diff --git a/.flowconfig b/.flowconfig index 2d02e3a16..872ad94b6 100644 --- a/.flowconfig +++ b/.flowconfig @@ -21,7 +21,6 @@ untyped-type-import sketchy-null [options] -exact_by_default=false experimental.const_params=true autoimports=true react.runtime=automatic diff --git a/.github/workflows/deprecate.yml b/.github/workflows/deprecate.yml index d1f081bc8..38d09edef 100644 --- a/.github/workflows/deprecate.yml +++ b/.github/workflows/deprecate.yml @@ -73,7 +73,7 @@ jobs: contents: write steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: token: ${{ secrets.RPLDY_PAT_TOKEN }} - name: Prepare @@ -106,7 +106,7 @@ jobs: if: ${{ inputs.version != '' }} steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 - name: Prepare diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 7286ec71f..69eb6c671 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -95,7 +95,7 @@ jobs: IS_CODE_CHANGED: ${{ steps.check-changes.outputs.code_changed }} steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 2 - name: Check for code changes @@ -132,7 +132,7 @@ jobs: if: ${{ needs.workflow-gate.outputs.proceed == 'true' && (needs.code-changes.outputs.IS_CODE_CHANGED == 'true' || needs.workflow-gate.outputs.has_rune2e_label == 'true') }} steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Prepare uses: ./.github/actions/prepare with: @@ -154,7 +154,7 @@ jobs: if: ${{ needs.workflow-gate.outputs.proceed == 'true' && needs.workflow-gate.outputs.is_label_event != 'true' }} steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Prepare uses: ./.github/actions/prepare with: @@ -175,7 +175,7 @@ jobs: actions: read steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Prepare uses: ./.github/actions/prepare with: @@ -207,7 +207,7 @@ jobs: if: ${{ needs.workflow-gate.outputs.proceed == 'true' && needs.workflow-gate.outputs.is_label_event != 'true' }} steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Prepare uses: ./.github/actions/prepare with: @@ -230,7 +230,7 @@ jobs: if: ${{ needs.workflow-gate.outputs.proceed == 'true' && needs.workflow-gate.outputs.is_label_event != 'true' }} steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Prepare uses: ./.github/actions/prepare with: @@ -253,7 +253,7 @@ jobs: actions: read steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Prepare uses: ./.github/actions/prepare with: @@ -303,7 +303,7 @@ jobs: pull-requests: read steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && 1 || 0 }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index af0fa522d..d2b94f2f4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -66,7 +66,7 @@ jobs: echo "🔴 Failing Job - Cant use version: (premajor, preminor, prepatch, prerelease) without selecting 'preid' value too! >> $GITHUB_STEP_SUMMARY exit 1 - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 diff --git a/.github/workflows/storybook-publish.yml b/.github/workflows/storybook-publish.yml index 9ef6b23cd..7abb9d5e1 100644 --- a/.github/workflows/storybook-publish.yml +++ b/.github/workflows/storybook-publish.yml @@ -18,7 +18,7 @@ jobs: name: Publish Uploady Storybook runs-on: ubuntu-latest steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Prepare uses: ./.github/actions/prepare diff --git a/babel.config.js b/babel.config.js index db12a2618..4c7f20b20 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,10 +1,33 @@ const env = process.env.BABEL_ENV, isUploadyBundle = process.env.UPLOADY_BUNDLE; +//inlines process.env.X member expressions into literal values at build time. +//replaces babel-plugin-transform-inline-environment-variables, which is unmaintained +//and broken under @babel/traverse 8.x (relies on the removed path.toComputedKey API) +function inlineEnvVariables({ types: t }) { + return { + visitor: { + MemberExpression(path) { + if (path.get("object").matchesPattern("process.env")) { + const property = path.node.property; + + const key = path.node.computed + ? (t.isStringLiteral(property) ? property.value : null) + : property.name; + + if (key != null) { + path.replaceWith(t.valueToNode(process.env[key])); + } + } + }, + }, + }; +} + const productionConfig = { plugins: [ //cant add to base because breaks unit-tests that modify process.env - "transform-inline-environment-variables", + inlineEnvVariables, ] }; @@ -22,29 +45,28 @@ const config = { }, ], "@babel/react", - "@babel/flow", ], plugins: [ "@babel/plugin-proposal-function-bind", "@babel/plugin-proposal-export-default-from", - ["babel-plugin-transform-flow-enums", { - //avoid using flow-enums-runtime, just return a frozen "enum" object - getRuntime: (t) => t.arrowFunctionExpression( - [t.identifier("enumObj")], - t.callExpression( - t.memberExpression(t.identifier("Object"), t.identifier("freeze")), - [t.identifier("enumObj")] - ) - ) - }], - "babel-plugin-syntax-hermes-parser", - //adding these here to stop sb build from breaking on loose mode issue :( - "minify-dead-code-elimination", ["module-resolver", { "root": ["./"], // "alias": {} }] ], + overrides: [ + { + test: /\.jsx?$/, + presets: ["@babel/flow"], + plugins: [ + "babel-plugin-syntax-hermes-parser", + ], + }, + { + test: /\.tsx?$/, + presets: ["@babel/preset-typescript"], + }, + ], env: { //cant use plugin when building storybook :( production: isUploadyBundle ? productionConfig : undefined, diff --git a/flow-typed/npm/bom.js b/flow-typed/npm/bom.js index 9060f2743..648ec0573 100644 --- a/flow-typed/npm/bom.js +++ b/flow-typed/npm/bom.js @@ -899,7 +899,7 @@ declare class SharedWorker extends EventTarget { declare function importScripts(...urls: Array): void; declare class WorkerGlobalScope extends EventTarget { - self: this; + +self: this; location: WorkerLocation; navigator: WorkerNavigator; close(): void; diff --git a/flow-typed/npm/dom.js b/flow-typed/npm/dom.js index 63abf8761..dd279b830 100644 --- a/flow-typed/npm/dom.js +++ b/flow-typed/npm/dom.js @@ -1064,7 +1064,7 @@ declare class HTMLCollection<+Elem: HTMLElement> { length: number; item(nameOrIndex?: any, optionalIndex?: any): Elem | null; namedItem(name: string): Elem | null; - [index: number | string]: Elem; + +[index: number | string]: Elem; } // from https://www.w3.org/TR/custom-elements/#extensions-to-document-interface-to-register diff --git a/flow-typed/npm/jsx-custom.js b/flow-typed/npm/jsx-custom.js index 019ea5ec3..0832da346 100644 --- a/flow-typed/npm/jsx-custom.js +++ b/flow-typed/npm/jsx-custom.js @@ -24,7 +24,7 @@ declare class SyntheticEvent<+T: EventTarget = EventTarget, +E: Event = Event> { isDefaultPrevented(): boolean; isPropagationStopped(): boolean; isTrusted: boolean; - nativeEvent: E; + +nativeEvent: E; persist(): void; preventDefault(): void; stopPropagation(): void; diff --git a/flow-typed/npm/node.js b/flow-typed/npm/node.js index 7a0c52466..c83a3a7ea 100644 --- a/flow-typed/npm/node.js +++ b/flow-typed/npm/node.js @@ -1484,7 +1484,7 @@ type http$agentOptions = { declare class http$Agent<+SocketT = net$Socket> { constructor(options: http$agentOptions): void; destroy(): void; - freeSockets: { [name: string]: $ReadOnlyArray, ... }; + +freeSockets: { +[name: string]: $ReadOnlyArray, ... }; getName(options: { host: string, port: number, @@ -1493,8 +1493,8 @@ declare class http$Agent<+SocketT = net$Socket> { }): string; maxFreeSockets: number; maxSockets: number; - requests: { [name: string]: $ReadOnlyArray>, ... }; - sockets: { [name: string]: $ReadOnlyArray, ... }; + +requests: { +[name: string]: $ReadOnlyArray>, ... }; + +sockets: { +[name: string]: $ReadOnlyArray, ... }; } declare class http$IncomingMessage extends stream$Readable { diff --git a/package.json b/package.json index 31b9fa64b..44b2e7035 100644 --- a/package.json +++ b/package.json @@ -59,39 +59,38 @@ "@actions/core": "^3.0.0", "@actions/github": "^9.0.0", "@babel/cli": "^8.0.4", - "@babel/core": "^7.29.0", - "@babel/plugin-proposal-export-default-from": "^7.27.1", - "@babel/plugin-proposal-function-bind": "^7.27.1", - "@babel/plugin-transform-runtime": "^7.29.0", - "@babel/preset-env": "^7.29.2", - "@babel/preset-flow": "^7.27.1", - "@babel/preset-react": "^7.28.5", + "@babel/core": "^8.0.1", + "@babel/plugin-proposal-export-default-from": "^8.0.1", + "@babel/plugin-proposal-function-bind": "^8.0.1", + "@babel/plugin-transform-runtime": "^8.0.1", + "@babel/preset-env": "^8.0.2", + "@babel/preset-flow": "^8.0.1", + "@babel/preset-react": "^8.0.1", + "@babel/preset-typescript": "^8.0.1", "@babel/runtime-corejs3": "^8.0.0", - "@commitlint/cli": "^20.5.0", + "@commitlint/cli": "^21.2.1", "@commitlint/config-conventional": "^21.0.2", "@commitlint/config-lerna-scopes": "^21.0.2", "@eslint/compat": "^2.1.0", "@eslint/js": "^10.0.1", "@monorepo-utils/package-utils": "^2.11.0", - "@storybook/addon-docs": "10.4.2", - "@storybook/addon-links": "10.4.2", + "@storybook/addon-docs": "10.4.6", + "@storybook/addon-links": "10.4.6", "@storybook/addon-webpack5-compiler-babel": "^4.0.1", - "@storybook/react-webpack5": "10.4.2", - "@testing-library/jest-dom": "^6.6.3", + "@storybook/react-webpack5": "^10.4.6", + "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", "@types/react": "^19.2.14", + "@typescript/native": "npm:typescript@^7.0.2", "@vitest/coverage-istanbul": "^4.1.2", "@vitest/coverage-v8": "^4.1.2", "@vitest/ui": "^4.1.2", "async": "^3.2.6", "babel-loader": "^10.1.1", "babel-plugin-istanbul": "^8.0.0", - "babel-plugin-minify-dead-code-elimination": "^0.5.2", "babel-plugin-module-resolver": "^5.0.3", "babel-plugin-syntax-hermes-parser": "0.36.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "babel-plugin-transform-inline-environment-variables": "^0.4.4", "bytes": "^3.1.2", "chai": "^6.2.2", "chai-dom": "^1.12.1", @@ -102,19 +101,19 @@ "cypress-intercept-formdata": "^1.0.0", "cypress-mochawesome-reporter": "^4.0.2", "cypress-multi-reporters": "^2.0.5", - "eslint": "^10.4.1", + "eslint": "^10.7.0", "eslint-plugin-ft-flow": "^3.0.11", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-no-async": "^1.3.1", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-storybook": "10.4.2", + "eslint-plugin-storybook": "10.4.6", "eslint-plugin-vitest": "^0.5.4", "execa": "^9.6.0", "filesize": "^11.0.15", - "flow-bin": "0.291.0", - "fs-extra": "^11.3.5", + "flow-bin": "0.322.0", + "fs-extra": "^11.3.6", "glob": "^13.0.6", "globals": "^17.6.0", "hermes-eslint": "^0.36.1", @@ -137,17 +136,17 @@ "rimraf": "^6.1.3", "semver-utils": "^1.1.4", "shelljs": "^0.10.0", - "storybook": "^10.4.2", + "storybook": "^10.4.6", "styled-components": "^6.4.2", "tty-browserify": "^0.0.1", - "typescript": "^6.0.3", + "typescript": "npm:@typescript/typescript6@^6.0.2", "typescript-eslint": "^8.61.0", - "vite": "^8.0.16", - "vitest": "^4.1.7", + "vite": "^8.1.4", + "vitest": "^4.1.10", "wait-on": "^9.0.10", "weak-napi": "^2.0.2", - "webpack": "^5.107.2", - "webpack-cli": "^7.0.3", + "webpack": "^5.108.4", + "webpack-cli": "^7.2.1", "webpack-merge": "^6.0.1", "webpack-virtual-modules": "^0.6.2", "xml2js": "^0.6.2", diff --git a/packages/core/abort/package.json b/packages/core/abort/package.json index dd7646d94..dc0ae2a05 100644 --- a/packages/core/abort/package.json +++ b/packages/core/abort/package.json @@ -27,7 +27,7 @@ "@rpldy/simple-state": "workspace:*" }, "devDependencies": { - "flow-bin": "^0.291.0" + "flow-bin": "^0.322.0" }, "publishConfig": { "access": "public" diff --git a/packages/core/abort/src/abort.js b/packages/core/abort/src/abort.js index 06392e448..40b625a3d 100644 --- a/packages/core/abort/src/abort.js +++ b/packages/core/abort/src/abort.js @@ -20,14 +20,14 @@ type StateAbortMethods = { pending: (item: BatchItem, aborts: AbortsMap, finalizeItem: FinalizeRequestMethod) => boolean, }; -const ITEM_STATE_ABORTS: StateAbortMethods = (({ +const ITEM_STATE_ABORTS: StateAbortMethods = ({ [FILE_STATES.UPLOADING]: (item: BatchItem, aborts: AbortsMap, _) => { logger.debugLog(`abort: aborting uploading item - `, item); return aborts[item.id](); }, [FILE_STATES.ADDED]: abortNonUploadingItem, [FILE_STATES.PENDING]: abortNonUploadingItem, -}: any): StateAbortMethods); +} as any) as StateAbortMethods; const callAbortOnItem = ( item: BatchItem, @@ -37,7 +37,7 @@ const callAbortOnItem = ( const itemState = item?.state; const method = !!itemState && - (ITEM_STATE_ABORTS: any)[itemState.valueOf()]; + (ITEM_STATE_ABORTS as any)[itemState.valueOf()]; return method ? method(item, aborts, finalizeItem) : false; diff --git a/packages/core/abort/src/getAbortEnhancer.js b/packages/core/abort/src/getAbortEnhancer.js index 6596cfe74..0368160ce 100644 --- a/packages/core/abort/src/getAbortEnhancer.js +++ b/packages/core/abort/src/getAbortEnhancer.js @@ -8,7 +8,7 @@ const getAbortEnhancer = (): UploaderEnhancer => { */ return (uploader: UploaderType): UploaderType => { //$FlowIssue[incompatible-call]: unsure how to tell Flow this is ok... - uploader.update(({ abortAll, abortBatch, abortItem }: any)); + uploader.update({ abortAll, abortBatch, abortItem } as any); return uploader; }; }; diff --git a/packages/core/abort/src/types.js b/packages/core/abort/src/types.js index 1fee72b9b..36b2ff451 100644 --- a/packages/core/abort/src/types.js +++ b/packages/core/abort/src/types.js @@ -12,7 +12,7 @@ export type ItemsQueue = { [string]: string[] }; export type AbortResult = { isFast: boolean }; -type InExactRawCreateOptions = { ...RawCreateOptions }; +type InExactRawCreateOptions = { ...RawCreateOptions, ... }; export type AbortBatchMethod = (Batch, InExactRawCreateOptions, AbortsMap, ItemsQueue, FinalizeRequestMethod, InExactRawCreateOptions) => AbortResult; diff --git a/packages/core/chunked-sender/ChunkedSender.stories.js b/packages/core/chunked-sender/ChunkedSender.stories.js index f3fb5f8f5..7d8456605 100644 --- a/packages/core/chunked-sender/ChunkedSender.stories.js +++ b/packages/core/chunked-sender/ChunkedSender.stories.js @@ -15,7 +15,7 @@ import getChunkedEnhancer, { CHUNK_EVENTS } from "./src"; import Readme from "./ChunkedSender.storydoc.mdx"; export const WithChunkedSender: UploadyStory = createUploadyStory( - ({ destination, chunkSize, sendWithRangeHeader }): Node => { + function StoryRender({ destination, chunkSize, sendWithRangeHeader }): Node { const { url } = destination; const [file, setFile] = useState(null); diff --git a/packages/core/chunked-sender/package.json b/packages/core/chunked-sender/package.json index 6e37fa5af..a75e55733 100644 --- a/packages/core/chunked-sender/package.json +++ b/packages/core/chunked-sender/package.json @@ -38,6 +38,6 @@ "devDependencies": { "@rpldy/life-events": "workspace:*", "@rpldy/uploader": "workspace:*", - "flow-bin": "^0.291.0" + "flow-bin": "^0.322.0" } } diff --git a/packages/core/chunked-sender/src/chunkedSender/sendChunk.js b/packages/core/chunked-sender/src/chunkedSender/sendChunk.js index 0b42c6c73..28e65c810 100644 --- a/packages/core/chunked-sender/src/chunkedSender/sendChunk.js +++ b/packages/core/chunked-sender/src/chunkedSender/sendChunk.js @@ -66,7 +66,7 @@ const uploadChunkWithUpdatedData = ( const chunkIndex = state.chunks.indexOf(chunk); - return ((triggerUpdater(trigger, CHUNK_EVENTS.CHUNK_START, { + return (triggerUpdater(trigger, CHUNK_EVENTS.CHUNK_START, { item: unwrap(item), chunk: pick(chunk, ["id", "start", "end", "index", "attempt"]), chunkItem: { ...chunkItem }, @@ -77,10 +77,10 @@ const uploadChunkWithUpdatedData = ( totalCount: state.chunkCount, //TODO: should expose chunk_progress event instead of passing callback like this onProgress, - }): any): Promise) + }) as any as Promise) .then((response: ?ChunkStartEventData | boolean) => { let result; - const updatedData = typeof response === "boolean" ? (response === false ? { stop: true } : {}) : ((response: any) || {}); + const updatedData = typeof response === "boolean" ? (response === false ? { stop: true } : {}) : ((response as any) || {}); if (updatedData.stop) { logger.debugLog(`chunkedSender.sendChunk: received false from CHUNK_START handler - skipping chunk ${chunkIndex}, item ${item.id}`); diff --git a/packages/core/chunked-sender/src/chunkedSender/sendChunks.js b/packages/core/chunked-sender/src/chunkedSender/sendChunks.js index 1b160b779..3a1e87cb2 100644 --- a/packages/core/chunked-sender/src/chunkedSender/sendChunks.js +++ b/packages/core/chunked-sender/src/chunkedSender/sendChunks.js @@ -5,7 +5,7 @@ import handleChunkRequest from "./handleChunkRequest"; import getChunksToSend from "./getChunksToSend"; import sendChunk from "./sendChunk"; -import type { BatchItem } from "@rpldy/shared"; +import type { BatchItem, FILE_STATES as FileStatesType } from "@rpldy/shared"; import type { OnProgress } from "@rpldy/sender"; import type { TriggerMethod } from "@rpldy/life-events"; import type { Chunk, ChunkedState, State } from "./types"; @@ -28,7 +28,7 @@ const resolveOnError = (chunkedState: ChunkedState, resolve: PromiseResolve, ex: } }; -const finalizeOnFinish = (chunkedState: ChunkedState, item: BatchItem, resolve: PromiseResolve, status: FILE_STATES) => { +const finalizeOnFinish = (chunkedState: ChunkedState, item: BatchItem, resolve: PromiseResolve, status: FileStatesType) => { chunkedState.updateState((state) => { state.finished = true; }); diff --git a/packages/core/chunked-sender/src/chunkedSender/types.js b/packages/core/chunked-sender/src/chunkedSender/types.js index 52c0cb0cd..963b1b2d8 100644 --- a/packages/core/chunked-sender/src/chunkedSender/types.js +++ b/packages/core/chunked-sender/src/chunkedSender/types.js @@ -18,7 +18,7 @@ export type State = {| finished: boolean, aborted: boolean, error: boolean, - requests: { [string]: { abort: () => boolean } }, + requests: { [string]: { id: string, abort: () => boolean } }, responses: any[], chunks: Chunk[], uploaded: { [string]: number }, diff --git a/packages/core/chunked-sender/src/types.js b/packages/core/chunked-sender/src/types.js index 597208de8..2c720a03f 100644 --- a/packages/core/chunked-sender/src/types.js +++ b/packages/core/chunked-sender/src/types.js @@ -18,7 +18,8 @@ export type ChunkedOptions = { export type ChunkedSendOptions = { ...SendOptions, //the byte to start from (designed for resumable) (default: 0) - startByte?: number + startByte?: number, + ... }; export type MandatoryChunkedOptions = {| diff --git a/packages/core/chunked-sender/src/utils.js b/packages/core/chunked-sender/src/utils.js index eab70f973..28bfca785 100644 --- a/packages/core/chunked-sender/src/utils.js +++ b/packages/core/chunked-sender/src/utils.js @@ -16,9 +16,9 @@ const isChunkingSupported = (): boolean => { //$FlowExpectedError[method-unbinding] flow 0.153 !!! sliceMethod = Blob.prototype.slice || // $FlowFixMe[prop-missing] flow doesnt know webkitSlice - (Blob.prototype: any).webkitSlice || + (Blob.prototype as any).webkitSlice || // $FlowFixMe[prop-missing] flow doesnt know mozSlice - (Blob.prototype: any).mozSlice; + (Blob.prototype as any).mozSlice; } return !!sliceMethod; diff --git a/packages/core/life-events/package.json b/packages/core/life-events/package.json index 345439fa6..2034452ce 100644 --- a/packages/core/life-events/package.json +++ b/packages/core/life-events/package.json @@ -30,7 +30,7 @@ "@rpldy/shared": "workspace:*" }, "devDependencies": { - "flow-bin": "^0.291.0" + "flow-bin": "^0.322.0" }, "publishConfig": { "access": "public" diff --git a/packages/core/life-events/src/lifeEvents.js b/packages/core/life-events/src/lifeEvents.js index b840c000f..e7618b0ae 100644 --- a/packages/core/life-events/src/lifeEvents.js +++ b/packages/core/life-events/src/lifeEvents.js @@ -67,7 +67,7 @@ const getPublicMethods = () => .reduce((res, [key, m]) => { res[key] = { value: m }; return res; - }, ({}: { [string]: any })); + }, {} as { [string]: any }); type ApiFn = (...args: any[]) => any; @@ -90,7 +90,7 @@ const createApi = (target: Object): LifeEventsAPI => ((res, [name, fn]) => { res[name] = fn.bind(target); return res; - }, { ...apiMethods, target }); + }, { ...apiMethods, target }) as any as LifeEventsAPI; const cleanRegistryForName = (obj: Object, name: any, force: boolean = false) => { const registry = getValidLE(obj).registry; @@ -223,7 +223,7 @@ function hasEventRegistrations(this: any, name: any) { const defineLifeData = (target: Object, options: Options, events: any[] = [], registry: Object = {}, stats: Object = {}) => { Object.defineProperties(target, { // $FlowFixMe[invalid-computed-prop] - https://github.com/facebook/flow/issues/3258 - [(LESYM: any)]: { + [(LESYM as any)]: { value: Object.seal({ registry, events, diff --git a/packages/core/mock-sender/package.json b/packages/core/mock-sender/package.json index c9f2f7ac7..62a9527ab 100644 --- a/packages/core/mock-sender/package.json +++ b/packages/core/mock-sender/package.json @@ -27,7 +27,7 @@ "devDependencies": { "@rpldy/sender": "workspace:*", "@rpldy/uploader": "workspace:*", - "flow-bin": "^0.291.0" + "flow-bin": "^0.322.0" }, "publishConfig": { "access": "public" diff --git a/packages/core/mock-sender/src/mockSender.js b/packages/core/mock-sender/src/mockSender.js index ac25953d2..942dc1aa4 100644 --- a/packages/core/mock-sender/src/mockSender.js +++ b/packages/core/mock-sender/src/mockSender.js @@ -119,13 +119,13 @@ const getIsSuccessfulMockRequest = ( return getIsSuccessfulCall ? //$FlowExpectedError[incompatible-call] - getIsSuccessfulCall(({ + getIsSuccessfulCall({ //mimic xhr for mock sender readyState: 4, status: mockStatus, response: mockResponse, getAllResponseHeaders: () => mockHeaders, - }: any)) : true; + } as any) : true; }; const processResponse = (request: MockRequest, options: MandatoryMockOptions, sendOptions: SendOptions, url: ?string): Promise => { diff --git a/packages/core/mock-sender/src/types.js b/packages/core/mock-sender/src/types.js index e47648cf3..769124de8 100644 --- a/packages/core/mock-sender/src/types.js +++ b/packages/core/mock-sender/src/types.js @@ -17,4 +17,4 @@ export type MockOptions = {| isSuccessfulCall?: IsSuccessfulCall |}; -export type MandatoryMockOptions = {[key in keyof MockOptions]: $NonMaybeType} +export type MandatoryMockOptions = {[key in keyof MockOptions]: NonNullable} diff --git a/packages/core/raw-uploader/package.json b/packages/core/raw-uploader/package.json index c4137c95a..393cdc1a5 100644 --- a/packages/core/raw-uploader/package.json +++ b/packages/core/raw-uploader/package.json @@ -33,7 +33,7 @@ "@rpldy/shared": "workspace:*" }, "devDependencies": { - "flow-bin": "^0.291.0" + "flow-bin": "^0.322.0" }, "publishConfig": { "access": "public" diff --git a/packages/core/raw-uploader/src/types.js b/packages/core/raw-uploader/src/types.js index b5d4da971..64b2a2500 100644 --- a/packages/core/raw-uploader/src/types.js +++ b/packages/core/raw-uploader/src/types.js @@ -2,7 +2,7 @@ import type { Trigger, UploadInfo, UploadOptions } from "@rpldy/shared"; import type { OffMethod, OnAndOnceMethod } from "@rpldy/life-events"; -export type UploaderEnhancer = (uploader: UploaderType, trigger: Trigger) => UploaderType; +export type UploaderEnhancer = (uploader: UploaderType, trigger: Trigger) => UploaderType; export type RawCreateOptions = {| ...UploadOptions, diff --git a/packages/core/retry/package.json b/packages/core/retry/package.json index bb1b6e57c..9e91589bc 100644 --- a/packages/core/retry/package.json +++ b/packages/core/retry/package.json @@ -27,7 +27,7 @@ "@rpldy/uploader": "workspace:*" }, "devDependencies": { - "flow-bin": "^0.291.0" + "flow-bin": "^0.322.0" }, "publishConfig": { "access": "public" diff --git a/packages/core/retry/src/retry.js b/packages/core/retry/src/retry.js index 633604204..f637a7f1d 100644 --- a/packages/core/retry/src/retry.js +++ b/packages/core/retry/src/retry.js @@ -5,10 +5,10 @@ import { UPLOADER_EVENTS } from "@rpldy/uploader"; import { RETRY_EXT, RETRY_EVENT } from "./consts"; import type { UploaderType, UploaderCreateOptions, TriggerMethod } from "@rpldy/uploader"; -import type { BatchItem, UploadOptions } from "@rpldy/shared"; +import type { BatchItem, UploadOptions, FILE_STATES as FileStatesType } from "@rpldy/shared"; import type { State, RetryState } from "./types"; -const FAILED_STATES = [FILE_STATES.ABORTED, FILE_STATES.ERROR]; +const FAILED_STATES: Array = [FILE_STATES.ABORTED, FILE_STATES.ERROR]; const removeItemFromState = (retryState: RetryState, id: string) => { retryState.updateState((state: State) => { @@ -46,7 +46,7 @@ const uploadFailedIds = ( trigger(RETRY_EVENT, { items: uploads, options: retryOptions }); failedIds?.forEach((id) => removeItemFromState(retryState, id)); - uploader.add(uploads, (retryOptions: ?UploadOptions)); + uploader.add(uploads, retryOptions as ?UploadOptions); } return !!uploads.length; diff --git a/packages/core/safe-storage/package.json b/packages/core/safe-storage/package.json index 997bcd3eb..c412f17cd 100644 --- a/packages/core/safe-storage/package.json +++ b/packages/core/safe-storage/package.json @@ -25,7 +25,7 @@ "@rpldy/shared": "workspace:*" }, "devDependencies": { - "flow-bin": "^0.291.0" + "flow-bin": "^0.322.0" }, "publishConfig": { "access": "public" diff --git a/packages/core/safe-storage/src/safeStorageCreator.js b/packages/core/safe-storage/src/safeStorageCreator.js index 0c14da899..e8b768d0f 100644 --- a/packages/core/safe-storage/src/safeStorageCreator.js +++ b/packages/core/safe-storage/src/safeStorageCreator.js @@ -28,9 +28,9 @@ const safeStorageCreator = (storageType: string): SafeStorage => { length: 0, }; - const safeStorage = methods.reduce<{ length: number, isSupported: boolean, [string]: (...args: mixed[]) => void }>( + const safeStorage = methods.reduce<{ length: number, isSupported: boolean, [string]: (...args: unknown[]) => void }>( (res, method) => { - res[method] = (...args: mixed[]) => + res[method] = (...args: unknown[]) => isSupported ? window[storageType][method](...args) : undefined; return res; @@ -42,7 +42,7 @@ const safeStorageCreator = (storageType: string): SafeStorage => { } }); - return safeStorage; + return safeStorage as any as SafeStorage; }; export default safeStorageCreator; diff --git a/packages/core/safe-storage/src/storage.js b/packages/core/safe-storage/src/storage.js index 37b6e9c8d..1967f9cc8 100644 --- a/packages/core/safe-storage/src/storage.js +++ b/packages/core/safe-storage/src/storage.js @@ -2,8 +2,8 @@ import createSafeStorage from "./safeStorageCreator"; import type { SafeStorage } from "./types"; -const safeLocalStorage = (createSafeStorage("localStorage"): SafeStorage); -const safeSessionStorage = (createSafeStorage("sessionStorage"): SafeStorage); +const safeLocalStorage = createSafeStorage("localStorage") as SafeStorage; +const safeSessionStorage = createSafeStorage("sessionStorage") as SafeStorage; export { safeLocalStorage, diff --git a/packages/core/sender/package.json b/packages/core/sender/package.json index 7bf0bc1e4..ba6de8002 100644 --- a/packages/core/sender/package.json +++ b/packages/core/sender/package.json @@ -25,7 +25,7 @@ "@rpldy/shared": "workspace:*" }, "devDependencies": { - "flow-bin": "^0.291.0" + "flow-bin": "^0.322.0" }, "publishConfig": { "access": "public" diff --git a/packages/core/sender/src/types.js b/packages/core/sender/src/types.js index e44842ab3..6f8d09055 100644 --- a/packages/core/sender/src/types.js +++ b/packages/core/sender/src/types.js @@ -19,6 +19,7 @@ export type SendOptions = { formDataAllowUndefined?: boolean, formatServerResponse?: FormatServerResponseMethod, isSuccessfulCall?: IsSuccessfulCall, + ... }; export type SenderProgressEvent = { total: number, loaded: number }; @@ -39,4 +40,4 @@ export type SendResult = { senderType: string, }; -export type SendMethod<-T: SendOptions> = (item: BatchItem[], url: ?string, options: T, onProgress: OnProgress) => SendResult; +export type SendMethod = (item: BatchItem[], url: ?string, options: T, onProgress: OnProgress) => SendResult; diff --git a/packages/core/sender/src/xhrSender/xhrSender.js b/packages/core/sender/src/xhrSender/xhrSender.js index 1ac5a6763..068765198 100644 --- a/packages/core/sender/src/xhrSender/xhrSender.js +++ b/packages/core/sender/src/xhrSender/xhrSender.js @@ -8,6 +8,7 @@ import type { BatchItem, UploadData, Headers, + FILE_STATES as FileStatesType, } from "@rpldy/shared"; import type { OnProgress, SendResult, SendOptions, XhrSendConfig } from "../types"; @@ -114,7 +115,7 @@ const processResponse = (sendRequest: SendRequest, options: SendOptions): Promis return checkIsResponseSuccessful(xhr, options) .then((isSuccess) => { - const state = isSuccess ? FILE_STATES.FINISHED : FILE_STATES.ERROR; + const state: FileStatesType = isSuccess ? FILE_STATES.FINISHED : FILE_STATES.ERROR; const status = xhr.status; const resHeaders = parseResponseHeaders(xhr); diff --git a/packages/core/shared/package.json b/packages/core/shared/package.json index ad955059f..5c395dc2e 100644 --- a/packages/core/shared/package.json +++ b/packages/core/shared/package.json @@ -22,7 +22,7 @@ "build": "node ../../../scripts/build.mjs" }, "devDependencies": { - "flow-bin": "^0.291.0" + "flow-bin": "^0.322.0" }, "dependencies": { "invariant": "^2.2.4", diff --git a/packages/core/shared/src/batchItem.js b/packages/core/shared/src/batchItem.js index ccada2c87..b2f11b740 100644 --- a/packages/core/shared/src/batchItem.js +++ b/packages/core/shared/src/batchItem.js @@ -1,5 +1,6 @@ // @flow import { FILE_STATES } from "./enums"; +import type { FileStatesEnum as FileStatesType } from "./enums"; import type { BatchItem, UploadInfo } from "./types"; const BISYM = Symbol.for("__rpldy-bi__"); @@ -30,7 +31,7 @@ const createBatchItem = (f: UploadInfo, batchId: string, isPending: boolean = fa //keep existing id for recycled items const id = isAlreadyBatchItem && f.id && typeof f.id === "string" ? f.id : `${batchId}.item-${iCounter}`, - state: FILE_STATES = isPending ? FILE_STATES.PENDING : FILE_STATES.ADDED; + state: FileStatesType = isPending ? FILE_STATES.PENDING : FILE_STATES.ADDED; let batchItem: any = { id, @@ -41,7 +42,7 @@ const createBatchItem = (f: UploadInfo, batchId: string, isPending: boolean = fa completed: 0, loaded: 0, recycled: isAlreadyBatchItem, - previousBatch: isAlreadyBatchItem ? ((f: any).batchId) : null, + previousBatch: isAlreadyBatchItem ? (f as any).batchId : null, }; Object.defineProperty(batchItem, BISYM, { @@ -50,7 +51,7 @@ const createBatchItem = (f: UploadInfo, batchId: string, isPending: boolean = fa writable: true, }); - const fileData = isAlreadyBatchItem ? (((f: any).file || (f: any).url)) : f; + const fileData = isAlreadyBatchItem ? ((f as any).file || (f as any).url) : f; if (typeof fileData === "string") { batchItem = getBatchItemWithUrl(batchItem, fileData); diff --git a/packages/core/shared/src/enums.js b/packages/core/shared/src/enums.js index b686dceac..76775e998 100644 --- a/packages/core/shared/src/enums.js +++ b/packages/core/shared/src/enums.js @@ -1,27 +1,26 @@ // @flow -enum BATCH_STATES { - PENDING ="pending", - ADDED = "added", - PROCESSING = "processing", - UPLOADING = "uploading", - CANCELLED = "cancelled", - FINISHED = "finished", - ABORTED = "aborted", - ERROR = "error", -} +export const BATCH_STATES = Object.freeze({ + PENDING: "pending", + ADDED: "added", + PROCESSING: "processing", + UPLOADING: "uploading", + CANCELLED: "cancelled", + FINISHED: "finished", + ABORTED: "aborted", + ERROR: "error", +}); -enum FILE_STATES { - PENDING = "pending", - ADDED = "added", - UPLOADING = "uploading", - CANCELLED = "cancelled", - FINISHED = "finished", - ERROR = "error", - ABORTED = "aborted", -} +export type BatchStatesEnum = Values; -export { - BATCH_STATES, - FILE_STATES, -}; +export const FILE_STATES = Object.freeze({ + PENDING: "pending", + ADDED: "added", + UPLOADING: "uploading", + CANCELLED: "cancelled", + FINISHED: "finished", + ERROR: "error", + ABORTED: "aborted", +}); + +export type FileStatesEnum = Values; diff --git a/packages/core/shared/src/index.js b/packages/core/shared/src/index.js index 797ecb3ba..1aa44d91d 100644 --- a/packages/core/shared/src/index.js +++ b/packages/core/shared/src/index.js @@ -44,8 +44,17 @@ export { export type * from "./types"; +//re-exporting the type under the same name as the value below - eslint-plugin-import +//doesn't distinguish Flow's separate value/type namespaces and flags this as a duplicate export +/* eslint-disable import/export */ export { FILE_STATES, BATCH_STATES } from "./enums"; +export type { + FileStatesEnum as FILE_STATES, + BatchStatesEnum as BATCH_STATES, +} from "./enums"; +/* eslint-enable import/export */ + export type { MergeOptions } from "./utils/merge"; diff --git a/packages/core/shared/src/request/parseResponseHeaders.js b/packages/core/shared/src/request/parseResponseHeaders.js index 5f75a60a8..e3ea6a201 100644 --- a/packages/core/shared/src/request/parseResponseHeaders.js +++ b/packages/core/shared/src/request/parseResponseHeaders.js @@ -12,7 +12,7 @@ const parseResponseHeaders = (xhr: XMLHttpRequest): ?Headers => { const [key, val] = line.split(": "); res[key] = val; return res; - }, ({}: { [string]: any })); + }, {} as { [string]: any }); } catch (ex) { // eslint-disable-line debugLog("uploady.request: failed to read response headers", xhr); } diff --git a/packages/core/shared/src/request/request.js b/packages/core/shared/src/request/request.js index ebeb8a463..7b7feaa82 100644 --- a/packages/core/shared/src/request/request.js +++ b/packages/core/shared/src/request/request.js @@ -12,7 +12,7 @@ const setHeaders = (req: XMLHttpRequest, headers: Object): ?Headers => { } }; -const request = (url: string, data?: mixed, options: ?RequestOptions = {}): XhrPromise => { +const request = (url: string, data?: unknown, options: ?RequestOptions = {}): XhrPromise => { const req = new XMLHttpRequest(); return new XhrPromise( diff --git a/packages/core/shared/src/triggerCancellable.js b/packages/core/shared/src/triggerCancellable.js index cbff9f4af..c19fb4171 100644 --- a/packages/core/shared/src/triggerCancellable.js +++ b/packages/core/shared/src/triggerCancellable.js @@ -1,8 +1,8 @@ // @flow import type { Trigger, TriggerCancellableOutcome } from "./types"; -const triggerCancellable = (trigger: Trigger, event?: string, ...args?: mixed[]): TriggerCancellableOutcome => { - const doTrigger = (event: string, ...args?: mixed[]): Promise => +const triggerCancellable = (trigger: Trigger, event?: string, ...args: unknown[]): TriggerCancellableOutcome => { + const doTrigger = (event: string, ...args: unknown[]): Promise => new Promise((resolve, reject) => { const results: Promise[] = trigger(event, ...args); diff --git a/packages/core/shared/src/triggerUpdater.js b/packages/core/shared/src/triggerUpdater.js index cff84e8ad..597989f2e 100644 --- a/packages/core/shared/src/triggerUpdater.js +++ b/packages/core/shared/src/triggerUpdater.js @@ -4,8 +4,8 @@ import type { Trigger, Updater } from "./types"; type Outcome = Promise | Updater; -const triggerUpdater = (trigger: Trigger, event?: string, ...args?: mixed[]): Outcome => { - const doTrigger = (event: string, ...args?: mixed[]): Promise => new Promise((resolve, reject) => { +const triggerUpdater = (trigger: Trigger, event?: string, ...args: unknown[]): Outcome => { + const doTrigger = (event: string, ...args: unknown[]): Promise => new Promise((resolve, reject) => { const results: Promise[] = trigger(event, ...args); if (results && results.length) { diff --git a/packages/core/shared/src/types.js b/packages/core/shared/src/types.js index 33f1c771a..bb021a62b 100644 --- a/packages/core/shared/src/types.js +++ b/packages/core/shared/src/types.js @@ -1,5 +1,5 @@ // @flow -import { BATCH_STATES, FILE_STATES } from "./enums"; +import type { BatchStatesEnum as BatchStatesType, FileStatesEnum as FileStatesType } from "./enums"; export type Destination = { //upload URL @@ -24,8 +24,9 @@ export type ProgressInfo = { export type UploadData = { status: number, - state: FILE_STATES, + state: FileStatesType, response: any, + ... }; export type FormatParamGroupNameMethod = (number, string) => string; @@ -39,7 +40,7 @@ export type IsSuccessfulCall = (xhr: XMLHttpRequest) => boolean; type BatchItemBase = {| id: string, batchId: string, - state: FILE_STATES, + state: FileStatesType, uploadResponse?: any, uploadStatus: number, //percentage of upload completed @@ -77,7 +78,7 @@ export type Batch = { id: string, uploaderId: string, items: BatchItem[], - state: BATCH_STATES, + state: BatchStatesType, //percentage of upload completed for batch items completed: number, //sum of bytes uploaded for batch items @@ -130,13 +131,13 @@ export type UploadOptions = {| userData?: any, |}; -export type Trigger = (string, ...args: mixed[]) => Promise[]; +export type Trigger = (string, ...args: unknown[]) => Promise[]; -export type Cancellable = (string, ...args: mixed[]) => Promise; +export type Cancellable = (string, ...args: unknown[]) => Promise; export type TriggerCancellableOutcome = Promise | Cancellable; -export type Updater = (string, ...args: mixed[]) => Promise; +export type Updater = (string, ...args: unknown[]) => Promise; export type GetExact = T & Partial; diff --git a/packages/core/shared/src/utils/merge.js b/packages/core/shared/src/utils/merge.js index b089c413a..090ce78a9 100644 --- a/packages/core/shared/src/utils/merge.js +++ b/packages/core/shared/src/utils/merge.js @@ -4,7 +4,7 @@ import isPlainObject from "./isPlainObject"; export type MergeOptions = { undefinedOverwrites?: boolean, withSymbols?: boolean, - predicate?: (mixed, mixed) => boolean, + predicate?: (unknown, unknown) => boolean, }; type MergeMethod = (target: Object, ...sources: Array) => Object; @@ -63,7 +63,7 @@ const getMerge = (options: MergeOptions = {}): MergeMethod => { * * No recursion protection */ -export default (getMerge(): MergeMethod); +export default getMerge() as MergeMethod; export { getMerge, diff --git a/packages/core/shared/src/utils/pick.js b/packages/core/shared/src/utils/pick.js index 1ded43123..fbbf794e6 100644 --- a/packages/core/shared/src/utils/pick.js +++ b/packages/core/shared/src/utils/pick.js @@ -6,6 +6,6 @@ const pick = (obj: Object, props: string[]): ?Object => res[key] = obj[key]; } return res; - }, ({}: { [string]: any })); + }, {} as { [string]: any }); export default pick; diff --git a/packages/core/simple-state/package.json b/packages/core/simple-state/package.json index ca04b8b05..603a067fa 100644 --- a/packages/core/simple-state/package.json +++ b/packages/core/simple-state/package.json @@ -25,7 +25,7 @@ "@rpldy/shared": "workspace:*" }, "devDependencies": { - "flow-bin": "^0.291.0" + "flow-bin": "^0.322.0" }, "publishConfig": { "access": "public" diff --git a/packages/core/tus-sender/TusSender.stories.js b/packages/core/tus-sender/TusSender.stories.js index 8b29f3ca2..3149dacfe 100644 --- a/packages/core/tus-sender/TusSender.stories.js +++ b/packages/core/tus-sender/TusSender.stories.js @@ -74,7 +74,7 @@ const useUploaderWithTus = ({ return uploaderRef; }; -export const WithTusSender: UploadyStory = createUploadyStory((props): Node => { +export const WithTusSender: UploadyStory = createUploadyStory(function StoryRender(props): Node { const inputRef = useRef(null); const uploaderRef = useUploaderWithTus(props); @@ -106,7 +106,7 @@ export const WithTusSender: UploadyStory = createUploadyStory((props): Node => { ); }); -export const WithTusDataOnCreate: UploadyStory = createUploadyStory((props): Node => { +export const WithTusDataOnCreate: UploadyStory = createUploadyStory(function StoryRender(props): Node { const inputRef = useRef(null); const uploaderRef = useUploaderWithTus(props); @@ -138,7 +138,7 @@ export const WithTusDataOnCreate: UploadyStory = createUploadyStory((props): Nod ); }); -export const WithTusConcatenation: UploadyStory = createUploadyStory((props): Node => { +export const WithTusConcatenation: UploadyStory = createUploadyStory(function StoryRender(props): Node { const inputRef = useRef(null); const uploaderRef = useUploaderWithTus(props); @@ -170,7 +170,7 @@ export const WithTusConcatenation: UploadyStory = createUploadyStory((props): No ); }); -export const WithFeatureDetection: UploadyStory = createUploadyStory((props): Node => { +export const WithFeatureDetection: UploadyStory = createUploadyStory(function StoryRender(props): Node { const inputRef = useRef(null); const uploaderRef = useUploaderWithTus({ featureDetection: true, diff --git a/packages/core/tus-sender/package.json b/packages/core/tus-sender/package.json index a9728766e..a044f77d2 100644 --- a/packages/core/tus-sender/package.json +++ b/packages/core/tus-sender/package.json @@ -41,6 +41,6 @@ "devDependencies": { "@rpldy/life-events": "workspace:*", "@rpldy/uploader": "workspace:*", - "flow-bin": "^0.291.0" + "flow-bin": "^0.322.0" } } diff --git a/packages/core/tus-sender/src/tusSender/handleEvents.js b/packages/core/tus-sender/src/tusSender/handleEvents.js index d57d29ccb..3963aa4f8 100644 --- a/packages/core/tus-sender/src/tusSender/handleEvents.js +++ b/packages/core/tus-sender/src/tusSender/handleEvents.js @@ -40,17 +40,17 @@ const forgetPersistedUrls = (item: BatchItem, itemInfo: ItemInfo, options: TusOp }; const getPartUpdatedRequest = (data: ChunkStartEventData, trigger: TriggerMethod) => - ((triggerUpdater(trigger, TUS_EVENTS.PART_START, { + (triggerUpdater(trigger, TUS_EVENTS.PART_START, { url: data.url, item: data.item, headers: data.sendOptions?.headers || {}, chunk: data.chunk, - }): any): Promise) + }) as any as Promise) .then((response: PartStartResponseData) => { let updated = data; if (response && isPlainObject(response)) { - const { headers: respHeaders, url: respUrl } = (response: any); + const { headers: respHeaders, url: respUrl } = response as any; updated = merge({}, data, { sendOptions: { diff --git a/packages/core/tus-sender/src/tusSender/handleParallelTusUpload.js b/packages/core/tus-sender/src/tusSender/handleParallelTusUpload.js index c58e05ff6..72ea58746 100644 --- a/packages/core/tus-sender/src/tusSender/handleParallelTusUpload.js +++ b/packages/core/tus-sender/src/tusSender/handleParallelTusUpload.js @@ -4,7 +4,7 @@ import { SUCCESS_CODES } from "../consts"; import { persistResumable } from "../resumableStore"; import { addLocationToResponse, getUploadMetadata } from "./utils"; -import type { BatchItem, UploadData } from "@rpldy/shared"; +import type { BatchItem, UploadData, FILE_STATES as FileStatesType } from "@rpldy/shared"; import type { SendOptions } from "@rpldy/sender"; import type { State, TusState } from "../types"; import type { ParallelPartData } from "./types"; @@ -34,9 +34,11 @@ const handleFinalizeResponse = (pXhr: XhrPromise, uploadData: UploadData, tusSta } } else { logger.debugLog(`tusSender.finalizeParallel: parallel upload finalize failed!`, status); + const state: FileStatesType = FILE_STATES.ERROR; + result = { status: status, - state: FILE_STATES.ERROR, + state, response: { message: xhr?.response || (successCode && !resLocation ? "No valid location header for finalize request" : "") }, }; } diff --git a/packages/core/tus-sender/src/tusSender/initTusUpload/resumeUpload.js b/packages/core/tus-sender/src/tusSender/initTusUpload/resumeUpload.js index 92e1bde73..590db5d09 100644 --- a/packages/core/tus-sender/src/tusSender/initTusUpload/resumeUpload.js +++ b/packages/core/tus-sender/src/tusSender/initTusUpload/resumeUpload.js @@ -105,15 +105,15 @@ const getUpdatedRequest = ( ): Promise => { const { options } = tusState.getState(); - return ((triggerUpdater(trigger, TUS_EVENTS.RESUME_START, { + return (triggerUpdater(trigger, TUS_EVENTS.RESUME_START, { url, item: unwrap(item), resumeHeaders: unwrap(options.resumeHeaders), - }): any): Promise) + }) as any as Promise) .then((response: ResumeStartEventResponse | boolean) => { let result; - const updatedData = typeof response === "boolean" ? (response === false ? { stop: true } : {}) : ((response: any) || {}); + const updatedData = typeof response === "boolean" ? (response === false ? { stop: true } : {}) : ((response as any) || {}); if (updatedData.stop) { logger.debugLog(`tusSender.resume: received false from TUS RESUME_START event - cancelling resume attempt for item: ${item.id}`); diff --git a/packages/core/uploader/Uploader.stories.js b/packages/core/uploader/Uploader.stories.js index 9d76275ea..d6d75a258 100644 --- a/packages/core/uploader/Uploader.stories.js +++ b/packages/core/uploader/Uploader.stories.js @@ -23,7 +23,7 @@ import type { UploadyUploaderType } from "./src"; import type { Node } from "react"; export const WithCustomUI: UploadyStory = createUploadyStory( - ({ enhancer, destination, grouped, groupSize }): Node => { + function StoryRender({ enhancer, destination, grouped, groupSize }): Node { const uploaderRef = useRef(null); const inputRef = useRef(null); @@ -65,7 +65,7 @@ export const WithCustomUI: UploadyStory = createUploadyStory( }); export const WithProgress: UploadyStory = createUploadyStory( - ({ enhancer, destination }): Node => { + function StoryRender({ enhancer, destination }): Node { const uploaderRef = useRef(null); const [uploaderId, setUploaderId] = useState(null); const { url } = destination; @@ -195,7 +195,7 @@ const UploaderWithEvents = ({ enhancer, destination, grouped, groupSize, extOpti }; export const TEST_EventsData: UploadyStory = createUploadyStory( - ({ enhancer, destination, grouped, groupSize, extOptions }): Node => { + function StoryRender({ enhancer, destination, grouped, groupSize, extOptions }): Node { return ( { +export const TEST_ProtoPollute: UploadyStory = createUploadyStory(function StoryRender(): Node { useEffect(() => { window._test_createUploader = createUploader; }, []); @@ -221,11 +221,11 @@ export const TEST_ProtoPollute: UploadyStory = createUploadyStory((): Node => { }); export const UMD_Core: UploadyStory = createUploadyStory( - ({ + function StoryRender({ destination, enhancer, multiple, - }: UploadyStoryParams): Node => { + }: UploadyStoryParams): Node { const [uploaderReady, setUploaderReady] = useState(false); const inputRef = useRef(null); const uploaderRef = useRef(null); diff --git a/packages/core/uploader/package.json b/packages/core/uploader/package.json index c0cb44ce0..c88167d2c 100644 --- a/packages/core/uploader/package.json +++ b/packages/core/uploader/package.json @@ -37,7 +37,7 @@ "@rpldy/simple-state": "workspace:*" }, "devDependencies": { - "flow-bin": "^0.291.0" + "flow-bin": "^0.322.0" }, "publishConfig": { "access": "public" diff --git a/packages/core/uploader/src/consts.js b/packages/core/uploader/src/consts.js index 4d2b5595b..1a96219ca 100644 --- a/packages/core/uploader/src/consts.js +++ b/packages/core/uploader/src/consts.js @@ -1,5 +1,6 @@ // @flow import { devFreeze, FILE_STATES } from "@rpldy/shared"; +import type { FILE_STATES as FileStatesType } from "@rpldy/shared"; export const UPLOADER_EVENTS: Object = devFreeze({ BATCH_ADD: "BATCH-ADD", @@ -31,7 +32,7 @@ export const SENDER_EVENTS: Object = devFreeze({ BATCH_PROGRESS: "BATCH_PROGRESS", }); -export const ITEM_FINALIZE_STATES = [ +export const ITEM_FINALIZE_STATES: Array = [ FILE_STATES.FINISHED, FILE_STATES.ERROR, FILE_STATES.CANCELLED, diff --git a/packages/core/uploader/src/queue/batchHelpers.js b/packages/core/uploader/src/queue/batchHelpers.js index feec037cd..8518920b3 100644 --- a/packages/core/uploader/src/queue/batchHelpers.js +++ b/packages/core/uploader/src/queue/batchHelpers.js @@ -6,7 +6,7 @@ import { getItemsPrepareUpdater } from "./preSendPrepare"; import { finalizeItem, getIsItemExists } from "./itemHelpers"; import type { BatchData, QueueState, State } from "./types"; -import type { Batch, BatchItem, UploadOptions } from "@rpldy/shared"; +import type { Batch, BatchItem, UploadOptions, BATCH_STATES as BatchStatesType } from "@rpldy/shared"; import type { ItemsSendData } from "./preSendPrepare"; const prepareBatchStartItems = getItemsPrepareUpdater( @@ -20,13 +20,13 @@ const prepareBatchStartItems = getItemsPrepareUpdater( }, ); -const BATCH_READY_STATES = [ +const BATCH_READY_STATES: Array = [ BATCH_STATES.ADDED, BATCH_STATES.PROCESSING, BATCH_STATES.UPLOADING, ]; -const BATCH_FINISHED_STATES = [ +const BATCH_FINISHED_STATES: Array = [ BATCH_STATES.ABORTED, BATCH_STATES.CANCELLED, BATCH_STATES.FINISHED, @@ -80,7 +80,7 @@ const finalizeBatch = ( queue: QueueState, batchId: string, eventType: string, - finalState: BATCH_STATES = BATCH_STATES.FINISHED, + finalState: BatchStatesType = BATCH_STATES.FINISHED, additionalInfo?: string, ): void => { queue.updateState((state) => { diff --git a/packages/core/uploader/src/queue/preSendPrepare.js b/packages/core/uploader/src/queue/preSendPrepare.js index 7e271fc83..a2bfec3d1 100644 --- a/packages/core/uploader/src/queue/preSendPrepare.js +++ b/packages/core/uploader/src/queue/preSendPrepare.js @@ -51,12 +51,12 @@ const triggerItemsPrepareEvent = ( eventType: string, validateResponse: ?ResponseValidator ): Promise => -((triggerUpdater < { subject: Object, options: UploaderCreateOptions } > ( - queue.trigger, eventType, eventSubject, options): any): Promise) +(triggerUpdater<{ subject: Object, options: UploaderCreateOptions }>( + queue.trigger, eventType, eventSubject, options) as any as Promise) // $FlowFixMe[incompatible-type] - function return type mismatch .then((updated: ?{ subject: Object, options: UploaderCreateOptions } | boolean) => { validateResponse?.(updated); - return processPrepareResponse(eventType, items, options, (updated: any)); + return processPrepareResponse(eventType, items, options, updated as any); }); const persistPrepareResponse = (queue: QueueState, prepared: ItemsSendData) => { diff --git a/packages/core/uploader/src/queue/uploaderQueue.js b/packages/core/uploader/src/queue/uploaderQueue.js index d6c834818..bad185886 100644 --- a/packages/core/uploader/src/queue/uploaderQueue.js +++ b/packages/core/uploader/src/queue/uploaderQueue.js @@ -134,7 +134,7 @@ const createUploaderQueue = ( sender.on(SENDER_EVENTS.BATCH_PROGRESS, handleBatchProgress); - const runCancellable = (name: string, ...args: mixed[]) => { + const runCancellable = (name: string, ...args: unknown[]) => { if (!isFunction(cancellable)) { //for flow :( throw new Error("Uploader queue - cancellable is of wrong type"); diff --git a/packages/core/uploader/src/uploader.js b/packages/core/uploader/src/uploader.js index 762055ccb..2c1b1bc27 100644 --- a/packages/core/uploader/src/uploader.js +++ b/packages/core/uploader/src/uploader.js @@ -155,7 +155,7 @@ const createUploader = (options?: UploaderCreateOptions): UploadyUploaderType => /** * ensures that data being exposed to client-land isnt a proxy, only pojos */ - const triggerWithUnwrap = (name: string, ...data: mixed[]) => { + const triggerWithUnwrap = (name: string, ...data: unknown[]) => { //delays unwrap to the very last time on trigger. Will only unwrap if there are listeners const lp = createLifePack(() => data.map(deepProxyUnwrap)); return trigger(name, lp); diff --git a/packages/native/native-uploady/package.json b/packages/native/native-uploady/package.json index 3a5b97bf7..95e0c2b97 100644 --- a/packages/native/native-uploady/package.json +++ b/packages/native/native-uploady/package.json @@ -38,7 +38,7 @@ "react": ">=16.8" }, "devDependencies": { - "flow-bin": "^0.291.0", + "flow-bin": "^0.322.0", "react": "^19.2.0" }, "publishConfig": { diff --git a/packages/ui/chunked-uploady/ChunkedUploady.stories.js b/packages/ui/chunked-uploady/ChunkedUploady.stories.js index 59e489065..1a595d03b 100644 --- a/packages/ui/chunked-uploady/ChunkedUploady.stories.js +++ b/packages/ui/chunked-uploady/ChunkedUploady.stories.js @@ -46,7 +46,7 @@ const UploadButtonWithUniqueIdHeader = () => { }; export const Simple: UploadyStory = createUploadyStory( - ({ enhancer, destination, multiple, chunkSize, extOptions }): Node => { + function StoryRender({ enhancer, destination, multiple, chunkSize, extOptions }): Node { const { isSuccessfulCall } = extOptions || {}; return ( @@ -64,7 +64,7 @@ export const Simple: UploadyStory = createUploadyStory( }); export const WithProgress: UploadyStory = createUploadyStory( - ({ enhancer, destination, multiple, chunkSize }): Node => { + function StoryRender({ enhancer, destination, multiple, chunkSize }): Node { return ( { + function StoryRender({ enhancer, destination, multiple, chunkSize }): Node { return ( { }; export const WithChunkEventHooks: UploadyStory = createUploadyStory( - ({ enhancer, destination, multiple, chunkSize }): Node => { + function StoryRender({ enhancer, destination, multiple, chunkSize }): Node { return ( { + function StoryRender({ enhancer, destination, multiple, chunkSize }): Node { return ( { + }): Node { const [UploadyUI, setUploadyUI] = useState(null); const onBundleLoad = useCallback(() => { diff --git a/packages/ui/chunked-uploady/package.json b/packages/ui/chunked-uploady/package.json index aee056f91..899d5e9b2 100644 --- a/packages/ui/chunked-uploady/package.json +++ b/packages/ui/chunked-uploady/package.json @@ -42,7 +42,7 @@ }, "devDependencies": { "@rpldy/upload-button": "workspace:*", - "flow-bin": "^0.291.0", + "flow-bin": "^0.322.0", "react": "^19.2.0", "react-dom": "^19.2.0" }, diff --git a/packages/ui/retry-hooks/package.json b/packages/ui/retry-hooks/package.json index 32deba307..ef730b8d5 100644 --- a/packages/ui/retry-hooks/package.json +++ b/packages/ui/retry-hooks/package.json @@ -41,7 +41,7 @@ "devDependencies": { "@rpldy/upload-button": "workspace:*", "@rpldy/upload-preview": "workspace:*", - "flow-bin": "^0.291.0", + "flow-bin": "^0.322.0", "rc-progress": "^4.0.0", "react": "^19.2.0", "react-dom": "^19.2.0" diff --git a/packages/ui/retry-hooks/src/useRetryListener.js b/packages/ui/retry-hooks/src/useRetryListener.js index 316b15151..d8fda68bd 100644 --- a/packages/ui/retry-hooks/src/useRetryListener.js +++ b/packages/ui/retry-hooks/src/useRetryListener.js @@ -4,6 +4,6 @@ import { RETRY_EVENT } from "@rpldy/retry"; import type { RetryListenerHook } from "./types"; -const useRetryListener = (generateUploaderEventHook(RETRY_EVENT, false): RetryListenerHook); +const useRetryListener = generateUploaderEventHook(RETRY_EVENT, false) as RetryListenerHook; export default useRetryListener; diff --git a/packages/ui/shared/package.json b/packages/ui/shared/package.json index 66d6c5dca..ffb0cd41d 100644 --- a/packages/ui/shared/package.json +++ b/packages/ui/shared/package.json @@ -27,7 +27,7 @@ }, "devDependencies": { "@rpldy/life-events": "workspace:*", - "flow-bin": "^0.291.0", + "flow-bin": "^0.322.0", "react": "^19.2.0", "react-dom": "^19.2.0" }, diff --git a/packages/ui/shared/src/hocs/createRequestUpdateHoc.js b/packages/ui/shared/src/hocs/createRequestUpdateHoc.js index 9ae346ccb..54be2383a 100644 --- a/packages/ui/shared/src/hocs/createRequestUpdateHoc.js +++ b/packages/ui/shared/src/hocs/createRequestUpdateHoc.js @@ -36,7 +36,7 @@ const createRequestUpdateHoc = ({ //need layout effect to register to event in time (block) useLayoutEffect(() => { - const handleEvent: (...params: mixed[]) => ?mixed = (...params: mixed[]) => + const handleEvent: (...params: unknown[]) => ?unknown = (...params: unknown[]) => getIsValidEventData(id, ...params) === true ? //returning a promise to event dispatcher so it will await until its resolved by user-land code new Promise((resolve) => { diff --git a/packages/ui/shared/src/hooks/hooksUtils.js b/packages/ui/shared/src/hooks/hooksUtils.js index 5987008f1..9a4880205 100644 --- a/packages/ui/shared/src/hooks/hooksUtils.js +++ b/packages/ui/shared/src/hooks/hooksUtils.js @@ -30,7 +30,7 @@ const generateUploaderEventHookWithState = cbFn = undefined; } - const eventCallback = useCallback((eventObj: Object, ...args: mixed[]) => { + const eventCallback = useCallback((eventObj: Object, ...args: unknown[]) => { if (!usedId || eventObj.id === usedId) { setEventState(stateCalculator(eventObj, ...args)); @@ -47,7 +47,7 @@ const generateUploaderEventHookWithState = const generateUploaderEventHook = (event: string, canScope: boolean = true): ((fn: Callback, id?: string) => void) => (fn: ?Callback, id?: string) => { - const eventCallback = useCallback((eventObj: Object, ...args: mixed[]) => { + const eventCallback = useCallback((eventObj: Object, ...args: unknown[]) => { return (fn && (!canScope || !id || eventObj.id === id)) ? fn(eventObj, ...args) : undefined; }, [fn, id]); diff --git a/packages/ui/shared/src/types.js b/packages/ui/shared/src/types.js index 619dad91c..5b5a0fe2d 100644 --- a/packages/ui/shared/src/types.js +++ b/packages/ui/shared/src/types.js @@ -26,7 +26,7 @@ export type BatchEventHook = EventHook; export type BatchCancellableEventHook = (cb: (batch: Batch, options: UploaderCreateOptions) => boolean | void) => void; export type BatchEventHookWithState = EventHookWithState; -export type RefObject = {current: null | void | T}; +export type RefObject = {current: null | void | T}; export type AddUploadFunction = (files: UploadInfo | UploadInfo[], addOptions: ?UploadOptions) => void; diff --git a/packages/ui/shared/src/uploadyVersion.js b/packages/ui/shared/src/uploadyVersion.js index 8352fd30f..faa654d0f 100644 --- a/packages/ui/shared/src/uploadyVersion.js +++ b/packages/ui/shared/src/uploadyVersion.js @@ -11,12 +11,12 @@ const getGlobal = () => const getRegisteredVersion = (): string => { const global = getGlobal(); - return (global: Object)[GLOBAL_VERSION_SYM]; + return (global as Object)[GLOBAL_VERSION_SYM]; }; const registerUploadyContextVersion = (): void => { const global =getGlobal(); - (global: Object)[GLOBAL_VERSION_SYM] = getVersion(); + (global as Object)[GLOBAL_VERSION_SYM] = getVersion(); }; const getIsVersionRegisteredAndDifferent = (): boolean => { diff --git a/packages/ui/tus-uploady/package.json b/packages/ui/tus-uploady/package.json index e5115bb6c..e67cc5023 100644 --- a/packages/ui/tus-uploady/package.json +++ b/packages/ui/tus-uploady/package.json @@ -43,7 +43,7 @@ "@rpldy/retry-hooks": "workspace:*", "@rpldy/upload-button": "workspace:*", "@rpldy/uploady": "workspace:*", - "flow-bin": "^0.291.0", + "flow-bin": "^0.322.0", "react": "^19.2.0", "react-dom": "^19.2.0" }, diff --git a/packages/ui/upload-button/UploadButton.stories.js b/packages/ui/upload-button/UploadButton.stories.js index 988fc6020..adf8d44dd 100644 --- a/packages/ui/upload-button/UploadButton.stories.js +++ b/packages/ui/upload-button/UploadButton.stories.js @@ -37,7 +37,7 @@ import type { Node } from "react"; import type { Batch, BatchItem, UploadyContextType } from "@rpldy/uploady"; export const Simple: UploadyStory = createUploadyStory( - ({ enhancer, destination, multiple, grouped, groupSize }): Node => { + function StoryRender({ enhancer, destination, multiple, grouped, groupSize }): Node { return ( { + function StoryRender({ enhancer, destination, multiple, grouped, groupSize }): Node { return ( void }) => { }; export const WithEventListeners: UploadyStory = createUploadyStory( - ({ enhancer, destination, multiple, grouped, groupSize }): Node => { + function StoryRender({ enhancer, destination, multiple, grouped, groupSize }): Node { const { setUpdater, logEvent } = useEventsLogUpdater(); const listeners = useMemo( - () => ({ - [UPLOADER_EVENTS.BATCH_START]: ((batch: Batch) => { + (): any => ({ + [UPLOADER_EVENTS.BATCH_START]: (batch: Batch) => { logEvent( `Batch Start - ${batch.id} - item count = ${batch.items.length}`, ); - }: any), - [UPLOADER_EVENTS.BATCH_FINISH]: ((batch: Batch) => { + }, + [UPLOADER_EVENTS.BATCH_FINISH]: (batch: Batch) => { logEvent( `Batch Finish - ${batch.id} - item count = ${batch.items.length}`, ); - }: any), - [UPLOADER_EVENTS.ITEM_START]: ((item: BatchItem) => { + }, + [UPLOADER_EVENTS.ITEM_START]: (item: BatchItem) => { logEvent(`Item Start - ${item.id} : ${item.file.name}`); - }: any), - [UPLOADER_EVENTS.ITEM_FINISH]: ((item: BatchItem) => { + }, + [UPLOADER_EVENTS.ITEM_FINISH]: (item: BatchItem) => { logEvent(`Item Finish - ${item.id} : ${item.file.name}`); - }: any), + }, }), [], ); @@ -158,7 +158,7 @@ const HookedUploadButton = () => { }; export const withEventHooks: UploadyStory = createUploadyStory( - ({ enhancer, destination, multiple }): Node => { + function StoryRender({ enhancer, destination, multiple }): Node { return ( { + function StoryRender({ enhancer, destination, multiple }): Node { return ( { } export const WithClass: UploadyStory = createUploadyStory( - ({ enhancer, destination, multiple }): Node => { + function StoryRender({ enhancer, destination, multiple }): Node { return ( { }; export const DisabledDuringUpload: UploadyStory = createUploadyStory( - ({ enhancer, destination, multiple, grouped, groupSize }): Node => { + function StoryRender({ enhancer, destination, multiple, grouped, groupSize }): Node { return ( { + function StoryRender({ enhancer, destination, multiple }): Node { const destinationOverride = useMemo( () => ({ headers: { ...destination.headers, "x-test": "1234" }, @@ -303,7 +303,7 @@ const DivUploadButton = asUploadButton(forwardRef((props: any, ref: React.RefSet })); export const WithComponentAsButton: UploadyStory = createUploadyStory( - ({ enhancer, destination, multiple, grouped, groupSize }): Node => { + function StoryRender({ enhancer, destination, multiple, grouped, groupSize }): Node { return ( { }; export const WithCustomFileInputAndCustomButton: UploadyStory = createUploadyStory( - ({ enhancer, destination, multiple, grouped, groupSize }): Node => { + function StoryRender({ enhancer, destination, multiple, grouped, groupSize }): Node { return (
{ + function StoryRender({ enhancer, destination, multiple, grouped, groupSize }): Node { - const filterBySize = useCallback((file: mixed) => { + const filterBySize = useCallback((file: unknown) => { //filter out files larger than 5MB return !(file instanceof File) || file.size < 5242880; }, []); @@ -492,7 +492,7 @@ const MyForm = () => { }; export const WithForm: UploadyStory = createUploadyStory( - ({ enhancer, destination, grouped, groupSize }): Node => { + function StoryRender({ enhancer, destination, grouped, groupSize }): Node { return ( | ((null | HTMLButtonElement) => mixed)) => -