From 9864086c84c43c2e47b8b0956a9c209b4eb2b40b Mon Sep 17 00:00:00 2001 From: gaozl Date: Wed, 14 May 2025 17:00:44 +0800 Subject: [PATCH] fix: init --- Inter Font License.txt | 93 + bindings/djdemo/greetservice.js | 36 + bindings/djdemo/index.js | 10 + bindings/djdemo/models.js | 54 + index.html | 49 + main copy.js | 51 + main.js | 170 + node_modules/.bin/vite | 21 + node_modules/.bin/vite.ps1 | 41 + node_modules/.pnpm-workspace-state.json | 25 + .../node_modules/@alova/shared/LICENSE | 21 + .../shared/dist/alova-shared.common.cjs | 607 + .../@alova/shared/dist/alova-shared.esm.js | 529 + .../node_modules/@alova/shared/package.json | 32 + .../@alova/shared/typings/alova-shared.d.ts | 387 + .../node_modules/@esbuild/win32-x64/README.md | 3 + .../@esbuild/win32-x64/package.json | 20 + .../@rollup/rollup-win32-x64-msvc/README.md | 3 + .../rollup-win32-x64-msvc/package.json | 19 + .../rollup.win32-x64-msvc.node | Bin 0 -> 3682304 bytes .../node_modules/@types/estree/LICENSE | 21 + .../node_modules/@types/estree/README.md | 15 + .../node_modules/@types/estree/flow.d.ts | 167 + .../node_modules/@types/estree/index.d.ts | 694 + .../node_modules/@types/estree/package.json | 27 + .../@wailsio/runtime/dist/application.js | 32 + .../@wailsio/runtime/dist/browser.js | 20 + .../@wailsio/runtime/dist/callable.js | 144 + .../@wailsio/runtime/dist/calls.js | 194 + .../@wailsio/runtime/dist/cancellable.js | 792 + .../@wailsio/runtime/dist/clipboard.js | 30 + .../@wailsio/runtime/dist/contextmenu.js | 80 + .../@wailsio/runtime/dist/create.js | 94 + .../@wailsio/runtime/dist/dialogs.js | 134 + .../@wailsio/runtime/dist/drag.js | 222 + .../@wailsio/runtime/dist/event_types.js | 229 + .../@wailsio/runtime/dist/events.js | 101 + .../@wailsio/runtime/dist/flags.js | 23 + .../@wailsio/runtime/dist/index.js | 38 + .../@wailsio/runtime/dist/listener.js | 44 + .../@wailsio/runtime/dist/nanoid.js | 38 + .../@wailsio/runtime/dist/runtime.js | 63 + .../@wailsio/runtime/dist/screens.js | 38 + .../@wailsio/runtime/dist/system.js | 116 + .../@wailsio/runtime/dist/utils.js | 95 + .../@wailsio/runtime/dist/window.js | 438 + .../node_modules/@wailsio/runtime/dist/wml.js | 179 + .../@wailsio/runtime/package.json | 62 + .../@wailsio/runtime/types/application.d.ts | 12 + .../@wailsio/runtime/types/browser.d.ts | 6 + .../@wailsio/runtime/types/callable.d.ts | 3 + .../@wailsio/runtime/types/calls.d.ts | 63 + .../@wailsio/runtime/types/cancellable.d.ts | 434 + .../@wailsio/runtime/types/clipboard.d.ts | 13 + .../@wailsio/runtime/types/contextmenu.d.ts | 1 + .../@wailsio/runtime/types/create.d.ts | 31 + .../@wailsio/runtime/types/dialogs.d.ts | 140 + .../@wailsio/runtime/types/drag.d.ts | 1 + .../@wailsio/runtime/types/event_types.d.ts | 218 + .../@wailsio/runtime/types/events.d.ts | 66 + .../@wailsio/runtime/types/flags.d.ts | 7 + .../@wailsio/runtime/types/index.d.ts | 16 + .../@wailsio/runtime/types/listener.d.ts | 9 + .../@wailsio/runtime/types/nanoid.d.ts | 1 + .../@wailsio/runtime/types/runtime.d.ts | 22 + .../@wailsio/runtime/types/screens.d.ts | 60 + .../@wailsio/runtime/types/system.d.ts | 83 + .../@wailsio/runtime/types/utils.d.ts | 21 + .../@wailsio/runtime/types/window.d.ts | 292 + .../@wailsio/runtime/types/wml.d.ts | 8 + .../alova@3.2.10/node_modules/alova/LICENSE | 21 + .../alova@3.2.10/node_modules/alova/README.md | 77 + .../node_modules/alova/README.zh-CN.md | 75 + .../alova/dist/adapter/fetch.common.cjs | 92 + .../alova/dist/adapter/fetch.esm.js | 90 + .../alova/dist/adapter/fetch.umd.js | 150 + .../alova/dist/adapter/fetch.umd.min.js | 1 + .../node_modules/alova/dist/alova.common.cjs | 930 + .../node_modules/alova/dist/alova.esm.js | 921 + .../node_modules/alova/dist/alova.umd.js | 1207 + .../node_modules/alova/dist/alova.umd.min.js | 1 + .../alova/dist/clienthook/index.common.cjs | 3463 + .../alova/dist/clienthook/index.esm.js | 3430 + .../alova/dist/clienthook/index.umd.js | 3897 + .../alova/dist/clienthook/index.umd.min.js | 1 + .../alova/dist/serverhook/index.common.cjs | 865 + .../alova/dist/serverhook/index.esm.js | 861 + .../alova/dist/stateshook/react.common.cjs | 86 + .../alova/dist/stateshook/react.esm.js | 84 + .../alova/dist/stateshook/react.umd.js | 117 + .../alova/dist/stateshook/react.umd.min.js | 1 + .../alova/dist/stateshook/solid.common.cjs | 48 + .../alova/dist/stateshook/solid.esm.js | 46 + .../alova/dist/stateshook/solid.umd.js | 51 + .../alova/dist/stateshook/solid.umd.min.js | 1 + .../alova/dist/stateshook/svelte.common.cjs | 63 + .../alova/dist/stateshook/svelte.esm.js | 61 + .../alova/dist/stateshook/vue-demi.common.cjs | 47 + .../alova/dist/stateshook/vue-demi.esm.js | 45 + .../alova/dist/stateshook/vue-demi.umd.js | 66 + .../alova/dist/stateshook/vue-demi.umd.min.js | 1 + .../alova/dist/stateshook/vue.common.cjs | 52 + .../alova/dist/stateshook/vue.esm.js | 50 + .../alova/dist/stateshook/vue.umd.js | 72 + .../alova/dist/stateshook/vue.umd.min.js | 1 + .../node_modules/alova/package.json | 153 + .../alova/typings/additional.d.ts | 5 + .../alova/typings/clienthook/general.d.ts | 282 + .../alova/typings/clienthook/helper.d.ts | 86 + .../hooks/actionDelegationMiddleware.d.ts | 36 + .../clienthook/hooks/tokenAuthentication.d.ts | 205 + .../typings/clienthook/hooks/updateState.d.ts | 25 + .../clienthook/hooks/useAutoRequest.d.ts | 71 + .../typings/clienthook/hooks/useCaptcha.d.ts | 36 + .../typings/clienthook/hooks/useFetcher.d.ts | 73 + .../typings/clienthook/hooks/useForm.d.ts | 108 + .../clienthook/hooks/usePagination.d.ts | 134 + .../typings/clienthook/hooks/useRequest.d.ts | 36 + .../clienthook/hooks/useRetriable.d.ts | 90 + .../clienthook/hooks/useSQRequest.d.ts | 497 + .../typings/clienthook/hooks/useSSE.d.ts | 122 + .../clienthook/hooks/useSerialRequest.d.ts | 168 + .../clienthook/hooks/useSerialWatcher.d.ts | 175 + .../typings/clienthook/hooks/useWatcher.d.ts | 28 + .../alova/typings/clienthook/index.d.ts | 17 + .../node_modules/alova/typings/fetch.d.cts | 13 + .../node_modules/alova/typings/fetch.d.ts | 11 + .../node_modules/alova/typings/index.d.ts | 802 + .../alova/typings/serverhook.d.ts | 136 + .../alova/typings/stateshook/react.d.ts | 17 + .../alova/typings/stateshook/solid.d.ts | 20 + .../alova/typings/stateshook/svelte.d.ts | 16 + .../alova/typings/stateshook/vue-demi.d.ts | 16 + .../alova/typings/stateshook/vue.d.ts | 16 + .../node_modules/esbuild/LICENSE.md | 21 + .../node_modules/esbuild/README.md | 3 + .../node_modules/esbuild/bin/esbuild | 220 + .../node_modules/esbuild/install.js | 285 + .../node_modules/esbuild/lib/main.d.ts | 705 + .../node_modules/esbuild/lib/main.js | 2239 + .../esbuild/node_modules/.bin/esbuild | 21 + .../esbuild/node_modules/.bin/esbuild.ps1 | 41 + .../node_modules/esbuild/package.json | 46 + node_modules/.pnpm/lock.yaml | 568 + .../nanoid@3.3.11/node_modules/nanoid/LICENSE | 20 + .../node_modules/nanoid/README.md | 39 + .../nanoid/async/index.browser.cjs | 69 + .../nanoid/async/index.browser.js | 34 + .../node_modules/nanoid/async/index.cjs | 71 + .../node_modules/nanoid/async/index.d.ts | 56 + .../node_modules/nanoid/async/index.js | 35 + .../node_modules/nanoid/async/index.native.js | 26 + .../node_modules/nanoid/async/package.json | 12 + .../node_modules/nanoid/bin/nanoid.cjs | 55 + .../node_modules/nanoid/index.browser.cjs | 72 + .../node_modules/nanoid/index.browser.js | 34 + .../node_modules/nanoid/index.cjs | 85 + .../node_modules/nanoid/index.d.cts | 91 + .../node_modules/nanoid/index.d.ts | 91 + .../node_modules/nanoid/index.js | 45 + .../node_modules/nanoid/nanoid.js | 1 + .../nanoid/node_modules/.bin/nanoid | 21 + .../nanoid/node_modules/.bin/nanoid.ps1 | 41 + .../node_modules/nanoid/non-secure/index.cjs | 34 + .../node_modules/nanoid/non-secure/index.d.ts | 33 + .../node_modules/nanoid/non-secure/index.js | 21 + .../nanoid/non-secure/package.json | 6 + .../node_modules/nanoid/package.json | 89 + .../nanoid/url-alphabet/index.cjs | 7 + .../node_modules/nanoid/url-alphabet/index.js | 3 + .../nanoid/url-alphabet/package.json | 6 + node_modules/.pnpm/node_modules/.bin/esbuild | 21 + .../.pnpm/node_modules/.bin/esbuild.ps1 | 41 + node_modules/.pnpm/node_modules/.bin/nanoid | 21 + .../.pnpm/node_modules/.bin/nanoid.ps1 | 41 + node_modules/.pnpm/node_modules/.bin/rollup | 21 + .../.pnpm/node_modules/.bin/rollup.ps1 | 41 + .../node_modules/picocolors/LICENSE | 15 + .../node_modules/picocolors/README.md | 21 + .../node_modules/picocolors/package.json | 25 + .../picocolors/picocolors.browser.js | 4 + .../node_modules/picocolors/picocolors.d.ts | 5 + .../node_modules/picocolors/picocolors.js | 75 + .../node_modules/picocolors/types.d.ts | 51 + .../node_modules/postcss/LICENSE | 20 + .../node_modules/postcss/README.md | 28 + .../node_modules/postcss/lib/at-rule.d.ts | 140 + .../node_modules/postcss/lib/at-rule.js | 25 + .../node_modules/postcss/lib/comment.d.ts | 68 + .../node_modules/postcss/lib/comment.js | 13 + .../node_modules/postcss/lib/container.d.ts | 480 + .../node_modules/postcss/lib/container.js | 447 + .../postcss/lib/css-syntax-error.d.ts | 248 + .../postcss/lib/css-syntax-error.js | 133 + .../node_modules/postcss/lib/declaration.d.ts | 151 + .../node_modules/postcss/lib/declaration.js | 24 + .../node_modules/postcss/lib/document.d.ts | 69 + .../node_modules/postcss/lib/document.js | 33 + .../node_modules/postcss/lib/fromJSON.d.ts | 9 + .../node_modules/postcss/lib/fromJSON.js | 54 + .../node_modules/postcss/lib/input.d.ts | 206 + .../node_modules/postcss/lib/input.js | 251 + .../node_modules/postcss/lib/lazy-result.d.ts | 190 + .../node_modules/postcss/lib/lazy-result.js | 550 + .../node_modules/postcss/lib/list.d.ts | 60 + .../node_modules/postcss/lib/list.js | 58 + .../node_modules/postcss/lib/map-generator.js | 368 + .../postcss/lib/no-work-result.d.ts | 46 + .../postcss/lib/no-work-result.js | 138 + .../node_modules/postcss/lib/node.d.ts | 541 + .../node_modules/postcss/lib/node.js | 434 + .../node_modules/postcss/lib/parse.d.ts | 9 + .../node_modules/postcss/lib/parse.js | 42 + .../node_modules/postcss/lib/parser.js | 611 + .../node_modules/postcss/lib/postcss.d.mts | 69 + .../node_modules/postcss/lib/postcss.d.ts | 458 + .../node_modules/postcss/lib/postcss.js | 101 + .../node_modules/postcss/lib/postcss.mjs | 30 + .../postcss/lib/previous-map.d.ts | 81 + .../node_modules/postcss/lib/previous-map.js | 144 + .../node_modules/postcss/lib/processor.d.ts | 115 + .../node_modules/postcss/lib/processor.js | 67 + .../node_modules/postcss/lib/result.d.ts | 205 + .../node_modules/postcss/lib/result.js | 42 + .../node_modules/postcss/lib/root.d.ts | 87 + .../node_modules/postcss/lib/root.js | 61 + .../node_modules/postcss/lib/rule.d.ts | 126 + .../node_modules/postcss/lib/rule.js | 27 + .../node_modules/postcss/lib/stringifier.d.ts | 46 + .../node_modules/postcss/lib/stringifier.js | 353 + .../node_modules/postcss/lib/stringify.d.ts | 9 + .../node_modules/postcss/lib/stringify.js | 11 + .../node_modules/postcss/lib/symbols.js | 5 + .../postcss/lib/terminal-highlight.js | 70 + .../node_modules/postcss/lib/tokenize.js | 266 + .../node_modules/postcss/lib/warn-once.js | 13 + .../node_modules/postcss/lib/warning.d.ts | 147 + .../node_modules/postcss/lib/warning.js | 37 + .../postcss/node_modules/.bin/nanoid | 21 + .../postcss/node_modules/.bin/nanoid.ps1 | 41 + .../node_modules/postcss/package.json | 88 + .../rate-limiter-flexible/.editorconfig | 13 + .../rate-limiter-flexible/LICENSE.md | 7 + .../rate-limiter-flexible/README.md | 260 + .../rate-limiter-flexible/index.js | 33 + .../lib/BurstyRateLimiter.js | 78 + .../lib/ExpressBruteFlexible.js | 347 + .../lib/RLWrapperBlackAndWhite.js | 195 + .../lib/RateLimiterAbstract.js | 125 + .../lib/RateLimiterCluster.js | 367 + .../lib/RateLimiterDynamo.js | 393 + .../lib/RateLimiterMemcache.js | 150 + .../lib/RateLimiterMemory.js | 106 + .../lib/RateLimiterMongo.js | 279 + .../lib/RateLimiterMySQL.js | 379 + .../lib/RateLimiterPostgres.js | 329 + .../lib/RateLimiterPrisma.js | 127 + .../lib/RateLimiterQueue.js | 127 + .../lib/RateLimiterRedis.js | 178 + .../lib/RateLimiterRes.js | 64 + .../lib/RateLimiterStoreAbstract.js | 384 + .../lib/RateLimiterUnion.js | 51 + .../lib/component/BlockedKeys/BlockedKeys.js | 75 + .../lib/component/BlockedKeys/index.js | 3 + .../component/MemoryStorage/MemoryStorage.js | 83 + .../lib/component/MemoryStorage/Record.js | 40 + .../lib/component/MemoryStorage/index.js | 3 + .../lib/component/RateLimiterQueueError.js | 13 + .../lib/component/index.d.ts | 9 + .../rate-limiter-flexible/lib/constants.js | 18 + .../rate-limiter-flexible/lib/index.d.ts | 407 + .../rate-limiter-flexible/package.json | 69 + .../node_modules/rollup/LICENSE.md | 681 + .../node_modules/rollup/README.md | 134 + .../node_modules/rollup/dist/bin/rollup | 1856 + .../rollup/dist/es/getLogFilter.js | 64 + .../node_modules/rollup/dist/es/package.json | 1 + .../node_modules/rollup/dist/es/parseAst.js | 12 + .../node_modules/rollup/dist/es/rollup.js | 17 + .../rollup/dist/es/shared/node-entry.js | 23695 ++++++ .../rollup/dist/es/shared/parseAst.js | 2073 + .../rollup/dist/es/shared/watch.js | 9297 +++ .../rollup/dist/getLogFilter.d.ts | 5 + .../node_modules/rollup/dist/getLogFilter.js | 69 + .../rollup/dist/loadConfigFile.d.ts | 20 + .../rollup/dist/loadConfigFile.js | 29 + .../node_modules/rollup/dist/native.js | 110 + .../node_modules/rollup/dist/parseAst.d.ts | 4 + .../node_modules/rollup/dist/parseAst.js | 22 + .../node_modules/rollup/dist/rollup.d.ts | 1104 + .../node_modules/rollup/dist/rollup.js | 128 + .../rollup/dist/shared/fsevents-importer.js | 37 + .../node_modules/rollup/dist/shared/index.js | 9003 +++ .../rollup/dist/shared/loadConfigFile.js | 559 + .../rollup/dist/shared/parseAst.js | 2301 + .../node_modules/rollup/dist/shared/rollup.js | 23603 ++++++ .../rollup/dist/shared/watch-cli.js | 542 + .../node_modules/rollup/dist/shared/watch.js | 324 + .../rollup/node_modules/.bin/rollup | 21 + .../rollup/node_modules/.bin/rollup.ps1 | 41 + .../node_modules/rollup/package.json | 269 + .../node_modules/source-map-js/LICENSE | 28 + .../node_modules/source-map-js/README.md | 765 + .../source-map-js/lib/array-set.js | 121 + .../source-map-js/lib/base64-vlq.js | 140 + .../node_modules/source-map-js/lib/base64.js | 67 + .../source-map-js/lib/binary-search.js | 111 + .../source-map-js/lib/mapping-list.js | 79 + .../source-map-js/lib/quick-sort.js | 132 + .../lib/source-map-consumer.d.ts | 1 + .../source-map-js/lib/source-map-consumer.js | 1188 + .../lib/source-map-generator.d.ts | 1 + .../source-map-js/lib/source-map-generator.js | 444 + .../source-map-js/lib/source-node.d.ts | 1 + .../source-map-js/lib/source-node.js | 413 + .../node_modules/source-map-js/lib/util.js | 594 + .../node_modules/source-map-js/package.json | 71 + .../source-map-js/source-map.d.ts | 104 + .../node_modules/source-map-js/source-map.js | 8 + .../vite@5.4.19/node_modules/vite/LICENSE.md | 3423 + .../vite@5.4.19/node_modules/vite/README.md | 20 + .../vite/bin/openChrome.applescript | 95 + .../vite@5.4.19/node_modules/vite/bin/vite.js | 61 + .../vite@5.4.19/node_modules/vite/client.d.ts | 256 + .../node_modules/vite/dist/client/client.mjs | 829 + .../node_modules/vite/dist/client/env.mjs | 24 + .../vite/dist/node-cjs/publicUtils.cjs | 6171 ++ .../vite/dist/node/chunks/dep-C6uTJdX2.js | 67031 ++++++++++++++++ .../vite/dist/node/chunks/dep-CEGXe0Sr.js | 7004 ++ .../vite/dist/node/chunks/dep-COdkJwUb.js | 993 + .../vite/dist/node/chunks/dep-D-7KCb9p.js | 7960 ++ .../vite/dist/node/chunks/dep-IQS-Za7F.js | 561 + .../node_modules/vite/dist/node/cli.js | 917 + .../node_modules/vite/dist/node/constants.js | 113 + .../node_modules/vite/dist/node/index.d.ts | 3627 + .../node_modules/vite/dist/node/index.js | 261 + .../node_modules/vite/dist/node/runtime.d.ts | 63 + .../node_modules/vite/dist/node/runtime.js | 1066 + .../vite/dist/node/types.d-aGj9QkWt.d.ts | 281 + .../vite@5.4.19/node_modules/vite/index.cjs | 60 + .../vite@5.4.19/node_modules/vite/index.d.cts | 6 + .../vite/node_modules/.bin/esbuild | 21 + .../vite/node_modules/.bin/esbuild.ps1 | 41 + .../vite/node_modules/.bin/rollup | 21 + .../vite/node_modules/.bin/rollup.ps1 | 41 + .../node_modules/vite/node_modules/.bin/vite | 21 + .../vite/node_modules/.bin/vite.ps1 | 41 + .../node_modules/vite/package.json | 191 + .../node_modules/vite/types/customEvent.d.ts | 39 + .../node_modules/vite/types/hmrPayload.d.ts | 65 + .../node_modules/vite/types/hot.d.ts | 36 + .../node_modules/vite/types/import-meta.d.ts | 5 + .../node_modules/vite/types/importGlob.d.ts | 75 + .../node_modules/vite/types/importMeta.d.ts | 22 + .../node_modules/vite/types/metadata.d.ts | 10 + .../node_modules/vite/types/package.json | 4 + node_modules/.vite/deps/_metadata.json | 25 + node_modules/.vite/deps/alova.js | 752 + node_modules/.vite/deps/alova_fetch.js | 92 + node_modules/.vite/deps/chunk-BBH5XXYJ.js | 203 + node_modules/.vite/deps/package.json | 3 + package-lock.json | 867 + package.json | 19 + pnpm-lock.yaml | 568 + public/assets/HarmonyOS_Sans_Regular.ttf | Bin 0 -> 146616 bytes public/assets/HarmonyOS_Sans_SC_Regular.ttf | Bin 0 -> 8261128 bytes public/assets/act.png | Bin 0 -> 62877 bytes public/assets/bg.mp4 | Bin 0 -> 3214677 bytes public/assets/bg.png | Bin 0 -> 102622 bytes public/assets/bg.svg | 10 + public/assets/face.svg | 9 + public/assets/logo.svg | 25 + public/assets/map.png | Bin 0 -> 188785 bytes public/assets/map1.png | Bin 0 -> 187441 bytes public/assets/member.png | Bin 0 -> 305380 bytes public/assets/rod.svg | 17 + public/assets/start.png | Bin 0 -> 72588 bytes public/assets/start.svg | 40 + public/assets/stop.svg | 22 + public/assets/title_bg.png | Bin 0 -> 37801 bytes public/assets/weather.png | Bin 0 -> 1560 bytes public/assets/xsj.png | Bin 0 -> 227460 bytes public/iflyrec/crypto-js.js | 5736 ++ public/iflyrec/index.cjs.js | 1 + public/iflyrec/index.d.ts | 30 + public/iflyrec/index.esm.js | 1 + public/iflyrec/index.umd.js | 1 + public/iflyrec/processor.worker.js | 1 + public/iflyrec/processor.worklet.js | 1 + public/style.css | 94 + recorder.js | 168 + util.js | 167 + 392 files changed, 237278 insertions(+) create mode 100644 Inter Font License.txt create mode 100644 bindings/djdemo/greetservice.js create mode 100644 bindings/djdemo/index.js create mode 100644 bindings/djdemo/models.js create mode 100644 index.html create mode 100644 main copy.js create mode 100644 main.js create mode 100644 node_modules/.bin/vite create mode 100644 node_modules/.bin/vite.ps1 create mode 100644 node_modules/.pnpm-workspace-state.json create mode 100644 node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/LICENSE create mode 100644 node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/dist/alova-shared.common.cjs create mode 100644 node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/dist/alova-shared.esm.js create mode 100644 node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/package.json create mode 100644 node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/typings/alova-shared.d.ts create mode 100644 node_modules/.pnpm/@esbuild+win32-x64@0.21.5/node_modules/@esbuild/win32-x64/README.md create mode 100644 node_modules/.pnpm/@esbuild+win32-x64@0.21.5/node_modules/@esbuild/win32-x64/package.json create mode 100644 node_modules/.pnpm/@rollup+rollup-win32-x64-msvc@4.40.2/node_modules/@rollup/rollup-win32-x64-msvc/README.md create mode 100644 node_modules/.pnpm/@rollup+rollup-win32-x64-msvc@4.40.2/node_modules/@rollup/rollup-win32-x64-msvc/package.json create mode 100644 node_modules/.pnpm/@rollup+rollup-win32-x64-msvc@4.40.2/node_modules/@rollup/rollup-win32-x64-msvc/rollup.win32-x64-msvc.node create mode 100644 node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/LICENSE create mode 100644 node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/README.md create mode 100644 node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/flow.d.ts create mode 100644 node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/index.d.ts create mode 100644 node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/package.json create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/application.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/browser.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/callable.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/calls.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/cancellable.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/clipboard.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/contextmenu.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/create.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/dialogs.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/drag.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/event_types.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/events.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/flags.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/index.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/listener.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/nanoid.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/runtime.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/screens.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/system.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/utils.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/window.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/wml.js create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/package.json create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/application.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/browser.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/callable.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/calls.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/cancellable.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/clipboard.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/contextmenu.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/create.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/dialogs.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/drag.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/event_types.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/events.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/flags.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/index.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/listener.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/nanoid.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/runtime.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/screens.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/system.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/utils.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/window.d.ts create mode 100644 node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/wml.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/LICENSE create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/README.md create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/README.zh-CN.md create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.common.cjs create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.esm.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.umd.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.umd.min.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.common.cjs create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.esm.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.umd.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.umd.min.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.common.cjs create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.esm.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.umd.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.umd.min.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/serverhook/index.common.cjs create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/serverhook/index.esm.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.common.cjs create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.esm.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.umd.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.umd.min.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.common.cjs create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.esm.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.umd.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.umd.min.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/svelte.common.cjs create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/svelte.esm.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.common.cjs create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.esm.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.umd.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.umd.min.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.common.cjs create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.esm.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.umd.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.umd.min.js create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/package.json create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/additional.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/general.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/helper.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/actionDelegationMiddleware.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/tokenAuthentication.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/updateState.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useAutoRequest.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useCaptcha.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useFetcher.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useForm.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/usePagination.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useRequest.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useRetriable.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSQRequest.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSSE.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSerialRequest.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSerialWatcher.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useWatcher.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/index.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/fetch.d.cts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/fetch.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/index.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/serverhook.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/react.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/solid.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/svelte.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/vue-demi.d.ts create mode 100644 node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/vue.d.ts create mode 100644 node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/LICENSE.md create mode 100644 node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/README.md create mode 100644 node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/bin/esbuild create mode 100644 node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/install.js create mode 100644 node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/lib/main.d.ts create mode 100644 node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/lib/main.js create mode 100644 node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/node_modules/.bin/esbuild create mode 100644 node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/node_modules/.bin/esbuild.ps1 create mode 100644 node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/package.json create mode 100644 node_modules/.pnpm/lock.yaml create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/LICENSE create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/README.md create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.browser.cjs create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.browser.js create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.cjs create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.d.ts create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.js create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.native.js create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/package.json create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/nanoid.cjs create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.browser.cjs create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.browser.js create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.cjs create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.d.cts create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.d.ts create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.js create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/nanoid.js create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules/.bin/nanoid create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules/.bin/nanoid.ps1 create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/index.cjs create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/index.d.ts create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/index.js create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/package.json create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/package.json create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/url-alphabet/index.cjs create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/url-alphabet/index.js create mode 100644 node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/url-alphabet/package.json create mode 100644 node_modules/.pnpm/node_modules/.bin/esbuild create mode 100644 node_modules/.pnpm/node_modules/.bin/esbuild.ps1 create mode 100644 node_modules/.pnpm/node_modules/.bin/nanoid create mode 100644 node_modules/.pnpm/node_modules/.bin/nanoid.ps1 create mode 100644 node_modules/.pnpm/node_modules/.bin/rollup create mode 100644 node_modules/.pnpm/node_modules/.bin/rollup.ps1 create mode 100644 node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/LICENSE create mode 100644 node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/README.md create mode 100644 node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/package.json create mode 100644 node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.browser.js create mode 100644 node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.d.ts create mode 100644 node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js create mode 100644 node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/types.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/LICENSE create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/README.md create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/at-rule.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/at-rule.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/comment.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/comment.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/container.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/container.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/css-syntax-error.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/css-syntax-error.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/declaration.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/declaration.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/document.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/document.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/fromJSON.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/fromJSON.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/input.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/input.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/lazy-result.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/lazy-result.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/list.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/list.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/map-generator.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/no-work-result.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/no-work-result.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/node.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/node.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/parse.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/parse.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/parser.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/postcss.d.mts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/postcss.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/postcss.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/postcss.mjs create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/previous-map.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/previous-map.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/processor.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/processor.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/result.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/result.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/root.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/root.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/rule.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/rule.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/stringifier.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/stringifier.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/stringify.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/stringify.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/symbols.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/terminal-highlight.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/tokenize.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/warn-once.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/warning.d.ts create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/warning.js create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/node_modules/.bin/nanoid create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/node_modules/.bin/nanoid.ps1 create mode 100644 node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/package.json create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/.editorconfig create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/LICENSE.md create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/README.md create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/index.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/BurstyRateLimiter.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/ExpressBruteFlexible.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RLWrapperBlackAndWhite.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RateLimiterAbstract.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RateLimiterCluster.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RateLimiterDynamo.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RateLimiterMemcache.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RateLimiterMemory.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RateLimiterMongo.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RateLimiterMySQL.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RateLimiterPostgres.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RateLimiterPrisma.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RateLimiterQueue.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RateLimiterRedis.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RateLimiterRes.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RateLimiterStoreAbstract.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/RateLimiterUnion.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/component/BlockedKeys/BlockedKeys.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/component/BlockedKeys/index.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/component/MemoryStorage/MemoryStorage.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/component/MemoryStorage/Record.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/component/MemoryStorage/index.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/component/RateLimiterQueueError.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/component/index.d.ts create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/constants.js create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/lib/index.d.ts create mode 100644 node_modules/.pnpm/rate-limiter-flexible@5.0.5/node_modules/rate-limiter-flexible/package.json create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/LICENSE.md create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/README.md create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/bin/rollup create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/es/getLogFilter.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/es/package.json create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/es/parseAst.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/es/rollup.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/es/shared/node-entry.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/es/shared/parseAst.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/es/shared/watch.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/getLogFilter.d.ts create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/getLogFilter.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/loadConfigFile.d.ts create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/loadConfigFile.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/native.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/parseAst.d.ts create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/parseAst.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/rollup.d.ts create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/rollup.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/shared/fsevents-importer.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/shared/index.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/shared/loadConfigFile.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/shared/parseAst.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/shared/rollup.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/shared/watch-cli.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/shared/watch.js create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/node_modules/.bin/rollup create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/node_modules/.bin/rollup.ps1 create mode 100644 node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/package.json create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/LICENSE create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/README.md create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/array-set.js create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/base64-vlq.js create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/base64.js create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/binary-search.js create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/mapping-list.js create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/quick-sort.js create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/source-map-consumer.d.ts create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/source-map-consumer.js create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/source-map-generator.d.ts create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/source-map-generator.js create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/source-node.d.ts create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/source-node.js create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/util.js create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/package.json create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/source-map.d.ts create mode 100644 node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/source-map.js create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/LICENSE.md create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/README.md create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/bin/openChrome.applescript create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/bin/vite.js create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/client.d.ts create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/client/client.mjs create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/client/env.mjs create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/node-cjs/publicUtils.cjs create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/node/chunks/dep-C6uTJdX2.js create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/node/chunks/dep-CEGXe0Sr.js create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/node/chunks/dep-COdkJwUb.js create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/node/chunks/dep-D-7KCb9p.js create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/node/chunks/dep-IQS-Za7F.js create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/node/cli.js create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/node/constants.js create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/node/index.d.ts create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/node/index.js create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/node/runtime.d.ts create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/node/runtime.js create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/dist/node/types.d-aGj9QkWt.d.ts create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/index.cjs create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/index.d.cts create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/node_modules/.bin/esbuild create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/node_modules/.bin/esbuild.ps1 create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/node_modules/.bin/rollup create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/node_modules/.bin/rollup.ps1 create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/node_modules/.bin/vite create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/node_modules/.bin/vite.ps1 create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/package.json create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/types/customEvent.d.ts create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/types/hmrPayload.d.ts create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/types/hot.d.ts create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/types/import-meta.d.ts create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/types/importGlob.d.ts create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/types/importMeta.d.ts create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/types/metadata.d.ts create mode 100644 node_modules/.pnpm/vite@5.4.19/node_modules/vite/types/package.json create mode 100644 node_modules/.vite/deps/_metadata.json create mode 100644 node_modules/.vite/deps/alova.js create mode 100644 node_modules/.vite/deps/alova_fetch.js create mode 100644 node_modules/.vite/deps/chunk-BBH5XXYJ.js create mode 100644 node_modules/.vite/deps/package.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 public/assets/HarmonyOS_Sans_Regular.ttf create mode 100644 public/assets/HarmonyOS_Sans_SC_Regular.ttf create mode 100644 public/assets/act.png create mode 100644 public/assets/bg.mp4 create mode 100644 public/assets/bg.png create mode 100644 public/assets/bg.svg create mode 100644 public/assets/face.svg create mode 100644 public/assets/logo.svg create mode 100644 public/assets/map.png create mode 100644 public/assets/map1.png create mode 100644 public/assets/member.png create mode 100644 public/assets/rod.svg create mode 100644 public/assets/start.png create mode 100644 public/assets/start.svg create mode 100644 public/assets/stop.svg create mode 100644 public/assets/title_bg.png create mode 100644 public/assets/weather.png create mode 100644 public/assets/xsj.png create mode 100644 public/iflyrec/crypto-js.js create mode 100644 public/iflyrec/index.cjs.js create mode 100644 public/iflyrec/index.d.ts create mode 100644 public/iflyrec/index.esm.js create mode 100644 public/iflyrec/index.umd.js create mode 100644 public/iflyrec/processor.worker.js create mode 100644 public/iflyrec/processor.worklet.js create mode 100644 public/style.css create mode 100644 recorder.js create mode 100644 util.js diff --git a/Inter Font License.txt b/Inter Font License.txt new file mode 100644 index 0000000..b525cbf --- /dev/null +++ b/Inter Font License.txt @@ -0,0 +1,93 @@ +Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/bindings/djdemo/greetservice.js b/bindings/djdemo/greetservice.js new file mode 100644 index 0000000..f8d3c5d --- /dev/null +++ b/bindings/djdemo/greetservice.js @@ -0,0 +1,36 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import {Call as $Call, Create as $Create} from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as $models from "./models.js"; + +/** + * @param {string} text + * @returns {Promise<$models.CustomerRes> & { cancel(): void }} + */ +export function Customer(text) { + let $resultPromise = /** @type {any} */($Call.ByID(95760012, text)); + let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $$createType0($result); + })); + $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); + return $typingPromise; +} + +/** + * @param {string} name + * @returns {Promise & { cancel(): void }} + */ +export function Greet(name) { + let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); + return $resultPromise; +} + +// Private type creation functions +const $$createType0 = $models.CustomerRes.createFrom; diff --git a/bindings/djdemo/index.js b/bindings/djdemo/index.js new file mode 100644 index 0000000..130c30a --- /dev/null +++ b/bindings/djdemo/index.js @@ -0,0 +1,10 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as GreetService from "./greetservice.js"; +export { + GreetService +}; + +export * from "./models.js"; diff --git a/bindings/djdemo/models.js b/bindings/djdemo/models.js new file mode 100644 index 0000000..0e179ec --- /dev/null +++ b/bindings/djdemo/models.js @@ -0,0 +1,54 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import {Create as $Create} from "@wailsio/runtime"; + +/** + * 返回类型 + * 1. text 固定回答内容 + * 2. shopList [{name,shopNum,intro,logo}] + * 3. shop [{name,intro,logo}] + * 4. facility 设施名称 + * 5. film 转换成 shop + * 6. activity [{name,intro,logo}] + * 7. weather 天气 + * 8. time 时间 + * 9. other 其它 + */ +export class CustomerRes { + /** + * Creates a new CustomerRes instance. + * @param {Partial} [$$source = {}] - The source object to create the CustomerRes. + */ + constructor($$source = {}) { + if (!("Cate" in $$source)) { + /** + * @member + * @type {string} + */ + this["Cate"] = ""; + } + if (!("Value" in $$source)) { + /** + * @member + * @type {any} + */ + this["Value"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new CustomerRes instance from a string or object. + * @param {any} [$$source = {}] + * @returns {CustomerRes} + */ + static createFrom($$source = {}) { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new CustomerRes(/** @type {Partial} */($$parsedSource)); + } +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..2a07d1e --- /dev/null +++ b/index.html @@ -0,0 +1,49 @@ + + + + + + + + Wails App + + +
+ + + +
+ +
+ + +
+ +
+ +
+
    +
  • + AI小红帽 +
  • +
  • +
    您好呀,有什么需要帮助的吗?
    +
  • +
+
+ + + + + +
+ + + + + diff --git a/main copy.js b/main copy.js new file mode 100644 index 0000000..cbf659d --- /dev/null +++ b/main copy.js @@ -0,0 +1,51 @@ +
+ +

Wails + Javascript

+
+
Please enter your name below 👇
+
+ + +
+
+ +
+ +import {GreetService} from "./bindings/djdemo"; +import {Events} from "@wailsio/runtime"; + +const resultElement = document.getElementById('result'); +const timeElement = document.getElementById('time'); + +window.doGreet = () => { + let name = document.getElementById('name').value; + if (!name) { + name = 'anonymous'; + } + GreetService.Greet(name).then((result) => { + resultElement.innerText = result; + }).catch((err) => { + console.log(err); + }); + + GreetService.Customer(name).then((result) => { + console.log(result.Cate) + console.log(result.Value) + }).catch((err) => { + console.log(err); + }); +} + +Events.On('time', (time) => { + timeElement.innerText = time.data; +}); diff --git a/main.js b/main.js new file mode 100644 index 0000000..bf8ef2e --- /dev/null +++ b/main.js @@ -0,0 +1,170 @@ +import { onchangeSize,initDate,setScrollPosition,addBackItemText,addItemImg,addAvdi,addredHot,addBackItemAction } from "./util.js"; +import { btnStatus,recorder,getWebSocketUrl,connectWebSocket } from "./recorder.js" + + +import { createAlova } from 'alova'; +import adapterFetch from 'alova/fetch'; + +const alovaInstance = createAlova({ + requestAdapter: adapterFetch(), + responded: response => response.json() +}); + +window.cli = null +window.woNode = null +window.woVoice = null + +window.onload = () => { + onchangeSize(); + window.addEventListener("resize",onchangeSize); + initDate(); //初始化时间 + setScrollPosition(); //自动滚动到底部 +} + + +let addMy = () => { + window. woNode = document.createElement("li"); + window.woNode.className = "right" + window.woNode.innerHTML=""; + document.getElementById("cont").appendChild(window.woNode); + + window.woVoice = document.createElement("li"); + window.woVoice.className = "right" + document.getElementById("cont").appendChild(window.woVoice); + window.cli = document.createElement("div"); + window.woVoice.appendChild(window.cli); +} + + + + +window.audioStart = () => { + //开始识别 + if (btnStatus === "UNDEFINED" || btnStatus === "CLOSED") { + connectWebSocket(); + document.getElementById("stopBnt").style.display = "block"; + document.getElementById("startBnt").style.display = "none"; + addMy(); //添加我气泡 + setScrollPosition(); + } +} + +function delMy(){ + if(window.cli && !window.cli.innerText){ + window.woVoice.remove(); + window.woNode.remove(); + window.woNode = null; + window.cli = null; + window.woVoice = null; + } +} + +//接收模型回复处理内容 +function callBack(str){ + document.getElementById("ing").remove(); + // let obj = JSON.parse(str); + let obj = str; + addredHot(); + if(obj.code == 200){ + switch(obj.data.type){ + case "shopList" : + obj.data.value.forEach((item, index)=>{ + addBackItemAction(item); + }); + break; + case "activity" : + obj.data.value.forEach((item, index)=>{ + addBackItemAction(item); + }); + break; + case "shop" : + try{ + if(typeof obj.data.value.length == "number"){ + addBackItemText(`${obj.data.value[0].name}位于商场 ${obj.data.value[0].house_number},\n下方为您推荐导航线路`); + addItemImg("./assets/map.png"); + }else{ + addBackItemText(`${obj.data.value.name}位于商场 ${obj.data.value.house_number},\n下方为您推荐导航线路`); + addItemImg("./assets/map.png"); + } + }catch(e){ + + } + break; + case "facility" : + if(typeof obj.data.value.length == "number"){ + addBackItemText(`下方为您推荐导航到${obj.data.value}的线路`); + addItemImg("./assets/map1.png"); + }else{ + addBackItemText(`下方为您推荐导航到${obj.data.value}的线路`); + addItemImg("./assets/map1.png"); + } + break; + case "weather" : + addBackItemText(`${obj.data.value.city}今天天气${obj.data.value.dayweather},最高温度${obj.data.value.daytemp_float}`); + break; + default : + addBackItemText(obj.data.value); + break; + } + + } + addAvdi(); +} + + +let getAiData = async (msg) => { + const response = await alovaInstance.Post('http://dify.123.1000my.com:59222/v1/workflows/run', { + inputs: { + "question": msg + }, + response_mode: 'blocking', + user: 'djdemo' + },{ + headers: { + 'Authorization': 'Bearer app-DjzwAeiecJhqdavo6Xev0fUr' + } + }); + console.log(response) + let res = { + code:200, + data: { + "type": response.data?.outputs?.type, + "value": response.data?.outputs?.value + } + } + callBack(res) +} + +function callAiModel(msg){ + console.log(msg) + // 调用模型 + addBackItemText("思考中...","ing") + setScrollPosition(); + // 调用容器方法获得返回 + // 模拟回复 + // callBack('{"code":200,"data":{"type":"shopList","value":[{"name":"夏日精选活动","intro":"夏日精选活动夏日精选活动夏日精选活动夏日精选活动夏日精选活动","logo":"./assets/act.png"},{"name":"夏日精选活动","intro":"夏日精选活动夏日精选活动夏日精选活动夏日精选活动夏日精选活动","shopNum":"L101","logo":"./assets/act.png"}]}}'); + // 调用api + getAiData(msg) + +} + +//停止识别后动作 +window.audioStop = () => { + console.log("audioStop") + console.log(btnStatus) + //停止识别 + if (btnStatus === "CONNECTING" || btnStatus === "OPEN") { + // 结束录音 + recorder.stop(); + }else if (btnStatus === "CLOSED"){ + document.getElementById("stopBnt").style.display = "none"; + document.getElementById("startBnt").style.display = "block"; + delMy(); //没有收到语音,删除空气泡 + // 调用模型 + callAiModel(window.cli.innerText) + } + + +} + + diff --git a/node_modules/.bin/vite b/node_modules/.bin/vite new file mode 100644 index 0000000..1e9e736 --- /dev/null +++ b/node_modules/.bin/vite @@ -0,0 +1,21 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/vite@5.4.19/node_modules/vite/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/vite@5.4.19/node_modules/vite/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/vite@5.4.19/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/vite@5.4.19/node_modules/vite/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/vite@5.4.19/node_modules/vite/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/vite@5.4.19/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../vite/bin/vite.js" "$@" +else + exec node "$basedir/../vite/bin/vite.js" "$@" +fi diff --git a/node_modules/.bin/vite.ps1 b/node_modules/.bin/vite.ps1 new file mode 100644 index 0000000..de70195 --- /dev/null +++ b/node_modules/.bin/vite.ps1 @@ -0,0 +1,41 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +$pathsep=":" +$env_node_path=$env:NODE_PATH +$new_node_path="F:\htmlWork\TestCode\frontend\node_modules\.pnpm\vite@5.4.19\node_modules\vite\bin\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\vite@5.4.19\node_modules\vite\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\vite@5.4.19\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\node_modules" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" + $pathsep=";" +} else { + $new_node_path="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/vite@5.4.19/node_modules/vite/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/vite@5.4.19/node_modules/vite/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/vite@5.4.19/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules" +} +if ([string]::IsNullOrEmpty($env_node_path)) { + $env:NODE_PATH=$new_node_path +} else { + $env:NODE_PATH="$new_node_path$pathsep$env_node_path" +} + +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../vite/bin/vite.js" $args + } else { + & "$basedir/node$exe" "$basedir/../vite/bin/vite.js" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../vite/bin/vite.js" $args + } else { + & "node$exe" "$basedir/../vite/bin/vite.js" $args + } + $ret=$LASTEXITCODE +} +$env:NODE_PATH=$env_node_path +exit $ret diff --git a/node_modules/.pnpm-workspace-state.json b/node_modules/.pnpm-workspace-state.json new file mode 100644 index 0000000..336776a --- /dev/null +++ b/node_modules/.pnpm-workspace-state.json @@ -0,0 +1,25 @@ +{ + "lastValidatedTimestamp": 1747032412126, + "projects": {}, + "pnpmfileExists": false, + "settings": { + "autoInstallPeers": true, + "dedupeDirectDeps": false, + "dedupeInjectedDeps": true, + "dedupePeerDependents": true, + "dev": true, + "excludeLinksFromLockfile": false, + "hoistPattern": [ + "*" + ], + "hoistWorkspacePackages": true, + "injectWorkspacePackages": false, + "linkWorkspacePackages": false, + "nodeLinker": "isolated", + "optional": true, + "preferWorkspacePackages": false, + "production": true, + "publicHoistPattern": [] + }, + "filteredInstall": false +} diff --git a/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/LICENSE b/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/LICENSE new file mode 100644 index 0000000..4a56f14 --- /dev/null +++ b/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 JOU Amjs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/dist/alova-shared.common.cjs b/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/dist/alova-shared.common.cjs new file mode 100644 index 0000000..66f8e57 --- /dev/null +++ b/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/dist/alova-shared.common.cjs @@ -0,0 +1,607 @@ +/** + * @alova/shared 1.1.2 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2024 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +'use strict'; + +const undefStr = 'undefined'; +// The following unified processing functions or variables added to reduce the amount of compiled code +const PromiseCls = Promise; +const promiseResolve = (value) => PromiseCls.resolve(value); +const promiseReject = (value) => PromiseCls.reject(value); +const ObjectCls = Object; +const RegExpCls = RegExp; +const undefinedValue = undefined; +const nullValue = null; +const trueValue = true; +const falseValue = false; +const promiseThen = (promise, onFulfilled, onrejected) => promise.then(onFulfilled, onrejected); +const promiseCatch = (promise, onrejected) => promise.catch(onrejected); +const promiseFinally = (promise, onfinally) => promise.finally(onfinally); +const JSONStringify = (value, replacer, space) => JSON.stringify(value, replacer, space); +const JSONParse = (value) => JSON.parse(value); +const setTimeoutFn = (fn, delay = 0) => setTimeout(fn, delay); +const clearTimeoutTimer = (timer) => clearTimeout(timer); +const objectKeys = (obj) => ObjectCls.keys(obj); +const objectValues = (obj) => ObjectCls.values(obj); +const forEach = (ary, fn) => ary.forEach(fn); +const pushItem = (ary, ...item) => ary.push(...item); +const mapItem = (ary, callbackfn) => ary.map(callbackfn); +const filterItem = (ary, predicate) => ary.filter(predicate); +const shift = (ary) => ary.shift(); +const slice = (ary, start, end) => ary.slice(start, end); +const splice = (ary, start, deleteCount = 0, ...items) => ary.splice(start, deleteCount, ...items); +const len = (data) => data.length; +const isArray = (arg) => Array.isArray(arg); +const deleteAttr = (arg, attr) => delete arg[attr]; +const typeOf = (arg) => typeof arg; +const regexpTest = (reg, str) => reg.test(`${str}`); +const includes = (ary, target) => ary.includes(target); +const valueObject = (value, writable = falseValue) => ({ value, writable }); +const defineProperty = (o, key, value, isDescriptor = falseValue) => ObjectCls.defineProperty(o, key, isDescriptor ? value : valueObject(value, falseValue)); +// Whether it is running on the server side, node and bun are judged by process, and deno is judged by Deno. +// Some frameworks (such as Alipay and uniapp) will inject the process object as a global variable. +// Therefore, the process.cwd function unique to the server is used as the basis for judgment. +const isSSR = typeof window === undefStr && + (typeof process !== undefStr ? typeof process.cwd === 'function' : typeof Deno !== undefStr); +/** cache mode */ +// only cache in memory, it's default option +const MEMORY = 'memory'; +// persistent cache, and will be read to memory when page is refreshed, it means that the memory cache always exist until cache is expired. +const STORAGE_RESTORE = 'restore'; + +/** + * Empty function for compatibility processing + */ +const noop = () => { }; +/** + * A function that returns the parameter itself, used for compatibility processing + * Since some systems use self as a reserved word, $self is used to distinguish it. + * @param arg any parameter + * @returns return parameter itself + */ +const $self = (arg) => arg; +/** + * Determine whether the parameter is a function any parameter + * @returns Whether the parameter is a function + */ +const isFn = (arg) => typeOf(arg) === 'function'; +/** + * Determine whether the parameter is a number any parameter + * @returns Whether the parameter is a number + */ +const isNumber = (arg) => typeOf(arg) === 'number' && !Number.isNaN(arg); +/** + * Determine whether the parameter is a string any parameter + * @returns Whether the parameter is a string + */ +const isString = (arg) => typeOf(arg) === 'string'; +/** + * Determine whether the parameter is an object any parameter + * @returns Whether the parameter is an object + */ +const isObject = (arg) => arg !== nullValue && typeOf(arg) === 'object'; +/** + * Global toString any parameter stringified parameters + */ +const globalToString = (arg) => ObjectCls.prototype.toString.call(arg); +/** + * Determine whether it is a normal object any parameter + * @returns Judgment result + */ +const isPlainObject = (arg) => globalToString(arg) === '[object Object]'; +/** + * Determine whether it is an instance of a certain class any parameter + * @returns Judgment result + */ +const instanceOf = (arg, cls) => arg instanceof cls; +/** + * Unified timestamp acquisition function + * @returns Timestamp + */ +const getTime = (date) => (date ? date.getTime() : Date.now()); +/** + * Get the alova instance through the method instance alova example + */ +const getContext = (methodInstance) => methodInstance.context; +/** + * Get method instance configuration data + * @returns Configuration object + */ +const getConfig = (methodInstance) => methodInstance.config; +/** + * Get alova configuration data alova configuration object + */ +const getContextOptions = (alovaInstance) => alovaInstance.options; +/** + * Get alova configuration data through method instance alova configuration object + */ +const getOptions = (methodInstance) => getContextOptions(getContext(methodInstance)); +/** + * Get the key value of the request method + * @returns The key value of this request method + */ +const key = (methodInstance) => { + const { params, headers } = getConfig(methodInstance); + return JSONStringify([methodInstance.type, methodInstance.url, params, methodInstance.data, headers]); +}; +/** + * Create uuid simple version uuid + */ +const uuid = () => { + const timestamp = new Date().getTime(); + return Math.floor(Math.random() * timestamp).toString(36); +}; +/** + * Get the key value of the method instance method instance + * @returns The key value of this method instance + */ +const getMethodInternalKey = (methodInstance) => methodInstance.key; +/** + * Get the request method object + * @param methodHandler Request method handle + * @param args Method call parameters request method object + */ +const getHandlerMethod = (methodHandler, assert, args = []) => { + const methodInstance = isFn(methodHandler) ? methodHandler(...args) : methodHandler; + assert(!!methodInstance.key, 'hook handler must be a method instance or a function that returns method instance'); + return methodInstance; +}; +/** + * Is it special data + * @param data Submit data + * @returns Judgment result + */ +const isSpecialRequestBody = (data) => { + const dataTypeString = globalToString(data); + return (/^\[object (Blob|FormData|ReadableStream|URLSearchParams)\]$/i.test(dataTypeString) || instanceOf(data, ArrayBuffer)); +}; +const objAssign = (target, ...sources) => ObjectCls.assign(target, ...sources); +/** + * Excludes specified attributes from a data collection and returns a new data collection data collection + * @param keys Excluded keys new data collection + */ +const omit = (obj, ...keys) => { + const result = {}; + for (const key in obj) { + if (!keys.includes(key)) { + result[key] = obj[key]; + } + } + return result; +}; +/** + * the same as `Promise.withResolvers` + * @returns promise with resolvers. + */ +function usePromise() { + let retResolve; + let retReject; + const promise = new Promise((resolve, reject) => { + retResolve = resolve; + retReject = reject; + }); + return { promise, resolve: retResolve, reject: retReject }; +} +/** + * Get cached configuration parameters, fixedly returning an object in the format { e: function, c: any, f: any, m: number, s: boolean, t: string } e is the abbreviation of expire, which returns the cache expiration time point (timestamp) in milliseconds. + * c is controlled, indicating whether it is a controlled cache + * f is the original value of cacheFor, which is used to call to obtain cached data when c is true. + * m is the abbreviation of mode, storage mode + * s is the abbreviation of storage, whether to store it locally + * t is the abbreviation of tag, which stores tags persistently. + * @param methodInstance method instance + * @returns Unified cache parameter object + */ +const getLocalCacheConfigParam = (methodInstance) => { + const { cacheFor } = getConfig(methodInstance); + const getCacheExpireTs = (cacheExpire) => isNumber(cacheExpire) ? getTime() + cacheExpire : getTime(cacheExpire || undefinedValue); + let cacheMode = MEMORY; + let expire = () => 0; + let store = falseValue; + let tag = undefinedValue; + const controlled = isFn(cacheFor); + if (!controlled) { + let expireColumn = cacheFor; + if (isPlainObject(cacheFor)) { + const { mode = MEMORY, expire, tag: configTag } = cacheFor || {}; + cacheMode = mode; + store = mode === STORAGE_RESTORE; + tag = configTag ? configTag.toString() : undefinedValue; + expireColumn = expire; + } + expire = (mode) => getCacheExpireTs(isFn(expireColumn) ? expireColumn({ method: methodInstance, mode }) : expireColumn); + } + return { + f: cacheFor, + c: controlled, + e: expire, + m: cacheMode, + s: store, + t: tag + }; +}; +/** + * Create class instance + * @param Cls Constructor + * @param args Constructor parameters class instance + */ +const newInstance = (Cls, ...args) => new Cls(...args); +/** + * Unified configuration + * @param data + * @returns unified configuration + */ +const sloughConfig = (config, args = []) => isFn(config) ? config(...args) : config; +const sloughFunction = (arg, defaultFn) => isFn(arg) ? arg : ![falseValue, nullValue].includes(arg) ? defaultFn : noop; +/** + * Create an executor that calls multiple times synchronously and only executes it once asynchronously + */ +const createSyncOnceRunner = (delay = 0) => { + let timer = undefinedValue; + // Executing multiple calls to this function will execute once asynchronously + return (fn) => { + if (timer) { + clearTimeout(timer); + } + timer = setTimeoutFn(fn, delay); + }; +}; +/** + * Create an asynchronous function queue, the asynchronous function will be executed serially queue add function + */ +const createAsyncQueue = (catchError = falseValue) => { + const queue = []; + let completedHandler = undefinedValue; + let executing = false; + const executeQueue = async () => { + executing = true; + while (len(queue) > 0) { + const asyncFunc = shift(queue); + if (asyncFunc) { + await asyncFunc(); + } + } + completedHandler && completedHandler(); + executing = false; + }; + const addQueue = (asyncFunc) => newInstance((PromiseCls), (resolve, reject) => { + const wrappedFunc = () => promiseThen(asyncFunc(), resolve, err => { + catchError ? resolve(undefinedValue) : reject(err); + }); + pushItem(queue, wrappedFunc); + if (!executing) { + executeQueue(); + } + }); + const onComplete = (fn) => { + completedHandler = fn; + }; + return { + addQueue, + onComplete + }; +}; +/** + * Traverse the target object deeply target audience + * @param callback Traversal callback + * @param preorder Whether to traverse in preorder, the default is true + * @param key The currently traversed key + * @param parent The parent node currently traversed + */ +const walkObject = (target, callback, preorder = trueValue, key, parent) => { + const callCallback = () => { + if (parent && key) { + target = callback(target, key, parent); + if (target !== parent[key]) { + parent[key] = target; + } + } + }; + // Preorder traversal + preorder && callCallback(); + if (isObject(target)) { + for (const i in target) { + if (!instanceOf(target, String)) { + walkObject(target[i], callback, preorder, i, target); + } + } + } + // Postal order traversal + !preorder && callCallback(); + return target; +}; +const cacheKeyPrefix = '$a.'; +/** + * build common cache key. + */ +const buildNamespacedCacheKey = (namespace, key) => cacheKeyPrefix + namespace + key; +/** + * Calculate retry delay time based on avoidance strategy and number of retries avoid parameters + * @param retryTimes Number of retries + * @returns Retry delay time + */ +const delayWithBackoff = (backoff, retryTimes) => { + let { startQuiver, endQuiver } = backoff; + const { delay, multiplier = 1 } = backoff; + let retryDelayFinally = (delay || 0) * multiplier ** (retryTimes - 1); + // If start quiver or end quiver has a value, you need to increase the random jitter value in the specified range + if (startQuiver || endQuiver) { + startQuiver = startQuiver || 0; + endQuiver = endQuiver || 1; + retryDelayFinally += + retryDelayFinally * startQuiver + Math.random() * retryDelayFinally * (endQuiver - startQuiver); + retryDelayFinally = Math.floor(retryDelayFinally); // round delay + } + return retryDelayFinally; +}; +/** + * Build the complete url baseURL path url parameters complete url + */ +const buildCompletedURL = (baseURL, url, params) => { + // If the Base url ends with /, remove / + baseURL = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL; + // If it does not start with /or http protocol, you need to add / + // Compatible with some RESTful usage fix: https://github.com/alovajs/alova/issues/382 + if (url !== '') { + url = url.match(/^(\/|https?:\/\/)/) ? url : `/${url}`; + } + const completeURL = baseURL + url; + // Convert params object to get string + // Filter out those whose value is undefined + const paramsStr = mapItem(filterItem(objectKeys(params), key => params[key] !== undefinedValue), key => `${key}=${params[key]}`).join('&'); + // Splice the get parameters behind the url. Note that the url may already have parameters. + return paramsStr + ? +completeURL.includes('?') + ? `${completeURL}&${paramsStr}` + : `${completeURL}?${paramsStr}` + : completeURL; +}; +/** + * Deep clone an object. + * + * @param obj The object to be cloned. + * @returns The cloned object. + */ +const deepClone = (obj) => { + if (isArray(obj)) { + return mapItem(obj, deepClone); + } + if (isPlainObject(obj) && obj.constructor === ObjectCls) { + const clone = {}; + forEach(objectKeys(obj), key => { + clone[key] = deepClone(obj[key]); + }); + return clone; + } + return obj; +}; + +/** + * alova error class + */ +class AlovaError extends Error { + constructor(prefix, message, errorCode) { + super(message + (errorCode ? `\n\nFor detailed: https://alova.js.org/error#${errorCode}` : '')); + this.name = `[alova${prefix ? `/${prefix}` : ''}]`; + } +} +/** + * Custom assertion function that throws an error when the expression is false + * When errorCode is passed in, a link to the error document will be provided to guide the user to correct it. + * @param expression Judgment expression, true or false + * @param message Assert message + */ +const createAssert = (prefix = '') => (expression, message, errorCode) => { + if (!expression) { + throw newInstance(AlovaError, prefix, message, errorCode); + } +}; + +const createEventManager = () => { + const eventMap = {}; + return { + eventMap, + on(type, handler) { + const eventTypeItem = (eventMap[type] = eventMap[type] || []); + pushItem(eventTypeItem, handler); + // return the off function + return () => { + eventMap[type] = filterItem(eventTypeItem, item => item !== handler); + }; + }, + off(type, handler) { + const handlers = eventMap[type]; + if (!handlers) { + return; + } + if (handler) { + const index = handlers.indexOf(handler); + index > -1 && handlers.splice(index, 1); + } + else { + delete eventMap[type]; + } + }, + emit(type, event) { + const handlers = eventMap[type] || []; + return mapItem(handlers, handler => handler(event)); + } + }; +}; +const decorateEvent = (onEvent, decoratedHandler) => { + const emitter = createEventManager(); + const eventType = uuid(); + const eventReturn = onEvent(event => emitter.emit(eventType, event)); + return (handler) => { + emitter.on(eventType, event => { + decoratedHandler(handler, event); + }); + return eventReturn; + }; +}; + +class FrameworkReadableState { + constructor(state, key, dehydrate, exportState) { + this.s = state; + this.k = key; + this.$dhy = dehydrate; + this.$exp = exportState; + } + get v() { + return this.$dhy(this.s); + } + get e() { + return this.$exp(this.s); + } +} +class FrameworkState extends FrameworkReadableState { + constructor(state, key, dehydrate, exportState, update) { + super(state, key, dehydrate, exportState); + this.$upd = update; + } + set v(newValue) { + this.$upd(this.s, newValue); + } + get v() { + return super.v; + } +} + +class QueueCallback { + /** + * @param [limit=null] no limit if set undefined or null + * @param [initialProcessing=false] + */ + constructor(limit, initialProcessing = false) { + this.limit = limit; + this.callbackQueue = []; + this.isProcessing = false; + this.interrupt = false; + this.isProcessing = initialProcessing; + } + /** + * Adds a callback function to the callback queue. + * If a limit is set and the queue has reached its limit, the callback will not be added. + * @param callback The callback function to be added to the queue. + */ + queueCallback(callback) { + if (this.limit && this.callbackQueue.length >= this.limit) { + return; + } + this.callbackQueue.push(callback); + if (!this.isProcessing) { + this.tryRunQueueCallback(); + } + } + /** + * Tries to run the callbacks in the queue. + * If there are callbacks in the queue, it removes the first callback and executes it. + * This method is called recursively until there are no more callbacks in the queue. + */ + async tryRunQueueCallback() { + this.isProcessing = true; + this.interrupt = false; + while (this.callbackQueue.length > 0 && !this.interrupt) { + const cb = this.callbackQueue.shift(); + await (cb === null || cb === void 0 ? void 0 : cb()); + } + this.isProcessing = false; + } + /** + * If set the param `state` to true, it will interrupt the current job (whether or not the current processing state is true) + * If set the param `state` to false, then get on with the rest of the work + */ + setProcessingState(state) { + this.isProcessing = state; + if (!state) { + this.tryRunQueueCallback(); + } + else { + this.interrupt = true; + } + } +} + +const type = {}; + +exports.$self = $self; +exports.AlovaError = AlovaError; +exports.FrameworkReadableState = FrameworkReadableState; +exports.FrameworkState = FrameworkState; +exports.JSONParse = JSONParse; +exports.JSONStringify = JSONStringify; +exports.MEMORY = MEMORY; +exports.ObjectCls = ObjectCls; +exports.PromiseCls = PromiseCls; +exports.QueueCallback = QueueCallback; +exports.RegExpCls = RegExpCls; +exports.STORAGE_RESTORE = STORAGE_RESTORE; +exports.buildCompletedURL = buildCompletedURL; +exports.buildNamespacedCacheKey = buildNamespacedCacheKey; +exports.clearTimeoutTimer = clearTimeoutTimer; +exports.createAssert = createAssert; +exports.createAsyncQueue = createAsyncQueue; +exports.createEventManager = createEventManager; +exports.createSyncOnceRunner = createSyncOnceRunner; +exports.decorateEvent = decorateEvent; +exports.deepClone = deepClone; +exports.defineProperty = defineProperty; +exports.delayWithBackoff = delayWithBackoff; +exports.deleteAttr = deleteAttr; +exports.falseValue = falseValue; +exports.filterItem = filterItem; +exports.forEach = forEach; +exports.getConfig = getConfig; +exports.getContext = getContext; +exports.getContextOptions = getContextOptions; +exports.getHandlerMethod = getHandlerMethod; +exports.getLocalCacheConfigParam = getLocalCacheConfigParam; +exports.getMethodInternalKey = getMethodInternalKey; +exports.getOptions = getOptions; +exports.getTime = getTime; +exports.globalToString = globalToString; +exports.includes = includes; +exports.instanceOf = instanceOf; +exports.isArray = isArray; +exports.isFn = isFn; +exports.isNumber = isNumber; +exports.isObject = isObject; +exports.isPlainObject = isPlainObject; +exports.isSSR = isSSR; +exports.isSpecialRequestBody = isSpecialRequestBody; +exports.isString = isString; +exports.key = key; +exports.len = len; +exports.mapItem = mapItem; +exports.newInstance = newInstance; +exports.noop = noop; +exports.nullValue = nullValue; +exports.objAssign = objAssign; +exports.objectKeys = objectKeys; +exports.objectValues = objectValues; +exports.omit = omit; +exports.promiseCatch = promiseCatch; +exports.promiseFinally = promiseFinally; +exports.promiseReject = promiseReject; +exports.promiseResolve = promiseResolve; +exports.promiseThen = promiseThen; +exports.pushItem = pushItem; +exports.regexpTest = regexpTest; +exports.setTimeoutFn = setTimeoutFn; +exports.shift = shift; +exports.slice = slice; +exports.sloughConfig = sloughConfig; +exports.sloughFunction = sloughFunction; +exports.splice = splice; +exports.trueValue = trueValue; +exports.type = type; +exports.typeOf = typeOf; +exports.undefinedValue = undefinedValue; +exports.usePromise = usePromise; +exports.uuid = uuid; +exports.valueObject = valueObject; +exports.walkObject = walkObject; diff --git a/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/dist/alova-shared.esm.js b/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/dist/alova-shared.esm.js new file mode 100644 index 0000000..2bf69a2 --- /dev/null +++ b/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/dist/alova-shared.esm.js @@ -0,0 +1,529 @@ +/** + * @alova/shared 1.1.2 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2024 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +const undefStr = 'undefined'; +// The following unified processing functions or variables added to reduce the amount of compiled code +const PromiseCls = Promise; +const promiseResolve = (value) => PromiseCls.resolve(value); +const promiseReject = (value) => PromiseCls.reject(value); +const ObjectCls = Object; +const RegExpCls = RegExp; +const undefinedValue = undefined; +const nullValue = null; +const trueValue = true; +const falseValue = false; +const promiseThen = (promise, onFulfilled, onrejected) => promise.then(onFulfilled, onrejected); +const promiseCatch = (promise, onrejected) => promise.catch(onrejected); +const promiseFinally = (promise, onfinally) => promise.finally(onfinally); +const JSONStringify = (value, replacer, space) => JSON.stringify(value, replacer, space); +const JSONParse = (value) => JSON.parse(value); +const setTimeoutFn = (fn, delay = 0) => setTimeout(fn, delay); +const clearTimeoutTimer = (timer) => clearTimeout(timer); +const objectKeys = (obj) => ObjectCls.keys(obj); +const objectValues = (obj) => ObjectCls.values(obj); +const forEach = (ary, fn) => ary.forEach(fn); +const pushItem = (ary, ...item) => ary.push(...item); +const mapItem = (ary, callbackfn) => ary.map(callbackfn); +const filterItem = (ary, predicate) => ary.filter(predicate); +const shift = (ary) => ary.shift(); +const slice = (ary, start, end) => ary.slice(start, end); +const splice = (ary, start, deleteCount = 0, ...items) => ary.splice(start, deleteCount, ...items); +const len = (data) => data.length; +const isArray = (arg) => Array.isArray(arg); +const deleteAttr = (arg, attr) => delete arg[attr]; +const typeOf = (arg) => typeof arg; +const regexpTest = (reg, str) => reg.test(`${str}`); +const includes = (ary, target) => ary.includes(target); +const valueObject = (value, writable = falseValue) => ({ value, writable }); +const defineProperty = (o, key, value, isDescriptor = falseValue) => ObjectCls.defineProperty(o, key, isDescriptor ? value : valueObject(value, falseValue)); +// Whether it is running on the server side, node and bun are judged by process, and deno is judged by Deno. +// Some frameworks (such as Alipay and uniapp) will inject the process object as a global variable. +// Therefore, the process.cwd function unique to the server is used as the basis for judgment. +const isSSR = typeof window === undefStr && + (typeof process !== undefStr ? typeof process.cwd === 'function' : typeof Deno !== undefStr); +/** cache mode */ +// only cache in memory, it's default option +const MEMORY = 'memory'; +// persistent cache, and will be read to memory when page is refreshed, it means that the memory cache always exist until cache is expired. +const STORAGE_RESTORE = 'restore'; + +/** + * Empty function for compatibility processing + */ +const noop = () => { }; +/** + * A function that returns the parameter itself, used for compatibility processing + * Since some systems use self as a reserved word, $self is used to distinguish it. + * @param arg any parameter + * @returns return parameter itself + */ +const $self = (arg) => arg; +/** + * Determine whether the parameter is a function any parameter + * @returns Whether the parameter is a function + */ +const isFn = (arg) => typeOf(arg) === 'function'; +/** + * Determine whether the parameter is a number any parameter + * @returns Whether the parameter is a number + */ +const isNumber = (arg) => typeOf(arg) === 'number' && !Number.isNaN(arg); +/** + * Determine whether the parameter is a string any parameter + * @returns Whether the parameter is a string + */ +const isString = (arg) => typeOf(arg) === 'string'; +/** + * Determine whether the parameter is an object any parameter + * @returns Whether the parameter is an object + */ +const isObject = (arg) => arg !== nullValue && typeOf(arg) === 'object'; +/** + * Global toString any parameter stringified parameters + */ +const globalToString = (arg) => ObjectCls.prototype.toString.call(arg); +/** + * Determine whether it is a normal object any parameter + * @returns Judgment result + */ +const isPlainObject = (arg) => globalToString(arg) === '[object Object]'; +/** + * Determine whether it is an instance of a certain class any parameter + * @returns Judgment result + */ +const instanceOf = (arg, cls) => arg instanceof cls; +/** + * Unified timestamp acquisition function + * @returns Timestamp + */ +const getTime = (date) => (date ? date.getTime() : Date.now()); +/** + * Get the alova instance through the method instance alova example + */ +const getContext = (methodInstance) => methodInstance.context; +/** + * Get method instance configuration data + * @returns Configuration object + */ +const getConfig = (methodInstance) => methodInstance.config; +/** + * Get alova configuration data alova configuration object + */ +const getContextOptions = (alovaInstance) => alovaInstance.options; +/** + * Get alova configuration data through method instance alova configuration object + */ +const getOptions = (methodInstance) => getContextOptions(getContext(methodInstance)); +/** + * Get the key value of the request method + * @returns The key value of this request method + */ +const key = (methodInstance) => { + const { params, headers } = getConfig(methodInstance); + return JSONStringify([methodInstance.type, methodInstance.url, params, methodInstance.data, headers]); +}; +/** + * Create uuid simple version uuid + */ +const uuid = () => { + const timestamp = new Date().getTime(); + return Math.floor(Math.random() * timestamp).toString(36); +}; +/** + * Get the key value of the method instance method instance + * @returns The key value of this method instance + */ +const getMethodInternalKey = (methodInstance) => methodInstance.key; +/** + * Get the request method object + * @param methodHandler Request method handle + * @param args Method call parameters request method object + */ +const getHandlerMethod = (methodHandler, assert, args = []) => { + const methodInstance = isFn(methodHandler) ? methodHandler(...args) : methodHandler; + assert(!!methodInstance.key, 'hook handler must be a method instance or a function that returns method instance'); + return methodInstance; +}; +/** + * Is it special data + * @param data Submit data + * @returns Judgment result + */ +const isSpecialRequestBody = (data) => { + const dataTypeString = globalToString(data); + return (/^\[object (Blob|FormData|ReadableStream|URLSearchParams)\]$/i.test(dataTypeString) || instanceOf(data, ArrayBuffer)); +}; +const objAssign = (target, ...sources) => ObjectCls.assign(target, ...sources); +/** + * Excludes specified attributes from a data collection and returns a new data collection data collection + * @param keys Excluded keys new data collection + */ +const omit = (obj, ...keys) => { + const result = {}; + for (const key in obj) { + if (!keys.includes(key)) { + result[key] = obj[key]; + } + } + return result; +}; +/** + * the same as `Promise.withResolvers` + * @returns promise with resolvers. + */ +function usePromise() { + let retResolve; + let retReject; + const promise = new Promise((resolve, reject) => { + retResolve = resolve; + retReject = reject; + }); + return { promise, resolve: retResolve, reject: retReject }; +} +/** + * Get cached configuration parameters, fixedly returning an object in the format { e: function, c: any, f: any, m: number, s: boolean, t: string } e is the abbreviation of expire, which returns the cache expiration time point (timestamp) in milliseconds. + * c is controlled, indicating whether it is a controlled cache + * f is the original value of cacheFor, which is used to call to obtain cached data when c is true. + * m is the abbreviation of mode, storage mode + * s is the abbreviation of storage, whether to store it locally + * t is the abbreviation of tag, which stores tags persistently. + * @param methodInstance method instance + * @returns Unified cache parameter object + */ +const getLocalCacheConfigParam = (methodInstance) => { + const { cacheFor } = getConfig(methodInstance); + const getCacheExpireTs = (cacheExpire) => isNumber(cacheExpire) ? getTime() + cacheExpire : getTime(cacheExpire || undefinedValue); + let cacheMode = MEMORY; + let expire = () => 0; + let store = falseValue; + let tag = undefinedValue; + const controlled = isFn(cacheFor); + if (!controlled) { + let expireColumn = cacheFor; + if (isPlainObject(cacheFor)) { + const { mode = MEMORY, expire, tag: configTag } = cacheFor || {}; + cacheMode = mode; + store = mode === STORAGE_RESTORE; + tag = configTag ? configTag.toString() : undefinedValue; + expireColumn = expire; + } + expire = (mode) => getCacheExpireTs(isFn(expireColumn) ? expireColumn({ method: methodInstance, mode }) : expireColumn); + } + return { + f: cacheFor, + c: controlled, + e: expire, + m: cacheMode, + s: store, + t: tag + }; +}; +/** + * Create class instance + * @param Cls Constructor + * @param args Constructor parameters class instance + */ +const newInstance = (Cls, ...args) => new Cls(...args); +/** + * Unified configuration + * @param data + * @returns unified configuration + */ +const sloughConfig = (config, args = []) => isFn(config) ? config(...args) : config; +const sloughFunction = (arg, defaultFn) => isFn(arg) ? arg : ![falseValue, nullValue].includes(arg) ? defaultFn : noop; +/** + * Create an executor that calls multiple times synchronously and only executes it once asynchronously + */ +const createSyncOnceRunner = (delay = 0) => { + let timer = undefinedValue; + // Executing multiple calls to this function will execute once asynchronously + return (fn) => { + if (timer) { + clearTimeout(timer); + } + timer = setTimeoutFn(fn, delay); + }; +}; +/** + * Create an asynchronous function queue, the asynchronous function will be executed serially queue add function + */ +const createAsyncQueue = (catchError = falseValue) => { + const queue = []; + let completedHandler = undefinedValue; + let executing = false; + const executeQueue = async () => { + executing = true; + while (len(queue) > 0) { + const asyncFunc = shift(queue); + if (asyncFunc) { + await asyncFunc(); + } + } + completedHandler && completedHandler(); + executing = false; + }; + const addQueue = (asyncFunc) => newInstance((PromiseCls), (resolve, reject) => { + const wrappedFunc = () => promiseThen(asyncFunc(), resolve, err => { + catchError ? resolve(undefinedValue) : reject(err); + }); + pushItem(queue, wrappedFunc); + if (!executing) { + executeQueue(); + } + }); + const onComplete = (fn) => { + completedHandler = fn; + }; + return { + addQueue, + onComplete + }; +}; +/** + * Traverse the target object deeply target audience + * @param callback Traversal callback + * @param preorder Whether to traverse in preorder, the default is true + * @param key The currently traversed key + * @param parent The parent node currently traversed + */ +const walkObject = (target, callback, preorder = trueValue, key, parent) => { + const callCallback = () => { + if (parent && key) { + target = callback(target, key, parent); + if (target !== parent[key]) { + parent[key] = target; + } + } + }; + // Preorder traversal + preorder && callCallback(); + if (isObject(target)) { + for (const i in target) { + if (!instanceOf(target, String)) { + walkObject(target[i], callback, preorder, i, target); + } + } + } + // Postal order traversal + !preorder && callCallback(); + return target; +}; +const cacheKeyPrefix = '$a.'; +/** + * build common cache key. + */ +const buildNamespacedCacheKey = (namespace, key) => cacheKeyPrefix + namespace + key; +/** + * Calculate retry delay time based on avoidance strategy and number of retries avoid parameters + * @param retryTimes Number of retries + * @returns Retry delay time + */ +const delayWithBackoff = (backoff, retryTimes) => { + let { startQuiver, endQuiver } = backoff; + const { delay, multiplier = 1 } = backoff; + let retryDelayFinally = (delay || 0) * multiplier ** (retryTimes - 1); + // If start quiver or end quiver has a value, you need to increase the random jitter value in the specified range + if (startQuiver || endQuiver) { + startQuiver = startQuiver || 0; + endQuiver = endQuiver || 1; + retryDelayFinally += + retryDelayFinally * startQuiver + Math.random() * retryDelayFinally * (endQuiver - startQuiver); + retryDelayFinally = Math.floor(retryDelayFinally); // round delay + } + return retryDelayFinally; +}; +/** + * Build the complete url baseURL path url parameters complete url + */ +const buildCompletedURL = (baseURL, url, params) => { + // If the Base url ends with /, remove / + baseURL = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL; + // If it does not start with /or http protocol, you need to add / + // Compatible with some RESTful usage fix: https://github.com/alovajs/alova/issues/382 + if (url !== '') { + url = url.match(/^(\/|https?:\/\/)/) ? url : `/${url}`; + } + const completeURL = baseURL + url; + // Convert params object to get string + // Filter out those whose value is undefined + const paramsStr = mapItem(filterItem(objectKeys(params), key => params[key] !== undefinedValue), key => `${key}=${params[key]}`).join('&'); + // Splice the get parameters behind the url. Note that the url may already have parameters. + return paramsStr + ? +completeURL.includes('?') + ? `${completeURL}&${paramsStr}` + : `${completeURL}?${paramsStr}` + : completeURL; +}; +/** + * Deep clone an object. + * + * @param obj The object to be cloned. + * @returns The cloned object. + */ +const deepClone = (obj) => { + if (isArray(obj)) { + return mapItem(obj, deepClone); + } + if (isPlainObject(obj) && obj.constructor === ObjectCls) { + const clone = {}; + forEach(objectKeys(obj), key => { + clone[key] = deepClone(obj[key]); + }); + return clone; + } + return obj; +}; + +/** + * alova error class + */ +class AlovaError extends Error { + constructor(prefix, message, errorCode) { + super(message + (errorCode ? `\n\nFor detailed: https://alova.js.org/error#${errorCode}` : '')); + this.name = `[alova${prefix ? `/${prefix}` : ''}]`; + } +} +/** + * Custom assertion function that throws an error when the expression is false + * When errorCode is passed in, a link to the error document will be provided to guide the user to correct it. + * @param expression Judgment expression, true or false + * @param message Assert message + */ +const createAssert = (prefix = '') => (expression, message, errorCode) => { + if (!expression) { + throw newInstance(AlovaError, prefix, message, errorCode); + } +}; + +const createEventManager = () => { + const eventMap = {}; + return { + eventMap, + on(type, handler) { + const eventTypeItem = (eventMap[type] = eventMap[type] || []); + pushItem(eventTypeItem, handler); + // return the off function + return () => { + eventMap[type] = filterItem(eventTypeItem, item => item !== handler); + }; + }, + off(type, handler) { + const handlers = eventMap[type]; + if (!handlers) { + return; + } + if (handler) { + const index = handlers.indexOf(handler); + index > -1 && handlers.splice(index, 1); + } + else { + delete eventMap[type]; + } + }, + emit(type, event) { + const handlers = eventMap[type] || []; + return mapItem(handlers, handler => handler(event)); + } + }; +}; +const decorateEvent = (onEvent, decoratedHandler) => { + const emitter = createEventManager(); + const eventType = uuid(); + const eventReturn = onEvent(event => emitter.emit(eventType, event)); + return (handler) => { + emitter.on(eventType, event => { + decoratedHandler(handler, event); + }); + return eventReturn; + }; +}; + +class FrameworkReadableState { + constructor(state, key, dehydrate, exportState) { + this.s = state; + this.k = key; + this.$dhy = dehydrate; + this.$exp = exportState; + } + get v() { + return this.$dhy(this.s); + } + get e() { + return this.$exp(this.s); + } +} +class FrameworkState extends FrameworkReadableState { + constructor(state, key, dehydrate, exportState, update) { + super(state, key, dehydrate, exportState); + this.$upd = update; + } + set v(newValue) { + this.$upd(this.s, newValue); + } + get v() { + return super.v; + } +} + +class QueueCallback { + /** + * @param [limit=null] no limit if set undefined or null + * @param [initialProcessing=false] + */ + constructor(limit, initialProcessing = false) { + this.limit = limit; + this.callbackQueue = []; + this.isProcessing = false; + this.interrupt = false; + this.isProcessing = initialProcessing; + } + /** + * Adds a callback function to the callback queue. + * If a limit is set and the queue has reached its limit, the callback will not be added. + * @param callback The callback function to be added to the queue. + */ + queueCallback(callback) { + if (this.limit && this.callbackQueue.length >= this.limit) { + return; + } + this.callbackQueue.push(callback); + if (!this.isProcessing) { + this.tryRunQueueCallback(); + } + } + /** + * Tries to run the callbacks in the queue. + * If there are callbacks in the queue, it removes the first callback and executes it. + * This method is called recursively until there are no more callbacks in the queue. + */ + async tryRunQueueCallback() { + this.isProcessing = true; + this.interrupt = false; + while (this.callbackQueue.length > 0 && !this.interrupt) { + const cb = this.callbackQueue.shift(); + await (cb === null || cb === void 0 ? void 0 : cb()); + } + this.isProcessing = false; + } + /** + * If set the param `state` to true, it will interrupt the current job (whether or not the current processing state is true) + * If set the param `state` to false, then get on with the rest of the work + */ + setProcessingState(state) { + this.isProcessing = state; + if (!state) { + this.tryRunQueueCallback(); + } + else { + this.interrupt = true; + } + } +} + +const type = {}; + +export { $self, AlovaError, FrameworkReadableState, FrameworkState, JSONParse, JSONStringify, MEMORY, ObjectCls, PromiseCls, QueueCallback, RegExpCls, STORAGE_RESTORE, buildCompletedURL, buildNamespacedCacheKey, clearTimeoutTimer, createAssert, createAsyncQueue, createEventManager, createSyncOnceRunner, decorateEvent, deepClone, defineProperty, delayWithBackoff, deleteAttr, falseValue, filterItem, forEach, getConfig, getContext, getContextOptions, getHandlerMethod, getLocalCacheConfigParam, getMethodInternalKey, getOptions, getTime, globalToString, includes, instanceOf, isArray, isFn, isNumber, isObject, isPlainObject, isSSR, isSpecialRequestBody, isString, key, len, mapItem, newInstance, noop, nullValue, objAssign, objectKeys, objectValues, omit, promiseCatch, promiseFinally, promiseReject, promiseResolve, promiseThen, pushItem, regexpTest, setTimeoutFn, shift, slice, sloughConfig, sloughFunction, splice, trueValue, type, typeOf, undefinedValue, usePromise, uuid, valueObject, walkObject }; diff --git a/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/package.json b/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/package.json new file mode 100644 index 0000000..b97276a --- /dev/null +++ b/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/package.json @@ -0,0 +1,32 @@ +{ + "name": "@alova/shared", + "version": "1.1.2", + "type": "module", + "author": "Scott Hu", + "main": "dist/alova-shared.common.cjs", + "module": "dist/alova-shared.esm.js", + "types": "typings/alova-shared.d.ts", + "license": "MIT", + "homepage": "https://alova.js.org", + "repository": { + "type": "git", + "url": "https://github.com/alovajs/alova.git" + }, + "bugs": { + "url": "https://github.com/alovajs/alova/issues" + }, + "files": [ + "dist", + "typings" + ], + "devDependencies": { + "@alova/scripts": "1.1.1" + }, + "scripts": { + "clean": "rimraf ./dist", + "test": "vitest run", + "lint": "eslint", + "lint:fix": "eslint --fix", + "build": "pnpm run clean && alova-scripts build" + } +} \ No newline at end of file diff --git a/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/typings/alova-shared.d.ts b/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/typings/alova-shared.d.ts new file mode 100644 index 0000000..d324ee1 --- /dev/null +++ b/node_modules/.pnpm/@alova+shared@1.1.2/node_modules/@alova/shared/typings/alova-shared.d.ts @@ -0,0 +1,387 @@ +/** + * @alova/shared 1.1.2 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2024 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +/** + * alova error class + */ +declare class AlovaError extends Error { + constructor(prefix: string, message: string, errorCode?: number); +} +/** + * Custom assertion function that throws an error when the expression is false + * When errorCode is passed in, a link to the error document will be provided to guide the user to correct it. + * @param expression Judgment expression, true or false + * @param message Assert message + */ +declare const createAssert: (prefix?: string) => (expression: boolean, message: string, errorCode?: number) => void; + +interface EventManager { + on(type: K, handler: (event: E[K]) => void): () => void; + off(type: K, handler?: (event: E[K]) => void): () => void; + /** + * @param type + * @param event + * @param sync Whether to synchronize emit events, if set to `true`, this will wait for all listeners to return results using Promise.all + */ + emit(type: K, event: E[K]): any[]; + eventMap: EventMap; +} +type EventMap = { + [K in keyof E]?: ((event: E[K]) => void)[]; +}; +declare const createEventManager: () => EventManager; +declare const decorateEvent: void) => any>(onEvent: OnEvent, decoratedHandler: (handler: Parameters[0], event: Parameters[0]>[0]) => void) => (handler: Parameters[0]) => any; + +type GeneralFn = (...args: any[]) => any; +/** + * common UI framework state type + */ +interface GeneralState { + [x: string]: T; +} +/** + * is any type + */ +type IsAny = 0 extends 1 & T ? P : N; +/** + * is unknown type + */ +type IsUnknown = IsAny extends P ? N : unknown extends T ? P : N; +type IsAssignable = T2 extends T ? true : false; +type Equal = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 ? true : false; +type UsePromiseExposure = { + promise: Promise; + resolve: (value: T | PromiseLike) => void; + reject: (reason?: any) => void; +}; +interface BackoffPolicy { + /** + * Delay time for re-request, in milliseconds + * @default 1000 + */ + delay?: number; + /** + * Specify the delay multiple. For example, if the multiplier is set to 1.5 and the delay is 2 seconds, the first retry will be 2 seconds, the second will be 3 seconds, and the third will be 4.5 seconds + * @default 1 + */ + multiplier?: number; + /** + * The jitter starting percentage value of the delay request, ranging from 0-1 + * When only startQuiver is set, endQuiver defaults to 1 + * For example, if it is set to 0.5, it will add a random time of 50% to 100% to the current delay time + * If endQuiver has a value, the delay time will increase by a random value in the range of startQuiver and endQuiver + */ + startQuiver?: number; + /** + * The jitter ending percentage value of the delay request, ranging from 0-1 + * When only endQuiver is set, startQuiver defaults to 0 + * For example, if it is set to 0.5, it will add a random time from 0% to 50% to the current delay time + * If startQuiver has a value, the delay time will increase by a random value between startQuiver and endQuiver + */ + endQuiver?: number; +} +declare const type: {}; + +type UpdateFn = (state: GeneralState, newValue: Data) => void; +type DehydrateFn = (state: GeneralState) => Data; +type ExportFn = (state: GeneralState) => GeneralState; +declare class FrameworkReadableState { + s: GeneralState; + k: Key; + protected $dhy: DehydrateFn; + protected $exp: ExportFn; + constructor(state: GeneralState, key: Key, dehydrate: DehydrateFn, exportState: ExportFn); + get v(): Data; + get e(): GeneralState; +} +declare class FrameworkState extends FrameworkReadableState { + private $upd; + constructor(state: GeneralState, key: Key, dehydrate: DehydrateFn, exportState: ExportFn, update: UpdateFn); + set v(newValue: Data); + get v(): Data; +} + +/** + * Request cache settings + * expire: expiration time + * 1. When set to a number: if it is greater than 0, the cached data will be returned first, the expiration time unit is milliseconds, if it is less than or equal to 0, it will not be cached, and Infinity will never expire; + * 2. When set to a Date object, it means + * mode: cache mode, optional values are memory, restore + */ +type CacheExpire = number | Date | null; +type CacheMode = 'memory' | 'restore'; + +/** + * Empty function for compatibility processing + */ +declare const noop: () => void; +/** + * A function that returns the parameter itself, used for compatibility processing + * Since some systems use self as a reserved word, $self is used to distinguish it. + * @param arg any parameter + * @returns return parameter itself + */ +declare const $self: (arg: T) => T; +/** + * Determine whether the parameter is a function any parameter + * @returns Whether the parameter is a function + */ +declare const isFn: (arg: any) => arg is GeneralFn; +/** + * Determine whether the parameter is a number any parameter + * @returns Whether the parameter is a number + */ +declare const isNumber: (arg: any) => arg is number; +/** + * Determine whether the parameter is a string any parameter + * @returns Whether the parameter is a string + */ +declare const isString: (arg: any) => arg is string; +/** + * Determine whether the parameter is an object any parameter + * @returns Whether the parameter is an object + */ +declare const isObject: (arg: any) => arg is T; +/** + * Global toString any parameter stringified parameters + */ +declare const globalToString: (arg: any) => string; +/** + * Determine whether it is a normal object any parameter + * @returns Judgment result + */ +declare const isPlainObject: (arg: any) => arg is Record; +/** + * Determine whether it is an instance of a certain class any parameter + * @returns Judgment result + */ +declare const instanceOf: (arg: any, cls: new (...args: any[]) => T) => arg is T; +/** + * Unified timestamp acquisition function + * @returns Timestamp + */ +declare const getTime: (date?: Date) => number; +/** + * Get the alova instance through the method instance alova example + */ +declare const getContext: (methodInstance: T) => T["context"]; +/** + * Get method instance configuration data + * @returns Configuration object + */ +declare const getConfig: (methodInstance: T) => T["config"]; +/** + * Get alova configuration data alova configuration object + */ +declare const getContextOptions: (alovaInstance: T) => T["options"]; +/** + * Get alova configuration data through method instance alova configuration object + */ +declare const getOptions: (methodInstance: T) => T["context"]["options"]; +/** + * Get the key value of the request method + * @returns The key value of this request method + */ +declare const key: (methodInstance: T) => string; +/** + * Create uuid simple version uuid + */ +declare const uuid: () => string; +/** + * Get the key value of the method instance method instance + * @returns The key value of this method instance + */ +declare const getMethodInternalKey: (methodInstance: T) => T["key"]; +/** + * Get the request method object + * @param methodHandler Request method handle + * @param args Method call parameters request method object + */ +declare const getHandlerMethod: (methodHandler: T | ((...args: any[]) => T), assert: (expression: boolean, msg: string) => void, args?: any[]) => T; +/** + * Is it special data + * @param data Submit data + * @returns Judgment result + */ +declare const isSpecialRequestBody: (data: any) => boolean; +declare const objAssign: , U extends Record[]>(target: T, ...sources: U) => T & U[number]; +type Omit = Pick>; +/** + * Excludes specified attributes from a data collection and returns a new data collection data collection + * @param keys Excluded keys new data collection + */ +declare const omit: , K extends keyof T>(obj: T, ...keys: K[]) => Pick>; +/** + * the same as `Promise.withResolvers` + * @returns promise with resolvers. + */ +declare function usePromise(): UsePromiseExposure; +/** + * Get cached configuration parameters, fixedly returning an object in the format { e: function, c: any, f: any, m: number, s: boolean, t: string } e is the abbreviation of expire, which returns the cache expiration time point (timestamp) in milliseconds. + * c is controlled, indicating whether it is a controlled cache + * f is the original value of cacheFor, which is used to call to obtain cached data when c is true. + * m is the abbreviation of mode, storage mode + * s is the abbreviation of storage, whether to store it locally + * t is the abbreviation of tag, which stores tags persistently. + * @param methodInstance method instance + * @returns Unified cache parameter object + */ +declare const getLocalCacheConfigParam: (methodInstance: T) => { + f: any; + c: boolean; + e: (mode: CacheMode) => ReturnType<(cacheExpire: CacheExpire) => number>; + m: CacheMode; + s: boolean; + t: string | undefined; +}; +/** + * Create class instance + * @param Cls Constructor + * @param args Constructor parameters class instance + */ +declare const newInstance: ; +}>(Cls: T, ...args: ConstructorParameters) => InstanceType; +/** + * Unified configuration + * @param data + * @returns unified configuration + */ +declare const sloughConfig: (config: T | ((...args: any[]) => T), args?: any[]) => T; +declare const sloughFunction: (arg: T | undefined, defaultFn: U) => (() => void) | U | (T & GeneralFn); +/** + * Create an executor that calls multiple times synchronously and only executes it once asynchronously + */ +declare const createSyncOnceRunner: (delay?: number) => (fn: () => void) => void; +/** + * Create an asynchronous function queue, the asynchronous function will be executed serially queue add function + */ +declare const createAsyncQueue: (catchError?: boolean) => { + addQueue: (asyncFunc: (...args: any[]) => Promise) => Promise; + onComplete: (fn: GeneralFn) => void; +}; +/** + * Traverse the target object deeply target audience + * @param callback Traversal callback + * @param preorder Whether to traverse in preorder, the default is true + * @param key The currently traversed key + * @param parent The parent node currently traversed + */ +declare const walkObject: (target: any, callback: (value: any, key: string | number | symbol, parent: any) => void, preorder?: boolean, key?: string | number | symbol, parent?: any) => any; +/** + * build common cache key. + */ +declare const buildNamespacedCacheKey: (namespace: string, key: string) => string; +/** + * Calculate retry delay time based on avoidance strategy and number of retries avoid parameters + * @param retryTimes Number of retries + * @returns Retry delay time + */ +declare const delayWithBackoff: (backoff: BackoffPolicy, retryTimes: number) => number; +/** + * Build the complete url baseURL path url parameters complete url + */ +declare const buildCompletedURL: (baseURL: string, url: string, params: Record) => string; +/** + * Deep clone an object. + * + * @param obj The object to be cloned. + * @returns The cloned object. + */ +declare const deepClone: (obj: T) => T; + +type CallbackFn = () => void | Promise; +declare class QueueCallback { + protected limit?: (number | null) | undefined; + private callbackQueue; + private isProcessing; + private interrupt; + /** + * @param [limit=null] no limit if set undefined or null + * @param [initialProcessing=false] + */ + constructor(limit?: (number | null) | undefined, initialProcessing?: boolean); + /** + * Adds a callback function to the callback queue. + * If a limit is set and the queue has reached its limit, the callback will not be added. + * @param callback The callback function to be added to the queue. + */ + queueCallback(callback: CallbackFn): void; + /** + * Tries to run the callbacks in the queue. + * If there are callbacks in the queue, it removes the first callback and executes it. + * This method is called recursively until there are no more callbacks in the queue. + */ + tryRunQueueCallback(): Promise; + /** + * If set the param `state` to true, it will interrupt the current job (whether or not the current processing state is true) + * If set the param `state` to false, then get on with the rest of the work + */ + setProcessingState(state: boolean): void; +} + +declare const PromiseCls: PromiseConstructor; +declare const promiseResolve: (value?: T) => Promise | undefined>; +declare const promiseReject: (value: T) => Promise; +declare const ObjectCls: ObjectConstructor; +declare const RegExpCls: RegExpConstructor; +declare const undefinedValue: undefined; +declare const nullValue: null; +declare const trueValue = true; +declare const falseValue = false; +declare const promiseThen: (promise: Promise, onFulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null) => Promise; +declare const promiseCatch: (promise: Promise, onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null) => Promise; +declare const promiseFinally: (promise: Promise, onfinally?: (() => void) | undefined | null) => Promise; +declare const JSONStringify: (value: T, replacer?: (this: any, key: string, value: any) => any, space?: string | number) => string; +declare const JSONParse: (value: string) => any; +declare const setTimeoutFn: (fn: GeneralFn, delay?: number) => number; +declare const clearTimeoutTimer: (timer: NodeJS.Timeout | string | number) => void; +declare const objectKeys: (obj: object) => string[]; +declare const objectValues: (obj: object) => any[]; +declare const forEach: (ary: T[], fn: (item: T, index: number, ary: T[]) => void) => void; +declare const pushItem: (ary: T[], ...item: T[]) => number; +declare const mapItem: (ary: T[], callbackfn: (value: T, index: number, array: T[]) => R) => R[]; +declare const filterItem: (ary: T[], predicate: (value: T, index: number, array: T[]) => unknown) => T[]; +declare const shift: (ary: T[]) => T | undefined; +declare const slice: (ary: T[], start?: number, end?: number) => T[]; +declare const splice: (ary: T[], start: number, deleteCount?: number, ...items: T[]) => T[]; +declare const len: (data: any[] | Uint8Array | string) => number; +declare const isArray: (arg: any) => arg is any[]; +declare const deleteAttr: >(arg: T, attr: keyof T) => boolean; +declare const typeOf: (arg: any) => "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"; +declare const regexpTest: (reg: RegExp, str: string | number) => boolean; +declare const includes: (ary: T[], target: T) => boolean; +declare const valueObject: (value: T, writable?: boolean) => { + value: T; + writable: boolean; +}; +declare const defineProperty: (o: object, key: string | symbol, value: any, isDescriptor?: boolean) => object; +declare const isSSR: boolean; +/** cache mode */ +declare const MEMORY = "memory"; +declare const STORAGE_RESTORE = "restore"; + +export { $self, AlovaError, type BackoffPolicy, type CallbackFn, type Equal, type EventManager, FrameworkReadableState, FrameworkState, type GeneralFn, type GeneralState, type IsAny, type IsAssignable, type IsUnknown, JSONParse, JSONStringify, MEMORY, ObjectCls, type Omit, PromiseCls, QueueCallback, RegExpCls, STORAGE_RESTORE, type UsePromiseExposure, buildCompletedURL, buildNamespacedCacheKey, clearTimeoutTimer, createAssert, createAsyncQueue, createEventManager, createSyncOnceRunner, decorateEvent, deepClone, defineProperty, delayWithBackoff, deleteAttr, falseValue, filterItem, forEach, getConfig, getContext, getContextOptions, getHandlerMethod, getLocalCacheConfigParam, getMethodInternalKey, getOptions, getTime, globalToString, includes, instanceOf, isArray, isFn, isNumber, isObject, isPlainObject, isSSR, isSpecialRequestBody, isString, key, len, mapItem, newInstance, noop, nullValue, objAssign, objectKeys, objectValues, omit, promiseCatch, promiseFinally, promiseReject, promiseResolve, promiseThen, pushItem, regexpTest, setTimeoutFn, shift, slice, sloughConfig, sloughFunction, splice, trueValue, type, typeOf, undefinedValue, usePromise, uuid, valueObject, walkObject }; diff --git a/node_modules/.pnpm/@esbuild+win32-x64@0.21.5/node_modules/@esbuild/win32-x64/README.md b/node_modules/.pnpm/@esbuild+win32-x64@0.21.5/node_modules/@esbuild/win32-x64/README.md new file mode 100644 index 0000000..a99ee7c --- /dev/null +++ b/node_modules/.pnpm/@esbuild+win32-x64@0.21.5/node_modules/@esbuild/win32-x64/README.md @@ -0,0 +1,3 @@ +# esbuild + +This is the Windows 64-bit binary for esbuild, a JavaScript bundler and minifier. See https://github.com/evanw/esbuild for details. diff --git a/node_modules/.pnpm/@esbuild+win32-x64@0.21.5/node_modules/@esbuild/win32-x64/package.json b/node_modules/.pnpm/@esbuild+win32-x64@0.21.5/node_modules/@esbuild/win32-x64/package.json new file mode 100644 index 0000000..94abf8c --- /dev/null +++ b/node_modules/.pnpm/@esbuild+win32-x64@0.21.5/node_modules/@esbuild/win32-x64/package.json @@ -0,0 +1,20 @@ +{ + "name": "@esbuild/win32-x64", + "version": "0.21.5", + "description": "The Windows 64-bit binary for esbuild, a JavaScript bundler.", + "repository": { + "type": "git", + "url": "git+https://github.com/evanw/esbuild.git" + }, + "license": "MIT", + "preferUnplugged": true, + "engines": { + "node": ">=12" + }, + "os": [ + "win32" + ], + "cpu": [ + "x64" + ] +} diff --git a/node_modules/.pnpm/@rollup+rollup-win32-x64-msvc@4.40.2/node_modules/@rollup/rollup-win32-x64-msvc/README.md b/node_modules/.pnpm/@rollup+rollup-win32-x64-msvc@4.40.2/node_modules/@rollup/rollup-win32-x64-msvc/README.md new file mode 100644 index 0000000..7382dbc --- /dev/null +++ b/node_modules/.pnpm/@rollup+rollup-win32-x64-msvc@4.40.2/node_modules/@rollup/rollup-win32-x64-msvc/README.md @@ -0,0 +1,3 @@ +# `@rollup/rollup-win32-x64-msvc` + +This is the **x86_64-pc-windows-msvc** binary for `rollup` diff --git a/node_modules/.pnpm/@rollup+rollup-win32-x64-msvc@4.40.2/node_modules/@rollup/rollup-win32-x64-msvc/package.json b/node_modules/.pnpm/@rollup+rollup-win32-x64-msvc@4.40.2/node_modules/@rollup/rollup-win32-x64-msvc/package.json new file mode 100644 index 0000000..e21bf40 --- /dev/null +++ b/node_modules/.pnpm/@rollup+rollup-win32-x64-msvc@4.40.2/node_modules/@rollup/rollup-win32-x64-msvc/package.json @@ -0,0 +1,19 @@ +{ + "name": "@rollup/rollup-win32-x64-msvc", + "version": "4.40.2", + "os": [ + "win32" + ], + "cpu": [ + "x64" + ], + "files": [ + "rollup.win32-x64-msvc.node" + ], + "description": "Native bindings for Rollup", + "author": "Lukas Taegert-Atkinson", + "homepage": "https://rollupjs.org/", + "license": "MIT", + "repository": "rollup/rollup", + "main": "./rollup.win32-x64-msvc.node" +} \ No newline at end of file diff --git a/node_modules/.pnpm/@rollup+rollup-win32-x64-msvc@4.40.2/node_modules/@rollup/rollup-win32-x64-msvc/rollup.win32-x64-msvc.node b/node_modules/.pnpm/@rollup+rollup-win32-x64-msvc@4.40.2/node_modules/@rollup/rollup-win32-x64-msvc/rollup.win32-x64-msvc.node new file mode 100644 index 0000000000000000000000000000000000000000..5a894e67bf91689c05a7b07904b70e2f72dcba1f GIT binary patch literal 3682304 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%0D{lIZ@L_qqLSLq& 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%0D&$*e~rpKhiy<~HOWu3kM=v*1ro>*rW#yoB= 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%0A+Px<5xoy{mRK-OE$jv!=-Un_$l2A&9JbD0 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
l-SyS|8K<+x2orOQkmvX5`k^{}^LjeyPh+&iP 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%0Ds`+|jw4+LFY>KN>R#eURvqK}jWuFcav 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
P#uQ0WthKNgO(9h<5*o7;w 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®<($KT2}fLz(qZ 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 z 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 z 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ϢTYLq7>b&%uUd|uwIZ}!Au-qq&iNBlQt8cjf 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%0AG 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 literal 0 HcmV?d00001 diff --git a/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/LICENSE b/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/LICENSE new file mode 100644 index 0000000..9e841e7 --- /dev/null +++ b/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/README.md b/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/README.md new file mode 100644 index 0000000..b0baf5f --- /dev/null +++ b/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/README.md @@ -0,0 +1,15 @@ +# Installation +> `npm install --save @types/estree` + +# Summary +This package contains type definitions for estree (https://github.com/estree/estree). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/estree. + +### Additional Details + * Last updated: Mon, 24 Mar 2025 07:34:10 GMT + * Dependencies: none + +# Credits +These definitions were written by [RReverser](https://github.com/RReverser). diff --git a/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/flow.d.ts b/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/flow.d.ts new file mode 100644 index 0000000..9d001a9 --- /dev/null +++ b/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/flow.d.ts @@ -0,0 +1,167 @@ +declare namespace ESTree { + interface FlowTypeAnnotation extends Node {} + + interface FlowBaseTypeAnnotation extends FlowTypeAnnotation {} + + interface FlowLiteralTypeAnnotation extends FlowTypeAnnotation, Literal {} + + interface FlowDeclaration extends Declaration {} + + interface AnyTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface ArrayTypeAnnotation extends FlowTypeAnnotation { + elementType: FlowTypeAnnotation; + } + + interface BooleanLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {} + + interface BooleanTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface ClassImplements extends Node { + id: Identifier; + typeParameters?: TypeParameterInstantiation | null; + } + + interface ClassProperty { + key: Expression; + value?: Expression | null; + typeAnnotation?: TypeAnnotation | null; + computed: boolean; + static: boolean; + } + + interface DeclareClass extends FlowDeclaration { + id: Identifier; + typeParameters?: TypeParameterDeclaration | null; + body: ObjectTypeAnnotation; + extends: InterfaceExtends[]; + } + + interface DeclareFunction extends FlowDeclaration { + id: Identifier; + } + + interface DeclareModule extends FlowDeclaration { + id: Literal | Identifier; + body: BlockStatement; + } + + interface DeclareVariable extends FlowDeclaration { + id: Identifier; + } + + interface FunctionTypeAnnotation extends FlowTypeAnnotation { + params: FunctionTypeParam[]; + returnType: FlowTypeAnnotation; + rest?: FunctionTypeParam | null; + typeParameters?: TypeParameterDeclaration | null; + } + + interface FunctionTypeParam { + name: Identifier; + typeAnnotation: FlowTypeAnnotation; + optional: boolean; + } + + interface GenericTypeAnnotation extends FlowTypeAnnotation { + id: Identifier | QualifiedTypeIdentifier; + typeParameters?: TypeParameterInstantiation | null; + } + + interface InterfaceExtends extends Node { + id: Identifier | QualifiedTypeIdentifier; + typeParameters?: TypeParameterInstantiation | null; + } + + interface InterfaceDeclaration extends FlowDeclaration { + id: Identifier; + typeParameters?: TypeParameterDeclaration | null; + extends: InterfaceExtends[]; + body: ObjectTypeAnnotation; + } + + interface IntersectionTypeAnnotation extends FlowTypeAnnotation { + types: FlowTypeAnnotation[]; + } + + interface MixedTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface NullableTypeAnnotation extends FlowTypeAnnotation { + typeAnnotation: TypeAnnotation; + } + + interface NumberLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {} + + interface NumberTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface StringLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {} + + interface StringTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface TupleTypeAnnotation extends FlowTypeAnnotation { + types: FlowTypeAnnotation[]; + } + + interface TypeofTypeAnnotation extends FlowTypeAnnotation { + argument: FlowTypeAnnotation; + } + + interface TypeAlias extends FlowDeclaration { + id: Identifier; + typeParameters?: TypeParameterDeclaration | null; + right: FlowTypeAnnotation; + } + + interface TypeAnnotation extends Node { + typeAnnotation: FlowTypeAnnotation; + } + + interface TypeCastExpression extends Expression { + expression: Expression; + typeAnnotation: TypeAnnotation; + } + + interface TypeParameterDeclaration extends Node { + params: Identifier[]; + } + + interface TypeParameterInstantiation extends Node { + params: FlowTypeAnnotation[]; + } + + interface ObjectTypeAnnotation extends FlowTypeAnnotation { + properties: ObjectTypeProperty[]; + indexers: ObjectTypeIndexer[]; + callProperties: ObjectTypeCallProperty[]; + } + + interface ObjectTypeCallProperty extends Node { + value: FunctionTypeAnnotation; + static: boolean; + } + + interface ObjectTypeIndexer extends Node { + id: Identifier; + key: FlowTypeAnnotation; + value: FlowTypeAnnotation; + static: boolean; + } + + interface ObjectTypeProperty extends Node { + key: Expression; + value: FlowTypeAnnotation; + optional: boolean; + static: boolean; + } + + interface QualifiedTypeIdentifier extends Node { + qualification: Identifier | QualifiedTypeIdentifier; + id: Identifier; + } + + interface UnionTypeAnnotation extends FlowTypeAnnotation { + types: FlowTypeAnnotation[]; + } + + interface VoidTypeAnnotation extends FlowBaseTypeAnnotation {} +} diff --git a/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/index.d.ts b/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/index.d.ts new file mode 100644 index 0000000..1c13265 --- /dev/null +++ b/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/index.d.ts @@ -0,0 +1,694 @@ +// This definition file follows a somewhat unusual format. ESTree allows +// runtime type checks based on the `type` parameter. In order to explain this +// to typescript we want to use discriminated union types: +// https://github.com/Microsoft/TypeScript/pull/9163 +// +// For ESTree this is a bit tricky because the high level interfaces like +// Node or Function are pulling double duty. We want to pass common fields down +// to the interfaces that extend them (like Identifier or +// ArrowFunctionExpression), but you can't extend a type union or enforce +// common fields on them. So we've split the high level interfaces into two +// types, a base type which passes down inherited fields, and a type union of +// all types which extend the base type. Only the type union is exported, and +// the union is how other types refer to the collection of inheriting types. +// +// This makes the definitions file here somewhat more difficult to maintain, +// but it has the notable advantage of making ESTree much easier to use as +// an end user. + +export interface BaseNodeWithoutComments { + // Every leaf interface that extends BaseNode must specify a type property. + // The type property should be a string literal. For example, Identifier + // has: `type: "Identifier"` + type: string; + loc?: SourceLocation | null | undefined; + range?: [number, number] | undefined; +} + +export interface BaseNode extends BaseNodeWithoutComments { + leadingComments?: Comment[] | undefined; + trailingComments?: Comment[] | undefined; +} + +export interface NodeMap { + AssignmentProperty: AssignmentProperty; + CatchClause: CatchClause; + Class: Class; + ClassBody: ClassBody; + Expression: Expression; + Function: Function; + Identifier: Identifier; + Literal: Literal; + MethodDefinition: MethodDefinition; + ModuleDeclaration: ModuleDeclaration; + ModuleSpecifier: ModuleSpecifier; + Pattern: Pattern; + PrivateIdentifier: PrivateIdentifier; + Program: Program; + Property: Property; + PropertyDefinition: PropertyDefinition; + SpreadElement: SpreadElement; + Statement: Statement; + Super: Super; + SwitchCase: SwitchCase; + TemplateElement: TemplateElement; + VariableDeclarator: VariableDeclarator; +} + +export type Node = NodeMap[keyof NodeMap]; + +export interface Comment extends BaseNodeWithoutComments { + type: "Line" | "Block"; + value: string; +} + +export interface SourceLocation { + source?: string | null | undefined; + start: Position; + end: Position; +} + +export interface Position { + /** >= 1 */ + line: number; + /** >= 0 */ + column: number; +} + +export interface Program extends BaseNode { + type: "Program"; + sourceType: "script" | "module"; + body: Array; + comments?: Comment[] | undefined; +} + +export interface Directive extends BaseNode { + type: "ExpressionStatement"; + expression: Literal; + directive: string; +} + +export interface BaseFunction extends BaseNode { + params: Pattern[]; + generator?: boolean | undefined; + async?: boolean | undefined; + // The body is either BlockStatement or Expression because arrow functions + // can have a body that's either. FunctionDeclarations and + // FunctionExpressions have only BlockStatement bodies. + body: BlockStatement | Expression; +} + +export type Function = FunctionDeclaration | FunctionExpression | ArrowFunctionExpression; + +export type Statement = + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | Declaration; + +export interface BaseStatement extends BaseNode {} + +export interface EmptyStatement extends BaseStatement { + type: "EmptyStatement"; +} + +export interface BlockStatement extends BaseStatement { + type: "BlockStatement"; + body: Statement[]; + innerComments?: Comment[] | undefined; +} + +export interface StaticBlock extends Omit { + type: "StaticBlock"; +} + +export interface ExpressionStatement extends BaseStatement { + type: "ExpressionStatement"; + expression: Expression; +} + +export interface IfStatement extends BaseStatement { + type: "IfStatement"; + test: Expression; + consequent: Statement; + alternate?: Statement | null | undefined; +} + +export interface LabeledStatement extends BaseStatement { + type: "LabeledStatement"; + label: Identifier; + body: Statement; +} + +export interface BreakStatement extends BaseStatement { + type: "BreakStatement"; + label?: Identifier | null | undefined; +} + +export interface ContinueStatement extends BaseStatement { + type: "ContinueStatement"; + label?: Identifier | null | undefined; +} + +export interface WithStatement extends BaseStatement { + type: "WithStatement"; + object: Expression; + body: Statement; +} + +export interface SwitchStatement extends BaseStatement { + type: "SwitchStatement"; + discriminant: Expression; + cases: SwitchCase[]; +} + +export interface ReturnStatement extends BaseStatement { + type: "ReturnStatement"; + argument?: Expression | null | undefined; +} + +export interface ThrowStatement extends BaseStatement { + type: "ThrowStatement"; + argument: Expression; +} + +export interface TryStatement extends BaseStatement { + type: "TryStatement"; + block: BlockStatement; + handler?: CatchClause | null | undefined; + finalizer?: BlockStatement | null | undefined; +} + +export interface WhileStatement extends BaseStatement { + type: "WhileStatement"; + test: Expression; + body: Statement; +} + +export interface DoWhileStatement extends BaseStatement { + type: "DoWhileStatement"; + body: Statement; + test: Expression; +} + +export interface ForStatement extends BaseStatement { + type: "ForStatement"; + init?: VariableDeclaration | Expression | null | undefined; + test?: Expression | null | undefined; + update?: Expression | null | undefined; + body: Statement; +} + +export interface BaseForXStatement extends BaseStatement { + left: VariableDeclaration | Pattern; + right: Expression; + body: Statement; +} + +export interface ForInStatement extends BaseForXStatement { + type: "ForInStatement"; +} + +export interface DebuggerStatement extends BaseStatement { + type: "DebuggerStatement"; +} + +export type Declaration = FunctionDeclaration | VariableDeclaration | ClassDeclaration; + +export interface BaseDeclaration extends BaseStatement {} + +export interface MaybeNamedFunctionDeclaration extends BaseFunction, BaseDeclaration { + type: "FunctionDeclaration"; + /** It is null when a function declaration is a part of the `export default function` statement */ + id: Identifier | null; + body: BlockStatement; +} + +export interface FunctionDeclaration extends MaybeNamedFunctionDeclaration { + id: Identifier; +} + +export interface VariableDeclaration extends BaseDeclaration { + type: "VariableDeclaration"; + declarations: VariableDeclarator[]; + kind: "var" | "let" | "const"; +} + +export interface VariableDeclarator extends BaseNode { + type: "VariableDeclarator"; + id: Pattern; + init?: Expression | null | undefined; +} + +export interface ExpressionMap { + ArrayExpression: ArrayExpression; + ArrowFunctionExpression: ArrowFunctionExpression; + AssignmentExpression: AssignmentExpression; + AwaitExpression: AwaitExpression; + BinaryExpression: BinaryExpression; + CallExpression: CallExpression; + ChainExpression: ChainExpression; + ClassExpression: ClassExpression; + ConditionalExpression: ConditionalExpression; + FunctionExpression: FunctionExpression; + Identifier: Identifier; + ImportExpression: ImportExpression; + Literal: Literal; + LogicalExpression: LogicalExpression; + MemberExpression: MemberExpression; + MetaProperty: MetaProperty; + NewExpression: NewExpression; + ObjectExpression: ObjectExpression; + SequenceExpression: SequenceExpression; + TaggedTemplateExpression: TaggedTemplateExpression; + TemplateLiteral: TemplateLiteral; + ThisExpression: ThisExpression; + UnaryExpression: UnaryExpression; + UpdateExpression: UpdateExpression; + YieldExpression: YieldExpression; +} + +export type Expression = ExpressionMap[keyof ExpressionMap]; + +export interface BaseExpression extends BaseNode {} + +export type ChainElement = SimpleCallExpression | MemberExpression; + +export interface ChainExpression extends BaseExpression { + type: "ChainExpression"; + expression: ChainElement; +} + +export interface ThisExpression extends BaseExpression { + type: "ThisExpression"; +} + +export interface ArrayExpression extends BaseExpression { + type: "ArrayExpression"; + elements: Array; +} + +export interface ObjectExpression extends BaseExpression { + type: "ObjectExpression"; + properties: Array; +} + +export interface PrivateIdentifier extends BaseNode { + type: "PrivateIdentifier"; + name: string; +} + +export interface Property extends BaseNode { + type: "Property"; + key: Expression | PrivateIdentifier; + value: Expression | Pattern; // Could be an AssignmentProperty + kind: "init" | "get" | "set"; + method: boolean; + shorthand: boolean; + computed: boolean; +} + +export interface PropertyDefinition extends BaseNode { + type: "PropertyDefinition"; + key: Expression | PrivateIdentifier; + value?: Expression | null | undefined; + computed: boolean; + static: boolean; +} + +export interface FunctionExpression extends BaseFunction, BaseExpression { + id?: Identifier | null | undefined; + type: "FunctionExpression"; + body: BlockStatement; +} + +export interface SequenceExpression extends BaseExpression { + type: "SequenceExpression"; + expressions: Expression[]; +} + +export interface UnaryExpression extends BaseExpression { + type: "UnaryExpression"; + operator: UnaryOperator; + prefix: true; + argument: Expression; +} + +export interface BinaryExpression extends BaseExpression { + type: "BinaryExpression"; + operator: BinaryOperator; + left: Expression | PrivateIdentifier; + right: Expression; +} + +export interface AssignmentExpression extends BaseExpression { + type: "AssignmentExpression"; + operator: AssignmentOperator; + left: Pattern | MemberExpression; + right: Expression; +} + +export interface UpdateExpression extends BaseExpression { + type: "UpdateExpression"; + operator: UpdateOperator; + argument: Expression; + prefix: boolean; +} + +export interface LogicalExpression extends BaseExpression { + type: "LogicalExpression"; + operator: LogicalOperator; + left: Expression; + right: Expression; +} + +export interface ConditionalExpression extends BaseExpression { + type: "ConditionalExpression"; + test: Expression; + alternate: Expression; + consequent: Expression; +} + +export interface BaseCallExpression extends BaseExpression { + callee: Expression | Super; + arguments: Array; +} +export type CallExpression = SimpleCallExpression | NewExpression; + +export interface SimpleCallExpression extends BaseCallExpression { + type: "CallExpression"; + optional: boolean; +} + +export interface NewExpression extends BaseCallExpression { + type: "NewExpression"; +} + +export interface MemberExpression extends BaseExpression, BasePattern { + type: "MemberExpression"; + object: Expression | Super; + property: Expression | PrivateIdentifier; + computed: boolean; + optional: boolean; +} + +export type Pattern = Identifier | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern | MemberExpression; + +export interface BasePattern extends BaseNode {} + +export interface SwitchCase extends BaseNode { + type: "SwitchCase"; + test?: Expression | null | undefined; + consequent: Statement[]; +} + +export interface CatchClause extends BaseNode { + type: "CatchClause"; + param: Pattern | null; + body: BlockStatement; +} + +export interface Identifier extends BaseNode, BaseExpression, BasePattern { + type: "Identifier"; + name: string; +} + +export type Literal = SimpleLiteral | RegExpLiteral | BigIntLiteral; + +export interface SimpleLiteral extends BaseNode, BaseExpression { + type: "Literal"; + value: string | boolean | number | null; + raw?: string | undefined; +} + +export interface RegExpLiteral extends BaseNode, BaseExpression { + type: "Literal"; + value?: RegExp | null | undefined; + regex: { + pattern: string; + flags: string; + }; + raw?: string | undefined; +} + +export interface BigIntLiteral extends BaseNode, BaseExpression { + type: "Literal"; + value?: bigint | null | undefined; + bigint: string; + raw?: string | undefined; +} + +export type UnaryOperator = "-" | "+" | "!" | "~" | "typeof" | "void" | "delete"; + +export type BinaryOperator = + | "==" + | "!=" + | "===" + | "!==" + | "<" + | "<=" + | ">" + | ">=" + | "<<" + | ">>" + | ">>>" + | "+" + | "-" + | "*" + | "/" + | "%" + | "**" + | "|" + | "^" + | "&" + | "in" + | "instanceof"; + +export type LogicalOperator = "||" | "&&" | "??"; + +export type AssignmentOperator = + | "=" + | "+=" + | "-=" + | "*=" + | "/=" + | "%=" + | "**=" + | "<<=" + | ">>=" + | ">>>=" + | "|=" + | "^=" + | "&=" + | "||=" + | "&&=" + | "??="; + +export type UpdateOperator = "++" | "--"; + +export interface ForOfStatement extends BaseForXStatement { + type: "ForOfStatement"; + await: boolean; +} + +export interface Super extends BaseNode { + type: "Super"; +} + +export interface SpreadElement extends BaseNode { + type: "SpreadElement"; + argument: Expression; +} + +export interface ArrowFunctionExpression extends BaseExpression, BaseFunction { + type: "ArrowFunctionExpression"; + expression: boolean; + body: BlockStatement | Expression; +} + +export interface YieldExpression extends BaseExpression { + type: "YieldExpression"; + argument?: Expression | null | undefined; + delegate: boolean; +} + +export interface TemplateLiteral extends BaseExpression { + type: "TemplateLiteral"; + quasis: TemplateElement[]; + expressions: Expression[]; +} + +export interface TaggedTemplateExpression extends BaseExpression { + type: "TaggedTemplateExpression"; + tag: Expression; + quasi: TemplateLiteral; +} + +export interface TemplateElement extends BaseNode { + type: "TemplateElement"; + tail: boolean; + value: { + /** It is null when the template literal is tagged and the text has an invalid escape (e.g. - tag`\unicode and \u{55}`) */ + cooked?: string | null | undefined; + raw: string; + }; +} + +export interface AssignmentProperty extends Property { + value: Pattern; + kind: "init"; + method: boolean; // false +} + +export interface ObjectPattern extends BasePattern { + type: "ObjectPattern"; + properties: Array; +} + +export interface ArrayPattern extends BasePattern { + type: "ArrayPattern"; + elements: Array; +} + +export interface RestElement extends BasePattern { + type: "RestElement"; + argument: Pattern; +} + +export interface AssignmentPattern extends BasePattern { + type: "AssignmentPattern"; + left: Pattern; + right: Expression; +} + +export type Class = ClassDeclaration | ClassExpression; +export interface BaseClass extends BaseNode { + superClass?: Expression | null | undefined; + body: ClassBody; +} + +export interface ClassBody extends BaseNode { + type: "ClassBody"; + body: Array; +} + +export interface MethodDefinition extends BaseNode { + type: "MethodDefinition"; + key: Expression | PrivateIdentifier; + value: FunctionExpression; + kind: "constructor" | "method" | "get" | "set"; + computed: boolean; + static: boolean; +} + +export interface MaybeNamedClassDeclaration extends BaseClass, BaseDeclaration { + type: "ClassDeclaration"; + /** It is null when a class declaration is a part of the `export default class` statement */ + id: Identifier | null; +} + +export interface ClassDeclaration extends MaybeNamedClassDeclaration { + id: Identifier; +} + +export interface ClassExpression extends BaseClass, BaseExpression { + type: "ClassExpression"; + id?: Identifier | null | undefined; +} + +export interface MetaProperty extends BaseExpression { + type: "MetaProperty"; + meta: Identifier; + property: Identifier; +} + +export type ModuleDeclaration = + | ImportDeclaration + | ExportNamedDeclaration + | ExportDefaultDeclaration + | ExportAllDeclaration; +export interface BaseModuleDeclaration extends BaseNode {} + +export type ModuleSpecifier = ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier; +export interface BaseModuleSpecifier extends BaseNode { + local: Identifier; +} + +export interface ImportDeclaration extends BaseModuleDeclaration { + type: "ImportDeclaration"; + specifiers: Array; + attributes: ImportAttribute[]; + source: Literal; +} + +export interface ImportSpecifier extends BaseModuleSpecifier { + type: "ImportSpecifier"; + imported: Identifier | Literal; +} + +export interface ImportAttribute extends BaseNode { + type: "ImportAttribute"; + key: Identifier | Literal; + value: Literal; +} + +export interface ImportExpression extends BaseExpression { + type: "ImportExpression"; + source: Expression; + options?: Expression | null | undefined; +} + +export interface ImportDefaultSpecifier extends BaseModuleSpecifier { + type: "ImportDefaultSpecifier"; +} + +export interface ImportNamespaceSpecifier extends BaseModuleSpecifier { + type: "ImportNamespaceSpecifier"; +} + +export interface ExportNamedDeclaration extends BaseModuleDeclaration { + type: "ExportNamedDeclaration"; + declaration?: Declaration | null | undefined; + specifiers: ExportSpecifier[]; + attributes: ImportAttribute[]; + source?: Literal | null | undefined; +} + +export interface ExportSpecifier extends Omit { + type: "ExportSpecifier"; + local: Identifier | Literal; + exported: Identifier | Literal; +} + +export interface ExportDefaultDeclaration extends BaseModuleDeclaration { + type: "ExportDefaultDeclaration"; + declaration: MaybeNamedFunctionDeclaration | MaybeNamedClassDeclaration | Expression; +} + +export interface ExportAllDeclaration extends BaseModuleDeclaration { + type: "ExportAllDeclaration"; + exported: Identifier | Literal | null; + attributes: ImportAttribute[]; + source: Literal; +} + +export interface AwaitExpression extends BaseExpression { + type: "AwaitExpression"; + argument: Expression; +} diff --git a/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/package.json b/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/package.json new file mode 100644 index 0000000..61ce23a --- /dev/null +++ b/node_modules/.pnpm/@types+estree@1.0.7/node_modules/@types/estree/package.json @@ -0,0 +1,27 @@ +{ + "name": "@types/estree", + "version": "1.0.7", + "description": "TypeScript definitions for estree", + "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/estree", + "license": "MIT", + "contributors": [ + { + "name": "RReverser", + "githubUsername": "RReverser", + "url": "https://github.com/RReverser" + } + ], + "main": "", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", + "directory": "types/estree" + }, + "scripts": {}, + "dependencies": {}, + "peerDependencies": {}, + "typesPublisherContentHash": "1ab11f4e78319f80655b4ca20a073da0dc035be5f3290fb0bfa1e08a055d0c7d", + "typeScriptVersion": "5.0", + "nonNpm": true +} \ No newline at end of file diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/application.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/application.js new file mode 100644 index 0000000..a017d4a --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/application.js @@ -0,0 +1,32 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +const call = newRuntimeCaller(objectNames.Application); +const HideMethod = 0; +const ShowMethod = 1; +const QuitMethod = 2; +/** + * Hides a certain method by calling the HideMethod function. + */ +export function Hide() { + return call(HideMethod); +} +/** + * Calls the ShowMethod and returns the result. + */ +export function Show() { + return call(ShowMethod); +} +/** + * Calls the QuitMethod to terminate the program. + */ +export function Quit() { + return call(QuitMethod); +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/browser.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/browser.js new file mode 100644 index 0000000..6339890 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/browser.js @@ -0,0 +1,20 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +const call = newRuntimeCaller(objectNames.Browser); +const BrowserOpenURL = 0; +/** + * Open a browser window to the given URL. + * + * @param url - The URL to open + */ +export function OpenURL(url) { + return call(BrowserOpenURL, { url: url.toString() }); +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/callable.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/callable.js new file mode 100644 index 0000000..c382735 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/callable.js @@ -0,0 +1,144 @@ +// Source: https://github.com/inspect-js/is-callable +// The MIT License (MIT) +// +// Copyright (c) 2015 Jordan Harband +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +var fnToStr = Function.prototype.toString; +var reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply; +var badArrayLike; +var isCallableMarker; +if (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') { + try { + badArrayLike = Object.defineProperty({}, 'length', { + get: function () { + throw isCallableMarker; + } + }); + isCallableMarker = {}; + // eslint-disable-next-line no-throw-literal + reflectApply(function () { throw 42; }, null, badArrayLike); + } + catch (_) { + if (_ !== isCallableMarker) { + reflectApply = null; + } + } +} +else { + reflectApply = null; +} +var constructorRegex = /^\s*class\b/; +var isES6ClassFn = function isES6ClassFunction(value) { + try { + var fnStr = fnToStr.call(value); + return constructorRegex.test(fnStr); + } + catch (e) { + return false; // not a function + } +}; +var tryFunctionObject = function tryFunctionToStr(value) { + try { + if (isES6ClassFn(value)) { + return false; + } + fnToStr.call(value); + return true; + } + catch (e) { + return false; + } +}; +var toStr = Object.prototype.toString; +var objectClass = '[object Object]'; +var fnClass = '[object Function]'; +var genClass = '[object GeneratorFunction]'; +var ddaClass = '[object HTMLAllCollection]'; // IE 11 +var ddaClass2 = '[object HTML document.all class]'; +var ddaClass3 = '[object HTMLCollection]'; // IE 9-10 +var hasToStringTag = typeof Symbol === 'function' && !!Symbol.toStringTag; // better: use `has-tostringtag` +var isIE68 = !(0 in [,]); // eslint-disable-line no-sparse-arrays, comma-spacing +var isDDA = function isDocumentDotAll() { return false; }; +if (typeof document === 'object') { + // Firefox 3 canonicalizes DDA to undefined when it's not accessed directly + var all = document.all; + if (toStr.call(all) === toStr.call(document.all)) { + isDDA = function isDocumentDotAll(value) { + /* globals document: false */ + // in IE 6-8, typeof document.all is "object" and it's truthy + if ((isIE68 || !value) && (typeof value === 'undefined' || typeof value === 'object')) { + try { + var str = toStr.call(value); + return (str === ddaClass + || str === ddaClass2 + || str === ddaClass3 // opera 12.16 + || str === objectClass // IE 6-8 + ) && value('') == null; // eslint-disable-line eqeqeq + } + catch (e) { /**/ } + } + return false; + }; + } +} +function isCallableRefApply(value) { + if (isDDA(value)) { + return true; + } + if (!value) { + return false; + } + if (typeof value !== 'function' && typeof value !== 'object') { + return false; + } + try { + reflectApply(value, null, badArrayLike); + } + catch (e) { + if (e !== isCallableMarker) { + return false; + } + } + return !isES6ClassFn(value) && tryFunctionObject(value); +} +function isCallableNoRefApply(value) { + if (isDDA(value)) { + return true; + } + if (!value) { + return false; + } + if (typeof value !== 'function' && typeof value !== 'object') { + return false; + } + if (hasToStringTag) { + return tryFunctionObject(value); + } + if (isES6ClassFn(value)) { + return false; + } + var strClass = toStr.call(value); + if (strClass !== fnClass && strClass !== genClass && !(/^\[object HTML/).test(strClass)) { + return false; + } + return tryFunctionObject(value); +} +; +export default reflectApply ? isCallableRefApply : isCallableNoRefApply; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/calls.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/calls.js new file mode 100644 index 0000000..a6777fa --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/calls.js @@ -0,0 +1,194 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { CancellablePromise } from "./cancellable.js"; +import { newRuntimeCaller, objectNames } from "./runtime.js"; +import { nanoid } from "./nanoid.js"; +// Setup +window._wails = window._wails || {}; +window._wails.callResultHandler = resultHandler; +window._wails.callErrorHandler = errorHandler; +const call = newRuntimeCaller(objectNames.Call); +const cancelCall = newRuntimeCaller(objectNames.CancelCall); +const callResponses = new Map(); +const CallBinding = 0; +const CancelMethod = 0; +/** + * Exception class that will be thrown in case the bound method returns an error. + * The value of the {@link RuntimeError#name} property is "RuntimeError". + */ +export class RuntimeError extends Error { + /** + * Constructs a new RuntimeError instance. + * @param message - The error message. + * @param options - Options to be forwarded to the Error constructor. + */ + constructor(message, options) { + super(message, options); + this.name = "RuntimeError"; + } +} +/** + * Handles the result of a call request. + * + * @param id - The id of the request to handle the result for. + * @param data - The result data of the request. + * @param isJSON - Indicates whether the data is JSON or not. + */ +function resultHandler(id, data, isJSON) { + const resolvers = getAndDeleteResponse(id); + if (!resolvers) { + return; + } + if (!data) { + resolvers.resolve(undefined); + } + else if (!isJSON) { + resolvers.resolve(data); + } + else { + try { + resolvers.resolve(JSON.parse(data)); + } + catch (err) { + resolvers.reject(new TypeError("could not parse result: " + err.message, { cause: err })); + } + } +} +/** + * Handles the error from a call request. + * + * @param id - The id of the promise handler. + * @param data - The error data to reject the promise handler with. + * @param isJSON - Indicates whether the data is JSON or not. + */ +function errorHandler(id, data, isJSON) { + const resolvers = getAndDeleteResponse(id); + if (!resolvers) { + return; + } + if (!isJSON) { + resolvers.reject(new Error(data)); + } + else { + let error; + try { + error = JSON.parse(data); + } + catch (err) { + resolvers.reject(new TypeError("could not parse error: " + err.message, { cause: err })); + return; + } + let options = {}; + if (error.cause) { + options.cause = error.cause; + } + let exception; + switch (error.kind) { + case "ReferenceError": + exception = new ReferenceError(error.message, options); + break; + case "TypeError": + exception = new TypeError(error.message, options); + break; + case "RuntimeError": + exception = new RuntimeError(error.message, options); + break; + default: + exception = new Error(error.message, options); + break; + } + resolvers.reject(exception); + } +} +/** + * Retrieves and removes the response associated with the given ID from the callResponses map. + * + * @param id - The ID of the response to be retrieved and removed. + * @returns The response object associated with the given ID, if any. + */ +function getAndDeleteResponse(id) { + const response = callResponses.get(id); + callResponses.delete(id); + return response; +} +/** + * Generates a unique ID using the nanoid library. + * + * @returns A unique ID that does not exist in the callResponses set. + */ +function generateID() { + let result; + do { + result = nanoid(); + } while (callResponses.has(result)); + return result; +} +/** + * Call a bound method according to the given call options. + * + * In case of failure, the returned promise will reject with an exception + * among ReferenceError (unknown method), TypeError (wrong argument count or type), + * {@link RuntimeError} (method returned an error), or other (network or internal errors). + * The exception might have a "cause" field with the value returned + * by the application- or service-level error marshaling functions. + * + * @param options - A method call descriptor. + * @returns The result of the call. + */ +export function Call(options) { + const id = generateID(); + const result = CancellablePromise.withResolvers(); + callResponses.set(id, { resolve: result.resolve, reject: result.reject }); + const request = call(CallBinding, Object.assign({ "call-id": id }, options)); + let running = false; + request.then(() => { + running = true; + }, (err) => { + callResponses.delete(id); + result.reject(err); + }); + const cancel = () => { + callResponses.delete(id); + return cancelCall(CancelMethod, { "call-id": id }).catch((err) => { + console.error("Error while requesting binding call cancellation:", err); + }); + }; + result.oncancelled = () => { + if (running) { + return cancel(); + } + else { + return request.then(cancel); + } + }; + return result.promise; +} +/** + * Calls a bound method by name with the specified arguments. + * See {@link Call} for details. + * + * @param methodName - The name of the method in the format 'package.struct.method'. + * @param args - The arguments to pass to the method. + * @returns The result of the method call. + */ +export function ByName(methodName, ...args) { + return Call({ methodName, args }); +} +/** + * Calls a method by its numeric ID with the specified arguments. + * See {@link Call} for details. + * + * @param methodID - The ID of the method to call. + * @param args - The arguments to pass to the method. + * @return The result of the method call. + */ +export function ByID(methodID, ...args) { + return Call({ methodID, args }); +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/cancellable.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/cancellable.js new file mode 100644 index 0000000..834cb94 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/cancellable.js @@ -0,0 +1,792 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +var _a; +import isCallable from "./callable.js"; +/** + * Exception class that will be used as rejection reason + * in case a {@link CancellablePromise} is cancelled successfully. + * + * The value of the {@link name} property is the string `"CancelError"`. + * The value of the {@link cause} property is the cause passed to the cancel method, if any. + */ +export class CancelError extends Error { + /** + * Constructs a new `CancelError` instance. + * @param message - The error message. + * @param options - Options to be forwarded to the Error constructor. + */ + constructor(message, options) { + super(message, options); + this.name = "CancelError"; + } +} +/** + * Exception class that will be reported as an unhandled rejection + * in case a {@link CancellablePromise} rejects after being cancelled, + * or when the `oncancelled` callback throws or rejects. + * + * The value of the {@link name} property is the string `"CancelledRejectionError"`. + * The value of the {@link cause} property is the reason the promise rejected with. + * + * Because the original promise was cancelled, + * a wrapper promise will be passed to the unhandled rejection listener instead. + * The {@link promise} property holds a reference to the original promise. + */ +export class CancelledRejectionError extends Error { + /** + * Constructs a new `CancelledRejectionError` instance. + * @param promise - The promise that caused the error originally. + * @param reason - The rejection reason. + * @param info - An optional informative message specifying the circumstances in which the error was thrown. + * Defaults to the string `"Unhandled rejection in cancelled promise."`. + */ + constructor(promise, reason, info) { + super((info !== null && info !== void 0 ? info : "Unhandled rejection in cancelled promise.") + " Reason: " + errorMessage(reason), { cause: reason }); + this.promise = promise; + this.name = "CancelledRejectionError"; + } +} +// Private field names. +const barrierSym = Symbol("barrier"); +const cancelImplSym = Symbol("cancelImpl"); +const species = (_a = Symbol.species) !== null && _a !== void 0 ? _a : Symbol("speciesPolyfill"); +/** + * A promise with an attached method for cancelling long-running operations (see {@link CancellablePromise#cancel}). + * Cancellation can optionally be bound to an {@link AbortSignal} + * for better composability (see {@link CancellablePromise#cancelOn}). + * + * Cancelling a pending promise will result in an immediate rejection + * with an instance of {@link CancelError} as reason, + * but whoever started the promise will be responsible + * for actually aborting the underlying operation. + * To this purpose, the constructor and all chaining methods + * accept optional cancellation callbacks. + * + * If a `CancellablePromise` still resolves after having been cancelled, + * the result will be discarded. If it rejects, the reason + * will be reported as an unhandled rejection, + * wrapped in a {@link CancelledRejectionError} instance. + * To facilitate the handling of cancellation requests, + * cancelled `CancellablePromise`s will _not_ report unhandled `CancelError`s + * whose `cause` field is the same as the one with which the current promise was cancelled. + * + * All usual promise methods are defined and return a `CancellablePromise` + * whose cancel method will cancel the parent operation as well, propagating the cancellation reason + * upwards through promise chains. + * Conversely, cancelling a promise will not automatically cancel dependent promises downstream: + * ```ts + * let root = new CancellablePromise((resolve, reject) => { ... }); + * let child1 = root.then(() => { ... }); + * let child2 = child1.then(() => { ... }); + * let child3 = root.catch(() => { ... }); + * child1.cancel(); // Cancels child1 and root, but not child2 or child3 + * ``` + * Cancelling a promise that has already settled is safe and has no consequence. + * + * The `cancel` method returns a promise that _always fulfills_ + * after the whole chain has processed the cancel request + * and all attached callbacks up to that moment have run. + * + * All ES2024 promise methods (static and instance) are defined on CancellablePromise, + * but actual availability may vary with OS/webview version. + * + * In line with the proposal at https://github.com/tc39/proposal-rm-builtin-subclassing, + * `CancellablePromise` does not support transparent subclassing. + * Extenders should take care to provide their own method implementations. + * This might be reconsidered in case the proposal is retired. + * + * CancellablePromise is a wrapper around the DOM Promise object + * and is compliant with the [Promises/A+ specification](https://promisesaplus.com/) + * (it passes the [compliance suite](https://github.com/promises-aplus/promises-tests)) + * if so is the underlying implementation. + */ +export class CancellablePromise extends Promise { + /** + * Creates a new `CancellablePromise`. + * + * @param executor - A callback used to initialize the promise. This callback is passed two arguments: + * a `resolve` callback used to resolve the promise with a value + * or the result of another promise (possibly cancellable), + * and a `reject` callback used to reject the promise with a provided reason or error. + * If the value provided to the `resolve` callback is a thenable _and_ cancellable object + * (it has a `then` _and_ a `cancel` method), + * cancellation requests will be forwarded to that object and the oncancelled will not be invoked anymore. + * If any one of the two callbacks is called _after_ the promise has been cancelled, + * the provided values will be cancelled and resolved as usual, + * but their results will be discarded. + * However, if the resolution process ultimately ends up in a rejection + * that is not due to cancellation, the rejection reason + * will be wrapped in a {@link CancelledRejectionError} + * and bubbled up as an unhandled rejection. + * @param oncancelled - It is the caller's responsibility to ensure that any operation + * started by the executor is properly halted upon cancellation. + * This optional callback can be used to that purpose. + * It will be called _synchronously_ with a cancellation cause + * when cancellation is requested, _after_ the promise has already rejected + * with a {@link CancelError}, but _before_ + * any {@link then}/{@link catch}/{@link finally} callback runs. + * If the callback returns a thenable, the promise returned from {@link cancel} + * will only fulfill after the former has settled. + * Unhandled exceptions or rejections from the callback will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as unhandled rejections. + * If the `resolve` callback is called before cancellation with a cancellable promise, + * cancellation requests on this promise will be diverted to that promise, + * and the original `oncancelled` callback will be discarded. + */ + constructor(executor, oncancelled) { + let resolve; + let reject; + super((res, rej) => { resolve = res; reject = rej; }); + if (this.constructor[species] !== Promise) { + throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property."); + } + let promise = { + promise: this, + resolve, + reject, + get oncancelled() { return oncancelled !== null && oncancelled !== void 0 ? oncancelled : null; }, + set oncancelled(cb) { oncancelled = cb !== null && cb !== void 0 ? cb : undefined; } + }; + const state = { + get root() { return state; }, + resolving: false, + settled: false + }; + // Setup cancellation system. + void Object.defineProperties(this, { + [barrierSym]: { + configurable: false, + enumerable: false, + writable: true, + value: null + }, + [cancelImplSym]: { + configurable: false, + enumerable: false, + writable: false, + value: cancellerFor(promise, state) + } + }); + // Run the actual executor. + const rejector = rejectorFor(promise, state); + try { + executor(resolverFor(promise, state), rejector); + } + catch (err) { + if (state.resolving) { + console.log("Unhandled exception in CancellablePromise executor.", err); + } + else { + rejector(err); + } + } + } + /** + * Cancels immediately the execution of the operation associated with this promise. + * The promise rejects with a {@link CancelError} instance as reason, + * with the {@link CancelError#cause} property set to the given argument, if any. + * + * Has no effect if called after the promise has already settled; + * repeated calls in particular are safe, but only the first one + * will set the cancellation cause. + * + * The `CancelError` exception _need not_ be handled explicitly _on the promises that are being cancelled:_ + * cancelling a promise with no attached rejection handler does not trigger an unhandled rejection event. + * Therefore, the following idioms are all equally correct: + * ```ts + * new CancellablePromise((resolve, reject) => { ... }).cancel(); + * new CancellablePromise((resolve, reject) => { ... }).then(...).cancel(); + * new CancellablePromise((resolve, reject) => { ... }).then(...).catch(...).cancel(); + * ``` + * Whenever some cancelled promise in a chain rejects with a `CancelError` + * with the same cancellation cause as itself, the error will be discarded silently. + * However, the `CancelError` _will still be delivered_ to all attached rejection handlers + * added by {@link then} and related methods: + * ```ts + * let cancellable = new CancellablePromise((resolve, reject) => { ... }); + * cancellable.then(() => { ... }).catch(console.log); + * cancellable.cancel(); // A CancelError is printed to the console. + * ``` + * If the `CancelError` is not handled downstream by the time it reaches + * a _non-cancelled_ promise, it _will_ trigger an unhandled rejection event, + * just like normal rejections would: + * ```ts + * let cancellable = new CancellablePromise((resolve, reject) => { ... }); + * let chained = cancellable.then(() => { ... }).then(() => { ... }); // No catch... + * cancellable.cancel(); // Unhandled rejection event on chained! + * ``` + * Therefore, it is important to either cancel whole promise chains from their tail, + * as shown in the correct idioms above, or take care of handling errors everywhere. + * + * @returns A cancellable promise that _fulfills_ after the cancel callback (if any) + * and all handlers attached up to the call to cancel have run. + * If the cancel callback returns a thenable, the promise returned by `cancel` + * will also wait for that thenable to settle. + * This enables callers to wait for the cancelled operation to terminate + * without being forced to handle potential errors at the call site. + * ```ts + * cancellable.cancel().then(() => { + * // Cleanup finished, it's safe to do something else. + * }, (err) => { + * // Unreachable: the promise returned from cancel will never reject. + * }); + * ``` + * Note that the returned promise will _not_ handle implicitly any rejection + * that might have occurred already in the cancelled chain. + * It will just track whether registered handlers have been executed or not. + * Therefore, unhandled rejections will never be silently handled by calling cancel. + */ + cancel(cause) { + return new CancellablePromise((resolve) => { + // INVARIANT: the result of this[cancelImplSym] and the barrier do not ever reject. + // Unfortunately macOS High Sierra does not support Promise.allSettled. + Promise.all([ + this[cancelImplSym](new CancelError("Promise cancelled.", { cause })), + currentBarrier(this) + ]).then(() => resolve(), () => resolve()); + }); + } + /** + * Binds promise cancellation to the abort event of the given {@link AbortSignal}. + * If the signal has already aborted, the promise will be cancelled immediately. + * When either condition is verified, the cancellation cause will be set + * to the signal's abort reason (see {@link AbortSignal#reason}). + * + * Has no effect if called (or if the signal aborts) _after_ the promise has already settled. + * Only the first signal to abort will set the cancellation cause. + * + * For more details about the cancellation process, + * see {@link cancel} and the `CancellablePromise` constructor. + * + * This method enables `await`ing cancellable promises without having + * to store them for future cancellation, e.g.: + * ```ts + * await longRunningOperation().cancelOn(signal); + * ``` + * instead of: + * ```ts + * let promiseToBeCancelled = longRunningOperation(); + * await promiseToBeCancelled; + * ``` + * + * @returns This promise, for method chaining. + */ + cancelOn(signal) { + if (signal.aborted) { + void this.cancel(signal.reason); + } + else { + signal.addEventListener('abort', () => void this.cancel(signal.reason), { capture: true }); + } + return this; + } + /** + * Attaches callbacks for the resolution and/or rejection of the `CancellablePromise`. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * When the parent promise rejects or is cancelled, the `onrejected` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A `CancellablePromise` for the completion of whichever callback is executed. + * The returned promise is hooked up to propagate cancellation requests up the chain, but not down: + * + * - if the parent promise is cancelled, the `onrejected` handler will be invoked with a `CancelError` + * and the returned promise _will resolve regularly_ with its result; + * - conversely, if the returned promise is cancelled, _the parent promise is cancelled too;_ + * the `onrejected` handler will still be invoked with the parent's `CancelError`, + * but its result will be discarded + * and the returned promise will reject with a `CancelError` as well. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If either callback returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + */ + then(onfulfilled, onrejected, oncancelled) { + if (!(this instanceof CancellablePromise)) { + throw new TypeError("CancellablePromise.prototype.then called on an invalid object."); + } + // NOTE: TypeScript's built-in type for then is broken, + // as it allows specifying an arbitrary TResult1 != T even when onfulfilled is not a function. + // We cannot fix it if we want to CancellablePromise to implement PromiseLike. + if (!isCallable(onfulfilled)) { + onfulfilled = identity; + } + if (!isCallable(onrejected)) { + onrejected = thrower; + } + if (onfulfilled === identity && onrejected == thrower) { + // Shortcut for trivial arguments. + return new CancellablePromise((resolve) => resolve(this)); + } + const barrier = {}; + this[barrierSym] = barrier; + return new CancellablePromise((resolve, reject) => { + void super.then((value) => { + var _a; + if (this[barrierSym] === barrier) { + this[barrierSym] = null; + } + (_a = barrier.resolve) === null || _a === void 0 ? void 0 : _a.call(barrier); + try { + resolve(onfulfilled(value)); + } + catch (err) { + reject(err); + } + }, (reason) => { + var _a; + if (this[barrierSym] === barrier) { + this[barrierSym] = null; + } + (_a = barrier.resolve) === null || _a === void 0 ? void 0 : _a.call(barrier); + try { + resolve(onrejected(reason)); + } + catch (err) { + reject(err); + } + }); + }, async (cause) => { + //cancelled = true; + try { + return oncancelled === null || oncancelled === void 0 ? void 0 : oncancelled(cause); + } + finally { + await this.cancel(cause); + } + }); + } + /** + * Attaches a callback for only the rejection of the Promise. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * When the parent promise rejects or is cancelled, the `onrejected` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * It is equivalent to + * ```ts + * cancellablePromise.then(undefined, onrejected, oncancelled); + * ``` + * and the same caveats apply. + * + * @returns A Promise for the completion of the callback. + * Cancellation requests on the returned promise + * will propagate up the chain to the parent promise, + * but not in the other direction. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If `onrejected` returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + * See {@link then} for more details. + */ + catch(onrejected, oncancelled) { + return this.then(undefined, onrejected, oncancelled); + } + /** + * Attaches a callback that is invoked when the CancellablePromise is settled (fulfilled or rejected). The + * resolved value cannot be accessed or modified from the callback. + * The returned promise will settle in the same state as the original one + * after the provided callback has completed execution, + * unless the callback throws or returns a rejecting promise, + * in which case the returned promise will reject as well. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * Once the parent promise settles, the `onfinally` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * This method is implemented in terms of {@link then} and the same caveats apply. + * It is polyfilled, hence available in every OS/webview version. + * + * @returns A Promise for the completion of the callback. + * Cancellation requests on the returned promise + * will propagate up the chain to the parent promise, + * but not in the other direction. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If `onfinally` returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + * See {@link then} for more details. + */ + finally(onfinally, oncancelled) { + if (!(this instanceof CancellablePromise)) { + throw new TypeError("CancellablePromise.prototype.finally called on an invalid object."); + } + if (!isCallable(onfinally)) { + return this.then(onfinally, onfinally, oncancelled); + } + return this.then((value) => CancellablePromise.resolve(onfinally()).then(() => value), (reason) => CancellablePromise.resolve(onfinally()).then(() => { throw reason; }), oncancelled); + } + /** + * We use the `[Symbol.species]` static property, if available, + * to disable the built-in automatic subclassing features from {@link Promise}. + * It is critical for performance reasons that extenders do not override this. + * Once the proposal at https://github.com/tc39/proposal-rm-builtin-subclassing + * is either accepted or retired, this implementation will have to be revised accordingly. + * + * @ignore + * @internal + */ + static get [species]() { + return Promise; + } + static all(values) { + let collected = Array.from(values); + const promise = collected.length === 0 + ? CancellablePromise.resolve(collected) + : new CancellablePromise((resolve, reject) => { + void Promise.all(collected).then(resolve, reject); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; + } + static allSettled(values) { + let collected = Array.from(values); + const promise = collected.length === 0 + ? CancellablePromise.resolve(collected) + : new CancellablePromise((resolve, reject) => { + void Promise.allSettled(collected).then(resolve, reject); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; + } + static any(values) { + let collected = Array.from(values); + const promise = collected.length === 0 + ? CancellablePromise.resolve(collected) + : new CancellablePromise((resolve, reject) => { + void Promise.any(collected).then(resolve, reject); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; + } + static race(values) { + let collected = Array.from(values); + const promise = new CancellablePromise((resolve, reject) => { + void Promise.race(collected).then(resolve, reject); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; + } + /** + * Creates a new cancelled CancellablePromise for the provided cause. + * + * @group Static Methods + */ + static cancel(cause) { + const p = new CancellablePromise(() => { }); + p.cancel(cause); + return p; + } + /** + * Creates a new CancellablePromise that cancels + * after the specified timeout, with the provided cause. + * + * If the {@link AbortSignal.timeout} factory method is available, + * it is used to base the timeout on _active_ time rather than _elapsed_ time. + * Otherwise, `timeout` falls back to {@link setTimeout}. + * + * @group Static Methods + */ + static timeout(milliseconds, cause) { + const promise = new CancellablePromise(() => { }); + if (AbortSignal && typeof AbortSignal === 'function' && AbortSignal.timeout && typeof AbortSignal.timeout === 'function') { + AbortSignal.timeout(milliseconds).addEventListener('abort', () => void promise.cancel(cause)); + } + else { + setTimeout(() => void promise.cancel(cause), milliseconds); + } + return promise; + } + static sleep(milliseconds, value) { + return new CancellablePromise((resolve) => { + setTimeout(() => resolve(value), milliseconds); + }); + } + /** + * Creates a new rejected CancellablePromise for the provided reason. + * + * @group Static Methods + */ + static reject(reason) { + return new CancellablePromise((_, reject) => reject(reason)); + } + static resolve(value) { + if (value instanceof CancellablePromise) { + // Optimise for cancellable promises. + return value; + } + return new CancellablePromise((resolve) => resolve(value)); + } + /** + * Creates a new CancellablePromise and returns it in an object, along with its resolve and reject functions + * and a getter/setter for the cancellation callback. + * + * This method is polyfilled, hence available in every OS/webview version. + * + * @group Static Methods + */ + static withResolvers() { + let result = { oncancelled: null }; + result.promise = new CancellablePromise((resolve, reject) => { + result.resolve = resolve; + result.reject = reject; + }, (cause) => { var _a; (_a = result.oncancelled) === null || _a === void 0 ? void 0 : _a.call(result, cause); }); + return result; + } +} +/** + * Returns a callback that implements the cancellation algorithm for the given cancellable promise. + * The promise returned from the resulting function does not reject. + */ +function cancellerFor(promise, state) { + let cancellationPromise = undefined; + return (reason) => { + if (!state.settled) { + state.settled = true; + state.reason = reason; + promise.reject(reason); + // Attach an error handler that ignores this specific rejection reason and nothing else. + // In theory, a sane underlying implementation at this point + // should always reject with our cancellation reason, + // hence the handler will never throw. + void Promise.prototype.then.call(promise.promise, undefined, (err) => { + if (err !== reason) { + throw err; + } + }); + } + // If reason is not set, the promise resolved regularly, hence we must not call oncancelled. + // If oncancelled is unset, no need to go any further. + if (!state.reason || !promise.oncancelled) { + return; + } + cancellationPromise = new Promise((resolve) => { + try { + resolve(promise.oncancelled(state.reason.cause)); + } + catch (err) { + Promise.reject(new CancelledRejectionError(promise.promise, err, "Unhandled exception in oncancelled callback.")); + } + }).catch((reason) => { + Promise.reject(new CancelledRejectionError(promise.promise, reason, "Unhandled rejection in oncancelled callback.")); + }); + // Unset oncancelled to prevent repeated calls. + promise.oncancelled = null; + return cancellationPromise; + }; +} +/** + * Returns a callback that implements the resolution algorithm for the given cancellable promise. + */ +function resolverFor(promise, state) { + return (value) => { + if (state.resolving) { + return; + } + state.resolving = true; + if (value === promise.promise) { + if (state.settled) { + return; + } + state.settled = true; + promise.reject(new TypeError("A promise cannot be resolved with itself.")); + return; + } + if (value != null && (typeof value === 'object' || typeof value === 'function')) { + let then; + try { + then = value.then; + } + catch (err) { + state.settled = true; + promise.reject(err); + return; + } + if (isCallable(then)) { + try { + let cancel = value.cancel; + if (isCallable(cancel)) { + const oncancelled = (cause) => { + Reflect.apply(cancel, value, [cause]); + }; + if (state.reason) { + // If already cancelled, propagate cancellation. + // The promise returned from the canceller algorithm does not reject + // so it can be discarded safely. + void cancellerFor(Object.assign(Object.assign({}, promise), { oncancelled }), state)(state.reason); + } + else { + promise.oncancelled = oncancelled; + } + } + } + catch (_a) { } + const newState = { + root: state.root, + resolving: false, + get settled() { return this.root.settled; }, + set settled(value) { this.root.settled = value; }, + get reason() { return this.root.reason; } + }; + const rejector = rejectorFor(promise, newState); + try { + Reflect.apply(then, value, [resolverFor(promise, newState), rejector]); + } + catch (err) { + rejector(err); + } + return; // IMPORTANT! + } + } + if (state.settled) { + return; + } + state.settled = true; + promise.resolve(value); + }; +} +/** + * Returns a callback that implements the rejection algorithm for the given cancellable promise. + */ +function rejectorFor(promise, state) { + return (reason) => { + if (state.resolving) { + return; + } + state.resolving = true; + if (state.settled) { + try { + if (reason instanceof CancelError && state.reason instanceof CancelError && Object.is(reason.cause, state.reason.cause)) { + // Swallow late rejections that are CancelErrors whose cancellation cause is the same as ours. + return; + } + } + catch (_a) { } + void Promise.reject(new CancelledRejectionError(promise.promise, reason)); + } + else { + state.settled = true; + promise.reject(reason); + } + }; +} +/** + * Cancels all values in an array that look like cancellable thenables. + * Returns a promise that fulfills once all cancellation procedures for the given values have settled. + */ +function cancelAll(parent, values, cause) { + const results = []; + for (const value of values) { + let cancel; + try { + if (!isCallable(value.then)) { + continue; + } + cancel = value.cancel; + if (!isCallable(cancel)) { + continue; + } + } + catch (_a) { + continue; + } + let result; + try { + result = Reflect.apply(cancel, value, [cause]); + } + catch (err) { + Promise.reject(new CancelledRejectionError(parent, err, "Unhandled exception in cancel method.")); + continue; + } + if (!result) { + continue; + } + results.push((result instanceof Promise ? result : Promise.resolve(result)).catch((reason) => { + Promise.reject(new CancelledRejectionError(parent, reason, "Unhandled rejection in cancel method.")); + })); + } + return Promise.all(results); +} +/** + * Returns its argument. + */ +function identity(x) { + return x; +} +/** + * Throws its argument. + */ +function thrower(reason) { + throw reason; +} +/** + * Attempts various strategies to convert an error to a string. + */ +function errorMessage(err) { + try { + if (err instanceof Error || typeof err !== 'object' || err.toString !== Object.prototype.toString) { + return "" + err; + } + } + catch (_a) { } + try { + return JSON.stringify(err); + } + catch (_b) { } + try { + return Object.prototype.toString.call(err); + } + catch (_c) { } + return ""; +} +/** + * Gets the current barrier promise for the given cancellable promise. If necessary, initialises the barrier. + */ +function currentBarrier(promise) { + var _a; + let pwr = (_a = promise[barrierSym]) !== null && _a !== void 0 ? _a : {}; + if (!('promise' in pwr)) { + Object.assign(pwr, promiseWithResolvers()); + } + if (promise[barrierSym] == null) { + pwr.resolve(); + promise[barrierSym] = pwr; + } + return pwr.promise; +} +// Polyfill Promise.withResolvers. +let promiseWithResolvers = Promise.withResolvers; +if (promiseWithResolvers && typeof promiseWithResolvers === 'function') { + promiseWithResolvers = promiseWithResolvers.bind(Promise); +} +else { + promiseWithResolvers = function () { + let resolve; + let reject; + const promise = new Promise((res, rej) => { resolve = res; reject = rej; }); + return { promise, resolve, reject }; + }; +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/clipboard.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/clipboard.js new file mode 100644 index 0000000..d579d4b --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/clipboard.js @@ -0,0 +1,30 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +const call = newRuntimeCaller(objectNames.Clipboard); +const ClipboardSetText = 0; +const ClipboardText = 1; +/** + * Sets the text to the Clipboard. + * + * @param text - The text to be set to the Clipboard. + * @return A Promise that resolves when the operation is successful. + */ +export function SetText(text) { + return call(ClipboardSetText, { text }); +} +/** + * Get the Clipboard text + * + * @returns A promise that resolves with the text from the Clipboard. + */ +export function Text() { + return call(ClipboardText); +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/contextmenu.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/contextmenu.js new file mode 100644 index 0000000..1485c3a --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/contextmenu.js @@ -0,0 +1,80 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +import { IsDebug } from "./system.js"; +import { eventTarget } from "./utils"; +// setup +window.addEventListener('contextmenu', contextMenuHandler); +const call = newRuntimeCaller(objectNames.ContextMenu); +const ContextMenuOpen = 0; +function openContextMenu(id, x, y, data) { + void call(ContextMenuOpen, { id, x, y, data }); +} +function contextMenuHandler(event) { + const target = eventTarget(event); + // Check for custom context menu + const customContextMenu = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu").trim(); + if (customContextMenu) { + event.preventDefault(); + const data = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu-data"); + openContextMenu(customContextMenu, event.clientX, event.clientY, data); + } + else { + processDefaultContextMenu(event, target); + } +} +/* +--default-contextmenu: auto; (default) will show the default context menu if contentEditable is true OR text has been selected OR element is input or textarea +--default-contextmenu: show; will always show the default context menu +--default-contextmenu: hide; will always hide the default context menu + +This rule is inherited like normal CSS rules, so nesting works as expected +*/ +function processDefaultContextMenu(event, target) { + // Debug builds always show the menu + if (IsDebug()) { + return; + } + // Process default context menu + switch (window.getComputedStyle(target).getPropertyValue("--default-contextmenu").trim()) { + case 'show': + return; + case 'hide': + event.preventDefault(); + return; + } + // Check if contentEditable is true + if (target.isContentEditable) { + return; + } + // Check if text has been selected + const selection = window.getSelection(); + const hasSelection = selection && selection.toString().length > 0; + if (hasSelection) { + for (let i = 0; i < selection.rangeCount; i++) { + const range = selection.getRangeAt(i); + const rects = range.getClientRects(); + for (let j = 0; j < rects.length; j++) { + const rect = rects[j]; + if (document.elementFromPoint(rect.left, rect.top) === target) { + return; + } + } + } + } + // Check if tag is input or textarea. + if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) { + if (hasSelection || (!target.readOnly && !target.disabled)) { + return; + } + } + // hide default context menu + event.preventDefault(); +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/create.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/create.js new file mode 100644 index 0000000..6103625 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/create.js @@ -0,0 +1,94 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +/** + * Any is a dummy creation function for simple or unknown types. + */ +export function Any(source) { + return source; +} +/** + * ByteSlice is a creation function that replaces + * null strings with empty strings. + */ +export function ByteSlice(source) { + return ((source == null) ? "" : source); +} +/** + * Array takes a creation function for an arbitrary type + * and returns an in-place creation function for an array + * whose elements are of that type. + */ +export function Array(element) { + if (element === Any) { + return (source) => (source === null ? [] : source); + } + return (source) => { + if (source === null) { + return []; + } + for (let i = 0; i < source.length; i++) { + source[i] = element(source[i]); + } + return source; + }; +} +/** + * Map takes creation functions for two arbitrary types + * and returns an in-place creation function for an object + * whose keys and values are of those types. + */ +export function Map(key, value) { + if (value === Any) { + return (source) => (source === null ? {} : source); + } + return (source) => { + if (source === null) { + return {}; + } + for (const key in source) { + source[key] = value(source[key]); + } + return source; + }; +} +/** + * Nullable takes a creation function for an arbitrary type + * and returns a creation function for a nullable value of that type. + */ +export function Nullable(element) { + if (element === Any) { + return Any; + } + return (source) => (source === null ? null : element(source)); +} +/** + * Struct takes an object mapping field names to creation functions + * and returns an in-place creation function for a struct. + */ +export function Struct(createField) { + let allAny = true; + for (const name in createField) { + if (createField[name] !== Any) { + allAny = false; + break; + } + } + if (allAny) { + return Any; + } + return (source) => { + for (const name in createField) { + if (name in source) { + source[name] = createField[name](source[name]); + } + } + return source; + }; +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/dialogs.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/dialogs.js new file mode 100644 index 0000000..2cfa475 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/dialogs.js @@ -0,0 +1,134 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +import { nanoid } from './nanoid.js'; +// setup +window._wails = window._wails || {}; +window._wails.dialogErrorCallback = dialogErrorCallback; +window._wails.dialogResultCallback = dialogResultCallback; +const call = newRuntimeCaller(objectNames.Dialog); +const dialogResponses = new Map(); +// Define constants from the `methods` object in Title Case +const DialogInfo = 0; +const DialogWarning = 1; +const DialogError = 2; +const DialogQuestion = 3; +const DialogOpenFile = 4; +const DialogSaveFile = 5; +/** + * Handles the result of a dialog request. + * + * @param id - The id of the request to handle the result for. + * @param data - The result data of the request. + * @param isJSON - Indicates whether the data is JSON or not. + */ +function dialogResultCallback(id, data, isJSON) { + let resolvers = getAndDeleteResponse(id); + if (!resolvers) { + return; + } + if (isJSON) { + try { + resolvers.resolve(JSON.parse(data)); + } + catch (err) { + resolvers.reject(new TypeError("could not parse result: " + err.message, { cause: err })); + } + } + else { + resolvers.resolve(data); + } +} +/** + * Handles the error from a dialog request. + * + * @param id - The id of the promise handler. + * @param message - An error message. + */ +function dialogErrorCallback(id, message) { + var _a; + (_a = getAndDeleteResponse(id)) === null || _a === void 0 ? void 0 : _a.reject(new window.Error(message)); +} +/** + * Retrieves and removes the response associated with the given ID from the dialogResponses map. + * + * @param id - The ID of the response to be retrieved and removed. + * @returns The response object associated with the given ID, if any. + */ +function getAndDeleteResponse(id) { + const response = dialogResponses.get(id); + dialogResponses.delete(id); + return response; +} +/** + * Generates a unique ID using the nanoid library. + * + * @returns A unique ID that does not exist in the dialogResponses set. + */ +function generateID() { + let result; + do { + result = nanoid(); + } while (dialogResponses.has(result)); + return result; +} +/** + * Presents a dialog of specified type with the given options. + * + * @param type - Dialog type. + * @param options - Options for the dialog. + * @returns A promise that resolves with result of dialog. + */ +function dialog(type, options = {}) { + const id = generateID(); + return new Promise((resolve, reject) => { + dialogResponses.set(id, { resolve, reject }); + call(type, Object.assign({ "dialog-id": id }, options)).catch((err) => { + dialogResponses.delete(id); + reject(err); + }); + }); +} +/** + * Presents an info dialog. + * + * @param options - Dialog options + * @returns A promise that resolves with the label of the chosen button. + */ +export function Info(options) { return dialog(DialogInfo, options); } +/** + * Presents a warning dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export function Warning(options) { return dialog(DialogWarning, options); } +/** + * Presents an error dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export function Error(options) { return dialog(DialogError, options); } +/** + * Presents a question dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export function Question(options) { return dialog(DialogQuestion, options); } +export function OpenFile(options) { var _a; return (_a = dialog(DialogOpenFile, options)) !== null && _a !== void 0 ? _a : []; } +/** + * Presents a file selection dialog to pick a file to save. + * + * @param options - Dialog options. + * @returns Selected file, or a blank string if no file has been selected. + */ +export function SaveFile(options) { return dialog(DialogSaveFile, options); } diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/drag.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/drag.js new file mode 100644 index 0000000..ae4ecc3 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/drag.js @@ -0,0 +1,222 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { invoke, IsWindows } from "./system.js"; +import { GetFlag } from "./flags.js"; +import { canTrackButtons, eventTarget } from "./utils.js"; +// Setup +let canDrag = false; +let dragging = false; +let resizable = false; +let canResize = false; +let resizing = false; +let resizeEdge = ""; +let defaultCursor = "auto"; +let buttons = 0; +const buttonsTracked = canTrackButtons(); +window._wails = window._wails || {}; +window._wails.setResizable = (value) => { + resizable = value; + if (!resizable) { + // Stop resizing if in progress. + canResize = resizing = false; + setResize(); + } +}; +window.addEventListener('mousedown', update, { capture: true }); +window.addEventListener('mousemove', update, { capture: true }); +window.addEventListener('mouseup', update, { capture: true }); +for (const ev of ['click', 'contextmenu', 'dblclick']) { + window.addEventListener(ev, suppressEvent, { capture: true }); +} +function suppressEvent(event) { + // Suppress click events while resizing or dragging. + if (dragging || resizing) { + event.stopImmediatePropagation(); + event.stopPropagation(); + event.preventDefault(); + } +} +// Use constants to avoid comparing strings multiple times. +const MouseDown = 0; +const MouseUp = 1; +const MouseMove = 2; +function update(event) { + // Windows suppresses mouse events at the end of dragging or resizing, + // so we need to be smart and synthesize button events. + let eventType, eventButtons = event.buttons; + switch (event.type) { + case 'mousedown': + eventType = MouseDown; + if (!buttonsTracked) { + eventButtons = buttons | (1 << event.button); + } + break; + case 'mouseup': + eventType = MouseUp; + if (!buttonsTracked) { + eventButtons = buttons & ~(1 << event.button); + } + break; + default: + eventType = MouseMove; + if (!buttonsTracked) { + eventButtons = buttons; + } + break; + } + let released = buttons & ~eventButtons; + let pressed = eventButtons & ~buttons; + buttons = eventButtons; + // Synthesize a release-press sequence if we detect a press of an already pressed button. + if (eventType === MouseDown && !(pressed & event.button)) { + released |= (1 << event.button); + pressed |= (1 << event.button); + } + // Suppress all button events during dragging and resizing, + // unless this is a mouseup event that is ending a drag action. + if (eventType !== MouseMove // Fast path for mousemove + && resizing + || (dragging + && (eventType === MouseDown + || event.button !== 0))) { + event.stopImmediatePropagation(); + event.stopPropagation(); + event.preventDefault(); + } + // Handle releases + if (released & 1) { + primaryUp(event); + } + // Handle presses + if (pressed & 1) { + primaryDown(event); + } + // Handle mousemove + if (eventType === MouseMove) { + onMouseMove(event); + } + ; +} +function primaryDown(event) { + // Reset readiness state. + canDrag = false; + canResize = false; + // Ignore repeated clicks on macOS and Linux. + if (!IsWindows()) { + if (event.type === 'mousedown' && event.button === 0 && event.detail !== 1) { + return; + } + } + if (resizeEdge) { + // Ready to resize if the primary button was pressed for the first time. + canResize = true; + // Do not start drag operations when on resize edges. + return; + } + // Retrieve target element + const target = eventTarget(event); + // Ready to drag if the primary button was pressed for the first time on a draggable element. + // Ignore clicks on the scrollbar. + const style = window.getComputedStyle(target); + canDrag = (style.getPropertyValue("--wails-draggable").trim() === "drag" + && (event.offsetX - parseFloat(style.paddingLeft) < target.clientWidth + && event.offsetY - parseFloat(style.paddingTop) < target.clientHeight)); +} +function primaryUp(event) { + // Stop dragging and resizing. + canDrag = false; + dragging = false; + canResize = false; + resizing = false; +} +const cursorForEdge = Object.freeze({ + "se-resize": "nwse-resize", + "sw-resize": "nesw-resize", + "nw-resize": "nwse-resize", + "ne-resize": "nesw-resize", + "w-resize": "ew-resize", + "n-resize": "ns-resize", + "s-resize": "ns-resize", + "e-resize": "ew-resize", +}); +function setResize(edge) { + if (edge) { + if (!resizeEdge) { + defaultCursor = document.body.style.cursor; + } + document.body.style.cursor = cursorForEdge[edge]; + } + else if (!edge && resizeEdge) { + document.body.style.cursor = defaultCursor; + } + resizeEdge = edge || ""; +} +function onMouseMove(event) { + if (canResize && resizeEdge) { + // Start resizing. + resizing = true; + invoke("wails:resize:" + resizeEdge); + } + else if (canDrag) { + // Start dragging. + dragging = true; + invoke("wails:drag"); + } + if (dragging || resizing) { + // Either drag or resize is ongoing, + // reset readiness and stop processing. + canDrag = canResize = false; + return; + } + if (!resizable || !IsWindows()) { + if (resizeEdge) { + setResize(); + } + return; + } + const resizeHandleHeight = GetFlag("system.resizeHandleHeight") || 5; + const resizeHandleWidth = GetFlag("system.resizeHandleWidth") || 5; + // Extra pixels for the corner areas. + const cornerExtra = GetFlag("resizeCornerExtra") || 10; + const rightBorder = (window.outerWidth - event.clientX) < resizeHandleWidth; + const leftBorder = event.clientX < resizeHandleWidth; + const topBorder = event.clientY < resizeHandleHeight; + const bottomBorder = (window.outerHeight - event.clientY) < resizeHandleHeight; + // Adjust for corner areas. + const rightCorner = (window.outerWidth - event.clientX) < (resizeHandleWidth + cornerExtra); + const leftCorner = event.clientX < (resizeHandleWidth + cornerExtra); + const topCorner = event.clientY < (resizeHandleHeight + cornerExtra); + const bottomCorner = (window.outerHeight - event.clientY) < (resizeHandleHeight + cornerExtra); + if (!leftCorner && !topCorner && !bottomCorner && !rightCorner) { + // Optimisation: out of all corner areas implies out of borders. + setResize(); + } + // Detect corners. + else if (rightCorner && bottomCorner) + setResize("se-resize"); + else if (leftCorner && bottomCorner) + setResize("sw-resize"); + else if (leftCorner && topCorner) + setResize("nw-resize"); + else if (topCorner && rightCorner) + setResize("ne-resize"); + // Detect borders. + else if (leftBorder) + setResize("w-resize"); + else if (topBorder) + setResize("n-resize"); + else if (bottomBorder) + setResize("s-resize"); + else if (rightBorder) + setResize("e-resize"); + // Out of border area. + else + setResize(); +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/event_types.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/event_types.js new file mode 100644 index 0000000..6cf95d6 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/event_types.js @@ -0,0 +1,229 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT +export const Types = Object.freeze({ + Windows: Object.freeze({ + APMPowerSettingChange: "windows:APMPowerSettingChange", + APMPowerStatusChange: "windows:APMPowerStatusChange", + APMResumeAutomatic: "windows:APMResumeAutomatic", + APMResumeSuspend: "windows:APMResumeSuspend", + APMSuspend: "windows:APMSuspend", + ApplicationStarted: "windows:ApplicationStarted", + SystemThemeChanged: "windows:SystemThemeChanged", + WebViewNavigationCompleted: "windows:WebViewNavigationCompleted", + WindowActive: "windows:WindowActive", + WindowBackgroundErase: "windows:WindowBackgroundErase", + WindowClickActive: "windows:WindowClickActive", + WindowClosing: "windows:WindowClosing", + WindowDidMove: "windows:WindowDidMove", + WindowDidResize: "windows:WindowDidResize", + WindowDPIChanged: "windows:WindowDPIChanged", + WindowDragDrop: "windows:WindowDragDrop", + WindowDragEnter: "windows:WindowDragEnter", + WindowDragLeave: "windows:WindowDragLeave", + WindowDragOver: "windows:WindowDragOver", + WindowEndMove: "windows:WindowEndMove", + WindowEndResize: "windows:WindowEndResize", + WindowFullscreen: "windows:WindowFullscreen", + WindowHide: "windows:WindowHide", + WindowInactive: "windows:WindowInactive", + WindowKeyDown: "windows:WindowKeyDown", + WindowKeyUp: "windows:WindowKeyUp", + WindowKillFocus: "windows:WindowKillFocus", + WindowNonClientHit: "windows:WindowNonClientHit", + WindowNonClientMouseDown: "windows:WindowNonClientMouseDown", + WindowNonClientMouseLeave: "windows:WindowNonClientMouseLeave", + WindowNonClientMouseMove: "windows:WindowNonClientMouseMove", + WindowNonClientMouseUp: "windows:WindowNonClientMouseUp", + WindowPaint: "windows:WindowPaint", + WindowRestore: "windows:WindowRestore", + WindowSetFocus: "windows:WindowSetFocus", + WindowShow: "windows:WindowShow", + WindowStartMove: "windows:WindowStartMove", + WindowStartResize: "windows:WindowStartResize", + WindowUnFullscreen: "windows:WindowUnFullscreen", + WindowZOrderChanged: "windows:WindowZOrderChanged", + WindowMinimise: "windows:WindowMinimise", + WindowUnMinimise: "windows:WindowUnMinimise", + WindowMaximise: "windows:WindowMaximise", + WindowUnMaximise: "windows:WindowUnMaximise", + }), + Mac: Object.freeze({ + ApplicationDidBecomeActive: "mac:ApplicationDidBecomeActive", + ApplicationDidChangeBackingProperties: "mac:ApplicationDidChangeBackingProperties", + ApplicationDidChangeEffectiveAppearance: "mac:ApplicationDidChangeEffectiveAppearance", + ApplicationDidChangeIcon: "mac:ApplicationDidChangeIcon", + ApplicationDidChangeOcclusionState: "mac:ApplicationDidChangeOcclusionState", + ApplicationDidChangeScreenParameters: "mac:ApplicationDidChangeScreenParameters", + ApplicationDidChangeStatusBarFrame: "mac:ApplicationDidChangeStatusBarFrame", + ApplicationDidChangeStatusBarOrientation: "mac:ApplicationDidChangeStatusBarOrientation", + ApplicationDidChangeTheme: "mac:ApplicationDidChangeTheme", + ApplicationDidFinishLaunching: "mac:ApplicationDidFinishLaunching", + ApplicationDidHide: "mac:ApplicationDidHide", + ApplicationDidResignActive: "mac:ApplicationDidResignActive", + ApplicationDidUnhide: "mac:ApplicationDidUnhide", + ApplicationDidUpdate: "mac:ApplicationDidUpdate", + ApplicationShouldHandleReopen: "mac:ApplicationShouldHandleReopen", + ApplicationWillBecomeActive: "mac:ApplicationWillBecomeActive", + ApplicationWillFinishLaunching: "mac:ApplicationWillFinishLaunching", + ApplicationWillHide: "mac:ApplicationWillHide", + ApplicationWillResignActive: "mac:ApplicationWillResignActive", + ApplicationWillTerminate: "mac:ApplicationWillTerminate", + ApplicationWillUnhide: "mac:ApplicationWillUnhide", + ApplicationWillUpdate: "mac:ApplicationWillUpdate", + MenuDidAddItem: "mac:MenuDidAddItem", + MenuDidBeginTracking: "mac:MenuDidBeginTracking", + MenuDidClose: "mac:MenuDidClose", + MenuDidDisplayItem: "mac:MenuDidDisplayItem", + MenuDidEndTracking: "mac:MenuDidEndTracking", + MenuDidHighlightItem: "mac:MenuDidHighlightItem", + MenuDidOpen: "mac:MenuDidOpen", + MenuDidPopUp: "mac:MenuDidPopUp", + MenuDidRemoveItem: "mac:MenuDidRemoveItem", + MenuDidSendAction: "mac:MenuDidSendAction", + MenuDidSendActionToItem: "mac:MenuDidSendActionToItem", + MenuDidUpdate: "mac:MenuDidUpdate", + MenuWillAddItem: "mac:MenuWillAddItem", + MenuWillBeginTracking: "mac:MenuWillBeginTracking", + MenuWillDisplayItem: "mac:MenuWillDisplayItem", + MenuWillEndTracking: "mac:MenuWillEndTracking", + MenuWillHighlightItem: "mac:MenuWillHighlightItem", + MenuWillOpen: "mac:MenuWillOpen", + MenuWillPopUp: "mac:MenuWillPopUp", + MenuWillRemoveItem: "mac:MenuWillRemoveItem", + MenuWillSendAction: "mac:MenuWillSendAction", + MenuWillSendActionToItem: "mac:MenuWillSendActionToItem", + MenuWillUpdate: "mac:MenuWillUpdate", + WebViewDidCommitNavigation: "mac:WebViewDidCommitNavigation", + WebViewDidFinishNavigation: "mac:WebViewDidFinishNavigation", + WebViewDidReceiveServerRedirectForProvisionalNavigation: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation", + WebViewDidStartProvisionalNavigation: "mac:WebViewDidStartProvisionalNavigation", + WindowDidBecomeKey: "mac:WindowDidBecomeKey", + WindowDidBecomeMain: "mac:WindowDidBecomeMain", + WindowDidBeginSheet: "mac:WindowDidBeginSheet", + WindowDidChangeAlpha: "mac:WindowDidChangeAlpha", + WindowDidChangeBackingLocation: "mac:WindowDidChangeBackingLocation", + WindowDidChangeBackingProperties: "mac:WindowDidChangeBackingProperties", + WindowDidChangeCollectionBehavior: "mac:WindowDidChangeCollectionBehavior", + WindowDidChangeEffectiveAppearance: "mac:WindowDidChangeEffectiveAppearance", + WindowDidChangeOcclusionState: "mac:WindowDidChangeOcclusionState", + WindowDidChangeOrderingMode: "mac:WindowDidChangeOrderingMode", + WindowDidChangeScreen: "mac:WindowDidChangeScreen", + WindowDidChangeScreenParameters: "mac:WindowDidChangeScreenParameters", + WindowDidChangeScreenProfile: "mac:WindowDidChangeScreenProfile", + WindowDidChangeScreenSpace: "mac:WindowDidChangeScreenSpace", + WindowDidChangeScreenSpaceProperties: "mac:WindowDidChangeScreenSpaceProperties", + WindowDidChangeSharingType: "mac:WindowDidChangeSharingType", + WindowDidChangeSpace: "mac:WindowDidChangeSpace", + WindowDidChangeSpaceOrderingMode: "mac:WindowDidChangeSpaceOrderingMode", + WindowDidChangeTitle: "mac:WindowDidChangeTitle", + WindowDidChangeToolbar: "mac:WindowDidChangeToolbar", + WindowDidDeminiaturize: "mac:WindowDidDeminiaturize", + WindowDidEndSheet: "mac:WindowDidEndSheet", + WindowDidEnterFullScreen: "mac:WindowDidEnterFullScreen", + WindowDidEnterVersionBrowser: "mac:WindowDidEnterVersionBrowser", + WindowDidExitFullScreen: "mac:WindowDidExitFullScreen", + WindowDidExitVersionBrowser: "mac:WindowDidExitVersionBrowser", + WindowDidExpose: "mac:WindowDidExpose", + WindowDidFocus: "mac:WindowDidFocus", + WindowDidMiniaturize: "mac:WindowDidMiniaturize", + WindowDidMove: "mac:WindowDidMove", + WindowDidOrderOffScreen: "mac:WindowDidOrderOffScreen", + WindowDidOrderOnScreen: "mac:WindowDidOrderOnScreen", + WindowDidResignKey: "mac:WindowDidResignKey", + WindowDidResignMain: "mac:WindowDidResignMain", + WindowDidResize: "mac:WindowDidResize", + WindowDidUpdate: "mac:WindowDidUpdate", + WindowDidUpdateAlpha: "mac:WindowDidUpdateAlpha", + WindowDidUpdateCollectionBehavior: "mac:WindowDidUpdateCollectionBehavior", + WindowDidUpdateCollectionProperties: "mac:WindowDidUpdateCollectionProperties", + WindowDidUpdateShadow: "mac:WindowDidUpdateShadow", + WindowDidUpdateTitle: "mac:WindowDidUpdateTitle", + WindowDidUpdateToolbar: "mac:WindowDidUpdateToolbar", + WindowDidZoom: "mac:WindowDidZoom", + WindowFileDraggingEntered: "mac:WindowFileDraggingEntered", + WindowFileDraggingExited: "mac:WindowFileDraggingExited", + WindowFileDraggingPerformed: "mac:WindowFileDraggingPerformed", + WindowHide: "mac:WindowHide", + WindowMaximise: "mac:WindowMaximise", + WindowUnMaximise: "mac:WindowUnMaximise", + WindowMinimise: "mac:WindowMinimise", + WindowUnMinimise: "mac:WindowUnMinimise", + WindowShouldClose: "mac:WindowShouldClose", + WindowShow: "mac:WindowShow", + WindowWillBecomeKey: "mac:WindowWillBecomeKey", + WindowWillBecomeMain: "mac:WindowWillBecomeMain", + WindowWillBeginSheet: "mac:WindowWillBeginSheet", + WindowWillChangeOrderingMode: "mac:WindowWillChangeOrderingMode", + WindowWillClose: "mac:WindowWillClose", + WindowWillDeminiaturize: "mac:WindowWillDeminiaturize", + WindowWillEnterFullScreen: "mac:WindowWillEnterFullScreen", + WindowWillEnterVersionBrowser: "mac:WindowWillEnterVersionBrowser", + WindowWillExitFullScreen: "mac:WindowWillExitFullScreen", + WindowWillExitVersionBrowser: "mac:WindowWillExitVersionBrowser", + WindowWillFocus: "mac:WindowWillFocus", + WindowWillMiniaturize: "mac:WindowWillMiniaturize", + WindowWillMove: "mac:WindowWillMove", + WindowWillOrderOffScreen: "mac:WindowWillOrderOffScreen", + WindowWillOrderOnScreen: "mac:WindowWillOrderOnScreen", + WindowWillResignMain: "mac:WindowWillResignMain", + WindowWillResize: "mac:WindowWillResize", + WindowWillUnfocus: "mac:WindowWillUnfocus", + WindowWillUpdate: "mac:WindowWillUpdate", + WindowWillUpdateAlpha: "mac:WindowWillUpdateAlpha", + WindowWillUpdateCollectionBehavior: "mac:WindowWillUpdateCollectionBehavior", + WindowWillUpdateCollectionProperties: "mac:WindowWillUpdateCollectionProperties", + WindowWillUpdateShadow: "mac:WindowWillUpdateShadow", + WindowWillUpdateTitle: "mac:WindowWillUpdateTitle", + WindowWillUpdateToolbar: "mac:WindowWillUpdateToolbar", + WindowWillUpdateVisibility: "mac:WindowWillUpdateVisibility", + WindowWillUseStandardFrame: "mac:WindowWillUseStandardFrame", + WindowZoomIn: "mac:WindowZoomIn", + WindowZoomOut: "mac:WindowZoomOut", + WindowZoomReset: "mac:WindowZoomReset", + }), + Linux: Object.freeze({ + ApplicationStartup: "linux:ApplicationStartup", + SystemThemeChanged: "linux:SystemThemeChanged", + WindowDeleteEvent: "linux:WindowDeleteEvent", + WindowDidMove: "linux:WindowDidMove", + WindowDidResize: "linux:WindowDidResize", + WindowFocusIn: "linux:WindowFocusIn", + WindowFocusOut: "linux:WindowFocusOut", + WindowLoadChanged: "linux:WindowLoadChanged", + }), + Common: Object.freeze({ + ApplicationOpenedWithFile: "common:ApplicationOpenedWithFile", + ApplicationStarted: "common:ApplicationStarted", + ThemeChanged: "common:ThemeChanged", + WindowClosing: "common:WindowClosing", + WindowDidMove: "common:WindowDidMove", + WindowDidResize: "common:WindowDidResize", + WindowDPIChanged: "common:WindowDPIChanged", + WindowFilesDropped: "common:WindowFilesDropped", + WindowFocus: "common:WindowFocus", + WindowFullscreen: "common:WindowFullscreen", + WindowHide: "common:WindowHide", + WindowLostFocus: "common:WindowLostFocus", + WindowMaximise: "common:WindowMaximise", + WindowMinimise: "common:WindowMinimise", + WindowRestore: "common:WindowRestore", + WindowRuntimeReady: "common:WindowRuntimeReady", + WindowShow: "common:WindowShow", + WindowUnFullscreen: "common:WindowUnFullscreen", + WindowUnMaximise: "common:WindowUnMaximise", + WindowUnMinimise: "common:WindowUnMinimise", + WindowZoom: "common:WindowZoom", + WindowZoomIn: "common:WindowZoomIn", + WindowZoomOut: "common:WindowZoomOut", + WindowZoomReset: "common:WindowZoomReset", + }), +}); diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/events.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/events.js new file mode 100644 index 0000000..ba8b2d3 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/events.js @@ -0,0 +1,101 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +import { eventListeners, Listener, listenerOff } from "./listener.js"; +// Setup +window._wails = window._wails || {}; +window._wails.dispatchWailsEvent = dispatchWailsEvent; +const call = newRuntimeCaller(objectNames.Events); +const EmitMethod = 0; +export { Types } from "./event_types.js"; +/** + * Represents a system event or a custom event emitted through wails-provided facilities. + */ +export class WailsEvent { + constructor(name, data = null) { + this.name = name; + this.data = data; + } +} +function dispatchWailsEvent(event) { + let listeners = eventListeners.get(event.name); + if (!listeners) { + return; + } + let wailsEvent = new WailsEvent(event.name, event.data); + if ('sender' in event) { + wailsEvent.sender = event.sender; + } + listeners = listeners.filter(listener => !listener.dispatch(wailsEvent)); + if (listeners.length === 0) { + eventListeners.delete(event.name); + } + else { + eventListeners.set(event.name, listeners); + } +} +/** + * Register a callback function to be called multiple times for a specific event. + * + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @param maxCallbacks - The maximum number of times the callback can be called for the event. Once the maximum number is reached, the callback will no longer be called. + * @returns A function that, when called, will unregister the callback from the event. + */ +export function OnMultiple(eventName, callback, maxCallbacks) { + let listeners = eventListeners.get(eventName) || []; + const thisListener = new Listener(eventName, callback, maxCallbacks); + listeners.push(thisListener); + eventListeners.set(eventName, listeners); + return () => listenerOff(thisListener); +} +/** + * Registers a callback function to be executed when the specified event occurs. + * + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @returns A function that, when called, will unregister the callback from the event. + */ +export function On(eventName, callback) { + return OnMultiple(eventName, callback, -1); +} +/** + * Registers a callback function to be executed only once for the specified event. + * + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @returns A function that, when called, will unregister the callback from the event. + */ +export function Once(eventName, callback) { + return OnMultiple(eventName, callback, 1); +} +/** + * Removes event listeners for the specified event names. + * + * @param eventNames - The name of the events to remove listeners for. + */ +export function Off(...eventNames) { + eventNames.forEach(eventName => eventListeners.delete(eventName)); +} +/** + * Removes all event listeners. + */ +export function OffAll() { + eventListeners.clear(); +} +/** + * Emits the given event. + * + * @param event - The name of the event to emit. + * @returns A promise that will be fulfilled once the event has been emitted. + */ +export function Emit(event) { + return call(EmitMethod, event); +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/flags.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/flags.js new file mode 100644 index 0000000..31071c2 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/flags.js @@ -0,0 +1,23 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +/** + * Retrieves the value associated with the specified key from the flag map. + * + * @param key - The key to retrieve the value for. + * @return The value associated with the specified key. + */ +export function GetFlag(key) { + try { + return window._wails.flags[key]; + } + catch (e) { + throw new Error("Unable to retrieve flag '" + key + "': " + e, { cause: e }); + } +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/index.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/index.js new file mode 100644 index 0000000..34f741b --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/index.js @@ -0,0 +1,38 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +// Setup +window._wails = window._wails || {}; +import "./contextmenu.js"; +import "./drag.js"; +// Re-export public API +import * as Application from "./application.js"; +import * as Browser from "./browser.js"; +import * as Call from "./calls.js"; +import * as Clipboard from "./clipboard.js"; +import * as Create from "./create.js"; +import * as Dialogs from "./dialogs.js"; +import * as Events from "./events.js"; +import * as Flags from "./flags.js"; +import * as Screens from "./screens.js"; +import * as System from "./system.js"; +import Window from "./window.js"; +import * as WML from "./wml.js"; +export { Application, Browser, Call, Clipboard, Dialogs, Events, Flags, Screens, System, Window, WML }; +/** + * An internal utility consumed by the binding generator. + * + * @ignore + * @internal + */ +export { Create }; +export * from "./cancellable.js"; +// Notify backend +window._wails.invoke = System.invoke; +System.invoke("wails:runtime:ready"); diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/listener.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/listener.js new file mode 100644 index 0000000..9604088 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/listener.js @@ -0,0 +1,44 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +// The following utilities have been factored out of ./events.ts +// for testing purposes. +export const eventListeners = new Map(); +export class Listener { + constructor(eventName, callback, maxCallbacks) { + this.eventName = eventName; + this.callback = callback; + this.maxCallbacks = maxCallbacks || -1; + } + dispatch(data) { + try { + this.callback(data); + } + catch (err) { + console.error(err); + } + if (this.maxCallbacks === -1) + return false; + this.maxCallbacks -= 1; + return this.maxCallbacks === 0; + } +} +export function listenerOff(listener) { + let listeners = eventListeners.get(listener.eventName); + if (!listeners) { + return; + } + listeners = listeners.filter(l => l !== listener); + if (listeners.length === 0) { + eventListeners.delete(listener.eventName); + } + else { + eventListeners.set(listener.eventName, listeners); + } +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/nanoid.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/nanoid.js new file mode 100644 index 0000000..c0d5e24 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/nanoid.js @@ -0,0 +1,38 @@ +// Source: https://github.com/ai/nanoid +// The MIT License (MIT) +// +// Copyright 2017 Andrey Sitnik +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// This alphabet uses `A-Za-z0-9_-` symbols. +// The order of characters is optimized for better gzip and brotli compression. +// References to the same file (works both for gzip and brotli): +// `'use`, `andom`, and `rict'` +// References to the brotli default dictionary: +// `-26T`, `1983`, `40px`, `75px`, `bush`, `jack`, `mind`, `very`, and `wolf` +const urlAlphabet = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'; +export function nanoid(size = 21) { + let id = ''; + // A compact alternative for `for (var i = 0; i < step; i++)`. + let i = size | 0; + while (i--) { + // `| 0` is more compact and faster than `Math.floor()`. + id += urlAlphabet[(Math.random() * 64) | 0]; + } + return id; +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/runtime.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/runtime.js new file mode 100644 index 0000000..f11df1c --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/runtime.js @@ -0,0 +1,63 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { nanoid } from './nanoid.js'; +const runtimeURL = window.location.origin + "/wails/runtime"; +// Object Names +export const objectNames = Object.freeze({ + Call: 0, + Clipboard: 1, + Application: 2, + Events: 3, + ContextMenu: 4, + Dialog: 5, + Window: 6, + Screens: 7, + System: 8, + Browser: 9, + CancelCall: 10, +}); +export let clientId = nanoid(); +/** + * Creates a new runtime caller with specified ID. + * + * @param object - The object to invoke the method on. + * @param windowName - The name of the window. + * @return The new runtime caller function. + */ +export function newRuntimeCaller(object, windowName = '') { + return function (method, args = null) { + return runtimeCallWithID(object, method, windowName, args); + }; +} +async function runtimeCallWithID(objectID, method, windowName, args) { + var _a, _b; + let url = new URL(runtimeURL); + url.searchParams.append("object", objectID.toString()); + url.searchParams.append("method", method.toString()); + if (args) { + url.searchParams.append("args", JSON.stringify(args)); + } + let headers = { + ["x-wails-client-id"]: clientId + }; + if (windowName) { + headers["x-wails-window-name"] = windowName; + } + let response = await fetch(url, { headers }); + if (!response.ok) { + throw new Error(await response.text()); + } + if (((_b = (_a = response.headers.get("Content-Type")) === null || _a === void 0 ? void 0 : _a.indexOf("application/json")) !== null && _b !== void 0 ? _b : -1) !== -1) { + return response.json(); + } + else { + return response.text(); + } +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/screens.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/screens.js new file mode 100644 index 0000000..b09dc58 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/screens.js @@ -0,0 +1,38 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +const call = newRuntimeCaller(objectNames.Screens); +const getAll = 0; +const getPrimary = 1; +const getCurrent = 2; +/** + * Gets all screens. + * + * @returns A promise that resolves to an array of Screen objects. + */ +export function GetAll() { + return call(getAll); +} +/** + * Gets the primary screen. + * + * @returns A promise that resolves to the primary screen. + */ +export function GetPrimary() { + return call(getPrimary); +} +/** + * Gets the current active screen. + * + * @returns A promise that resolves with the current active screen. + */ +export function GetCurrent() { + return call(getCurrent); +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/system.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/system.js new file mode 100644 index 0000000..4d51cf8 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/system.js @@ -0,0 +1,116 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +const call = newRuntimeCaller(objectNames.System); +const SystemIsDarkMode = 0; +const SystemEnvironment = 1; +const _invoke = (function () { + var _a, _b, _c, _d, _e; + try { + if ((_b = (_a = window.chrome) === null || _a === void 0 ? void 0 : _a.webview) === null || _b === void 0 ? void 0 : _b.postMessage) { + return window.chrome.webview.postMessage.bind(window.chrome.webview); + } + else if ((_e = (_d = (_c = window.webkit) === null || _c === void 0 ? void 0 : _c.messageHandlers) === null || _d === void 0 ? void 0 : _d['external']) === null || _e === void 0 ? void 0 : _e.postMessage) { + return window.webkit.messageHandlers['external'].postMessage.bind(window.webkit.messageHandlers['external']); + } + } + catch (e) { } + console.warn('\n%c⚠️ Browser Environment Detected %c\n\n%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode.\nMore information at: https://v3.wails.io/learn/build/#using-a-browser-for-development\n', 'background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;', 'background: transparent;', 'color: #ffffff; font-style: italic; font-weight: bold;'); + return null; +})(); +export function invoke(msg) { + _invoke === null || _invoke === void 0 ? void 0 : _invoke(msg); +} +/** + * Retrieves the system dark mode status. + * + * @returns A promise that resolves to a boolean value indicating if the system is in dark mode. + */ +export function IsDarkMode() { + return call(SystemIsDarkMode); +} +/** + * Fetches the capabilities of the application from the server. + * + * @returns A promise that resolves to an object containing the capabilities. + */ +export async function Capabilities() { + let response = await fetch("/wails/capabilities"); + if (response.ok) { + return response.json(); + } + else { + throw new Error("could not fetch capabilities: " + response.statusText); + } +} +/** + * Retrieves environment details. + * + * @returns A promise that resolves to an object containing OS and system architecture. + */ +export function Environment() { + return call(SystemEnvironment); +} +/** + * Checks if the current operating system is Windows. + * + * @return True if the operating system is Windows, otherwise false. + */ +export function IsWindows() { + return window._wails.environment.OS === "windows"; +} +/** + * Checks if the current operating system is Linux. + * + * @returns Returns true if the current operating system is Linux, false otherwise. + */ +export function IsLinux() { + return window._wails.environment.OS === "linux"; +} +/** + * Checks if the current environment is a macOS operating system. + * + * @returns True if the environment is macOS, false otherwise. + */ +export function IsMac() { + return window._wails.environment.OS === "darwin"; +} +/** + * Checks if the current environment architecture is AMD64. + * + * @returns True if the current environment architecture is AMD64, false otherwise. + */ +export function IsAMD64() { + return window._wails.environment.Arch === "amd64"; +} +/** + * Checks if the current architecture is ARM. + * + * @returns True if the current architecture is ARM, false otherwise. + */ +export function IsARM() { + return window._wails.environment.Arch === "arm"; +} +/** + * Checks if the current environment is ARM64 architecture. + * + * @returns Returns true if the environment is ARM64 architecture, otherwise returns false. + */ +export function IsARM64() { + return window._wails.environment.Arch === "arm64"; +} +/** + * Reports whether the app is being run in debug mode. + * + * @returns True if the app is being run in debug mode. + */ +export function IsDebug() { + return Boolean(window._wails.environment.Debug); +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/utils.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/utils.js new file mode 100644 index 0000000..4752828 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/utils.js @@ -0,0 +1,95 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +/** + * Logs a message to the console with custom formatting. + * + * @param message - The message to be logged. + */ +export function debugLog(message) { + // eslint-disable-next-line + console.log('%c wails3 %c ' + message + ' ', 'background: #aa0000; color: #fff; border-radius: 3px 0px 0px 3px; padding: 1px; font-size: 0.7rem', 'background: #009900; color: #fff; border-radius: 0px 3px 3px 0px; padding: 1px; font-size: 0.7rem'); +} +/** + * Checks whether the webview supports the {@link MouseEvent#buttons} property. + * Looking at you macOS High Sierra! + */ +export function canTrackButtons() { + return (new MouseEvent('mousedown')).buttons === 0; +} +/** + * Checks whether the browser supports removing listeners by triggering an AbortSignal + * (see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#signal). + */ +export function canAbortListeners() { + if (!EventTarget || !AbortSignal || !AbortController) + return false; + let result = true; + const target = new EventTarget(); + const controller = new AbortController(); + target.addEventListener('test', () => { result = false; }, { signal: controller.signal }); + controller.abort(); + target.dispatchEvent(new CustomEvent('test')); + return result; +} +/** + * Resolves the closest HTMLElement ancestor of an event's target. + */ +export function eventTarget(event) { + var _a; + if (event.target instanceof HTMLElement) { + return event.target; + } + else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { + return (_a = event.target.parentElement) !== null && _a !== void 0 ? _a : document.body; + } + else { + return document.body; + } +} +/*** + This technique for proper load detection is taken from HTMX: + + BSD 2-Clause License + + Copyright (c) 2020, Big Sky Software + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ***/ +let isReady = false; +document.addEventListener('DOMContentLoaded', () => { isReady = true; }); +export function whenReady(callback) { + if (isReady || document.readyState === 'complete') { + callback(); + } + else { + document.addEventListener('DOMContentLoaded', callback); + } +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/window.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/window.js new file mode 100644 index 0000000..c44d1ee --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/window.js @@ -0,0 +1,438 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +const PositionMethod = 0; +const CenterMethod = 1; +const CloseMethod = 2; +const DisableSizeConstraintsMethod = 3; +const EnableSizeConstraintsMethod = 4; +const FocusMethod = 5; +const ForceReloadMethod = 6; +const FullscreenMethod = 7; +const GetScreenMethod = 8; +const GetZoomMethod = 9; +const HeightMethod = 10; +const HideMethod = 11; +const IsFocusedMethod = 12; +const IsFullscreenMethod = 13; +const IsMaximisedMethod = 14; +const IsMinimisedMethod = 15; +const MaximiseMethod = 16; +const MinimiseMethod = 17; +const NameMethod = 18; +const OpenDevToolsMethod = 19; +const RelativePositionMethod = 20; +const ReloadMethod = 21; +const ResizableMethod = 22; +const RestoreMethod = 23; +const SetPositionMethod = 24; +const SetAlwaysOnTopMethod = 25; +const SetBackgroundColourMethod = 26; +const SetFramelessMethod = 27; +const SetFullscreenButtonEnabledMethod = 28; +const SetMaxSizeMethod = 29; +const SetMinSizeMethod = 30; +const SetRelativePositionMethod = 31; +const SetResizableMethod = 32; +const SetSizeMethod = 33; +const SetTitleMethod = 34; +const SetZoomMethod = 35; +const ShowMethod = 36; +const SizeMethod = 37; +const ToggleFullscreenMethod = 38; +const ToggleMaximiseMethod = 39; +const UnFullscreenMethod = 40; +const UnMaximiseMethod = 41; +const UnMinimiseMethod = 42; +const WidthMethod = 43; +const ZoomMethod = 44; +const ZoomInMethod = 45; +const ZoomOutMethod = 46; +const ZoomResetMethod = 47; +// Private field names. +const callerSym = Symbol("caller"); +class Window { + /** + * Initialises a window object with the specified name. + * + * @private + * @param name - The name of the target window. + */ + constructor(name = '') { + this[callerSym] = newRuntimeCaller(objectNames.Window, name); + // bind instance method to make them easily usable in event handlers + for (const method of Object.getOwnPropertyNames(Window.prototype)) { + if (method !== "constructor" + && typeof this[method] === "function") { + this[method] = this[method].bind(this); + } + } + } + /** + * Gets the specified window. + * + * @param name - The name of the window to get. + * @returns The corresponding window object. + */ + Get(name) { + return new Window(name); + } + /** + * Returns the absolute position of the window. + * + * @returns The current absolute position of the window. + */ + Position() { + return this[callerSym](PositionMethod); + } + /** + * Centers the window on the screen. + */ + Center() { + return this[callerSym](CenterMethod); + } + /** + * Closes the window. + */ + Close() { + return this[callerSym](CloseMethod); + } + /** + * Disables min/max size constraints. + */ + DisableSizeConstraints() { + return this[callerSym](DisableSizeConstraintsMethod); + } + /** + * Enables min/max size constraints. + */ + EnableSizeConstraints() { + return this[callerSym](EnableSizeConstraintsMethod); + } + /** + * Focuses the window. + */ + Focus() { + return this[callerSym](FocusMethod); + } + /** + * Forces the window to reload the page assets. + */ + ForceReload() { + return this[callerSym](ForceReloadMethod); + } + /** + * Switches the window to fullscreen mode. + */ + Fullscreen() { + return this[callerSym](FullscreenMethod); + } + /** + * Returns the screen that the window is on. + * + * @returns The screen the window is currently on. + */ + GetScreen() { + return this[callerSym](GetScreenMethod); + } + /** + * Returns the current zoom level of the window. + * + * @returns The current zoom level. + */ + GetZoom() { + return this[callerSym](GetZoomMethod); + } + /** + * Returns the height of the window. + * + * @returns The current height of the window. + */ + Height() { + return this[callerSym](HeightMethod); + } + /** + * Hides the window. + */ + Hide() { + return this[callerSym](HideMethod); + } + /** + * Returns true if the window is focused. + * + * @returns Whether the window is currently focused. + */ + IsFocused() { + return this[callerSym](IsFocusedMethod); + } + /** + * Returns true if the window is fullscreen. + * + * @returns Whether the window is currently fullscreen. + */ + IsFullscreen() { + return this[callerSym](IsFullscreenMethod); + } + /** + * Returns true if the window is maximised. + * + * @returns Whether the window is currently maximised. + */ + IsMaximised() { + return this[callerSym](IsMaximisedMethod); + } + /** + * Returns true if the window is minimised. + * + * @returns Whether the window is currently minimised. + */ + IsMinimised() { + return this[callerSym](IsMinimisedMethod); + } + /** + * Maximises the window. + */ + Maximise() { + return this[callerSym](MaximiseMethod); + } + /** + * Minimises the window. + */ + Minimise() { + return this[callerSym](MinimiseMethod); + } + /** + * Returns the name of the window. + * + * @returns The name of the window. + */ + Name() { + return this[callerSym](NameMethod); + } + /** + * Opens the development tools pane. + */ + OpenDevTools() { + return this[callerSym](OpenDevToolsMethod); + } + /** + * Returns the relative position of the window to the screen. + * + * @returns The current relative position of the window. + */ + RelativePosition() { + return this[callerSym](RelativePositionMethod); + } + /** + * Reloads the page assets. + */ + Reload() { + return this[callerSym](ReloadMethod); + } + /** + * Returns true if the window is resizable. + * + * @returns Whether the window is currently resizable. + */ + Resizable() { + return this[callerSym](ResizableMethod); + } + /** + * Restores the window to its previous state if it was previously minimised, maximised or fullscreen. + */ + Restore() { + return this[callerSym](RestoreMethod); + } + /** + * Sets the absolute position of the window. + * + * @param x - The desired horizontal absolute position of the window. + * @param y - The desired vertical absolute position of the window. + */ + SetPosition(x, y) { + return this[callerSym](SetPositionMethod, { x, y }); + } + /** + * Sets the window to be always on top. + * + * @param alwaysOnTop - Whether the window should stay on top. + */ + SetAlwaysOnTop(alwaysOnTop) { + return this[callerSym](SetAlwaysOnTopMethod, { alwaysOnTop }); + } + /** + * Sets the background colour of the window. + * + * @param r - The desired red component of the window background. + * @param g - The desired green component of the window background. + * @param b - The desired blue component of the window background. + * @param a - The desired alpha component of the window background. + */ + SetBackgroundColour(r, g, b, a) { + return this[callerSym](SetBackgroundColourMethod, { r, g, b, a }); + } + /** + * Removes the window frame and title bar. + * + * @param frameless - Whether the window should be frameless. + */ + SetFrameless(frameless) { + return this[callerSym](SetFramelessMethod, { frameless }); + } + /** + * Disables the system fullscreen button. + * + * @param enabled - Whether the fullscreen button should be enabled. + */ + SetFullscreenButtonEnabled(enabled) { + return this[callerSym](SetFullscreenButtonEnabledMethod, { enabled }); + } + /** + * Sets the maximum size of the window. + * + * @param width - The desired maximum width of the window. + * @param height - The desired maximum height of the window. + */ + SetMaxSize(width, height) { + return this[callerSym](SetMaxSizeMethod, { width, height }); + } + /** + * Sets the minimum size of the window. + * + * @param width - The desired minimum width of the window. + * @param height - The desired minimum height of the window. + */ + SetMinSize(width, height) { + return this[callerSym](SetMinSizeMethod, { width, height }); + } + /** + * Sets the relative position of the window to the screen. + * + * @param x - The desired horizontal relative position of the window. + * @param y - The desired vertical relative position of the window. + */ + SetRelativePosition(x, y) { + return this[callerSym](SetRelativePositionMethod, { x, y }); + } + /** + * Sets whether the window is resizable. + * + * @param resizable - Whether the window should be resizable. + */ + SetResizable(resizable) { + return this[callerSym](SetResizableMethod, { resizable }); + } + /** + * Sets the size of the window. + * + * @param width - The desired width of the window. + * @param height - The desired height of the window. + */ + SetSize(width, height) { + return this[callerSym](SetSizeMethod, { width, height }); + } + /** + * Sets the title of the window. + * + * @param title - The desired title of the window. + */ + SetTitle(title) { + return this[callerSym](SetTitleMethod, { title }); + } + /** + * Sets the zoom level of the window. + * + * @param zoom - The desired zoom level. + */ + SetZoom(zoom) { + return this[callerSym](SetZoomMethod, { zoom }); + } + /** + * Shows the window. + */ + Show() { + return this[callerSym](ShowMethod); + } + /** + * Returns the size of the window. + * + * @returns The current size of the window. + */ + Size() { + return this[callerSym](SizeMethod); + } + /** + * Toggles the window between fullscreen and normal. + */ + ToggleFullscreen() { + return this[callerSym](ToggleFullscreenMethod); + } + /** + * Toggles the window between maximised and normal. + */ + ToggleMaximise() { + return this[callerSym](ToggleMaximiseMethod); + } + /** + * Un-fullscreens the window. + */ + UnFullscreen() { + return this[callerSym](UnFullscreenMethod); + } + /** + * Un-maximises the window. + */ + UnMaximise() { + return this[callerSym](UnMaximiseMethod); + } + /** + * Un-minimises the window. + */ + UnMinimise() { + return this[callerSym](UnMinimiseMethod); + } + /** + * Returns the width of the window. + * + * @returns The current width of the window. + */ + Width() { + return this[callerSym](WidthMethod); + } + /** + * Zooms the window. + */ + Zoom() { + return this[callerSym](ZoomMethod); + } + /** + * Increases the zoom level of the webview content. + */ + ZoomIn() { + return this[callerSym](ZoomInMethod); + } + /** + * Decreases the zoom level of the webview content. + */ + ZoomOut() { + return this[callerSym](ZoomOutMethod); + } + /** + * Resets the zoom level of the webview content. + */ + ZoomReset() { + return this[callerSym](ZoomResetMethod); + } +} +/** + * The window within which the script is running. + */ +const thisWindow = new Window(''); +export default thisWindow; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/wml.js b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/wml.js new file mode 100644 index 0000000..9939282 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/dist/wml.js @@ -0,0 +1,179 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { OpenURL } from "./browser.js"; +import { Question } from "./dialogs.js"; +import { Emit, WailsEvent } from "./events.js"; +import { canAbortListeners, whenReady } from "./utils.js"; +import Window from "./window.js"; +/** + * Sends an event with the given name and optional data. + * + * @param eventName - - The name of the event to send. + * @param [data=null] - - Optional data to send along with the event. + */ +function sendEvent(eventName, data = null) { + Emit(new WailsEvent(eventName, data)); +} +/** + * Calls a method on a specified window. + * + * @param windowName - The name of the window to call the method on. + * @param methodName - The name of the method to call. + */ +function callWindowMethod(windowName, methodName) { + const targetWindow = Window.Get(windowName); + const method = targetWindow[methodName]; + if (typeof method !== "function") { + console.error(`Window method '${methodName}' not found`); + return; + } + try { + method.call(targetWindow); + } + catch (e) { + console.error(`Error calling window method '${methodName}': `, e); + } +} +/** + * Responds to a triggering event by running appropriate WML actions for the current target. + */ +function onWMLTriggered(ev) { + const element = ev.currentTarget; + function runEffect(choice = "Yes") { + if (choice !== "Yes") + return; + const eventType = element.getAttribute('wml-event') || element.getAttribute('data-wml-event'); + const targetWindow = element.getAttribute('wml-target-window') || element.getAttribute('data-wml-target-window') || ""; + const windowMethod = element.getAttribute('wml-window') || element.getAttribute('data-wml-window'); + const url = element.getAttribute('wml-openurl') || element.getAttribute('data-wml-openurl'); + if (eventType !== null) + sendEvent(eventType); + if (windowMethod !== null) + callWindowMethod(targetWindow, windowMethod); + if (url !== null) + void OpenURL(url); + } + const confirm = element.getAttribute('wml-confirm') || element.getAttribute('data-wml-confirm'); + if (confirm) { + Question({ + Title: "Confirm", + Message: confirm, + Detached: false, + Buttons: [ + { Label: "Yes" }, + { Label: "No", IsDefault: true } + ] + }).then(runEffect); + } + else { + runEffect(); + } +} +// Private field names. +const controllerSym = Symbol("controller"); +const triggerMapSym = Symbol("triggerMap"); +const elementCountSym = Symbol("elementCount"); +/** + * AbortControllerRegistry does not actually remember active event listeners: instead + * it ties them to an AbortSignal and uses an AbortController to remove them all at once. + */ +class AbortControllerRegistry { + constructor() { + this[controllerSym] = new AbortController(); + } + /** + * Returns an options object for addEventListener that ties the listener + * to the AbortSignal from the current AbortController. + * + * @param element - An HTML element + * @param triggers - The list of active WML trigger events for the specified elements + */ + set(element, triggers) { + return { signal: this[controllerSym].signal }; + } + /** + * Removes all registered event listeners and resets the registry. + */ + reset() { + this[controllerSym].abort(); + this[controllerSym] = new AbortController(); + } +} +/** + * WeakMapRegistry maps active trigger events to each DOM element through a WeakMap. + * This ensures that the mapping remains private to this module, while still allowing garbage + * collection of the involved elements. + */ +class WeakMapRegistry { + constructor() { + this[triggerMapSym] = new WeakMap(); + this[elementCountSym] = 0; + } + /** + * Sets active triggers for the specified element. + * + * @param element - An HTML element + * @param triggers - The list of active WML trigger events for the specified element + */ + set(element, triggers) { + if (!this[triggerMapSym].has(element)) { + this[elementCountSym]++; + } + this[triggerMapSym].set(element, triggers); + return {}; + } + /** + * Removes all registered event listeners. + */ + reset() { + if (this[elementCountSym] <= 0) + return; + for (const element of document.body.querySelectorAll('*')) { + if (this[elementCountSym] <= 0) + break; + const triggers = this[triggerMapSym].get(element); + if (triggers != null) { + this[elementCountSym]--; + } + for (const trigger of triggers || []) + element.removeEventListener(trigger, onWMLTriggered); + } + this[triggerMapSym] = new WeakMap(); + this[elementCountSym] = 0; + } +} +const triggerRegistry = canAbortListeners() ? new AbortControllerRegistry() : new WeakMapRegistry(); +/** + * Adds event listeners to the specified element. + */ +function addWMLListeners(element) { + const triggerRegExp = /\S+/g; + const triggerAttr = (element.getAttribute('wml-trigger') || element.getAttribute('data-wml-trigger') || "click"); + const triggers = []; + let match; + while ((match = triggerRegExp.exec(triggerAttr)) !== null) + triggers.push(match[0]); + const options = triggerRegistry.set(element, triggers); + for (const trigger of triggers) + element.addEventListener(trigger, onWMLTriggered, options); +} +/** + * Schedules an automatic reload of WML to be performed as soon as the document is fully loaded. + */ +export function Enable() { + whenReady(Reload); +} +/** + * Reloads the WML page by adding necessary event listeners and browser listeners. + */ +export function Reload() { + triggerRegistry.reset(); + document.body.querySelectorAll('[wml-event], [wml-window], [wml-openurl], [data-wml-event], [data-wml-window], [data-wml-openurl]').forEach(addWMLListeners); +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/package.json b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/package.json new file mode 100644 index 0000000..495abe2 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/package.json @@ -0,0 +1,62 @@ +{ + "name": "@wailsio/runtime", + "type": "module", + "version": "3.0.0-alpha.66", + "description": "Wails Runtime", + "types": "types/index.d.ts", + "exports": { + "types": "./types/index.d.ts", + "import": "./dist/index.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/wailsapp/wails.git", + "directory": "v3/internal/runtime/desktop/@wailsio/runtime" + }, + "author": "The Wails Team", + "license": "MIT", + "homepage": "https://v3.wails.io", + "bugs": { + "url": "https://github.com/wailsapp/wails/issues" + }, + "files": [ + "./dist", + "./types" + ], + "sideEffects": [ + "./dist/index.js", + "./dist/contextmenu.js", + "./dist/drag.js" + ], + "scripts": { + "check": "npx tsc --noEmit", + "test": "npx vitest run", + "clean": "npx rimraf ./dist ./docs ./types ./tsconfig.tsbuildinfo", + "generate:events": "task generate:events", + "generate": "npm run generate:events", + "prebuild": "npm run clean && npm run generate", + "build:code": "npx tsc", + "build:docs": "npx typedoc --plugin typedoc-plugin-mdn-links --plugin typedoc-plugin-missing-exports ./src/index.ts", + "build:docs:md": "npx typedoc --plugin typedoc-plugin-markdown --plugin typedoc-plugin-mdn-links --plugin typedoc-plugin-missing-exports ./src/index.ts", + "build": "npm run build:code & npm run build:docs & wait", + "prepack": "npm run build" + }, + "devDependencies": { + "happy-dom": "^17.1.1", + "promises-aplus-tests": "2.1.2", + "rimraf": "^5.0.5", + "typedoc": "^0.27.7", + "typedoc-plugin-markdown": "^4.4.2", + "typedoc-plugin-mdn-links": "^4.0.13", + "typedoc-plugin-missing-exports": "^3.1.0", + "typescript": "^5.7.3", + "vitest": "^3.0.6" + }, + "overrides": { + "promises-aplus-tests": { + "mocha": "^11.1.0", + "sinon": "^19.0.2", + "underscore": "^1.13.7" + } + } +} diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/application.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/application.d.ts new file mode 100644 index 0000000..bfab64a --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/application.d.ts @@ -0,0 +1,12 @@ +/** + * Hides a certain method by calling the HideMethod function. + */ +export declare function Hide(): Promise; +/** + * Calls the ShowMethod and returns the result. + */ +export declare function Show(): Promise; +/** + * Calls the QuitMethod to terminate the program. + */ +export declare function Quit(): Promise; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/browser.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/browser.d.ts new file mode 100644 index 0000000..799a457 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/browser.d.ts @@ -0,0 +1,6 @@ +/** + * Open a browser window to the given URL. + * + * @param url - The URL to open + */ +export declare function OpenURL(url: string | URL): Promise; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/callable.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/callable.d.ts new file mode 100644 index 0000000..54a1c6c --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/callable.d.ts @@ -0,0 +1,3 @@ +declare function isCallableRefApply(value: T | unknown): value is (...args: any[]) => any; +declare const _default: typeof isCallableRefApply; +export default _default; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/calls.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/calls.d.ts new file mode 100644 index 0000000..a96fa80 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/calls.d.ts @@ -0,0 +1,63 @@ +import { CancellablePromise } from "./cancellable.js"; +/** + * Holds all required information for a binding call. + * May provide either a method ID or a method name, but not both. + */ +export type CallOptions = { + /** The numeric ID of the bound method to call. */ + methodID: number; + /** The fully qualified name of the bound method to call. */ + methodName?: never; + /** Arguments to be passed into the bound method. */ + args: any[]; +} | { + /** The numeric ID of the bound method to call. */ + methodID?: never; + /** The fully qualified name of the bound method to call. */ + methodName: string; + /** Arguments to be passed into the bound method. */ + args: any[]; +}; +/** + * Exception class that will be thrown in case the bound method returns an error. + * The value of the {@link RuntimeError#name} property is "RuntimeError". + */ +export declare class RuntimeError extends Error { + /** + * Constructs a new RuntimeError instance. + * @param message - The error message. + * @param options - Options to be forwarded to the Error constructor. + */ + constructor(message?: string, options?: ErrorOptions); +} +/** + * Call a bound method according to the given call options. + * + * In case of failure, the returned promise will reject with an exception + * among ReferenceError (unknown method), TypeError (wrong argument count or type), + * {@link RuntimeError} (method returned an error), or other (network or internal errors). + * The exception might have a "cause" field with the value returned + * by the application- or service-level error marshaling functions. + * + * @param options - A method call descriptor. + * @returns The result of the call. + */ +export declare function Call(options: CallOptions): CancellablePromise; +/** + * Calls a bound method by name with the specified arguments. + * See {@link Call} for details. + * + * @param methodName - The name of the method in the format 'package.struct.method'. + * @param args - The arguments to pass to the method. + * @returns The result of the method call. + */ +export declare function ByName(methodName: string, ...args: any[]): CancellablePromise; +/** + * Calls a method by its numeric ID with the specified arguments. + * See {@link Call} for details. + * + * @param methodID - The ID of the method to call. + * @param args - The arguments to pass to the method. + * @return The result of the method call. + */ +export declare function ByID(methodID: number, ...args: any[]): CancellablePromise; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/cancellable.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/cancellable.d.ts new file mode 100644 index 0000000..a65a2ba --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/cancellable.d.ts @@ -0,0 +1,434 @@ +/** + * Exception class that will be used as rejection reason + * in case a {@link CancellablePromise} is cancelled successfully. + * + * The value of the {@link name} property is the string `"CancelError"`. + * The value of the {@link cause} property is the cause passed to the cancel method, if any. + */ +export declare class CancelError extends Error { + /** + * Constructs a new `CancelError` instance. + * @param message - The error message. + * @param options - Options to be forwarded to the Error constructor. + */ + constructor(message?: string, options?: ErrorOptions); +} +/** + * Exception class that will be reported as an unhandled rejection + * in case a {@link CancellablePromise} rejects after being cancelled, + * or when the `oncancelled` callback throws or rejects. + * + * The value of the {@link name} property is the string `"CancelledRejectionError"`. + * The value of the {@link cause} property is the reason the promise rejected with. + * + * Because the original promise was cancelled, + * a wrapper promise will be passed to the unhandled rejection listener instead. + * The {@link promise} property holds a reference to the original promise. + */ +export declare class CancelledRejectionError extends Error { + /** + * Holds a reference to the promise that was cancelled and then rejected. + */ + promise: CancellablePromise; + /** + * Constructs a new `CancelledRejectionError` instance. + * @param promise - The promise that caused the error originally. + * @param reason - The rejection reason. + * @param info - An optional informative message specifying the circumstances in which the error was thrown. + * Defaults to the string `"Unhandled rejection in cancelled promise."`. + */ + constructor(promise: CancellablePromise, reason?: any, info?: string); +} +type CancellablePromiseResolver = (value: T | PromiseLike | CancellablePromiseLike) => void; +type CancellablePromiseRejector = (reason?: any) => void; +type CancellablePromiseCanceller = (cause?: any) => void | PromiseLike; +type CancellablePromiseExecutor = (resolve: CancellablePromiseResolver, reject: CancellablePromiseRejector) => void; +export interface CancellablePromiseLike { + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike | CancellablePromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike | CancellablePromiseLike) | undefined | null): CancellablePromiseLike; + cancel(cause?: any): void | PromiseLike; +} +/** + * Wraps a cancellable promise along with its resolution methods. + * The `oncancelled` field will be null initially but may be set to provide a custom cancellation function. + */ +export interface CancellablePromiseWithResolvers { + promise: CancellablePromise; + resolve: CancellablePromiseResolver; + reject: CancellablePromiseRejector; + oncancelled: CancellablePromiseCanceller | null; +} +/** + * A promise with an attached method for cancelling long-running operations (see {@link CancellablePromise#cancel}). + * Cancellation can optionally be bound to an {@link AbortSignal} + * for better composability (see {@link CancellablePromise#cancelOn}). + * + * Cancelling a pending promise will result in an immediate rejection + * with an instance of {@link CancelError} as reason, + * but whoever started the promise will be responsible + * for actually aborting the underlying operation. + * To this purpose, the constructor and all chaining methods + * accept optional cancellation callbacks. + * + * If a `CancellablePromise` still resolves after having been cancelled, + * the result will be discarded. If it rejects, the reason + * will be reported as an unhandled rejection, + * wrapped in a {@link CancelledRejectionError} instance. + * To facilitate the handling of cancellation requests, + * cancelled `CancellablePromise`s will _not_ report unhandled `CancelError`s + * whose `cause` field is the same as the one with which the current promise was cancelled. + * + * All usual promise methods are defined and return a `CancellablePromise` + * whose cancel method will cancel the parent operation as well, propagating the cancellation reason + * upwards through promise chains. + * Conversely, cancelling a promise will not automatically cancel dependent promises downstream: + * ```ts + * let root = new CancellablePromise((resolve, reject) => { ... }); + * let child1 = root.then(() => { ... }); + * let child2 = child1.then(() => { ... }); + * let child3 = root.catch(() => { ... }); + * child1.cancel(); // Cancels child1 and root, but not child2 or child3 + * ``` + * Cancelling a promise that has already settled is safe and has no consequence. + * + * The `cancel` method returns a promise that _always fulfills_ + * after the whole chain has processed the cancel request + * and all attached callbacks up to that moment have run. + * + * All ES2024 promise methods (static and instance) are defined on CancellablePromise, + * but actual availability may vary with OS/webview version. + * + * In line with the proposal at https://github.com/tc39/proposal-rm-builtin-subclassing, + * `CancellablePromise` does not support transparent subclassing. + * Extenders should take care to provide their own method implementations. + * This might be reconsidered in case the proposal is retired. + * + * CancellablePromise is a wrapper around the DOM Promise object + * and is compliant with the [Promises/A+ specification](https://promisesaplus.com/) + * (it passes the [compliance suite](https://github.com/promises-aplus/promises-tests)) + * if so is the underlying implementation. + */ +export declare class CancellablePromise extends Promise implements PromiseLike, CancellablePromiseLike { + static [x: symbol]: PromiseConstructor; + /** + * Creates a new `CancellablePromise`. + * + * @param executor - A callback used to initialize the promise. This callback is passed two arguments: + * a `resolve` callback used to resolve the promise with a value + * or the result of another promise (possibly cancellable), + * and a `reject` callback used to reject the promise with a provided reason or error. + * If the value provided to the `resolve` callback is a thenable _and_ cancellable object + * (it has a `then` _and_ a `cancel` method), + * cancellation requests will be forwarded to that object and the oncancelled will not be invoked anymore. + * If any one of the two callbacks is called _after_ the promise has been cancelled, + * the provided values will be cancelled and resolved as usual, + * but their results will be discarded. + * However, if the resolution process ultimately ends up in a rejection + * that is not due to cancellation, the rejection reason + * will be wrapped in a {@link CancelledRejectionError} + * and bubbled up as an unhandled rejection. + * @param oncancelled - It is the caller's responsibility to ensure that any operation + * started by the executor is properly halted upon cancellation. + * This optional callback can be used to that purpose. + * It will be called _synchronously_ with a cancellation cause + * when cancellation is requested, _after_ the promise has already rejected + * with a {@link CancelError}, but _before_ + * any {@link then}/{@link catch}/{@link finally} callback runs. + * If the callback returns a thenable, the promise returned from {@link cancel} + * will only fulfill after the former has settled. + * Unhandled exceptions or rejections from the callback will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as unhandled rejections. + * If the `resolve` callback is called before cancellation with a cancellable promise, + * cancellation requests on this promise will be diverted to that promise, + * and the original `oncancelled` callback will be discarded. + */ + constructor(executor: CancellablePromiseExecutor, oncancelled?: CancellablePromiseCanceller); + /** + * Cancels immediately the execution of the operation associated with this promise. + * The promise rejects with a {@link CancelError} instance as reason, + * with the {@link CancelError#cause} property set to the given argument, if any. + * + * Has no effect if called after the promise has already settled; + * repeated calls in particular are safe, but only the first one + * will set the cancellation cause. + * + * The `CancelError` exception _need not_ be handled explicitly _on the promises that are being cancelled:_ + * cancelling a promise with no attached rejection handler does not trigger an unhandled rejection event. + * Therefore, the following idioms are all equally correct: + * ```ts + * new CancellablePromise((resolve, reject) => { ... }).cancel(); + * new CancellablePromise((resolve, reject) => { ... }).then(...).cancel(); + * new CancellablePromise((resolve, reject) => { ... }).then(...).catch(...).cancel(); + * ``` + * Whenever some cancelled promise in a chain rejects with a `CancelError` + * with the same cancellation cause as itself, the error will be discarded silently. + * However, the `CancelError` _will still be delivered_ to all attached rejection handlers + * added by {@link then} and related methods: + * ```ts + * let cancellable = new CancellablePromise((resolve, reject) => { ... }); + * cancellable.then(() => { ... }).catch(console.log); + * cancellable.cancel(); // A CancelError is printed to the console. + * ``` + * If the `CancelError` is not handled downstream by the time it reaches + * a _non-cancelled_ promise, it _will_ trigger an unhandled rejection event, + * just like normal rejections would: + * ```ts + * let cancellable = new CancellablePromise((resolve, reject) => { ... }); + * let chained = cancellable.then(() => { ... }).then(() => { ... }); // No catch... + * cancellable.cancel(); // Unhandled rejection event on chained! + * ``` + * Therefore, it is important to either cancel whole promise chains from their tail, + * as shown in the correct idioms above, or take care of handling errors everywhere. + * + * @returns A cancellable promise that _fulfills_ after the cancel callback (if any) + * and all handlers attached up to the call to cancel have run. + * If the cancel callback returns a thenable, the promise returned by `cancel` + * will also wait for that thenable to settle. + * This enables callers to wait for the cancelled operation to terminate + * without being forced to handle potential errors at the call site. + * ```ts + * cancellable.cancel().then(() => { + * // Cleanup finished, it's safe to do something else. + * }, (err) => { + * // Unreachable: the promise returned from cancel will never reject. + * }); + * ``` + * Note that the returned promise will _not_ handle implicitly any rejection + * that might have occurred already in the cancelled chain. + * It will just track whether registered handlers have been executed or not. + * Therefore, unhandled rejections will never be silently handled by calling cancel. + */ + cancel(cause?: any): CancellablePromise; + /** + * Binds promise cancellation to the abort event of the given {@link AbortSignal}. + * If the signal has already aborted, the promise will be cancelled immediately. + * When either condition is verified, the cancellation cause will be set + * to the signal's abort reason (see {@link AbortSignal#reason}). + * + * Has no effect if called (or if the signal aborts) _after_ the promise has already settled. + * Only the first signal to abort will set the cancellation cause. + * + * For more details about the cancellation process, + * see {@link cancel} and the `CancellablePromise` constructor. + * + * This method enables `await`ing cancellable promises without having + * to store them for future cancellation, e.g.: + * ```ts + * await longRunningOperation().cancelOn(signal); + * ``` + * instead of: + * ```ts + * let promiseToBeCancelled = longRunningOperation(); + * await promiseToBeCancelled; + * ``` + * + * @returns This promise, for method chaining. + */ + cancelOn(signal: AbortSignal): CancellablePromise; + /** + * Attaches callbacks for the resolution and/or rejection of the `CancellablePromise`. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * When the parent promise rejects or is cancelled, the `onrejected` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A `CancellablePromise` for the completion of whichever callback is executed. + * The returned promise is hooked up to propagate cancellation requests up the chain, but not down: + * + * - if the parent promise is cancelled, the `onrejected` handler will be invoked with a `CancelError` + * and the returned promise _will resolve regularly_ with its result; + * - conversely, if the returned promise is cancelled, _the parent promise is cancelled too;_ + * the `onrejected` handler will still be invoked with the parent's `CancelError`, + * but its result will be discarded + * and the returned promise will reject with a `CancelError` as well. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If either callback returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike | CancellablePromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike | CancellablePromiseLike) | undefined | null, oncancelled?: CancellablePromiseCanceller): CancellablePromise; + /** + * Attaches a callback for only the rejection of the Promise. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * When the parent promise rejects or is cancelled, the `onrejected` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * It is equivalent to + * ```ts + * cancellablePromise.then(undefined, onrejected, oncancelled); + * ``` + * and the same caveats apply. + * + * @returns A Promise for the completion of the callback. + * Cancellation requests on the returned promise + * will propagate up the chain to the parent promise, + * but not in the other direction. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If `onrejected` returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + * See {@link then} for more details. + */ + catch(onrejected?: ((reason: any) => (PromiseLike | TResult)) | undefined | null, oncancelled?: CancellablePromiseCanceller): CancellablePromise; + /** + * Attaches a callback that is invoked when the CancellablePromise is settled (fulfilled or rejected). The + * resolved value cannot be accessed or modified from the callback. + * The returned promise will settle in the same state as the original one + * after the provided callback has completed execution, + * unless the callback throws or returns a rejecting promise, + * in which case the returned promise will reject as well. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * Once the parent promise settles, the `onfinally` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * This method is implemented in terms of {@link then} and the same caveats apply. + * It is polyfilled, hence available in every OS/webview version. + * + * @returns A Promise for the completion of the callback. + * Cancellation requests on the returned promise + * will propagate up the chain to the parent promise, + * but not in the other direction. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If `onfinally` returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + * See {@link then} for more details. + */ + finally(onfinally?: (() => void) | undefined | null, oncancelled?: CancellablePromiseCanceller): CancellablePromise; + /** + * Creates a CancellablePromise that is resolved with an array of results + * when all of the provided Promises resolve, or rejected when any Promise is rejected. + * + * Every one of the provided objects that is a thenable _and_ cancellable object + * will be cancelled when the returned promise is cancelled, with the same cause. + * + * @group Static Methods + */ + static all(values: Iterable>): CancellablePromise[]>; + static all(values: T): CancellablePromise<{ + -readonly [P in keyof T]: Awaited; + }>; + /** + * Creates a CancellablePromise that is resolved with an array of results + * when all of the provided Promises resolve or reject. + * + * Every one of the provided objects that is a thenable _and_ cancellable object + * will be cancelled when the returned promise is cancelled, with the same cause. + * + * @group Static Methods + */ + static allSettled(values: Iterable>): CancellablePromise>[]>; + static allSettled(values: T): CancellablePromise<{ + -readonly [P in keyof T]: PromiseSettledResult>; + }>; + /** + * The any function returns a promise that is fulfilled by the first given promise to be fulfilled, + * or rejected with an AggregateError containing an array of rejection reasons + * if all of the given promises are rejected. + * It resolves all elements of the passed iterable to promises as it runs this algorithm. + * + * Every one of the provided objects that is a thenable _and_ cancellable object + * will be cancelled when the returned promise is cancelled, with the same cause. + * + * @group Static Methods + */ + static any(values: Iterable>): CancellablePromise>; + static any(values: T): CancellablePromise>; + /** + * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved or rejected. + * + * Every one of the provided objects that is a thenable _and_ cancellable object + * will be cancelled when the returned promise is cancelled, with the same cause. + * + * @group Static Methods + */ + static race(values: Iterable>): CancellablePromise>; + static race(values: T): CancellablePromise>; + /** + * Creates a new cancelled CancellablePromise for the provided cause. + * + * @group Static Methods + */ + static cancel(cause?: any): CancellablePromise; + /** + * Creates a new CancellablePromise that cancels + * after the specified timeout, with the provided cause. + * + * If the {@link AbortSignal.timeout} factory method is available, + * it is used to base the timeout on _active_ time rather than _elapsed_ time. + * Otherwise, `timeout` falls back to {@link setTimeout}. + * + * @group Static Methods + */ + static timeout(milliseconds: number, cause?: any): CancellablePromise; + /** + * Creates a new CancellablePromise that resolves after the specified timeout. + * The returned promise can be cancelled without consequences. + * + * @group Static Methods + */ + static sleep(milliseconds: number): CancellablePromise; + /** + * Creates a new CancellablePromise that resolves after + * the specified timeout, with the provided value. + * The returned promise can be cancelled without consequences. + * + * @group Static Methods + */ + static sleep(milliseconds: number, value: T): CancellablePromise; + /** + * Creates a new rejected CancellablePromise for the provided reason. + * + * @group Static Methods + */ + static reject(reason?: any): CancellablePromise; + /** + * Creates a new resolved CancellablePromise. + * + * @group Static Methods + */ + static resolve(): CancellablePromise; + /** + * Creates a new resolved CancellablePromise for the provided value. + * + * @group Static Methods + */ + static resolve(value: T): CancellablePromise>; + /** + * Creates a new resolved CancellablePromise for the provided value. + * + * @group Static Methods + */ + static resolve(value: T | PromiseLike): CancellablePromise>; + /** + * Creates a new CancellablePromise and returns it in an object, along with its resolve and reject functions + * and a getter/setter for the cancellation callback. + * + * This method is polyfilled, hence available in every OS/webview version. + * + * @group Static Methods + */ + static withResolvers(): CancellablePromiseWithResolvers; +} +export {}; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/clipboard.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/clipboard.d.ts new file mode 100644 index 0000000..4d03634 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/clipboard.d.ts @@ -0,0 +1,13 @@ +/** + * Sets the text to the Clipboard. + * + * @param text - The text to be set to the Clipboard. + * @return A Promise that resolves when the operation is successful. + */ +export declare function SetText(text: string): Promise; +/** + * Get the Clipboard text + * + * @returns A promise that resolves with the text from the Clipboard. + */ +export declare function Text(): Promise; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/contextmenu.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/contextmenu.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/contextmenu.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/create.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/create.d.ts new file mode 100644 index 0000000..a3332a4 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/create.d.ts @@ -0,0 +1,31 @@ +/** + * Any is a dummy creation function for simple or unknown types. + */ +export declare function Any(source: any): T; +/** + * ByteSlice is a creation function that replaces + * null strings with empty strings. + */ +export declare function ByteSlice(source: any): string; +/** + * Array takes a creation function for an arbitrary type + * and returns an in-place creation function for an array + * whose elements are of that type. + */ +export declare function Array(element: (source: any) => T): (source: any) => T[]; +/** + * Map takes creation functions for two arbitrary types + * and returns an in-place creation function for an object + * whose keys and values are of those types. + */ +export declare function Map(key: (source: any) => string, value: (source: any) => V): (source: any) => Record; +/** + * Nullable takes a creation function for an arbitrary type + * and returns a creation function for a nullable value of that type. + */ +export declare function Nullable(element: (source: any) => T): (source: any) => (T | null); +/** + * Struct takes an object mapping field names to creation functions + * and returns an in-place creation function for a struct. + */ +export declare function Struct(createField: Record any>): = any>(source: any) => U; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/dialogs.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/dialogs.d.ts new file mode 100644 index 0000000..223d43e --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/dialogs.d.ts @@ -0,0 +1,140 @@ +export interface OpenFileDialogOptions { + /** Indicates if directories can be chosen. */ + CanChooseDirectories?: boolean; + /** Indicates if files can be chosen. */ + CanChooseFiles?: boolean; + /** Indicates if directories can be created. */ + CanCreateDirectories?: boolean; + /** Indicates if hidden files should be shown. */ + ShowHiddenFiles?: boolean; + /** Indicates if aliases should be resolved. */ + ResolvesAliases?: boolean; + /** Indicates if multiple selection is allowed. */ + AllowsMultipleSelection?: boolean; + /** Indicates if the extension should be hidden. */ + HideExtension?: boolean; + /** Indicates if hidden extensions can be selected. */ + CanSelectHiddenExtension?: boolean; + /** Indicates if file packages should be treated as directories. */ + TreatsFilePackagesAsDirectories?: boolean; + /** Indicates if other file types are allowed. */ + AllowsOtherFiletypes?: boolean; + /** Array of file filters. */ + Filters?: FileFilter[]; + /** Title of the dialog. */ + Title?: string; + /** Message to show in the dialog. */ + Message?: string; + /** Text to display on the button. */ + ButtonText?: string; + /** Directory to open in the dialog. */ + Directory?: string; + /** Indicates if the dialog should appear detached from the main window. */ + Detached?: boolean; +} +export interface SaveFileDialogOptions { + /** Default filename to use in the dialog. */ + Filename?: string; + /** Indicates if directories can be chosen. */ + CanChooseDirectories?: boolean; + /** Indicates if files can be chosen. */ + CanChooseFiles?: boolean; + /** Indicates if directories can be created. */ + CanCreateDirectories?: boolean; + /** Indicates if hidden files should be shown. */ + ShowHiddenFiles?: boolean; + /** Indicates if aliases should be resolved. */ + ResolvesAliases?: boolean; + /** Indicates if the extension should be hidden. */ + HideExtension?: boolean; + /** Indicates if hidden extensions can be selected. */ + CanSelectHiddenExtension?: boolean; + /** Indicates if file packages should be treated as directories. */ + TreatsFilePackagesAsDirectories?: boolean; + /** Indicates if other file types are allowed. */ + AllowsOtherFiletypes?: boolean; + /** Array of file filters. */ + Filters?: FileFilter[]; + /** Title of the dialog. */ + Title?: string; + /** Message to show in the dialog. */ + Message?: string; + /** Text to display on the button. */ + ButtonText?: string; + /** Directory to open in the dialog. */ + Directory?: string; + /** Indicates if the dialog should appear detached from the main window. */ + Detached?: boolean; +} +export interface MessageDialogOptions { + /** The title of the dialog window. */ + Title?: string; + /** The main message to show in the dialog. */ + Message?: string; + /** Array of button options to show in the dialog. */ + Buttons?: Button[]; + /** True if the dialog should appear detached from the main window (if applicable). */ + Detached?: boolean; +} +export interface Button { + /** Text that appears within the button. */ + Label?: string; + /** True if the button should cancel an operation when clicked. */ + IsCancel?: boolean; + /** True if the button should be the default action when the user presses enter. */ + IsDefault?: boolean; +} +export interface FileFilter { + /** Display name for the filter, it could be "Text Files", "Images" etc. */ + DisplayName?: string; + /** Pattern to match for the filter, e.g. "*.txt;*.md" for text markdown files. */ + Pattern?: string; +} +/** + * Presents an info dialog. + * + * @param options - Dialog options + * @returns A promise that resolves with the label of the chosen button. + */ +export declare function Info(options: MessageDialogOptions): Promise; +/** + * Presents a warning dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export declare function Warning(options: MessageDialogOptions): Promise; +/** + * Presents an error dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export declare function Error(options: MessageDialogOptions): Promise; +/** + * Presents a question dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export declare function Question(options: MessageDialogOptions): Promise; +/** + * Presents a file selection dialog to pick one or more files to open. + * + * @param options - Dialog options. + * @returns Selected file or list of files, or a blank string/empty list if no file has been selected. + */ +export declare function OpenFile(options: OpenFileDialogOptions & { + AllowsMultipleSelection: true; +}): Promise; +export declare function OpenFile(options: OpenFileDialogOptions & { + AllowsMultipleSelection?: false | undefined; +}): Promise; +export declare function OpenFile(options: OpenFileDialogOptions): Promise; +/** + * Presents a file selection dialog to pick a file to save. + * + * @param options - Dialog options. + * @returns Selected file, or a blank string if no file has been selected. + */ +export declare function SaveFile(options: SaveFileDialogOptions): Promise; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/drag.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/drag.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/drag.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/event_types.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/event_types.d.ts new file mode 100644 index 0000000..382c324 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/event_types.d.ts @@ -0,0 +1,218 @@ +export declare const Types: Readonly<{ + Windows: Readonly<{ + APMPowerSettingChange: "windows:APMPowerSettingChange"; + APMPowerStatusChange: "windows:APMPowerStatusChange"; + APMResumeAutomatic: "windows:APMResumeAutomatic"; + APMResumeSuspend: "windows:APMResumeSuspend"; + APMSuspend: "windows:APMSuspend"; + ApplicationStarted: "windows:ApplicationStarted"; + SystemThemeChanged: "windows:SystemThemeChanged"; + WebViewNavigationCompleted: "windows:WebViewNavigationCompleted"; + WindowActive: "windows:WindowActive"; + WindowBackgroundErase: "windows:WindowBackgroundErase"; + WindowClickActive: "windows:WindowClickActive"; + WindowClosing: "windows:WindowClosing"; + WindowDidMove: "windows:WindowDidMove"; + WindowDidResize: "windows:WindowDidResize"; + WindowDPIChanged: "windows:WindowDPIChanged"; + WindowDragDrop: "windows:WindowDragDrop"; + WindowDragEnter: "windows:WindowDragEnter"; + WindowDragLeave: "windows:WindowDragLeave"; + WindowDragOver: "windows:WindowDragOver"; + WindowEndMove: "windows:WindowEndMove"; + WindowEndResize: "windows:WindowEndResize"; + WindowFullscreen: "windows:WindowFullscreen"; + WindowHide: "windows:WindowHide"; + WindowInactive: "windows:WindowInactive"; + WindowKeyDown: "windows:WindowKeyDown"; + WindowKeyUp: "windows:WindowKeyUp"; + WindowKillFocus: "windows:WindowKillFocus"; + WindowNonClientHit: "windows:WindowNonClientHit"; + WindowNonClientMouseDown: "windows:WindowNonClientMouseDown"; + WindowNonClientMouseLeave: "windows:WindowNonClientMouseLeave"; + WindowNonClientMouseMove: "windows:WindowNonClientMouseMove"; + WindowNonClientMouseUp: "windows:WindowNonClientMouseUp"; + WindowPaint: "windows:WindowPaint"; + WindowRestore: "windows:WindowRestore"; + WindowSetFocus: "windows:WindowSetFocus"; + WindowShow: "windows:WindowShow"; + WindowStartMove: "windows:WindowStartMove"; + WindowStartResize: "windows:WindowStartResize"; + WindowUnFullscreen: "windows:WindowUnFullscreen"; + WindowZOrderChanged: "windows:WindowZOrderChanged"; + WindowMinimise: "windows:WindowMinimise"; + WindowUnMinimise: "windows:WindowUnMinimise"; + WindowMaximise: "windows:WindowMaximise"; + WindowUnMaximise: "windows:WindowUnMaximise"; + }>; + Mac: Readonly<{ + ApplicationDidBecomeActive: "mac:ApplicationDidBecomeActive"; + ApplicationDidChangeBackingProperties: "mac:ApplicationDidChangeBackingProperties"; + ApplicationDidChangeEffectiveAppearance: "mac:ApplicationDidChangeEffectiveAppearance"; + ApplicationDidChangeIcon: "mac:ApplicationDidChangeIcon"; + ApplicationDidChangeOcclusionState: "mac:ApplicationDidChangeOcclusionState"; + ApplicationDidChangeScreenParameters: "mac:ApplicationDidChangeScreenParameters"; + ApplicationDidChangeStatusBarFrame: "mac:ApplicationDidChangeStatusBarFrame"; + ApplicationDidChangeStatusBarOrientation: "mac:ApplicationDidChangeStatusBarOrientation"; + ApplicationDidChangeTheme: "mac:ApplicationDidChangeTheme"; + ApplicationDidFinishLaunching: "mac:ApplicationDidFinishLaunching"; + ApplicationDidHide: "mac:ApplicationDidHide"; + ApplicationDidResignActive: "mac:ApplicationDidResignActive"; + ApplicationDidUnhide: "mac:ApplicationDidUnhide"; + ApplicationDidUpdate: "mac:ApplicationDidUpdate"; + ApplicationShouldHandleReopen: "mac:ApplicationShouldHandleReopen"; + ApplicationWillBecomeActive: "mac:ApplicationWillBecomeActive"; + ApplicationWillFinishLaunching: "mac:ApplicationWillFinishLaunching"; + ApplicationWillHide: "mac:ApplicationWillHide"; + ApplicationWillResignActive: "mac:ApplicationWillResignActive"; + ApplicationWillTerminate: "mac:ApplicationWillTerminate"; + ApplicationWillUnhide: "mac:ApplicationWillUnhide"; + ApplicationWillUpdate: "mac:ApplicationWillUpdate"; + MenuDidAddItem: "mac:MenuDidAddItem"; + MenuDidBeginTracking: "mac:MenuDidBeginTracking"; + MenuDidClose: "mac:MenuDidClose"; + MenuDidDisplayItem: "mac:MenuDidDisplayItem"; + MenuDidEndTracking: "mac:MenuDidEndTracking"; + MenuDidHighlightItem: "mac:MenuDidHighlightItem"; + MenuDidOpen: "mac:MenuDidOpen"; + MenuDidPopUp: "mac:MenuDidPopUp"; + MenuDidRemoveItem: "mac:MenuDidRemoveItem"; + MenuDidSendAction: "mac:MenuDidSendAction"; + MenuDidSendActionToItem: "mac:MenuDidSendActionToItem"; + MenuDidUpdate: "mac:MenuDidUpdate"; + MenuWillAddItem: "mac:MenuWillAddItem"; + MenuWillBeginTracking: "mac:MenuWillBeginTracking"; + MenuWillDisplayItem: "mac:MenuWillDisplayItem"; + MenuWillEndTracking: "mac:MenuWillEndTracking"; + MenuWillHighlightItem: "mac:MenuWillHighlightItem"; + MenuWillOpen: "mac:MenuWillOpen"; + MenuWillPopUp: "mac:MenuWillPopUp"; + MenuWillRemoveItem: "mac:MenuWillRemoveItem"; + MenuWillSendAction: "mac:MenuWillSendAction"; + MenuWillSendActionToItem: "mac:MenuWillSendActionToItem"; + MenuWillUpdate: "mac:MenuWillUpdate"; + WebViewDidCommitNavigation: "mac:WebViewDidCommitNavigation"; + WebViewDidFinishNavigation: "mac:WebViewDidFinishNavigation"; + WebViewDidReceiveServerRedirectForProvisionalNavigation: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation"; + WebViewDidStartProvisionalNavigation: "mac:WebViewDidStartProvisionalNavigation"; + WindowDidBecomeKey: "mac:WindowDidBecomeKey"; + WindowDidBecomeMain: "mac:WindowDidBecomeMain"; + WindowDidBeginSheet: "mac:WindowDidBeginSheet"; + WindowDidChangeAlpha: "mac:WindowDidChangeAlpha"; + WindowDidChangeBackingLocation: "mac:WindowDidChangeBackingLocation"; + WindowDidChangeBackingProperties: "mac:WindowDidChangeBackingProperties"; + WindowDidChangeCollectionBehavior: "mac:WindowDidChangeCollectionBehavior"; + WindowDidChangeEffectiveAppearance: "mac:WindowDidChangeEffectiveAppearance"; + WindowDidChangeOcclusionState: "mac:WindowDidChangeOcclusionState"; + WindowDidChangeOrderingMode: "mac:WindowDidChangeOrderingMode"; + WindowDidChangeScreen: "mac:WindowDidChangeScreen"; + WindowDidChangeScreenParameters: "mac:WindowDidChangeScreenParameters"; + WindowDidChangeScreenProfile: "mac:WindowDidChangeScreenProfile"; + WindowDidChangeScreenSpace: "mac:WindowDidChangeScreenSpace"; + WindowDidChangeScreenSpaceProperties: "mac:WindowDidChangeScreenSpaceProperties"; + WindowDidChangeSharingType: "mac:WindowDidChangeSharingType"; + WindowDidChangeSpace: "mac:WindowDidChangeSpace"; + WindowDidChangeSpaceOrderingMode: "mac:WindowDidChangeSpaceOrderingMode"; + WindowDidChangeTitle: "mac:WindowDidChangeTitle"; + WindowDidChangeToolbar: "mac:WindowDidChangeToolbar"; + WindowDidDeminiaturize: "mac:WindowDidDeminiaturize"; + WindowDidEndSheet: "mac:WindowDidEndSheet"; + WindowDidEnterFullScreen: "mac:WindowDidEnterFullScreen"; + WindowDidEnterVersionBrowser: "mac:WindowDidEnterVersionBrowser"; + WindowDidExitFullScreen: "mac:WindowDidExitFullScreen"; + WindowDidExitVersionBrowser: "mac:WindowDidExitVersionBrowser"; + WindowDidExpose: "mac:WindowDidExpose"; + WindowDidFocus: "mac:WindowDidFocus"; + WindowDidMiniaturize: "mac:WindowDidMiniaturize"; + WindowDidMove: "mac:WindowDidMove"; + WindowDidOrderOffScreen: "mac:WindowDidOrderOffScreen"; + WindowDidOrderOnScreen: "mac:WindowDidOrderOnScreen"; + WindowDidResignKey: "mac:WindowDidResignKey"; + WindowDidResignMain: "mac:WindowDidResignMain"; + WindowDidResize: "mac:WindowDidResize"; + WindowDidUpdate: "mac:WindowDidUpdate"; + WindowDidUpdateAlpha: "mac:WindowDidUpdateAlpha"; + WindowDidUpdateCollectionBehavior: "mac:WindowDidUpdateCollectionBehavior"; + WindowDidUpdateCollectionProperties: "mac:WindowDidUpdateCollectionProperties"; + WindowDidUpdateShadow: "mac:WindowDidUpdateShadow"; + WindowDidUpdateTitle: "mac:WindowDidUpdateTitle"; + WindowDidUpdateToolbar: "mac:WindowDidUpdateToolbar"; + WindowDidZoom: "mac:WindowDidZoom"; + WindowFileDraggingEntered: "mac:WindowFileDraggingEntered"; + WindowFileDraggingExited: "mac:WindowFileDraggingExited"; + WindowFileDraggingPerformed: "mac:WindowFileDraggingPerformed"; + WindowHide: "mac:WindowHide"; + WindowMaximise: "mac:WindowMaximise"; + WindowUnMaximise: "mac:WindowUnMaximise"; + WindowMinimise: "mac:WindowMinimise"; + WindowUnMinimise: "mac:WindowUnMinimise"; + WindowShouldClose: "mac:WindowShouldClose"; + WindowShow: "mac:WindowShow"; + WindowWillBecomeKey: "mac:WindowWillBecomeKey"; + WindowWillBecomeMain: "mac:WindowWillBecomeMain"; + WindowWillBeginSheet: "mac:WindowWillBeginSheet"; + WindowWillChangeOrderingMode: "mac:WindowWillChangeOrderingMode"; + WindowWillClose: "mac:WindowWillClose"; + WindowWillDeminiaturize: "mac:WindowWillDeminiaturize"; + WindowWillEnterFullScreen: "mac:WindowWillEnterFullScreen"; + WindowWillEnterVersionBrowser: "mac:WindowWillEnterVersionBrowser"; + WindowWillExitFullScreen: "mac:WindowWillExitFullScreen"; + WindowWillExitVersionBrowser: "mac:WindowWillExitVersionBrowser"; + WindowWillFocus: "mac:WindowWillFocus"; + WindowWillMiniaturize: "mac:WindowWillMiniaturize"; + WindowWillMove: "mac:WindowWillMove"; + WindowWillOrderOffScreen: "mac:WindowWillOrderOffScreen"; + WindowWillOrderOnScreen: "mac:WindowWillOrderOnScreen"; + WindowWillResignMain: "mac:WindowWillResignMain"; + WindowWillResize: "mac:WindowWillResize"; + WindowWillUnfocus: "mac:WindowWillUnfocus"; + WindowWillUpdate: "mac:WindowWillUpdate"; + WindowWillUpdateAlpha: "mac:WindowWillUpdateAlpha"; + WindowWillUpdateCollectionBehavior: "mac:WindowWillUpdateCollectionBehavior"; + WindowWillUpdateCollectionProperties: "mac:WindowWillUpdateCollectionProperties"; + WindowWillUpdateShadow: "mac:WindowWillUpdateShadow"; + WindowWillUpdateTitle: "mac:WindowWillUpdateTitle"; + WindowWillUpdateToolbar: "mac:WindowWillUpdateToolbar"; + WindowWillUpdateVisibility: "mac:WindowWillUpdateVisibility"; + WindowWillUseStandardFrame: "mac:WindowWillUseStandardFrame"; + WindowZoomIn: "mac:WindowZoomIn"; + WindowZoomOut: "mac:WindowZoomOut"; + WindowZoomReset: "mac:WindowZoomReset"; + }>; + Linux: Readonly<{ + ApplicationStartup: "linux:ApplicationStartup"; + SystemThemeChanged: "linux:SystemThemeChanged"; + WindowDeleteEvent: "linux:WindowDeleteEvent"; + WindowDidMove: "linux:WindowDidMove"; + WindowDidResize: "linux:WindowDidResize"; + WindowFocusIn: "linux:WindowFocusIn"; + WindowFocusOut: "linux:WindowFocusOut"; + WindowLoadChanged: "linux:WindowLoadChanged"; + }>; + Common: Readonly<{ + ApplicationOpenedWithFile: "common:ApplicationOpenedWithFile"; + ApplicationStarted: "common:ApplicationStarted"; + ThemeChanged: "common:ThemeChanged"; + WindowClosing: "common:WindowClosing"; + WindowDidMove: "common:WindowDidMove"; + WindowDidResize: "common:WindowDidResize"; + WindowDPIChanged: "common:WindowDPIChanged"; + WindowFilesDropped: "common:WindowFilesDropped"; + WindowFocus: "common:WindowFocus"; + WindowFullscreen: "common:WindowFullscreen"; + WindowHide: "common:WindowHide"; + WindowLostFocus: "common:WindowLostFocus"; + WindowMaximise: "common:WindowMaximise"; + WindowMinimise: "common:WindowMinimise"; + WindowRestore: "common:WindowRestore"; + WindowRuntimeReady: "common:WindowRuntimeReady"; + WindowShow: "common:WindowShow"; + WindowUnFullscreen: "common:WindowUnFullscreen"; + WindowUnMaximise: "common:WindowUnMaximise"; + WindowUnMinimise: "common:WindowUnMinimise"; + WindowZoom: "common:WindowZoom"; + WindowZoomIn: "common:WindowZoomIn"; + WindowZoomOut: "common:WindowZoomOut"; + WindowZoomReset: "common:WindowZoomReset"; + }>; +}>; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/events.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/events.d.ts new file mode 100644 index 0000000..11d03e1 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/events.d.ts @@ -0,0 +1,66 @@ +export { Types } from "./event_types.js"; +/** + * The type of handlers for a given event. + */ +export type Callback = (ev: WailsEvent) => void; +/** + * Represents a system event or a custom event emitted through wails-provided facilities. + */ +export declare class WailsEvent { + /** + * The name of the event. + */ + name: string; + /** + * Optional data associated with the emitted event. + */ + data: any; + /** + * Name of the originating window. Omitted for application events. + * Will be overridden if set manually. + */ + sender?: string; + constructor(name: string, data?: any); +} +/** + * Register a callback function to be called multiple times for a specific event. + * + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @param maxCallbacks - The maximum number of times the callback can be called for the event. Once the maximum number is reached, the callback will no longer be called. + * @returns A function that, when called, will unregister the callback from the event. + */ +export declare function OnMultiple(eventName: string, callback: Callback, maxCallbacks: number): () => void; +/** + * Registers a callback function to be executed when the specified event occurs. + * + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @returns A function that, when called, will unregister the callback from the event. + */ +export declare function On(eventName: string, callback: Callback): () => void; +/** + * Registers a callback function to be executed only once for the specified event. + * + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @returns A function that, when called, will unregister the callback from the event. + */ +export declare function Once(eventName: string, callback: Callback): () => void; +/** + * Removes event listeners for the specified event names. + * + * @param eventNames - The name of the events to remove listeners for. + */ +export declare function Off(...eventNames: [string, ...string[]]): void; +/** + * Removes all event listeners. + */ +export declare function OffAll(): void; +/** + * Emits the given event. + * + * @param event - The name of the event to emit. + * @returns A promise that will be fulfilled once the event has been emitted. + */ +export declare function Emit(event: WailsEvent): Promise; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/flags.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/flags.d.ts new file mode 100644 index 0000000..272aa91 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/flags.d.ts @@ -0,0 +1,7 @@ +/** + * Retrieves the value associated with the specified key from the flag map. + * + * @param key - The key to retrieve the value for. + * @return The value associated with the specified key. + */ +export declare function GetFlag(key: string): any; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/index.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/index.d.ts new file mode 100644 index 0000000..54dca22 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/index.d.ts @@ -0,0 +1,16 @@ +import "./contextmenu.js"; +import "./drag.js"; +import * as Application from "./application.js"; +import * as Browser from "./browser.js"; +import * as Call from "./calls.js"; +import * as Clipboard from "./clipboard.js"; +import * as Create from "./create.js"; +import * as Dialogs from "./dialogs.js"; +import * as Events from "./events.js"; +import * as Flags from "./flags.js"; +import * as Screens from "./screens.js"; +import * as System from "./system.js"; +import Window from "./window.js"; +import * as WML from "./wml.js"; +export { Application, Browser, Call, Clipboard, Dialogs, Events, Flags, Screens, System, Window, WML }; +export * from "./cancellable.js"; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/listener.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/listener.d.ts new file mode 100644 index 0000000..75bb5c4 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/listener.d.ts @@ -0,0 +1,9 @@ +export declare const eventListeners: Map; +export declare class Listener { + eventName: string; + callback: (data: any) => void; + maxCallbacks: number; + constructor(eventName: string, callback: (data: any) => void, maxCallbacks: number); + dispatch(data: any): boolean; +} +export declare function listenerOff(listener: Listener): void; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/nanoid.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/nanoid.d.ts new file mode 100644 index 0000000..a691510 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/nanoid.d.ts @@ -0,0 +1 @@ +export declare function nanoid(size?: number): string; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/runtime.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/runtime.d.ts new file mode 100644 index 0000000..60f7606 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/runtime.d.ts @@ -0,0 +1,22 @@ +export declare const objectNames: Readonly<{ + Call: 0; + Clipboard: 1; + Application: 2; + Events: 3; + ContextMenu: 4; + Dialog: 5; + Window: 6; + Screens: 7; + System: 8; + Browser: 9; + CancelCall: 10; +}>; +export declare let clientId: string; +/** + * Creates a new runtime caller with specified ID. + * + * @param object - The object to invoke the method on. + * @param windowName - The name of the window. + * @return The new runtime caller function. + */ +export declare function newRuntimeCaller(object: number, windowName?: string): (method: number, args?: any) => Promise; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/screens.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/screens.d.ts new file mode 100644 index 0000000..b4a2f62 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/screens.d.ts @@ -0,0 +1,60 @@ +export interface Size { + /** The width of a rectangular area. */ + Width: number; + /** The height of a rectangular area. */ + Height: number; +} +export interface Rect { + /** The X coordinate of the origin. */ + X: number; + /** The Y coordinate of the origin. */ + Y: number; + /** The width of the rectangle. */ + Width: number; + /** The height of the rectangle. */ + Height: number; +} +export interface Screen { + /** Unique identifier for the screen. */ + ID: string; + /** Human-readable name of the screen. */ + Name: string; + /** The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc. */ + ScaleFactor: number; + /** The X coordinate of the screen. */ + X: number; + /** The Y coordinate of the screen. */ + Y: number; + /** Contains the width and height of the screen. */ + Size: Size; + /** Contains the bounds of the screen in terms of X, Y, Width, and Height. */ + Bounds: Rect; + /** Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling). */ + PhysicalBounds: Rect; + /** Contains the area of the screen that is actually usable (excluding taskbar and other system UI). */ + WorkArea: Rect; + /** Contains the physical WorkArea of the screen (before scaling). */ + PhysicalWorkArea: Rect; + /** True if this is the primary monitor selected by the user in the operating system. */ + IsPrimary: boolean; + /** The rotation of the screen. */ + Rotation: number; +} +/** + * Gets all screens. + * + * @returns A promise that resolves to an array of Screen objects. + */ +export declare function GetAll(): Promise; +/** + * Gets the primary screen. + * + * @returns A promise that resolves to the primary screen. + */ +export declare function GetPrimary(): Promise; +/** + * Gets the current active screen. + * + * @returns A promise that resolves with the current active screen. + */ +export declare function GetCurrent(): Promise; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/system.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/system.d.ts new file mode 100644 index 0000000..1e1924b --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/system.d.ts @@ -0,0 +1,83 @@ +export declare function invoke(msg: any): void; +/** + * Retrieves the system dark mode status. + * + * @returns A promise that resolves to a boolean value indicating if the system is in dark mode. + */ +export declare function IsDarkMode(): Promise; +/** + * Fetches the capabilities of the application from the server. + * + * @returns A promise that resolves to an object containing the capabilities. + */ +export declare function Capabilities(): Promise>; +export interface OSInfo { + /** The branding of the OS. */ + Branding: string; + /** The ID of the OS. */ + ID: string; + /** The name of the OS. */ + Name: string; + /** The version of the OS. */ + Version: string; +} +export interface EnvironmentInfo { + /** The architecture of the system. */ + Arch: string; + /** True if the application is running in debug mode, otherwise false. */ + Debug: boolean; + /** The operating system in use. */ + OS: string; + /** Details of the operating system. */ + OSInfo: OSInfo; + /** Additional platform information. */ + PlatformInfo: Record; +} +/** + * Retrieves environment details. + * + * @returns A promise that resolves to an object containing OS and system architecture. + */ +export declare function Environment(): Promise; +/** + * Checks if the current operating system is Windows. + * + * @return True if the operating system is Windows, otherwise false. + */ +export declare function IsWindows(): boolean; +/** + * Checks if the current operating system is Linux. + * + * @returns Returns true if the current operating system is Linux, false otherwise. + */ +export declare function IsLinux(): boolean; +/** + * Checks if the current environment is a macOS operating system. + * + * @returns True if the environment is macOS, false otherwise. + */ +export declare function IsMac(): boolean; +/** + * Checks if the current environment architecture is AMD64. + * + * @returns True if the current environment architecture is AMD64, false otherwise. + */ +export declare function IsAMD64(): boolean; +/** + * Checks if the current architecture is ARM. + * + * @returns True if the current architecture is ARM, false otherwise. + */ +export declare function IsARM(): boolean; +/** + * Checks if the current environment is ARM64 architecture. + * + * @returns Returns true if the environment is ARM64 architecture, otherwise returns false. + */ +export declare function IsARM64(): boolean; +/** + * Reports whether the app is being run in debug mode. + * + * @returns True if the app is being run in debug mode. + */ +export declare function IsDebug(): boolean; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/utils.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/utils.d.ts new file mode 100644 index 0000000..d748a04 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/utils.d.ts @@ -0,0 +1,21 @@ +/** + * Logs a message to the console with custom formatting. + * + * @param message - The message to be logged. + */ +export declare function debugLog(message: any): void; +/** + * Checks whether the webview supports the {@link MouseEvent#buttons} property. + * Looking at you macOS High Sierra! + */ +export declare function canTrackButtons(): boolean; +/** + * Checks whether the browser supports removing listeners by triggering an AbortSignal + * (see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#signal). + */ +export declare function canAbortListeners(): boolean; +/** + * Resolves the closest HTMLElement ancestor of an event's target. + */ +export declare function eventTarget(event: Event): HTMLElement; +export declare function whenReady(callback: () => void): void; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/window.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/window.d.ts new file mode 100644 index 0000000..3acecfb --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/window.d.ts @@ -0,0 +1,292 @@ +import type { Screen } from "./screens.js"; +/** + * A record describing the position of a window. + */ +interface Position { + /** The horizontal position of the window. */ + x: number; + /** The vertical position of the window. */ + y: number; +} +/** + * A record describing the size of a window. + */ +interface Size { + /** The width of the window. */ + width: number; + /** The height of the window. */ + height: number; +} +declare const callerSym: unique symbol; +declare class Window { + private [callerSym]; + /** + * Initialises a window object with the specified name. + * + * @private + * @param name - The name of the target window. + */ + constructor(name?: string); + /** + * Gets the specified window. + * + * @param name - The name of the window to get. + * @returns The corresponding window object. + */ + Get(name: string): Window; + /** + * Returns the absolute position of the window. + * + * @returns The current absolute position of the window. + */ + Position(): Promise; + /** + * Centers the window on the screen. + */ + Center(): Promise; + /** + * Closes the window. + */ + Close(): Promise; + /** + * Disables min/max size constraints. + */ + DisableSizeConstraints(): Promise; + /** + * Enables min/max size constraints. + */ + EnableSizeConstraints(): Promise; + /** + * Focuses the window. + */ + Focus(): Promise; + /** + * Forces the window to reload the page assets. + */ + ForceReload(): Promise; + /** + * Switches the window to fullscreen mode. + */ + Fullscreen(): Promise; + /** + * Returns the screen that the window is on. + * + * @returns The screen the window is currently on. + */ + GetScreen(): Promise; + /** + * Returns the current zoom level of the window. + * + * @returns The current zoom level. + */ + GetZoom(): Promise; + /** + * Returns the height of the window. + * + * @returns The current height of the window. + */ + Height(): Promise; + /** + * Hides the window. + */ + Hide(): Promise; + /** + * Returns true if the window is focused. + * + * @returns Whether the window is currently focused. + */ + IsFocused(): Promise; + /** + * Returns true if the window is fullscreen. + * + * @returns Whether the window is currently fullscreen. + */ + IsFullscreen(): Promise; + /** + * Returns true if the window is maximised. + * + * @returns Whether the window is currently maximised. + */ + IsMaximised(): Promise; + /** + * Returns true if the window is minimised. + * + * @returns Whether the window is currently minimised. + */ + IsMinimised(): Promise; + /** + * Maximises the window. + */ + Maximise(): Promise; + /** + * Minimises the window. + */ + Minimise(): Promise; + /** + * Returns the name of the window. + * + * @returns The name of the window. + */ + Name(): Promise; + /** + * Opens the development tools pane. + */ + OpenDevTools(): Promise; + /** + * Returns the relative position of the window to the screen. + * + * @returns The current relative position of the window. + */ + RelativePosition(): Promise; + /** + * Reloads the page assets. + */ + Reload(): Promise; + /** + * Returns true if the window is resizable. + * + * @returns Whether the window is currently resizable. + */ + Resizable(): Promise; + /** + * Restores the window to its previous state if it was previously minimised, maximised or fullscreen. + */ + Restore(): Promise; + /** + * Sets the absolute position of the window. + * + * @param x - The desired horizontal absolute position of the window. + * @param y - The desired vertical absolute position of the window. + */ + SetPosition(x: number, y: number): Promise; + /** + * Sets the window to be always on top. + * + * @param alwaysOnTop - Whether the window should stay on top. + */ + SetAlwaysOnTop(alwaysOnTop: boolean): Promise; + /** + * Sets the background colour of the window. + * + * @param r - The desired red component of the window background. + * @param g - The desired green component of the window background. + * @param b - The desired blue component of the window background. + * @param a - The desired alpha component of the window background. + */ + SetBackgroundColour(r: number, g: number, b: number, a: number): Promise; + /** + * Removes the window frame and title bar. + * + * @param frameless - Whether the window should be frameless. + */ + SetFrameless(frameless: boolean): Promise; + /** + * Disables the system fullscreen button. + * + * @param enabled - Whether the fullscreen button should be enabled. + */ + SetFullscreenButtonEnabled(enabled: boolean): Promise; + /** + * Sets the maximum size of the window. + * + * @param width - The desired maximum width of the window. + * @param height - The desired maximum height of the window. + */ + SetMaxSize(width: number, height: number): Promise; + /** + * Sets the minimum size of the window. + * + * @param width - The desired minimum width of the window. + * @param height - The desired minimum height of the window. + */ + SetMinSize(width: number, height: number): Promise; + /** + * Sets the relative position of the window to the screen. + * + * @param x - The desired horizontal relative position of the window. + * @param y - The desired vertical relative position of the window. + */ + SetRelativePosition(x: number, y: number): Promise; + /** + * Sets whether the window is resizable. + * + * @param resizable - Whether the window should be resizable. + */ + SetResizable(resizable: boolean): Promise; + /** + * Sets the size of the window. + * + * @param width - The desired width of the window. + * @param height - The desired height of the window. + */ + SetSize(width: number, height: number): Promise; + /** + * Sets the title of the window. + * + * @param title - The desired title of the window. + */ + SetTitle(title: string): Promise; + /** + * Sets the zoom level of the window. + * + * @param zoom - The desired zoom level. + */ + SetZoom(zoom: number): Promise; + /** + * Shows the window. + */ + Show(): Promise; + /** + * Returns the size of the window. + * + * @returns The current size of the window. + */ + Size(): Promise; + /** + * Toggles the window between fullscreen and normal. + */ + ToggleFullscreen(): Promise; + /** + * Toggles the window between maximised and normal. + */ + ToggleMaximise(): Promise; + /** + * Un-fullscreens the window. + */ + UnFullscreen(): Promise; + /** + * Un-maximises the window. + */ + UnMaximise(): Promise; + /** + * Un-minimises the window. + */ + UnMinimise(): Promise; + /** + * Returns the width of the window. + * + * @returns The current width of the window. + */ + Width(): Promise; + /** + * Zooms the window. + */ + Zoom(): Promise; + /** + * Increases the zoom level of the webview content. + */ + ZoomIn(): Promise; + /** + * Decreases the zoom level of the webview content. + */ + ZoomOut(): Promise; + /** + * Resets the zoom level of the webview content. + */ + ZoomReset(): Promise; +} +/** + * The window within which the script is running. + */ +declare const thisWindow: Window; +export default thisWindow; diff --git a/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/wml.d.ts b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/wml.d.ts new file mode 100644 index 0000000..020a3c5 --- /dev/null +++ b/node_modules/.pnpm/@wailsio+runtime@3.0.0-alpha.66/node_modules/@wailsio/runtime/types/wml.d.ts @@ -0,0 +1,8 @@ +/** + * Schedules an automatic reload of WML to be performed as soon as the document is fully loaded. + */ +export declare function Enable(): void; +/** + * Reloads the WML page by adding necessary event listeners and browser listeners. + */ +export declare function Reload(): void; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/LICENSE b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/LICENSE new file mode 100644 index 0000000..4a56f14 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 JOU Amjs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/README.md b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/README.md new file mode 100644 index 0000000..ed66242 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/README.md @@ -0,0 +1,77 @@ +

+ +

+ +

Workflow-Streamlined next-generation request tools.
Extremely improve your API using efficiency and save brainpower Just one step

+ +

English | Chinese

+ +[![npm](https://img.shields.io/npm/v/alova)](https://www.npmjs.com/package/alova) +[![build](https://github.com/alovajs/alova/actions/workflows/release.yml/badge.svg?branch=main)](https://github.com/alovajs/alova/actions/workflows/release.yml) +[![coverage status](https://coveralls.io/repos/github/alovajs/alova/badge.svg?branch=main)](https://coveralls.io/github/alovajs/alova?branch=main) +[![stars](https://img.shields.io/github/stars/alovajs/alova?style=social)](https://github.com/alovajs/alova) +[![discord](https://img.shields.io/badge/chat-Discord-515ff1)](https://discord.gg/S47QGJgkVb) +[![wechat](https://img.shields.io/badge/chat_with_CH-Wechat-07c160)](https://alova.js.org/img/wechat_qrcode.jpg) +[![tree shaking](https://badgen.net/bundlephobia/tree-shaking/alova)](https://bundlephobia.com/package/alova) +![typescript](https://badgen.net/badge/icon/typescript?icon=typescript&label) +![license](https://img.shields.io/badge/license-MIT-blue.svg) + +## What is alova? + +alova(pronounced /əˈləʊva/) is a workflow-streamlined next-generation request tool. Starting from front-end and back-end collaboration and API integration, it streamline API integration workflow from 7 steps to only 1 step, extremely streamline API integration workflow and making network requests very simple. Let's see how alova can help you simplify your work. + +![](https://alova.js.org/img/overview_flow_en.png) + +## Is there any difference? + +Unlike other request libraries, alova aims to make requests very simple and maintain more efficient data interaction. + +We consider both developers and App users. For developers, alova provides them with the ultimate user experience, and for application users, they can enjoy the smooth experience brought by alova's high-performance data interaction. + +In addition, let's take a look at the specific features: + +- The API design similar to Axios makes the learning cost of users lower; +- High-performance client and server request strategies make the application smoother; +- High flexibility, Alova's adapter allows Alova to work with any UI framework in any JS environment, and provides a unified user experience and perfect code migration; +- 2 cache modes and request sharing mechanisms to improve request performance and reduce server pressure; +- High aggregation organization of API code, each API's request parameters, cache behavior, response data conversion, etc. will be gathered in the same code block, which is a great advantage for managing a large number of APIs; + +> You can also check [Comparison with other request libraries](https://alova.js.org/about/comparison) to learn more about the differences of Alova. + +## Documentation + +Visit the [alova website](https://alova.js.org) for more information, or [check out the examples to try running](https://alova.js.org/category/examples). + +## Join the community + +- [Follow us on X to get the latest updates](https://x.com/alovajs) + +- [Join the Discord](https://discord.gg/S47QGJgkVb) + +- [Join the WeChat group](https://alova.js.org/img/wechat_qrcode.jpg) + +## We need your support + +If you like alova, we are very grateful for giving us a star in the upper right corner, which is a recognition and encouragement for our work. + +## Welcome to contribute + +We are honored to receive active participation from developers around the world in Issues and Discussions. + +We hope to make alova a common project for everyone who is willing to participate, rather than the alova team. We encourage everyone to become a contributor to the alova community with an open and inclusive attitude. Even if you are a junior developer, as long as your ideas meet the development guidelines of alova, please participate generously. + +Effective contributions will win you a certain reputation in the Alova community. Before contributing, please be sure to read the [Contribution Guide](https://github.com/alovajs/alova/blob/main/CONTRIBUTING.md) in detail to ensure your contribution is effective. + +## Changelog + +[Link](https://github.com/alovajs/alova/releases) + +## Contributors + + + + + +## LICENSE + +[MIT](https://en.wikipedia.org/wiki/MIT_License) diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/README.zh-CN.md b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/README.zh-CN.md new file mode 100644 index 0000000..ae844c1 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/README.zh-CN.md @@ -0,0 +1,75 @@ +

+ +

+ +

工作流精简的下一代请求工具
极致地简化你的API集成工作流,仅需一步

+ +

📑English | 中文

+ +[![npm](https://img.shields.io/npm/v/alova)](https://www.npmjs.com/package/alova) +[![build](https://github.com/alovajs/alova/actions/workflows/release.yml/badge.svg?branch=main)](https://github.com/alovajs/alova/actions/workflows/release.yml) +[![coverage status](https://coveralls.io/repos/github/alovajs/alova/badge.svg?branch=main)](https://coveralls.io/github/alovajs/alova?branch=main) +[![stars](https://img.shields.io/github/stars/alovajs/alova?style=social)](https://github.com/alovajs/alova) +[![discord](https://img.shields.io/badge/chat-Discord-515ff1)](https://discord.gg/S47QGJgkVb) +[![wechat](https://img.shields.io/badge/chat_with_CH-Wechat-07c160)](https://alova.js.org/img/wechat_qrcode.jpg) +[![tree shaking](https://badgen.net/bundlephobia/tree-shaking/alova)](https://bundlephobia.com/package/alova) +![typescript](https://badgen.net/badge/icon/typescript?icon=typescript&label) +![license](https://img.shields.io/badge/license-MIT-blue.svg) + +## alova 是什么? + +alova(读作/əˈləʊva/)是一个流程精简的下一代请求工具,从前后端协作和 API 集成作为出发点,将 API 集成步骤从 7 步简化为只有 1 步,极致地简化 API 集成工作流,让网络请求变得非常简单。我们来看看 alova 是如何帮你的简化工作的。 + +![](https://alova.js.org/img/overview_flow_cn.png) + +## 有什么不同吗? + +与其他请求库不同的是,alova 的目标是让请求变得非常简单,并且保持更高效的数据交互。 + +我们为开发者和 App 使用者双方考虑,对于开发者来说,alova 为他们提供了极致的使用体验,对于应用的用户来说,他们可以享受到 alova 的高性能数据交互带来的流畅体验。 + +此外,再从具体的特性来看看: + +- 与 axios 相似的 api 设计,让使用者学习成本更低; +- 高性能的客户端和服务端请求策略,让应用更流畅; +- 灵活性高,alova 的适配器可以让 alova 在任何 js 环境下,与任何 UI 框架协作使用,并且提供了统一的使用体验和完美的代码迁移; +- 2 种缓存模式和请求共享机制,提升请求性能并降低服务端压力; +- api 代码的高聚合组织,每个 api 的请求参数、缓存行为、响应数据转换等都将聚集在相同的代码块中,这对于管理大量的 api 有很大的优势; + +> 你还可以查看请[与其他请求库比较](https://alova.js.org/about/comparison)详细了解 alova 的不同之处。 + +## 文档 + +访问[alova 网站](https://alova.js.org)了解更多信息,或[查尝试运行的示例](https://alova.js.org/category/examples)。 + +## 加入交流社区 + +- [在 X 上关注我们,持续获得最新动态](https://x.com/alovajs) +- [加入在 Discord 社区参与交流](https://discord.gg/S47QGJgkVb) +- [加入微信群参与交流](https://alova.js.org/img/wechat_qrcode.jpg) + +## 我们需要你的支持 + +如果你喜欢 alova,我们非常感谢您在右上角给我们 star,这是对我们工作的认可和鼓励。 + +## 欢迎参与贡献 + +我们在 Issues 和 Disscussion 中收到了来自世界各地的开发者积极参与的信息,深感荣幸。 + +我们期望将 alova 打造成每位愿意参与的人的共同项目,而不是 alova 团队的,我们以开放包容的态度鼓励每个人成为 alova 社区的贡献者,即使你是一位初级开发者,只要想法符合 alova 的发展准则,也请大方地参与进来。 + +有效的贡献将为你赢得一定的 alova 社区名望。在参与贡献前,请务必详细阅读 [贡献指南](https://github.com/alovajs/alova/blob/main/CONTRIBUTING.zh-CN.md),以保证你的有效贡献。 + +## Changelog + +[前往查看](https://github.com/alovajs/alova/releases) + +## Contributors + + + + + +## LICENSE + +[MIT](https://en.wikipedia.org/wiki/MIT_License) diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.common.cjs b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.common.cjs new file mode 100644 index 0000000..a88fe5d --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.common.cjs @@ -0,0 +1,92 @@ +/** + * alova 3.2.10 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +'use strict'; + +var shared = require('@alova/shared'); + +const isBodyData = (data) => shared.isString(data) || shared.isSpecialRequestBody(data); +function adapterFetch() { + return (elements, method) => { + const adapterConfig = method.config; + const timeout = adapterConfig.timeout || 0; + const ctrl = new AbortController(); + const { data, headers } = elements; + const isContentTypeSet = /content-type/i.test(shared.ObjectCls.keys(headers).join()); + const isDataFormData = data && data.toString() === '[object FormData]'; + // When the content type is not set and the data is not a form data object, the content type is set to application/json by default. + if (!isContentTypeSet && !isDataFormData) { + headers['Content-Type'] = 'application/json;charset=UTF-8'; + } + const fetchPromise = fetch(elements.url, { + ...adapterConfig, + method: elements.type, + signal: ctrl.signal, + body: isBodyData(data) ? data : shared.JSONStringify(data) + }); + // If the interruption time is set, the request will be interrupted after the specified time. + let abortTimer; + let isTimeout = shared.falseValue; + if (timeout > 0) { + abortTimer = shared.setTimeoutFn(() => { + isTimeout = shared.trueValue; + ctrl.abort(); + }, timeout); + } + return { + response: () => fetchPromise.then(response => { + // Clear interrupt processing after successful request + shared.clearTimeoutTimer(abortTimer); + // Response's readable can only be read once and needs to be cloned before it can be reused. + return response.clone(); + }, err => shared.promiseReject(isTimeout ? shared.newInstance(Error, 'fetchError: network timeout') : err)), + // The then in the Headers function needs to catch exceptions, otherwise the correct error object will not be obtained internally. + headers: () => fetchPromise.then(({ headers: responseHeaders }) => responseHeaders, () => ({})), + // Due to limitations of the node fetch library, this code cannot be unit tested, but it has passed the test in the browser. + /* c8 ignore start */ + onDownload: async (cb) => { + let isAborted = shared.falseValue; + const response = await fetchPromise.catch(() => { + isAborted = shared.trueValue; + }); + if (!response) + return; + const { headers: responseHeaders, body } = response.clone(); + const reader = body ? body.getReader() : shared.undefinedValue; + const total = Number(responseHeaders.get('Content-Length') || responseHeaders.get('content-length') || 0); + if (total <= 0) { + return; + } + let loaded = 0; + if (reader) { + const pump = () => reader.read().then(({ done, value = new Uint8Array() }) => { + if (done || isAborted) { + isAborted && cb(total, 0); + } + else { + loaded += value.byteLength; + cb(total, loaded); + return pump(); + } + }); + pump(); + } + }, + onUpload() { + // eslint-disable-next-line no-console + console.error("fetch API does'nt support uploading progress. please consider to change `@alova/adapter-xhr` or `@alova/adapter-axios`"); + }, + /* c8 ignore stop */ + abort: () => { + ctrl.abort(); + shared.clearTimeoutTimer(abortTimer); + } + }; + }; +} + +module.exports = adapterFetch; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.esm.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.esm.js new file mode 100644 index 0000000..091d013 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.esm.js @@ -0,0 +1,90 @@ +/** + * alova 3.2.10 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +import { ObjectCls, JSONStringify, setTimeoutFn, clearTimeoutTimer, promiseReject, newInstance, undefinedValue, isString, isSpecialRequestBody, falseValue, trueValue } from '@alova/shared'; + +const isBodyData = (data) => isString(data) || isSpecialRequestBody(data); +function adapterFetch() { + return (elements, method) => { + const adapterConfig = method.config; + const timeout = adapterConfig.timeout || 0; + const ctrl = new AbortController(); + const { data, headers } = elements; + const isContentTypeSet = /content-type/i.test(ObjectCls.keys(headers).join()); + const isDataFormData = data && data.toString() === '[object FormData]'; + // When the content type is not set and the data is not a form data object, the content type is set to application/json by default. + if (!isContentTypeSet && !isDataFormData) { + headers['Content-Type'] = 'application/json;charset=UTF-8'; + } + const fetchPromise = fetch(elements.url, { + ...adapterConfig, + method: elements.type, + signal: ctrl.signal, + body: isBodyData(data) ? data : JSONStringify(data) + }); + // If the interruption time is set, the request will be interrupted after the specified time. + let abortTimer; + let isTimeout = falseValue; + if (timeout > 0) { + abortTimer = setTimeoutFn(() => { + isTimeout = trueValue; + ctrl.abort(); + }, timeout); + } + return { + response: () => fetchPromise.then(response => { + // Clear interrupt processing after successful request + clearTimeoutTimer(abortTimer); + // Response's readable can only be read once and needs to be cloned before it can be reused. + return response.clone(); + }, err => promiseReject(isTimeout ? newInstance(Error, 'fetchError: network timeout') : err)), + // The then in the Headers function needs to catch exceptions, otherwise the correct error object will not be obtained internally. + headers: () => fetchPromise.then(({ headers: responseHeaders }) => responseHeaders, () => ({})), + // Due to limitations of the node fetch library, this code cannot be unit tested, but it has passed the test in the browser. + /* c8 ignore start */ + onDownload: async (cb) => { + let isAborted = falseValue; + const response = await fetchPromise.catch(() => { + isAborted = trueValue; + }); + if (!response) + return; + const { headers: responseHeaders, body } = response.clone(); + const reader = body ? body.getReader() : undefinedValue; + const total = Number(responseHeaders.get('Content-Length') || responseHeaders.get('content-length') || 0); + if (total <= 0) { + return; + } + let loaded = 0; + if (reader) { + const pump = () => reader.read().then(({ done, value = new Uint8Array() }) => { + if (done || isAborted) { + isAborted && cb(total, 0); + } + else { + loaded += value.byteLength; + cb(total, loaded); + return pump(); + } + }); + pump(); + } + }, + onUpload() { + // eslint-disable-next-line no-console + console.error("fetch API does'nt support uploading progress. please consider to change `@alova/adapter-xhr` or `@alova/adapter-axios`"); + }, + /* c8 ignore stop */ + abort: () => { + ctrl.abort(); + clearTimeoutTimer(abortTimer); + } + }; + }; +} + +export { adapterFetch as default }; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.umd.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.umd.js new file mode 100644 index 0000000..abd7a9b --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.umd.js @@ -0,0 +1,150 @@ +/** + * alova 3.2.10 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.alovaFetch = factory()); +})(this, (function () { 'use strict'; + + /** + * @alova/shared 1.1.2 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) + */ + + const undefStr = 'undefined'; + // The following unified processing functions or variables added to reduce the amount of compiled code + const PromiseCls = Promise; + const promiseReject = (value) => PromiseCls.reject(value); + const ObjectCls = Object; + const undefinedValue = undefined; + const trueValue = true; + const falseValue = false; + const JSONStringify = (value, replacer, space) => JSON.stringify(value, replacer, space); + const setTimeoutFn = (fn, delay = 0) => setTimeout(fn, delay); + const clearTimeoutTimer = (timer) => clearTimeout(timer); + const typeOf = (arg) => typeof arg; + // Whether it is running on the server side, node and bun are judged by process, and deno is judged by Deno. + // Some frameworks (such as Alipay and uniapp) will inject the process object as a global variable. + // Therefore, the process.cwd function unique to the server is used as the basis for judgment. + typeof window === undefStr && + (typeof process !== undefStr ? typeof process.cwd === 'function' : typeof Deno !== undefStr); + /** + * Determine whether the parameter is a string any parameter + * @returns Whether the parameter is a string + */ + const isString = (arg) => typeOf(arg) === 'string'; + /** + * Global toString any parameter stringified parameters + */ + const globalToString = (arg) => ObjectCls.prototype.toString.call(arg); + /** + * Determine whether it is an instance of a certain class any parameter + * @returns Judgment result + */ + const instanceOf = (arg, cls) => arg instanceof cls; + /** + * Is it special data + * @param data Submit data + * @returns Judgment result + */ + const isSpecialRequestBody = (data) => { + const dataTypeString = globalToString(data); + return (/^\[object (Blob|FormData|ReadableStream|URLSearchParams)\]$/i.test(dataTypeString) || instanceOf(data, ArrayBuffer)); + }; + /** + * Create class instance + * @param Cls Constructor + * @param args Constructor parameters class instance + */ + const newInstance = (Cls, ...args) => new Cls(...args); + + const isBodyData = (data) => isString(data) || isSpecialRequestBody(data); + function adapterFetch() { + return (elements, method) => { + const adapterConfig = method.config; + const timeout = adapterConfig.timeout || 0; + const ctrl = new AbortController(); + const { data, headers } = elements; + const isContentTypeSet = /content-type/i.test(ObjectCls.keys(headers).join()); + const isDataFormData = data && data.toString() === '[object FormData]'; + // When the content type is not set and the data is not a form data object, the content type is set to application/json by default. + if (!isContentTypeSet && !isDataFormData) { + headers['Content-Type'] = 'application/json;charset=UTF-8'; + } + const fetchPromise = fetch(elements.url, { + ...adapterConfig, + method: elements.type, + signal: ctrl.signal, + body: isBodyData(data) ? data : JSONStringify(data) + }); + // If the interruption time is set, the request will be interrupted after the specified time. + let abortTimer; + let isTimeout = falseValue; + if (timeout > 0) { + abortTimer = setTimeoutFn(() => { + isTimeout = trueValue; + ctrl.abort(); + }, timeout); + } + return { + response: () => fetchPromise.then(response => { + // Clear interrupt processing after successful request + clearTimeoutTimer(abortTimer); + // Response's readable can only be read once and needs to be cloned before it can be reused. + return response.clone(); + }, err => promiseReject(isTimeout ? newInstance(Error, 'fetchError: network timeout') : err)), + // The then in the Headers function needs to catch exceptions, otherwise the correct error object will not be obtained internally. + headers: () => fetchPromise.then(({ headers: responseHeaders }) => responseHeaders, () => ({})), + // Due to limitations of the node fetch library, this code cannot be unit tested, but it has passed the test in the browser. + /* c8 ignore start */ + onDownload: async (cb) => { + let isAborted = falseValue; + const response = await fetchPromise.catch(() => { + isAborted = trueValue; + }); + if (!response) + return; + const { headers: responseHeaders, body } = response.clone(); + const reader = body ? body.getReader() : undefinedValue; + const total = Number(responseHeaders.get('Content-Length') || responseHeaders.get('content-length') || 0); + if (total <= 0) { + return; + } + let loaded = 0; + if (reader) { + const pump = () => reader.read().then(({ done, value = new Uint8Array() }) => { + if (done || isAborted) { + isAborted && cb(total, 0); + } + else { + loaded += value.byteLength; + cb(total, loaded); + return pump(); + } + }); + pump(); + } + }, + onUpload() { + // eslint-disable-next-line no-console + console.error("fetch API does'nt support uploading progress. please consider to change `@alova/adapter-xhr` or `@alova/adapter-axios`"); + }, + /* c8 ignore stop */ + abort: () => { + ctrl.abort(); + clearTimeoutTimer(abortTimer); + } + }; + }; + } + + return adapterFetch; + +})); diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.umd.min.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.umd.min.js new file mode 100644 index 0000000..ac98894 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/adapter/fetch.umd.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).alovaFetch=t()}(this,(function(){"use strict";const e="undefined",t=Promise,o=Object,n=!0,r=!1,a=e=>clearTimeout(e);typeof window===e&&typeof process!==e&&process.cwd;const s=e=>{const t=(n=e,o.prototype.toString.call(n));var n;return/^\[object (Blob|FormData|ReadableStream|URLSearchParams)\]$/i.test(t)||((e,t)=>e instanceof t)(e,ArrayBuffer)},i=e=>"string"===(e=>typeof e)(e)||s(e);return function(){return(e,s)=>{const c=s.config,d=c.timeout||0,l=new AbortController,{data:f,headers:u}=e,p=/content-type/i.test(o.keys(u).join()),h=f&&"[object FormData]"===f.toString();p||h||(u["Content-Type"]="application/json;charset=UTF-8");const y=fetch(e.url,{...c,method:e.type,signal:l.signal,body:i(f)?f:(g=f,JSON.stringify(g,b,m))});var g,b,m;let w,j=r;return d>0&&(w=((e,t=0)=>setTimeout(e,t))((()=>{j=n,l.abort()}),d)),{response:()=>y.then((e=>(a(w),e.clone())),(e=>(e=>t.reject(e))(j?((e,...t)=>new e(...t))(Error,"fetchError: network timeout"):e))),headers:()=>y.then((({headers:e})=>e),(()=>({}))),onDownload:async e=>{let t=r;const o=await y.catch((()=>{t=n}));if(!o)return;const{headers:a,body:s}=o.clone(),i=s?s.getReader():undefined,c=Number(a.get("Content-Length")||a.get("content-length")||0);if(c<=0)return;let d=0;if(i){const o=()=>i.read().then((({done:n,value:r=new Uint8Array})=>{if(!n&&!t)return d+=r.byteLength,e(c,d),o();t&&e(c,0)}));o()}},onUpload(){console.error("fetch API does'nt support uploading progress. please consider to change `@alova/adapter-xhr` or `@alova/adapter-axios`")},abort:()=>{l.abort(),a(w)}}}}})); diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.common.cjs b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.common.cjs new file mode 100644 index 0000000..a23814d --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.common.cjs @@ -0,0 +1,930 @@ +/** + * alova 3.2.10 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +'use strict'; + +var shared = require('@alova/shared'); + +exports.globalConfigMap = { + autoHitCache: 'global', + ssr: shared.isSSR +}; +/** + * Set global configuration + * @param config + */ +var globalConfig = (config) => { + exports.globalConfigMap = { + ...exports.globalConfigMap, + ...config + }; +}; + +const titleStyle = 'color: black; font-size: 12px; font-weight: bolder'; +/** + * Default cacheLogger function + */ +var defaultCacheLogger = (response, methodInstance, cacheMode, tag) => { + const cole = console; + // eslint-disable-next-line + const log = (...args) => console.log(...args); + const { url } = methodInstance; + const isRestoreMode = cacheMode === shared.STORAGE_RESTORE; + const hdStyle = '\x1B[42m%s\x1B[49m'; + const labelStyle = '\x1B[32m%s\x1B[39m'; + const startSep = ` [HitCache]${url} `; + const endSepFn = () => Array(shared.len(startSep) + 1).join('^'); + if (exports.globalConfigMap.ssr) { + log(hdStyle, startSep); + log(labelStyle, ' Cache ', response); + log(labelStyle, ' Mode ', cacheMode); + isRestoreMode && log(labelStyle, ' Tag ', tag); + log(labelStyle, endSepFn()); + } + else { + cole.groupCollapsed + ? cole.groupCollapsed('%cHitCache', 'padding: 2px 6px; background: #c4fcd3; color: #53b56d;', url) + : log(hdStyle, startSep); + log('%c[Cache]', titleStyle, response); + log('%c[Mode]', titleStyle, cacheMode); + isRestoreMode && log('%c[Tag]', titleStyle, tag); + log('%c[Method]', titleStyle, methodInstance); + cole.groupEnd ? cole.groupEnd() : log(labelStyle, endSepFn()); + } +}; + +const hitSourceStringCacheKey = (key) => `hss.${key}`; +const hitSourceRegexpPrefix = 'hsr.'; +const hitSourceRegexpCacheKey = (regexpStr) => hitSourceRegexpPrefix + regexpStr; +const unifiedHitSourceRegexpCacheKey = '$$hsrs'; +const regexpSourceFlagSeparator = '__$<>$__'; +const addItem = (obj, item) => { + obj[item] = 0; +}; +/** + * set or update cache + * @param namespace namespace + * @param key stored key + * @param response Stored response content + * @param expireTimestamp Timestamp representation of expiration time point + * @param storage storage object + * @param tag Storage tags, used to distinguish different storage tags + */ +const setWithCacheAdapter = async (namespace, key, data, expireTimestamp, cacheAdapter, hitSource, tag) => { + // not to cache if expireTimestamp is less than current timestamp + if (expireTimestamp > shared.getTime() && data) { + const methodCacheKey = shared.buildNamespacedCacheKey(namespace, key); + await cacheAdapter.set(methodCacheKey, shared.filterItem([data, expireTimestamp === Infinity ? shared.undefinedValue : expireTimestamp, tag], Boolean)); + // save the relationship between this method and its hitSources. + // cache structure is like this: + /* + { + "$a.[namespace][methodKey]": [cache data], + ... + "hss.[sourceMethodKey]": "{ + [targetMethodKey1]: 0, + [targetMethodKey2]: 0, + ... + }", + "hss.[sourceMethodName]": "{ + [targetMethodKey3]: 0, + [targetMethodKey4]: 0, + ... + }", + "hsr.[sourceMethodNameRegexpSource]": "{ + [targetMethodKey5]: 0, + [targetMethodKey6]: 0, + ... + }", + "hsr.regexp1": ["hss.key1", "hss.key2"], + "hsr.regexp2": ["hss.key1", "hss.key2"] + } + */ + if (hitSource) { + // filter repeat items and categorize the regexp, to prevent unnecessary cost of IO + const hitSourceKeys = {}; + const hitSourceRegexpSources = []; + shared.forEach(hitSource, sourceItem => { + const isRegexp = shared.instanceOf(sourceItem, shared.RegExpCls); + const targetHitSourceKey = isRegexp + ? sourceItem.source + (sourceItem.flags ? regexpSourceFlagSeparator + sourceItem.flags : '') + : sourceItem; + if (targetHitSourceKey) { + if (isRegexp && !hitSourceKeys[targetHitSourceKey]) { + shared.pushItem(hitSourceRegexpSources, targetHitSourceKey); + } + addItem(hitSourceKeys, isRegexp ? hitSourceRegexpCacheKey(targetHitSourceKey) : hitSourceStringCacheKey(targetHitSourceKey)); + } + }); + // save the relationship. Minimize IO as much as possible + const promises = shared.mapItem(shared.objectKeys(hitSourceKeys), async (hitSourceKey) => { + // filter the empty strings. + const targetMethodKeys = (await cacheAdapter.get(hitSourceKey)) || {}; + addItem(targetMethodKeys, methodCacheKey); + await cacheAdapter.set(hitSourceKey, targetMethodKeys); + }); + const saveRegexp = async () => { + // save the regexp source if regexp exists. + if (shared.len(hitSourceRegexpSources)) { + const regexpList = (await cacheAdapter.get(unifiedHitSourceRegexpCacheKey)) || []; + // TODO: hitSourceRegexpSources needs to be deduplicated + shared.pushItem(regexpList, ...hitSourceRegexpSources); + await cacheAdapter.set(unifiedHitSourceRegexpCacheKey, regexpList); + } + }; + // parallel executing all async tasks. + await shared.PromiseCls.all([...promises, saveRegexp()]); + } + } +}; +/** + * Delete stored response data + * @param namespace namespace + * @param key stored key + * @param storage storage object + */ +const removeWithCacheAdapter = async (namespace, key, cacheAdapter) => { + const methodStoreKey = shared.buildNamespacedCacheKey(namespace, key); + await cacheAdapter.remove(methodStoreKey); +}; +/** + * Get stored response data + * @param namespace namespace + * @param key stored key + * @param storage storage object + * @param tag Store tags. If the tag changes, the data will become invalid. + */ +const getRawWithCacheAdapter = async (namespace, key, cacheAdapter, tag) => { + const storagedData = await cacheAdapter.get(shared.buildNamespacedCacheKey(namespace, key)); + if (storagedData) { + // Eslint disable next line + const [dataUnused, expireTimestamp, storedTag] = storagedData; + // If there is no expiration time, it means that the data will never expire. Otherwise, you need to determine whether it has expired. + if (storedTag === tag && (!expireTimestamp || expireTimestamp > shared.getTime())) { + return storagedData; + } + // If expired, delete cache + await removeWithCacheAdapter(namespace, key, cacheAdapter); + } +}; +/** + * Get stored response data + * @param namespace namespace + * @param key stored key + * @param storage storage object + * @param tag Store tags. If the tag changes, the data will become invalid. + */ +const getWithCacheAdapter = async (namespace, key, cacheAdapter, tag) => { + const rawData = await getRawWithCacheAdapter(namespace, key, cacheAdapter, tag); + return rawData ? rawData[0] : shared.undefinedValue; +}; +/** + * clear all cached data + */ +const clearWithCacheAdapter = async (cacheAdapters) => shared.PromiseCls.all(cacheAdapters.map(cacheAdapter => cacheAdapter.clear())); +/** + * query and delete target cache with key and name of source method instance. + * @param sourceKey source method instance key + * @param sourceName source method instance name + * @param cacheAdapter cache adapter + */ +const hitTargetCacheWithCacheAdapter = async (sourceKey, sourceName, cacheAdapter) => { + const sourceNameStr = `${sourceName}`; + // map that recording the source key and target method keys. + const sourceTargetKeyMap = {}; + // get hit key by method key. + const hitSourceKey = hitSourceStringCacheKey(sourceKey); + sourceTargetKeyMap[hitSourceKey] = await cacheAdapter.get(hitSourceKey); + let unifiedHitSourceRegexpChannel; + if (sourceName) { + const hitSourceName = hitSourceStringCacheKey(sourceNameStr); + // get hit key by method name if it is exists. + sourceTargetKeyMap[hitSourceName] = await cacheAdapter.get(hitSourceName); + // match regexped key by source method name and get hit key by method name. + unifiedHitSourceRegexpChannel = await cacheAdapter.get(unifiedHitSourceRegexpCacheKey); + const matchedRegexpStrings = []; + if (unifiedHitSourceRegexpChannel && shared.len(unifiedHitSourceRegexpChannel)) { + shared.forEach(unifiedHitSourceRegexpChannel, regexpStr => { + const [source, flag] = regexpStr.split(regexpSourceFlagSeparator); + if (shared.newInstance(shared.RegExpCls, source, flag).test(sourceNameStr)) { + shared.pushItem(matchedRegexpStrings, regexpStr); + } + }); + // parallel get hit key by matched regexps. + await shared.PromiseCls.all(shared.mapItem(matchedRegexpStrings, async (regexpString) => { + const hitSourceRegexpString = hitSourceRegexpCacheKey(regexpString); + sourceTargetKeyMap[hitSourceRegexpString] = await cacheAdapter.get(hitSourceRegexpString); + })); + } + } + const removeWithTargetKey = async (targetKey) => { + try { + await cacheAdapter.remove(targetKey); + // loop sourceTargetKeyMap and remove this key to prevent unnecessary cost of IO. + for (const sourceKey in sourceTargetKeyMap) { + const targetKeys = sourceTargetKeyMap[sourceKey]; + if (targetKeys) { + shared.deleteAttr(targetKeys, targetKey); + } + } + } + catch (_a) { + // the try-catch is used to prevent throwing error, cause throwing error in `Promise.all` below. + } + }; + // now let's start to delete target caches. + // and filter the finished keys. + const accessedKeys = {}; + await shared.PromiseCls.all(shared.mapItem(shared.objectKeys(sourceTargetKeyMap), async (sourceKey) => { + const targetKeys = sourceTargetKeyMap[sourceKey]; + if (targetKeys) { + const removingPromises = []; + for (const key in targetKeys) { + if (!accessedKeys[key]) { + addItem(accessedKeys, key); + shared.pushItem(removingPromises, removeWithTargetKey(key)); + } + } + await shared.PromiseCls.all(removingPromises); + } + })); + // update source key if there is still has keys. + // remove source key if its keys is empty. + const unifiedHitSourceRegexpChannelLen = shared.len(unifiedHitSourceRegexpChannel || []); + await shared.PromiseCls.all(shared.mapItem(shared.objectKeys(sourceTargetKeyMap), async (sourceKey) => { + const targetKeys = sourceTargetKeyMap[sourceKey]; + if (targetKeys) { + if (shared.len(shared.objectKeys(targetKeys))) { + await cacheAdapter.set(sourceKey, targetKeys); + } + else { + await cacheAdapter.remove(sourceKey); + // if this is a regexped key, need to remove it from unified regexp channel. + if (sourceKey.includes(hitSourceRegexpPrefix) && unifiedHitSourceRegexpChannel) { + unifiedHitSourceRegexpChannel = shared.filterItem(unifiedHitSourceRegexpChannel, rawRegexpStr => hitSourceRegexpCacheKey(rawRegexpStr) !== sourceKey); + } + } + } + })); + // update unified hit source regexp channel if its length was changed. + if (unifiedHitSourceRegexpChannelLen !== shared.len(unifiedHitSourceRegexpChannel || [])) { + await cacheAdapter.set(unifiedHitSourceRegexpCacheKey, unifiedHitSourceRegexpChannel); + } +}; + +var cloneMethod = (methodInstance) => { + const { data, config } = methodInstance; + const newConfig = { ...config }; + const { headers = {}, params = {} } = newConfig; + const ctx = shared.getContext(methodInstance); + newConfig.headers = { ...headers }; + newConfig.params = { ...params }; + const newMethod = shared.newInstance((Method), methodInstance.type, ctx, methodInstance.url, newConfig, data); + return shared.objAssign(newMethod, { + ...methodInstance, + config: newConfig + }); +}; + +/* + * The matchers in the following three functions are Method instance matchers, which are divided into three situations: + * 1. If the matcher is a Method instance, clear the cache of the Method instance. + * 2. If matcher is a string or regular expression, clear the cache of all Method instances that meet the conditions. + * 3. If no matcher is passed in, all caches will be cleared. + */ +/** + * Query cache + * @param matcher Method instance matcher + * @returns Cache data, return undefined if not found + */ +const queryCache = async (matcher, { policy = 'all' } = {}) => { + // if key exists, that means it's a method instance. + if (matcher && matcher.key) { + const { id, l1Cache, l2Cache } = shared.getContext(matcher); + const methodKey = shared.getMethodInternalKey(matcher); + const { f: cacheFor, c: controlled, s: store, e: expireMilliseconds, t: tag } = shared.getLocalCacheConfigParam(matcher); + // if it's controlled cache, it will return the result of cacheFor function. + if (controlled) { + return cacheFor(); + } + let cachedData = policy !== 'l2' ? await getWithCacheAdapter(id, methodKey, l1Cache) : shared.undefinedValue; + if (policy === 'l2') { + cachedData = await getWithCacheAdapter(id, methodKey, l2Cache, tag); + } + else if (policy === 'all' && !cachedData) { + if (store && expireMilliseconds(shared.STORAGE_RESTORE) > shared.getTime()) { + cachedData = await getWithCacheAdapter(id, methodKey, l2Cache, tag); + } + } + return cachedData; + } +}; +/** + * Manually set cache response data. If the corresponding methodInstance sets persistent storage, the cache in the persistent storage will also be checked out. + * @param matcher Method instance matcher cache data + */ +const setCache = async (matcher, dataOrUpdater, { policy = 'all' } = {}) => { + const methodInstances = shared.isArray(matcher) ? matcher : [matcher]; + const batchPromises = methodInstances.map(async (methodInstance) => { + const { hitSource } = methodInstance; + const { id, l1Cache, l2Cache } = shared.getContext(methodInstance); + const methodKey = shared.getMethodInternalKey(methodInstance); + const { e: expireMilliseconds, s: toStore, t: tag, c: controlled } = shared.getLocalCacheConfigParam(methodInstance); + // don't set cache when it's controlled cache. + if (controlled) { + return; + } + let data = dataOrUpdater; + if (shared.isFn(dataOrUpdater)) { + let cachedData = policy !== 'l2' ? await getWithCacheAdapter(id, methodKey, l1Cache) : shared.undefinedValue; + if (policy === 'l2' || + (policy === 'all' && !cachedData && toStore && expireMilliseconds(shared.STORAGE_RESTORE) > shared.getTime())) { + cachedData = await getWithCacheAdapter(id, methodKey, l2Cache, tag); + } + data = dataOrUpdater(cachedData); + if (data === shared.undefinedValue) { + return; + } + } + return shared.PromiseCls.all([ + policy !== 'l2' && setWithCacheAdapter(id, methodKey, data, expireMilliseconds(shared.MEMORY), l1Cache, hitSource), + policy === 'l2' || (policy === 'all' && toStore) + ? setWithCacheAdapter(id, methodKey, data, expireMilliseconds(shared.STORAGE_RESTORE), l2Cache, hitSource, tag) + : shared.undefinedValue + ]); + }); + return shared.PromiseCls.all(batchPromises); +}; +/** + * invalid cache + * @param matcher Method instance matcher + */ +const invalidateCache = async (matcher) => { + if (!matcher) { + await shared.PromiseCls.all([clearWithCacheAdapter(usingL1CacheAdapters), clearWithCacheAdapter(usingL2CacheAdapters)]); + return; + } + const methodInstances = shared.isArray(matcher) ? matcher : [matcher]; + const batchPromises = methodInstances.map(methodInstance => { + const { id, l1Cache, l2Cache } = shared.getContext(methodInstance); + const { c: controlled, m: cacheMode } = shared.getLocalCacheConfigParam(methodInstance); + // don't invalidate cache when it's controlled cache. + if (controlled) { + return; + } + const methodKey = shared.getMethodInternalKey(methodInstance); + return shared.PromiseCls.all([ + removeWithCacheAdapter(id, methodKey, l1Cache), + cacheMode === shared.STORAGE_RESTORE ? removeWithCacheAdapter(id, methodKey, l2Cache) : shared.promiseResolve() + ]); + }); + await shared.PromiseCls.all(batchPromises); +}; +/** + * hit(invalidate) target caches by source method + * this is the implementation of auto invalidate cache + * @param sourceMethod source method instance + */ +const hitCacheBySource = async (sourceMethod) => { + // Find the hit target cache and invalidate its cache + // Control the automatic cache invalidation range through global configuration `autoHitCache` + const { autoHitCache } = exports.globalConfigMap; + const { l1Cache, l2Cache } = shared.getContext(sourceMethod); + const sourceKey = shared.getMethodInternalKey(sourceMethod); + const { name: sourceName } = shared.getConfig(sourceMethod); + const cacheAdaptersInvolved = { + global: [...usingL1CacheAdapters, ...usingL2CacheAdapters], + self: [l1Cache, l2Cache], + close: [] + }[autoHitCache]; + if (cacheAdaptersInvolved && shared.len(cacheAdaptersInvolved)) { + await shared.PromiseCls.all(shared.mapItem(cacheAdaptersInvolved, involvedCacheAdapter => hitTargetCacheWithCacheAdapter(sourceKey, sourceName, involvedCacheAdapter))); + } +}; + +const adapterReturnMap = {}; +/** + * actual request function + * @param method request method object + * @param forceRequest Ignore cache + * @returns response data + */ +function sendRequest(methodInstance, forceRequest) { + let fromCache = shared.trueValue; + let requestAdapterCtrlsPromiseResolveFn; + const requestAdapterCtrlsPromise = shared.newInstance(shared.PromiseCls, resolve => { + requestAdapterCtrlsPromiseResolveFn = resolve; + }); + const response = async () => { + const { beforeRequest = shared.noop, responded, requestAdapter, cacheLogger } = shared.getOptions(methodInstance); + const methodKey = shared.getMethodInternalKey(methodInstance); + const { s: toStorage, t: tag, m: cacheMode, e: expireMilliseconds } = shared.getLocalCacheConfigParam(methodInstance); + const { id, l1Cache, l2Cache, snapshots } = shared.getContext(methodInstance); + // Get controlled cache or uncontrolled cache + const { cacheFor } = shared.getConfig(methodInstance); + const { hitSource: methodHitSource } = methodInstance; + // If the current method sets a controlled cache, check whether there is custom data + let cachedResponse = await (shared.isFn(cacheFor) + ? cacheFor() + : // If it is a forced request, skip the step of getting it from the cache + // Otherwise, determine whether to use cached data + forceRequest + ? shared.undefinedValue + : getWithCacheAdapter(id, methodKey, l1Cache)); + // If it is storage restore mode and there is no data in the cache, the persistent data needs to be restored to the cache, and the cached expiration time must be used. + if (cacheMode === shared.STORAGE_RESTORE && !cachedResponse && !forceRequest) { + const rawL2CacheData = await getRawWithCacheAdapter(id, methodKey, l2Cache, tag); + if (rawL2CacheData) { + const [l2Response, l2ExpireMilliseconds] = rawL2CacheData; + await setWithCacheAdapter(id, methodKey, l2Response, l2ExpireMilliseconds, l1Cache, methodHitSource); + cachedResponse = l2Response; + } + } + // Clone the method as a parameter and pass it to beforeRequest to prevent side effects when using the original method instance request multiple times. + // Place it after `let cachedResponse = await...` to solve the problem of first assigning promise to the method instance in method.send, otherwise the promise will be undefined in clonedMethod. + const clonedMethod = cloneMethod(methodInstance); + // Call the hook function before sending the request + // beforeRequest supports synchronous functions and asynchronous functions + await beforeRequest(clonedMethod); + const { baseURL, url: newUrl, type, data } = clonedMethod; + const { params = {}, headers = {}, transform = shared.$self, shareRequest } = shared.getConfig(clonedMethod); + const namespacedAdapterReturnMap = (adapterReturnMap[id] = adapterReturnMap[id] || {}); + const requestBody = clonedMethod.data; + const requestBodyIsSpecial = shared.isSpecialRequestBody(requestBody); + // Will not share the request when requestBody is special data + let requestAdapterCtrls = requestBodyIsSpecial ? shared.undefinedValue : namespacedAdapterReturnMap[methodKey]; + let responseSuccessHandler = shared.$self; + let responseErrorHandler = shared.undefinedValue; + let responseCompleteHandler = shared.noop; + // uniform handler of onSuccess, onError, onComplete + if (shared.isFn(responded)) { + responseSuccessHandler = responded; + } + else if (shared.isPlainObject(responded)) { + const { onSuccess: successHandler, onError: errorHandler, onComplete: completeHandler } = responded; + responseSuccessHandler = shared.isFn(successHandler) ? successHandler : responseSuccessHandler; + responseErrorHandler = shared.isFn(errorHandler) ? errorHandler : responseErrorHandler; + responseCompleteHandler = shared.isFn(completeHandler) ? completeHandler : responseCompleteHandler; + } + // If there is no cache, make a request + if (cachedResponse !== shared.undefinedValue) { + requestAdapterCtrlsPromiseResolveFn(); // Ctrls will not be passed in when cache is encountered + // Print cache log + clonedMethod.fromCache = shared.trueValue; + shared.sloughFunction(cacheLogger, defaultCacheLogger)(cachedResponse, clonedMethod, cacheMode, tag); + responseCompleteHandler(clonedMethod); + return cachedResponse; + } + fromCache = shared.falseValue; + if (!shareRequest || !requestAdapterCtrls) { + // Request data + const ctrls = requestAdapter({ + url: shared.buildCompletedURL(baseURL, newUrl, params), + type, + data, + headers + }, clonedMethod); + requestAdapterCtrls = namespacedAdapterReturnMap[methodKey] = ctrls; + } + // Pass request adapter ctrls to promise for use in on download, on upload and abort + requestAdapterCtrlsPromiseResolveFn(requestAdapterCtrls); + /** + * Process response tasks and do not cache data on failure + * @param responsePromise Respond to promise instances + * @param responseHeaders Request header + * @param callInSuccess Whether to call in success callback + * @returns Processed response + */ + const handleResponseTask = async (handlerReturns, responseHeaders, callInSuccess = shared.trueValue) => { + const responseData = await handlerReturns; + const transformedData = await transform(responseData, responseHeaders || {}); + snapshots.save(methodInstance); + // Even if the cache operation fails, the response structure will be returned normally to avoid request errors caused by cache operation problems. + // The cache operation results can be obtained through `cacheAdapter.emitter.on('success' | 'fail', event => {})` + try { + // Automatic cache invalidation + await hitCacheBySource(clonedMethod); + } + catch (_a) { } + // Do not save cache when requestBody is special data + // Reason 1: Special data is generally submitted and requires interaction with the server. + // Reason 2: Special data is not convenient for generating cache keys + const toCache = !requestBody || !requestBodyIsSpecial; + // Use the latest expiration time after the response to cache data to avoid the problem of expiration time loss due to too long response time + if (toCache && callInSuccess) { + try { + await shared.PromiseCls.all([ + setWithCacheAdapter(id, methodKey, transformedData, expireMilliseconds(shared.MEMORY), l1Cache, methodHitSource), + toStorage && + setWithCacheAdapter(id, methodKey, transformedData, expireMilliseconds(shared.STORAGE_RESTORE), l2Cache, methodHitSource, tag) + ]); + } + catch (_b) { } + } + // Deep clone the transformed data before returning to avoid reference issues + // the `deepClone` will only clone array and plain object + return shared.deepClone(transformedData); + }; + return shared.promiseFinally(shared.promiseThen(shared.PromiseCls.all([requestAdapterCtrls.response(), requestAdapterCtrls.headers()]), ([rawResponse, rawHeaders]) => { + // Regardless of whether the request succeeds or fails, the shared request needs to be removed first + shared.deleteAttr(namespacedAdapterReturnMap, methodKey); + return handleResponseTask(responseSuccessHandler(rawResponse, clonedMethod), rawHeaders); + }, (error) => { + // Regardless of whether the request succeeds or fails, the shared request needs to be removed first + shared.deleteAttr(namespacedAdapterReturnMap, methodKey); + return shared.isFn(responseErrorHandler) + ? // When responding to an error, if no error is thrown, the successful response process will be processed, but the data will not be cached. + handleResponseTask(responseErrorHandler(error, clonedMethod), shared.undefinedValue, shared.falseValue) + : shared.promiseReject(error); + }), () => { + responseCompleteHandler(clonedMethod); + }); + }; + return { + // request interrupt function + abort: () => { + shared.promiseThen(requestAdapterCtrlsPromise, requestAdapterCtrls => requestAdapterCtrls && requestAdapterCtrls.abort()); + }, + onDownload: (handler) => { + shared.promiseThen(requestAdapterCtrlsPromise, requestAdapterCtrls => requestAdapterCtrls && requestAdapterCtrls.onDownload && requestAdapterCtrls.onDownload(handler)); + }, + onUpload: (handler) => { + shared.promiseThen(requestAdapterCtrlsPromise, requestAdapterCtrls => requestAdapterCtrls && requestAdapterCtrls.onUpload && requestAdapterCtrls.onUpload(handler)); + }, + response, + fromCache: () => fromCache + }; +} + +const offEventCallback = (offHandler, handlers) => () => { + const index = handlers.indexOf(offHandler); + index >= 0 && handlers.splice(index, 1); +}; +class Method { + constructor(type, context, url, config, data) { + this.dhs = []; + this.uhs = []; + this.fromCache = shared.undefinedValue; + const abortRequest = () => { + abortRequest.a(); + }; + abortRequest.a = shared.noop; + const instance = this; + const contextOptions = shared.getContextOptions(context); + instance.abort = abortRequest; + instance.baseURL = contextOptions.baseURL || ''; + instance.url = url; + instance.type = type; + instance.context = context; + // Merge request-related global configuration into the method object + const contextConcatConfig = {}; + const mergedLocalCacheKey = 'cacheFor'; + const globalLocalCache = shared.isPlainObject(contextOptions[mergedLocalCacheKey]) + ? contextOptions[mergedLocalCacheKey][type] + : shared.undefinedValue; + const hitSource = config && config.hitSource; + // Merge parameters + shared.forEach(['timeout', 'shareRequest'], mergedKey => { + if (contextOptions[mergedKey] !== shared.undefinedValue) { + contextConcatConfig[mergedKey] = contextOptions[mergedKey]; + } + }); + // Merge local cache + if (globalLocalCache !== shared.undefinedValue) { + contextConcatConfig[mergedLocalCacheKey] = globalLocalCache; + } + // Unify hit sources into arrays and convert them into method keys when there are method instances + if (hitSource) { + instance.hitSource = shared.mapItem(shared.isArray(hitSource) ? hitSource : [hitSource], sourceItem => shared.instanceOf(sourceItem, Method) ? shared.getMethodInternalKey(sourceItem) : sourceItem); + shared.deleteAttr(config, 'hitSource'); + } + instance.config = { + ...contextConcatConfig, + headers: {}, + params: {}, + ...(config || {}) + }; + instance.data = data; + instance.meta = config ? config.meta : instance.meta; + // The original key needs to be used externally instead of generating the key in real time. + // The reason is that the parameters of the method may pass in reference type values, but when the reference type value changes externally, the key generated in real time also changes, so it is more accurate to use the initial key. + instance.key = instance.generateKey(); + } + /** + * Bind download progress callback function + * @param progressHandler Download progress callback function + * @version 2.17.0 + * @return unbind function + */ + onDownload(downloadHandler) { + shared.pushItem(this.dhs, downloadHandler); + return offEventCallback(downloadHandler, this.dhs); + } + /** + * Bind upload progress callback function + * @param progressHandler Upload progress callback function + * @version 2.17.0 + * @return unbind function + */ + onUpload(uploadHandler) { + shared.pushItem(this.uhs, uploadHandler); + return offEventCallback(uploadHandler, this.uhs); + } + /** + * Send a request through a method instance and return a promise object + */ + send(forceRequest = shared.falseValue) { + const instance = this; + const { response, onDownload, onUpload, abort, fromCache } = sendRequest(instance, forceRequest); + shared.len(instance.dhs) > 0 && + onDownload((loaded, total) => shared.forEach(instance.dhs, handler => handler({ loaded, total }))); + shared.len(instance.uhs) > 0 && onUpload((loaded, total) => shared.forEach(instance.uhs, handler => handler({ loaded, total }))); + // The interrupt function is bound to the method instance for each request. The user can also interrupt the current request through method instance.abort() + instance.abort.a = abort; + instance.fromCache = shared.undefinedValue; + instance.promise = shared.promiseThen(response(), r => { + instance.fromCache = fromCache(); + return r; + }); + return instance.promise; + } + /** + * Set the method name, if there is already a name it will be overwritten + * @param name method name + */ + setName(name) { + shared.getConfig(this).name = name; + } + generateKey() { + return shared.key(this); + } + /** + * Bind callbacks for resolve and/or reject Promise + * @param onfulfilled The callback to be executed when resolving the Promise + * @param onrejected The callback to be executed when the Promise is rejected + * @returns Returns a Promise for executing any callbacks + */ + then(onfulfilled, onrejected) { + return shared.promiseThen(this.send(), onfulfilled, onrejected); + } + /** + * Bind a callback only for reject Promise + * @param onrejected The callback to be executed when the Promise is rejected + * @returns Returns a Promise that completes the callback + */ + catch(onrejected) { + return shared.promiseCatch(this.send(), onrejected); + } + /** + * Bind a callback that is called when the Promise is resolved (resolve or reject) + * @param onfinally Callback executed when Promise is resolved (resolve or reject). + * @return Returns a Promise that completes the callback. + */ + finally(onfinally) { + return shared.promiseFinally(this.send(), onfinally); + } +} + +/** + * Custom assertion function, throws an error when the expression is false + * @param expression Judgment expression, true or false + * @param msg assert message + */ +const myAssert = shared.createAssert(); + +// local storage will not fail the operation. +const EVENT_SUCCESS_KEY = 'success'; +const memoryAdapter = () => { + let l1Cache = {}; + const l1CacheEmitter = shared.createEventManager(); + const adapter = { + set(key, value) { + l1Cache[key] = value; + l1CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'set', key, value, container: l1Cache }); + }, + get: key => { + const value = l1Cache[key]; + l1CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'get', key, value, container: l1Cache }); + return value; + }, + remove(key) { + shared.deleteAttr(l1Cache, key); + l1CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'remove', key, container: l1Cache }); + }, + clear: () => { + l1Cache = {}; + l1CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'clear', key: '', container: l1Cache }); + }, + emitter: l1CacheEmitter + }; + return adapter; +}; +const localStorageAdapter = () => { + const l2CacheEmitter = shared.createEventManager(); + const instance = localStorage; + const adapter = { + set: (key, value) => { + instance.setItem(key, shared.JSONStringify(value)); + l2CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'set', key, value, container: instance }); + }, + get: key => { + const data = instance.getItem(key); + const value = data ? shared.JSONParse(data) : data; + l2CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'get', key, value, container: instance }); + return value; + }, + remove: key => { + instance.removeItem(key); + l2CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'remove', key, container: instance }); + }, + clear: () => { + instance.clear(); + l2CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'clear', key: '', container: instance }); + }, + emitter: l2CacheEmitter + }; + return adapter; +}; +const placeholderAdapter = () => { + const l2CacheNotDefinedAssert = () => { + myAssert(shared.falseValue, 'l2Cache is not defined.'); + }; + return { + set: () => { + l2CacheNotDefinedAssert(); + }, + get: () => { + l2CacheNotDefinedAssert(); + return shared.undefinedValue; + }, + remove: () => { + l2CacheNotDefinedAssert(); + }, + clear: () => { } + }; +}; + +const SetCls = Set; +class MethodSnapshotContainer { + constructor(capacity) { + /** + * Method instance snapshot collection, method instances that have sent requests will be saved + */ + this.records = {}; + this.occupy = 0; + myAssert(capacity >= 0, 'expected snapshots limit to be >= 0'); + this.capacity = capacity; + } + /** + * Save method instance snapshot + * @param methodInstance method instance + */ + save(methodInstance) { + const { name } = shared.getConfig(methodInstance); + const { records, occupy, capacity } = this; + if (name && occupy < capacity) { + // Using the name of the method as the key, save the method instance to the snapshot + const targetSnapshots = (records[name] = records[name] || shared.newInstance(SetCls)); + targetSnapshots.add(methodInstance); + // Statistical quantity + this.occupy += 1; + } + } + /** + * Get a Method instance snapshot, which will filter out the corresponding Method instance based on the matcher + * @param matcher Matching snapshot name, which can be a string or regular expression, or an object with a filter function + * @returns Array of matched Method instance snapshots + */ + match(matcher, matchAll = true) { + // Unify the filter parameters into name matcher and match handler + let nameString; + let nameReg; + let matchHandler; + let nameMatcher = matcher; + if (shared.isPlainObject(matcher)) { + nameMatcher = matcher.name; + matchHandler = matcher.filter; + } + if (shared.instanceOf(nameMatcher, shared.RegExpCls)) { + nameReg = nameMatcher; + } + else if (shared.isString(nameMatcher)) { + nameString = nameMatcher; + } + const { records } = this; + // Get the corresponding method instance snapshot through the deconstructed name matcher and filter handler + let matches = shared.newInstance((SetCls)); + // If the namespace parameter is provided, it will only be searched in this namespace, otherwise it will be searched in all cached data. + if (nameString) { + matches = records[nameString] || matches; + } + else if (nameReg) { + shared.forEach(shared.filterItem(shared.objectKeys(records), methodName => nameReg.test(methodName)), methodName => { + records[methodName].forEach(method => matches.add(method)); + }); + } + const fromMatchesArray = shared.isFn(matchHandler) ? shared.filterItem([...matches], matchHandler) : [...matches]; + return (matchAll ? fromMatchesArray : fromMatchesArray[0]); + } +} + +const typeGet = 'GET'; +const typeHead = 'HEAD'; +const typePost = 'POST'; +const typePut = 'PUT'; +const typePatch = 'PATCH'; +const typeDelete = 'DELETE'; +const typeOptions = 'OPTIONS'; +const defaultAlovaOptions = { + /** + * GET requests are cached for 5 minutes (300000 milliseconds) by default, and other requests are not cached by default. + */ + cacheFor: { + [typeGet]: 300000 + }, + /** + * Share requests default to true + */ + shareRequest: shared.trueValue, + /** + * Number of method snapshots, default is 1000 + */ + snapshots: 1000 +}; +let idCount = 0; +class Alova { + constructor(options) { + var _a, _b; + const instance = this; + instance.id = (options.id || (idCount += 1)).toString(); + // If storage is not specified, local storage is used by default. + instance.l1Cache = options.l1Cache || memoryAdapter(); + instance.l2Cache = + options.l2Cache || (typeof localStorage !== 'undefined' ? localStorageAdapter() : placeholderAdapter()); + // Merge default options + instance.options = { + ...defaultAlovaOptions, + ...options + }; + instance.snapshots = shared.newInstance((MethodSnapshotContainer), (_b = (_a = options.snapshots) !== null && _a !== void 0 ? _a : defaultAlovaOptions.snapshots) !== null && _b !== void 0 ? _b : 0); + } + Get(url, config) { + return shared.newInstance((Method), typeGet, this, url, config); + } + Post(url, data, config) { + return shared.newInstance((Method), typePost, this, url, config, data); + } + Delete(url, data, config) { + return shared.newInstance((Method), typeDelete, this, url, config, data); + } + Put(url, data, config) { + return shared.newInstance((Method), typePut, this, url, config, data); + } + Head(url, config) { + return shared.newInstance((Method), typeHead, this, url, config); + } + Patch(url, data, config) { + return shared.newInstance((Method), typePatch, this, url, config, data); + } + Options(url, config) { + return shared.newInstance((Method), typeOptions, this, url, config); + } +} +let boundStatesHook = shared.undefinedValue; +const usingL1CacheAdapters = []; +const usingL2CacheAdapters = []; +/** + * create an alova instance. + * @param options alova configuration. + * @returns alova instance. + */ +const createAlova = (options) => { + const alovaInstance = shared.newInstance((Alova), options); + const newStatesHook = alovaInstance.options.statesHook; + if (boundStatesHook) { + myAssert(boundStatesHook === newStatesHook, 'expected to use the same `statesHook`'); + } + boundStatesHook = newStatesHook; + const { l1Cache, l2Cache } = alovaInstance; + !usingL1CacheAdapters.includes(l1Cache) && shared.pushItem(usingL1CacheAdapters, l1Cache); + !usingL2CacheAdapters.includes(l2Cache) && shared.pushItem(usingL2CacheAdapters, l2Cache); + return alovaInstance; +}; + +const promiseStatesHook = () => { + myAssert(!!boundStatesHook, '`statesHook` is not set in alova instance'); + return boundStatesHook; +}; + +exports.Method = Method; +exports.createAlova = createAlova; +exports.globalConfig = globalConfig; +exports.hitCacheBySource = hitCacheBySource; +exports.invalidateCache = invalidateCache; +exports.promiseStatesHook = promiseStatesHook; +exports.queryCache = queryCache; +exports.setCache = setCache; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.esm.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.esm.js new file mode 100644 index 0000000..77ad947 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.esm.js @@ -0,0 +1,921 @@ +/** + * alova 3.2.10 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +import { isSSR, STORAGE_RESTORE, len, getTime, buildNamespacedCacheKey, filterItem, undefinedValue, forEach, instanceOf, RegExpCls, pushItem, mapItem, objectKeys, PromiseCls, newInstance, deleteAttr, getContext, objAssign, getMethodInternalKey, getLocalCacheConfigParam, isArray, isFn, MEMORY, promiseResolve, getConfig, promiseThen, trueValue, getOptions, isSpecialRequestBody, isPlainObject, sloughFunction, falseValue, buildCompletedURL, promiseFinally, promiseReject, noop, $self, deepClone, getContextOptions, key, promiseCatch, createAssert, createEventManager, JSONStringify, JSONParse, isString } from '@alova/shared'; + +let globalConfigMap = { + autoHitCache: 'global', + ssr: isSSR +}; +/** + * Set global configuration + * @param config + */ +var globalConfig = (config) => { + globalConfigMap = { + ...globalConfigMap, + ...config + }; +}; + +const titleStyle = 'color: black; font-size: 12px; font-weight: bolder'; +/** + * Default cacheLogger function + */ +var defaultCacheLogger = (response, methodInstance, cacheMode, tag) => { + const cole = console; + // eslint-disable-next-line + const log = (...args) => console.log(...args); + const { url } = methodInstance; + const isRestoreMode = cacheMode === STORAGE_RESTORE; + const hdStyle = '\x1B[42m%s\x1B[49m'; + const labelStyle = '\x1B[32m%s\x1B[39m'; + const startSep = ` [HitCache]${url} `; + const endSepFn = () => Array(len(startSep) + 1).join('^'); + if (globalConfigMap.ssr) { + log(hdStyle, startSep); + log(labelStyle, ' Cache ', response); + log(labelStyle, ' Mode ', cacheMode); + isRestoreMode && log(labelStyle, ' Tag ', tag); + log(labelStyle, endSepFn()); + } + else { + cole.groupCollapsed + ? cole.groupCollapsed('%cHitCache', 'padding: 2px 6px; background: #c4fcd3; color: #53b56d;', url) + : log(hdStyle, startSep); + log('%c[Cache]', titleStyle, response); + log('%c[Mode]', titleStyle, cacheMode); + isRestoreMode && log('%c[Tag]', titleStyle, tag); + log('%c[Method]', titleStyle, methodInstance); + cole.groupEnd ? cole.groupEnd() : log(labelStyle, endSepFn()); + } +}; + +const hitSourceStringCacheKey = (key) => `hss.${key}`; +const hitSourceRegexpPrefix = 'hsr.'; +const hitSourceRegexpCacheKey = (regexpStr) => hitSourceRegexpPrefix + regexpStr; +const unifiedHitSourceRegexpCacheKey = '$$hsrs'; +const regexpSourceFlagSeparator = '__$<>$__'; +const addItem = (obj, item) => { + obj[item] = 0; +}; +/** + * set or update cache + * @param namespace namespace + * @param key stored key + * @param response Stored response content + * @param expireTimestamp Timestamp representation of expiration time point + * @param storage storage object + * @param tag Storage tags, used to distinguish different storage tags + */ +const setWithCacheAdapter = async (namespace, key, data, expireTimestamp, cacheAdapter, hitSource, tag) => { + // not to cache if expireTimestamp is less than current timestamp + if (expireTimestamp > getTime() && data) { + const methodCacheKey = buildNamespacedCacheKey(namespace, key); + await cacheAdapter.set(methodCacheKey, filterItem([data, expireTimestamp === Infinity ? undefinedValue : expireTimestamp, tag], Boolean)); + // save the relationship between this method and its hitSources. + // cache structure is like this: + /* + { + "$a.[namespace][methodKey]": [cache data], + ... + "hss.[sourceMethodKey]": "{ + [targetMethodKey1]: 0, + [targetMethodKey2]: 0, + ... + }", + "hss.[sourceMethodName]": "{ + [targetMethodKey3]: 0, + [targetMethodKey4]: 0, + ... + }", + "hsr.[sourceMethodNameRegexpSource]": "{ + [targetMethodKey5]: 0, + [targetMethodKey6]: 0, + ... + }", + "hsr.regexp1": ["hss.key1", "hss.key2"], + "hsr.regexp2": ["hss.key1", "hss.key2"] + } + */ + if (hitSource) { + // filter repeat items and categorize the regexp, to prevent unnecessary cost of IO + const hitSourceKeys = {}; + const hitSourceRegexpSources = []; + forEach(hitSource, sourceItem => { + const isRegexp = instanceOf(sourceItem, RegExpCls); + const targetHitSourceKey = isRegexp + ? sourceItem.source + (sourceItem.flags ? regexpSourceFlagSeparator + sourceItem.flags : '') + : sourceItem; + if (targetHitSourceKey) { + if (isRegexp && !hitSourceKeys[targetHitSourceKey]) { + pushItem(hitSourceRegexpSources, targetHitSourceKey); + } + addItem(hitSourceKeys, isRegexp ? hitSourceRegexpCacheKey(targetHitSourceKey) : hitSourceStringCacheKey(targetHitSourceKey)); + } + }); + // save the relationship. Minimize IO as much as possible + const promises = mapItem(objectKeys(hitSourceKeys), async (hitSourceKey) => { + // filter the empty strings. + const targetMethodKeys = (await cacheAdapter.get(hitSourceKey)) || {}; + addItem(targetMethodKeys, methodCacheKey); + await cacheAdapter.set(hitSourceKey, targetMethodKeys); + }); + const saveRegexp = async () => { + // save the regexp source if regexp exists. + if (len(hitSourceRegexpSources)) { + const regexpList = (await cacheAdapter.get(unifiedHitSourceRegexpCacheKey)) || []; + // TODO: hitSourceRegexpSources needs to be deduplicated + pushItem(regexpList, ...hitSourceRegexpSources); + await cacheAdapter.set(unifiedHitSourceRegexpCacheKey, regexpList); + } + }; + // parallel executing all async tasks. + await PromiseCls.all([...promises, saveRegexp()]); + } + } +}; +/** + * Delete stored response data + * @param namespace namespace + * @param key stored key + * @param storage storage object + */ +const removeWithCacheAdapter = async (namespace, key, cacheAdapter) => { + const methodStoreKey = buildNamespacedCacheKey(namespace, key); + await cacheAdapter.remove(methodStoreKey); +}; +/** + * Get stored response data + * @param namespace namespace + * @param key stored key + * @param storage storage object + * @param tag Store tags. If the tag changes, the data will become invalid. + */ +const getRawWithCacheAdapter = async (namespace, key, cacheAdapter, tag) => { + const storagedData = await cacheAdapter.get(buildNamespacedCacheKey(namespace, key)); + if (storagedData) { + // Eslint disable next line + const [dataUnused, expireTimestamp, storedTag] = storagedData; + // If there is no expiration time, it means that the data will never expire. Otherwise, you need to determine whether it has expired. + if (storedTag === tag && (!expireTimestamp || expireTimestamp > getTime())) { + return storagedData; + } + // If expired, delete cache + await removeWithCacheAdapter(namespace, key, cacheAdapter); + } +}; +/** + * Get stored response data + * @param namespace namespace + * @param key stored key + * @param storage storage object + * @param tag Store tags. If the tag changes, the data will become invalid. + */ +const getWithCacheAdapter = async (namespace, key, cacheAdapter, tag) => { + const rawData = await getRawWithCacheAdapter(namespace, key, cacheAdapter, tag); + return rawData ? rawData[0] : undefinedValue; +}; +/** + * clear all cached data + */ +const clearWithCacheAdapter = async (cacheAdapters) => PromiseCls.all(cacheAdapters.map(cacheAdapter => cacheAdapter.clear())); +/** + * query and delete target cache with key and name of source method instance. + * @param sourceKey source method instance key + * @param sourceName source method instance name + * @param cacheAdapter cache adapter + */ +const hitTargetCacheWithCacheAdapter = async (sourceKey, sourceName, cacheAdapter) => { + const sourceNameStr = `${sourceName}`; + // map that recording the source key and target method keys. + const sourceTargetKeyMap = {}; + // get hit key by method key. + const hitSourceKey = hitSourceStringCacheKey(sourceKey); + sourceTargetKeyMap[hitSourceKey] = await cacheAdapter.get(hitSourceKey); + let unifiedHitSourceRegexpChannel; + if (sourceName) { + const hitSourceName = hitSourceStringCacheKey(sourceNameStr); + // get hit key by method name if it is exists. + sourceTargetKeyMap[hitSourceName] = await cacheAdapter.get(hitSourceName); + // match regexped key by source method name and get hit key by method name. + unifiedHitSourceRegexpChannel = await cacheAdapter.get(unifiedHitSourceRegexpCacheKey); + const matchedRegexpStrings = []; + if (unifiedHitSourceRegexpChannel && len(unifiedHitSourceRegexpChannel)) { + forEach(unifiedHitSourceRegexpChannel, regexpStr => { + const [source, flag] = regexpStr.split(regexpSourceFlagSeparator); + if (newInstance(RegExpCls, source, flag).test(sourceNameStr)) { + pushItem(matchedRegexpStrings, regexpStr); + } + }); + // parallel get hit key by matched regexps. + await PromiseCls.all(mapItem(matchedRegexpStrings, async (regexpString) => { + const hitSourceRegexpString = hitSourceRegexpCacheKey(regexpString); + sourceTargetKeyMap[hitSourceRegexpString] = await cacheAdapter.get(hitSourceRegexpString); + })); + } + } + const removeWithTargetKey = async (targetKey) => { + try { + await cacheAdapter.remove(targetKey); + // loop sourceTargetKeyMap and remove this key to prevent unnecessary cost of IO. + for (const sourceKey in sourceTargetKeyMap) { + const targetKeys = sourceTargetKeyMap[sourceKey]; + if (targetKeys) { + deleteAttr(targetKeys, targetKey); + } + } + } + catch (_a) { + // the try-catch is used to prevent throwing error, cause throwing error in `Promise.all` below. + } + }; + // now let's start to delete target caches. + // and filter the finished keys. + const accessedKeys = {}; + await PromiseCls.all(mapItem(objectKeys(sourceTargetKeyMap), async (sourceKey) => { + const targetKeys = sourceTargetKeyMap[sourceKey]; + if (targetKeys) { + const removingPromises = []; + for (const key in targetKeys) { + if (!accessedKeys[key]) { + addItem(accessedKeys, key); + pushItem(removingPromises, removeWithTargetKey(key)); + } + } + await PromiseCls.all(removingPromises); + } + })); + // update source key if there is still has keys. + // remove source key if its keys is empty. + const unifiedHitSourceRegexpChannelLen = len(unifiedHitSourceRegexpChannel || []); + await PromiseCls.all(mapItem(objectKeys(sourceTargetKeyMap), async (sourceKey) => { + const targetKeys = sourceTargetKeyMap[sourceKey]; + if (targetKeys) { + if (len(objectKeys(targetKeys))) { + await cacheAdapter.set(sourceKey, targetKeys); + } + else { + await cacheAdapter.remove(sourceKey); + // if this is a regexped key, need to remove it from unified regexp channel. + if (sourceKey.includes(hitSourceRegexpPrefix) && unifiedHitSourceRegexpChannel) { + unifiedHitSourceRegexpChannel = filterItem(unifiedHitSourceRegexpChannel, rawRegexpStr => hitSourceRegexpCacheKey(rawRegexpStr) !== sourceKey); + } + } + } + })); + // update unified hit source regexp channel if its length was changed. + if (unifiedHitSourceRegexpChannelLen !== len(unifiedHitSourceRegexpChannel || [])) { + await cacheAdapter.set(unifiedHitSourceRegexpCacheKey, unifiedHitSourceRegexpChannel); + } +}; + +var cloneMethod = (methodInstance) => { + const { data, config } = methodInstance; + const newConfig = { ...config }; + const { headers = {}, params = {} } = newConfig; + const ctx = getContext(methodInstance); + newConfig.headers = { ...headers }; + newConfig.params = { ...params }; + const newMethod = newInstance((Method), methodInstance.type, ctx, methodInstance.url, newConfig, data); + return objAssign(newMethod, { + ...methodInstance, + config: newConfig + }); +}; + +/* + * The matchers in the following three functions are Method instance matchers, which are divided into three situations: + * 1. If the matcher is a Method instance, clear the cache of the Method instance. + * 2. If matcher is a string or regular expression, clear the cache of all Method instances that meet the conditions. + * 3. If no matcher is passed in, all caches will be cleared. + */ +/** + * Query cache + * @param matcher Method instance matcher + * @returns Cache data, return undefined if not found + */ +const queryCache = async (matcher, { policy = 'all' } = {}) => { + // if key exists, that means it's a method instance. + if (matcher && matcher.key) { + const { id, l1Cache, l2Cache } = getContext(matcher); + const methodKey = getMethodInternalKey(matcher); + const { f: cacheFor, c: controlled, s: store, e: expireMilliseconds, t: tag } = getLocalCacheConfigParam(matcher); + // if it's controlled cache, it will return the result of cacheFor function. + if (controlled) { + return cacheFor(); + } + let cachedData = policy !== 'l2' ? await getWithCacheAdapter(id, methodKey, l1Cache) : undefinedValue; + if (policy === 'l2') { + cachedData = await getWithCacheAdapter(id, methodKey, l2Cache, tag); + } + else if (policy === 'all' && !cachedData) { + if (store && expireMilliseconds(STORAGE_RESTORE) > getTime()) { + cachedData = await getWithCacheAdapter(id, methodKey, l2Cache, tag); + } + } + return cachedData; + } +}; +/** + * Manually set cache response data. If the corresponding methodInstance sets persistent storage, the cache in the persistent storage will also be checked out. + * @param matcher Method instance matcher cache data + */ +const setCache = async (matcher, dataOrUpdater, { policy = 'all' } = {}) => { + const methodInstances = isArray(matcher) ? matcher : [matcher]; + const batchPromises = methodInstances.map(async (methodInstance) => { + const { hitSource } = methodInstance; + const { id, l1Cache, l2Cache } = getContext(methodInstance); + const methodKey = getMethodInternalKey(methodInstance); + const { e: expireMilliseconds, s: toStore, t: tag, c: controlled } = getLocalCacheConfigParam(methodInstance); + // don't set cache when it's controlled cache. + if (controlled) { + return; + } + let data = dataOrUpdater; + if (isFn(dataOrUpdater)) { + let cachedData = policy !== 'l2' ? await getWithCacheAdapter(id, methodKey, l1Cache) : undefinedValue; + if (policy === 'l2' || + (policy === 'all' && !cachedData && toStore && expireMilliseconds(STORAGE_RESTORE) > getTime())) { + cachedData = await getWithCacheAdapter(id, methodKey, l2Cache, tag); + } + data = dataOrUpdater(cachedData); + if (data === undefinedValue) { + return; + } + } + return PromiseCls.all([ + policy !== 'l2' && setWithCacheAdapter(id, methodKey, data, expireMilliseconds(MEMORY), l1Cache, hitSource), + policy === 'l2' || (policy === 'all' && toStore) + ? setWithCacheAdapter(id, methodKey, data, expireMilliseconds(STORAGE_RESTORE), l2Cache, hitSource, tag) + : undefinedValue + ]); + }); + return PromiseCls.all(batchPromises); +}; +/** + * invalid cache + * @param matcher Method instance matcher + */ +const invalidateCache = async (matcher) => { + if (!matcher) { + await PromiseCls.all([clearWithCacheAdapter(usingL1CacheAdapters), clearWithCacheAdapter(usingL2CacheAdapters)]); + return; + } + const methodInstances = isArray(matcher) ? matcher : [matcher]; + const batchPromises = methodInstances.map(methodInstance => { + const { id, l1Cache, l2Cache } = getContext(methodInstance); + const { c: controlled, m: cacheMode } = getLocalCacheConfigParam(methodInstance); + // don't invalidate cache when it's controlled cache. + if (controlled) { + return; + } + const methodKey = getMethodInternalKey(methodInstance); + return PromiseCls.all([ + removeWithCacheAdapter(id, methodKey, l1Cache), + cacheMode === STORAGE_RESTORE ? removeWithCacheAdapter(id, methodKey, l2Cache) : promiseResolve() + ]); + }); + await PromiseCls.all(batchPromises); +}; +/** + * hit(invalidate) target caches by source method + * this is the implementation of auto invalidate cache + * @param sourceMethod source method instance + */ +const hitCacheBySource = async (sourceMethod) => { + // Find the hit target cache and invalidate its cache + // Control the automatic cache invalidation range through global configuration `autoHitCache` + const { autoHitCache } = globalConfigMap; + const { l1Cache, l2Cache } = getContext(sourceMethod); + const sourceKey = getMethodInternalKey(sourceMethod); + const { name: sourceName } = getConfig(sourceMethod); + const cacheAdaptersInvolved = { + global: [...usingL1CacheAdapters, ...usingL2CacheAdapters], + self: [l1Cache, l2Cache], + close: [] + }[autoHitCache]; + if (cacheAdaptersInvolved && len(cacheAdaptersInvolved)) { + await PromiseCls.all(mapItem(cacheAdaptersInvolved, involvedCacheAdapter => hitTargetCacheWithCacheAdapter(sourceKey, sourceName, involvedCacheAdapter))); + } +}; + +const adapterReturnMap = {}; +/** + * actual request function + * @param method request method object + * @param forceRequest Ignore cache + * @returns response data + */ +function sendRequest(methodInstance, forceRequest) { + let fromCache = trueValue; + let requestAdapterCtrlsPromiseResolveFn; + const requestAdapterCtrlsPromise = newInstance(PromiseCls, resolve => { + requestAdapterCtrlsPromiseResolveFn = resolve; + }); + const response = async () => { + const { beforeRequest = noop, responded, requestAdapter, cacheLogger } = getOptions(methodInstance); + const methodKey = getMethodInternalKey(methodInstance); + const { s: toStorage, t: tag, m: cacheMode, e: expireMilliseconds } = getLocalCacheConfigParam(methodInstance); + const { id, l1Cache, l2Cache, snapshots } = getContext(methodInstance); + // Get controlled cache or uncontrolled cache + const { cacheFor } = getConfig(methodInstance); + const { hitSource: methodHitSource } = methodInstance; + // If the current method sets a controlled cache, check whether there is custom data + let cachedResponse = await (isFn(cacheFor) + ? cacheFor() + : // If it is a forced request, skip the step of getting it from the cache + // Otherwise, determine whether to use cached data + forceRequest + ? undefinedValue + : getWithCacheAdapter(id, methodKey, l1Cache)); + // If it is storage restore mode and there is no data in the cache, the persistent data needs to be restored to the cache, and the cached expiration time must be used. + if (cacheMode === STORAGE_RESTORE && !cachedResponse && !forceRequest) { + const rawL2CacheData = await getRawWithCacheAdapter(id, methodKey, l2Cache, tag); + if (rawL2CacheData) { + const [l2Response, l2ExpireMilliseconds] = rawL2CacheData; + await setWithCacheAdapter(id, methodKey, l2Response, l2ExpireMilliseconds, l1Cache, methodHitSource); + cachedResponse = l2Response; + } + } + // Clone the method as a parameter and pass it to beforeRequest to prevent side effects when using the original method instance request multiple times. + // Place it after `let cachedResponse = await...` to solve the problem of first assigning promise to the method instance in method.send, otherwise the promise will be undefined in clonedMethod. + const clonedMethod = cloneMethod(methodInstance); + // Call the hook function before sending the request + // beforeRequest supports synchronous functions and asynchronous functions + await beforeRequest(clonedMethod); + const { baseURL, url: newUrl, type, data } = clonedMethod; + const { params = {}, headers = {}, transform = $self, shareRequest } = getConfig(clonedMethod); + const namespacedAdapterReturnMap = (adapterReturnMap[id] = adapterReturnMap[id] || {}); + const requestBody = clonedMethod.data; + const requestBodyIsSpecial = isSpecialRequestBody(requestBody); + // Will not share the request when requestBody is special data + let requestAdapterCtrls = requestBodyIsSpecial ? undefinedValue : namespacedAdapterReturnMap[methodKey]; + let responseSuccessHandler = $self; + let responseErrorHandler = undefinedValue; + let responseCompleteHandler = noop; + // uniform handler of onSuccess, onError, onComplete + if (isFn(responded)) { + responseSuccessHandler = responded; + } + else if (isPlainObject(responded)) { + const { onSuccess: successHandler, onError: errorHandler, onComplete: completeHandler } = responded; + responseSuccessHandler = isFn(successHandler) ? successHandler : responseSuccessHandler; + responseErrorHandler = isFn(errorHandler) ? errorHandler : responseErrorHandler; + responseCompleteHandler = isFn(completeHandler) ? completeHandler : responseCompleteHandler; + } + // If there is no cache, make a request + if (cachedResponse !== undefinedValue) { + requestAdapterCtrlsPromiseResolveFn(); // Ctrls will not be passed in when cache is encountered + // Print cache log + clonedMethod.fromCache = trueValue; + sloughFunction(cacheLogger, defaultCacheLogger)(cachedResponse, clonedMethod, cacheMode, tag); + responseCompleteHandler(clonedMethod); + return cachedResponse; + } + fromCache = falseValue; + if (!shareRequest || !requestAdapterCtrls) { + // Request data + const ctrls = requestAdapter({ + url: buildCompletedURL(baseURL, newUrl, params), + type, + data, + headers + }, clonedMethod); + requestAdapterCtrls = namespacedAdapterReturnMap[methodKey] = ctrls; + } + // Pass request adapter ctrls to promise for use in on download, on upload and abort + requestAdapterCtrlsPromiseResolveFn(requestAdapterCtrls); + /** + * Process response tasks and do not cache data on failure + * @param responsePromise Respond to promise instances + * @param responseHeaders Request header + * @param callInSuccess Whether to call in success callback + * @returns Processed response + */ + const handleResponseTask = async (handlerReturns, responseHeaders, callInSuccess = trueValue) => { + const responseData = await handlerReturns; + const transformedData = await transform(responseData, responseHeaders || {}); + snapshots.save(methodInstance); + // Even if the cache operation fails, the response structure will be returned normally to avoid request errors caused by cache operation problems. + // The cache operation results can be obtained through `cacheAdapter.emitter.on('success' | 'fail', event => {})` + try { + // Automatic cache invalidation + await hitCacheBySource(clonedMethod); + } + catch (_a) { } + // Do not save cache when requestBody is special data + // Reason 1: Special data is generally submitted and requires interaction with the server. + // Reason 2: Special data is not convenient for generating cache keys + const toCache = !requestBody || !requestBodyIsSpecial; + // Use the latest expiration time after the response to cache data to avoid the problem of expiration time loss due to too long response time + if (toCache && callInSuccess) { + try { + await PromiseCls.all([ + setWithCacheAdapter(id, methodKey, transformedData, expireMilliseconds(MEMORY), l1Cache, methodHitSource), + toStorage && + setWithCacheAdapter(id, methodKey, transformedData, expireMilliseconds(STORAGE_RESTORE), l2Cache, methodHitSource, tag) + ]); + } + catch (_b) { } + } + // Deep clone the transformed data before returning to avoid reference issues + // the `deepClone` will only clone array and plain object + return deepClone(transformedData); + }; + return promiseFinally(promiseThen(PromiseCls.all([requestAdapterCtrls.response(), requestAdapterCtrls.headers()]), ([rawResponse, rawHeaders]) => { + // Regardless of whether the request succeeds or fails, the shared request needs to be removed first + deleteAttr(namespacedAdapterReturnMap, methodKey); + return handleResponseTask(responseSuccessHandler(rawResponse, clonedMethod), rawHeaders); + }, (error) => { + // Regardless of whether the request succeeds or fails, the shared request needs to be removed first + deleteAttr(namespacedAdapterReturnMap, methodKey); + return isFn(responseErrorHandler) + ? // When responding to an error, if no error is thrown, the successful response process will be processed, but the data will not be cached. + handleResponseTask(responseErrorHandler(error, clonedMethod), undefinedValue, falseValue) + : promiseReject(error); + }), () => { + responseCompleteHandler(clonedMethod); + }); + }; + return { + // request interrupt function + abort: () => { + promiseThen(requestAdapterCtrlsPromise, requestAdapterCtrls => requestAdapterCtrls && requestAdapterCtrls.abort()); + }, + onDownload: (handler) => { + promiseThen(requestAdapterCtrlsPromise, requestAdapterCtrls => requestAdapterCtrls && requestAdapterCtrls.onDownload && requestAdapterCtrls.onDownload(handler)); + }, + onUpload: (handler) => { + promiseThen(requestAdapterCtrlsPromise, requestAdapterCtrls => requestAdapterCtrls && requestAdapterCtrls.onUpload && requestAdapterCtrls.onUpload(handler)); + }, + response, + fromCache: () => fromCache + }; +} + +const offEventCallback = (offHandler, handlers) => () => { + const index = handlers.indexOf(offHandler); + index >= 0 && handlers.splice(index, 1); +}; +class Method { + constructor(type, context, url, config, data) { + this.dhs = []; + this.uhs = []; + this.fromCache = undefinedValue; + const abortRequest = () => { + abortRequest.a(); + }; + abortRequest.a = noop; + const instance = this; + const contextOptions = getContextOptions(context); + instance.abort = abortRequest; + instance.baseURL = contextOptions.baseURL || ''; + instance.url = url; + instance.type = type; + instance.context = context; + // Merge request-related global configuration into the method object + const contextConcatConfig = {}; + const mergedLocalCacheKey = 'cacheFor'; + const globalLocalCache = isPlainObject(contextOptions[mergedLocalCacheKey]) + ? contextOptions[mergedLocalCacheKey][type] + : undefinedValue; + const hitSource = config && config.hitSource; + // Merge parameters + forEach(['timeout', 'shareRequest'], mergedKey => { + if (contextOptions[mergedKey] !== undefinedValue) { + contextConcatConfig[mergedKey] = contextOptions[mergedKey]; + } + }); + // Merge local cache + if (globalLocalCache !== undefinedValue) { + contextConcatConfig[mergedLocalCacheKey] = globalLocalCache; + } + // Unify hit sources into arrays and convert them into method keys when there are method instances + if (hitSource) { + instance.hitSource = mapItem(isArray(hitSource) ? hitSource : [hitSource], sourceItem => instanceOf(sourceItem, Method) ? getMethodInternalKey(sourceItem) : sourceItem); + deleteAttr(config, 'hitSource'); + } + instance.config = { + ...contextConcatConfig, + headers: {}, + params: {}, + ...(config || {}) + }; + instance.data = data; + instance.meta = config ? config.meta : instance.meta; + // The original key needs to be used externally instead of generating the key in real time. + // The reason is that the parameters of the method may pass in reference type values, but when the reference type value changes externally, the key generated in real time also changes, so it is more accurate to use the initial key. + instance.key = instance.generateKey(); + } + /** + * Bind download progress callback function + * @param progressHandler Download progress callback function + * @version 2.17.0 + * @return unbind function + */ + onDownload(downloadHandler) { + pushItem(this.dhs, downloadHandler); + return offEventCallback(downloadHandler, this.dhs); + } + /** + * Bind upload progress callback function + * @param progressHandler Upload progress callback function + * @version 2.17.0 + * @return unbind function + */ + onUpload(uploadHandler) { + pushItem(this.uhs, uploadHandler); + return offEventCallback(uploadHandler, this.uhs); + } + /** + * Send a request through a method instance and return a promise object + */ + send(forceRequest = falseValue) { + const instance = this; + const { response, onDownload, onUpload, abort, fromCache } = sendRequest(instance, forceRequest); + len(instance.dhs) > 0 && + onDownload((loaded, total) => forEach(instance.dhs, handler => handler({ loaded, total }))); + len(instance.uhs) > 0 && onUpload((loaded, total) => forEach(instance.uhs, handler => handler({ loaded, total }))); + // The interrupt function is bound to the method instance for each request. The user can also interrupt the current request through method instance.abort() + instance.abort.a = abort; + instance.fromCache = undefinedValue; + instance.promise = promiseThen(response(), r => { + instance.fromCache = fromCache(); + return r; + }); + return instance.promise; + } + /** + * Set the method name, if there is already a name it will be overwritten + * @param name method name + */ + setName(name) { + getConfig(this).name = name; + } + generateKey() { + return key(this); + } + /** + * Bind callbacks for resolve and/or reject Promise + * @param onfulfilled The callback to be executed when resolving the Promise + * @param onrejected The callback to be executed when the Promise is rejected + * @returns Returns a Promise for executing any callbacks + */ + then(onfulfilled, onrejected) { + return promiseThen(this.send(), onfulfilled, onrejected); + } + /** + * Bind a callback only for reject Promise + * @param onrejected The callback to be executed when the Promise is rejected + * @returns Returns a Promise that completes the callback + */ + catch(onrejected) { + return promiseCatch(this.send(), onrejected); + } + /** + * Bind a callback that is called when the Promise is resolved (resolve or reject) + * @param onfinally Callback executed when Promise is resolved (resolve or reject). + * @return Returns a Promise that completes the callback. + */ + finally(onfinally) { + return promiseFinally(this.send(), onfinally); + } +} + +/** + * Custom assertion function, throws an error when the expression is false + * @param expression Judgment expression, true or false + * @param msg assert message + */ +const myAssert = createAssert(); + +// local storage will not fail the operation. +const EVENT_SUCCESS_KEY = 'success'; +const memoryAdapter = () => { + let l1Cache = {}; + const l1CacheEmitter = createEventManager(); + const adapter = { + set(key, value) { + l1Cache[key] = value; + l1CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'set', key, value, container: l1Cache }); + }, + get: key => { + const value = l1Cache[key]; + l1CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'get', key, value, container: l1Cache }); + return value; + }, + remove(key) { + deleteAttr(l1Cache, key); + l1CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'remove', key, container: l1Cache }); + }, + clear: () => { + l1Cache = {}; + l1CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'clear', key: '', container: l1Cache }); + }, + emitter: l1CacheEmitter + }; + return adapter; +}; +const localStorageAdapter = () => { + const l2CacheEmitter = createEventManager(); + const instance = localStorage; + const adapter = { + set: (key, value) => { + instance.setItem(key, JSONStringify(value)); + l2CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'set', key, value, container: instance }); + }, + get: key => { + const data = instance.getItem(key); + const value = data ? JSONParse(data) : data; + l2CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'get', key, value, container: instance }); + return value; + }, + remove: key => { + instance.removeItem(key); + l2CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'remove', key, container: instance }); + }, + clear: () => { + instance.clear(); + l2CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'clear', key: '', container: instance }); + }, + emitter: l2CacheEmitter + }; + return adapter; +}; +const placeholderAdapter = () => { + const l2CacheNotDefinedAssert = () => { + myAssert(falseValue, 'l2Cache is not defined.'); + }; + return { + set: () => { + l2CacheNotDefinedAssert(); + }, + get: () => { + l2CacheNotDefinedAssert(); + return undefinedValue; + }, + remove: () => { + l2CacheNotDefinedAssert(); + }, + clear: () => { } + }; +}; + +const SetCls = Set; +class MethodSnapshotContainer { + constructor(capacity) { + /** + * Method instance snapshot collection, method instances that have sent requests will be saved + */ + this.records = {}; + this.occupy = 0; + myAssert(capacity >= 0, 'expected snapshots limit to be >= 0'); + this.capacity = capacity; + } + /** + * Save method instance snapshot + * @param methodInstance method instance + */ + save(methodInstance) { + const { name } = getConfig(methodInstance); + const { records, occupy, capacity } = this; + if (name && occupy < capacity) { + // Using the name of the method as the key, save the method instance to the snapshot + const targetSnapshots = (records[name] = records[name] || newInstance(SetCls)); + targetSnapshots.add(methodInstance); + // Statistical quantity + this.occupy += 1; + } + } + /** + * Get a Method instance snapshot, which will filter out the corresponding Method instance based on the matcher + * @param matcher Matching snapshot name, which can be a string or regular expression, or an object with a filter function + * @returns Array of matched Method instance snapshots + */ + match(matcher, matchAll = true) { + // Unify the filter parameters into name matcher and match handler + let nameString; + let nameReg; + let matchHandler; + let nameMatcher = matcher; + if (isPlainObject(matcher)) { + nameMatcher = matcher.name; + matchHandler = matcher.filter; + } + if (instanceOf(nameMatcher, RegExpCls)) { + nameReg = nameMatcher; + } + else if (isString(nameMatcher)) { + nameString = nameMatcher; + } + const { records } = this; + // Get the corresponding method instance snapshot through the deconstructed name matcher and filter handler + let matches = newInstance((SetCls)); + // If the namespace parameter is provided, it will only be searched in this namespace, otherwise it will be searched in all cached data. + if (nameString) { + matches = records[nameString] || matches; + } + else if (nameReg) { + forEach(filterItem(objectKeys(records), methodName => nameReg.test(methodName)), methodName => { + records[methodName].forEach(method => matches.add(method)); + }); + } + const fromMatchesArray = isFn(matchHandler) ? filterItem([...matches], matchHandler) : [...matches]; + return (matchAll ? fromMatchesArray : fromMatchesArray[0]); + } +} + +const typeGet = 'GET'; +const typeHead = 'HEAD'; +const typePost = 'POST'; +const typePut = 'PUT'; +const typePatch = 'PATCH'; +const typeDelete = 'DELETE'; +const typeOptions = 'OPTIONS'; +const defaultAlovaOptions = { + /** + * GET requests are cached for 5 minutes (300000 milliseconds) by default, and other requests are not cached by default. + */ + cacheFor: { + [typeGet]: 300000 + }, + /** + * Share requests default to true + */ + shareRequest: trueValue, + /** + * Number of method snapshots, default is 1000 + */ + snapshots: 1000 +}; +let idCount = 0; +class Alova { + constructor(options) { + var _a, _b; + const instance = this; + instance.id = (options.id || (idCount += 1)).toString(); + // If storage is not specified, local storage is used by default. + instance.l1Cache = options.l1Cache || memoryAdapter(); + instance.l2Cache = + options.l2Cache || (typeof localStorage !== 'undefined' ? localStorageAdapter() : placeholderAdapter()); + // Merge default options + instance.options = { + ...defaultAlovaOptions, + ...options + }; + instance.snapshots = newInstance((MethodSnapshotContainer), (_b = (_a = options.snapshots) !== null && _a !== void 0 ? _a : defaultAlovaOptions.snapshots) !== null && _b !== void 0 ? _b : 0); + } + Get(url, config) { + return newInstance((Method), typeGet, this, url, config); + } + Post(url, data, config) { + return newInstance((Method), typePost, this, url, config, data); + } + Delete(url, data, config) { + return newInstance((Method), typeDelete, this, url, config, data); + } + Put(url, data, config) { + return newInstance((Method), typePut, this, url, config, data); + } + Head(url, config) { + return newInstance((Method), typeHead, this, url, config); + } + Patch(url, data, config) { + return newInstance((Method), typePatch, this, url, config, data); + } + Options(url, config) { + return newInstance((Method), typeOptions, this, url, config); + } +} +let boundStatesHook = undefinedValue; +const usingL1CacheAdapters = []; +const usingL2CacheAdapters = []; +/** + * create an alova instance. + * @param options alova configuration. + * @returns alova instance. + */ +const createAlova = (options) => { + const alovaInstance = newInstance((Alova), options); + const newStatesHook = alovaInstance.options.statesHook; + if (boundStatesHook) { + myAssert(boundStatesHook === newStatesHook, 'expected to use the same `statesHook`'); + } + boundStatesHook = newStatesHook; + const { l1Cache, l2Cache } = alovaInstance; + !usingL1CacheAdapters.includes(l1Cache) && pushItem(usingL1CacheAdapters, l1Cache); + !usingL2CacheAdapters.includes(l2Cache) && pushItem(usingL2CacheAdapters, l2Cache); + return alovaInstance; +}; + +const promiseStatesHook = () => { + myAssert(!!boundStatesHook, '`statesHook` is not set in alova instance'); + return boundStatesHook; +}; + +export { Method, createAlova, globalConfig, globalConfigMap, hitCacheBySource, invalidateCache, promiseStatesHook, queryCache, setCache }; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.umd.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.umd.js new file mode 100644 index 0000000..827b20c --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.umd.js @@ -0,0 +1,1207 @@ +/** + * alova 3.2.10 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.alova = {})); +})(this, (function (exports) { 'use strict'; + + /** + * @alova/shared 1.1.2 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) + */ + + const undefStr = 'undefined'; + // The following unified processing functions or variables added to reduce the amount of compiled code + const PromiseCls = Promise; + const promiseResolve = (value) => PromiseCls.resolve(value); + const promiseReject = (value) => PromiseCls.reject(value); + const ObjectCls = Object; + const RegExpCls = RegExp; + const undefinedValue = undefined; + const nullValue = null; + const trueValue = true; + const falseValue = false; + const promiseThen = (promise, onFulfilled, onrejected) => promise.then(onFulfilled, onrejected); + const promiseCatch = (promise, onrejected) => promise.catch(onrejected); + const promiseFinally = (promise, onfinally) => promise.finally(onfinally); + const JSONStringify = (value, replacer, space) => JSON.stringify(value, replacer, space); + const JSONParse = (value) => JSON.parse(value); + const objectKeys = (obj) => ObjectCls.keys(obj); + const forEach = (ary, fn) => ary.forEach(fn); + const pushItem = (ary, ...item) => ary.push(...item); + const mapItem = (ary, callbackfn) => ary.map(callbackfn); + const filterItem = (ary, predicate) => ary.filter(predicate); + const len = (data) => data.length; + const isArray = (arg) => Array.isArray(arg); + const deleteAttr = (arg, attr) => delete arg[attr]; + const typeOf = (arg) => typeof arg; + // Whether it is running on the server side, node and bun are judged by process, and deno is judged by Deno. + // Some frameworks (such as Alipay and uniapp) will inject the process object as a global variable. + // Therefore, the process.cwd function unique to the server is used as the basis for judgment. + const isSSR = typeof window === undefStr && + (typeof process !== undefStr ? typeof process.cwd === 'function' : typeof Deno !== undefStr); + /** cache mode */ + // only cache in memory, it's default option + const MEMORY = 'memory'; + // persistent cache, and will be read to memory when page is refreshed, it means that the memory cache always exist until cache is expired. + const STORAGE_RESTORE = 'restore'; + + /** + * Empty function for compatibility processing + */ + const noop = () => { }; + /** + * A function that returns the parameter itself, used for compatibility processing + * Since some systems use self as a reserved word, $self is used to distinguish it. + * @param arg any parameter + * @returns return parameter itself + */ + const $self = (arg) => arg; + /** + * Determine whether the parameter is a function any parameter + * @returns Whether the parameter is a function + */ + const isFn = (arg) => typeOf(arg) === 'function'; + /** + * Determine whether the parameter is a number any parameter + * @returns Whether the parameter is a number + */ + const isNumber = (arg) => typeOf(arg) === 'number' && !Number.isNaN(arg); + /** + * Determine whether the parameter is a string any parameter + * @returns Whether the parameter is a string + */ + const isString = (arg) => typeOf(arg) === 'string'; + /** + * Global toString any parameter stringified parameters + */ + const globalToString = (arg) => ObjectCls.prototype.toString.call(arg); + /** + * Determine whether it is a normal object any parameter + * @returns Judgment result + */ + const isPlainObject = (arg) => globalToString(arg) === '[object Object]'; + /** + * Determine whether it is an instance of a certain class any parameter + * @returns Judgment result + */ + const instanceOf = (arg, cls) => arg instanceof cls; + /** + * Unified timestamp acquisition function + * @returns Timestamp + */ + const getTime = (date) => (date ? date.getTime() : Date.now()); + /** + * Get the alova instance through the method instance alova example + */ + const getContext = (methodInstance) => methodInstance.context; + /** + * Get method instance configuration data + * @returns Configuration object + */ + const getConfig = (methodInstance) => methodInstance.config; + /** + * Get alova configuration data alova configuration object + */ + const getContextOptions = (alovaInstance) => alovaInstance.options; + /** + * Get alova configuration data through method instance alova configuration object + */ + const getOptions = (methodInstance) => getContextOptions(getContext(methodInstance)); + /** + * Get the key value of the request method + * @returns The key value of this request method + */ + const key = (methodInstance) => { + const { params, headers } = getConfig(methodInstance); + return JSONStringify([methodInstance.type, methodInstance.url, params, methodInstance.data, headers]); + }; + /** + * Get the key value of the method instance method instance + * @returns The key value of this method instance + */ + const getMethodInternalKey = (methodInstance) => methodInstance.key; + /** + * Is it special data + * @param data Submit data + * @returns Judgment result + */ + const isSpecialRequestBody = (data) => { + const dataTypeString = globalToString(data); + return (/^\[object (Blob|FormData|ReadableStream|URLSearchParams)\]$/i.test(dataTypeString) || instanceOf(data, ArrayBuffer)); + }; + const objAssign = (target, ...sources) => ObjectCls.assign(target, ...sources); + /** + * Get cached configuration parameters, fixedly returning an object in the format { e: function, c: any, f: any, m: number, s: boolean, t: string } e is the abbreviation of expire, which returns the cache expiration time point (timestamp) in milliseconds. + * c is controlled, indicating whether it is a controlled cache + * f is the original value of cacheFor, which is used to call to obtain cached data when c is true. + * m is the abbreviation of mode, storage mode + * s is the abbreviation of storage, whether to store it locally + * t is the abbreviation of tag, which stores tags persistently. + * @param methodInstance method instance + * @returns Unified cache parameter object + */ + const getLocalCacheConfigParam = (methodInstance) => { + const { cacheFor } = getConfig(methodInstance); + const getCacheExpireTs = (cacheExpire) => isNumber(cacheExpire) ? getTime() + cacheExpire : getTime(cacheExpire || undefinedValue); + let cacheMode = MEMORY; + let expire = () => 0; + let store = falseValue; + let tag = undefinedValue; + const controlled = isFn(cacheFor); + if (!controlled) { + let expireColumn = cacheFor; + if (isPlainObject(cacheFor)) { + const { mode = MEMORY, expire, tag: configTag } = cacheFor || {}; + cacheMode = mode; + store = mode === STORAGE_RESTORE; + tag = configTag ? configTag.toString() : undefinedValue; + expireColumn = expire; + } + expire = (mode) => getCacheExpireTs(isFn(expireColumn) ? expireColumn({ method: methodInstance, mode }) : expireColumn); + } + return { + f: cacheFor, + c: controlled, + e: expire, + m: cacheMode, + s: store, + t: tag + }; + }; + /** + * Create class instance + * @param Cls Constructor + * @param args Constructor parameters class instance + */ + const newInstance = (Cls, ...args) => new Cls(...args); + const sloughFunction = (arg, defaultFn) => isFn(arg) ? arg : ![falseValue, nullValue].includes(arg) ? defaultFn : noop; + const cacheKeyPrefix = '$a.'; + /** + * build common cache key. + */ + const buildNamespacedCacheKey = (namespace, key) => cacheKeyPrefix + namespace + key; + /** + * Build the complete url baseURL path url parameters complete url + */ + const buildCompletedURL = (baseURL, url, params) => { + // If the Base url ends with /, remove / + baseURL = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL; + // If it does not start with /or http protocol, you need to add / + // Compatible with some RESTful usage fix: https://github.com/alovajs/alova/issues/382 + if (url !== '') { + url = url.match(/^(\/|https?:\/\/)/) ? url : `/${url}`; + } + const completeURL = baseURL + url; + // Convert params object to get string + // Filter out those whose value is undefined + const paramsStr = mapItem(filterItem(objectKeys(params), key => params[key] !== undefinedValue), key => `${key}=${params[key]}`).join('&'); + // Splice the get parameters behind the url. Note that the url may already have parameters. + return paramsStr + ? +completeURL.includes('?') + ? `${completeURL}&${paramsStr}` + : `${completeURL}?${paramsStr}` + : completeURL; + }; + /** + * Deep clone an object. + * + * @param obj The object to be cloned. + * @returns The cloned object. + */ + const deepClone = (obj) => { + if (isArray(obj)) { + return mapItem(obj, deepClone); + } + if (isPlainObject(obj) && obj.constructor === ObjectCls) { + const clone = {}; + forEach(objectKeys(obj), key => { + clone[key] = deepClone(obj[key]); + }); + return clone; + } + return obj; + }; + + /** + * alova error class + */ + class AlovaError extends Error { + constructor(prefix, message, errorCode) { + super(message + (errorCode ? `\n\nFor detailed: https://alova.js.org/error#${errorCode}` : '')); + this.name = `[alova${prefix ? `/${prefix}` : ''}]`; + } + } + /** + * Custom assertion function that throws an error when the expression is false + * When errorCode is passed in, a link to the error document will be provided to guide the user to correct it. + * @param expression Judgment expression, true or false + * @param message Assert message + */ + const createAssert = (prefix = '') => (expression, message, errorCode) => { + if (!expression) { + throw newInstance(AlovaError, prefix, message, errorCode); + } + }; + + const createEventManager = () => { + const eventMap = {}; + return { + eventMap, + on(type, handler) { + const eventTypeItem = (eventMap[type] = eventMap[type] || []); + pushItem(eventTypeItem, handler); + // return the off function + return () => { + eventMap[type] = filterItem(eventTypeItem, item => item !== handler); + }; + }, + off(type, handler) { + const handlers = eventMap[type]; + if (!handlers) { + return; + } + if (handler) { + const index = handlers.indexOf(handler); + index > -1 && handlers.splice(index, 1); + } + else { + delete eventMap[type]; + } + }, + emit(type, event) { + const handlers = eventMap[type] || []; + return mapItem(handlers, handler => handler(event)); + } + }; + }; + + exports.globalConfigMap = { + autoHitCache: 'global', + ssr: isSSR + }; + /** + * Set global configuration + * @param config + */ + var globalConfig = (config) => { + exports.globalConfigMap = { + ...exports.globalConfigMap, + ...config + }; + }; + + const titleStyle = 'color: black; font-size: 12px; font-weight: bolder'; + /** + * Default cacheLogger function + */ + var defaultCacheLogger = (response, methodInstance, cacheMode, tag) => { + const cole = console; + // eslint-disable-next-line + const log = (...args) => console.log(...args); + const { url } = methodInstance; + const isRestoreMode = cacheMode === STORAGE_RESTORE; + const hdStyle = '\x1B[42m%s\x1B[49m'; + const labelStyle = '\x1B[32m%s\x1B[39m'; + const startSep = ` [HitCache]${url} `; + const endSepFn = () => Array(len(startSep) + 1).join('^'); + if (exports.globalConfigMap.ssr) { + log(hdStyle, startSep); + log(labelStyle, ' Cache ', response); + log(labelStyle, ' Mode ', cacheMode); + isRestoreMode && log(labelStyle, ' Tag ', tag); + log(labelStyle, endSepFn()); + } + else { + cole.groupCollapsed + ? cole.groupCollapsed('%cHitCache', 'padding: 2px 6px; background: #c4fcd3; color: #53b56d;', url) + : log(hdStyle, startSep); + log('%c[Cache]', titleStyle, response); + log('%c[Mode]', titleStyle, cacheMode); + isRestoreMode && log('%c[Tag]', titleStyle, tag); + log('%c[Method]', titleStyle, methodInstance); + cole.groupEnd ? cole.groupEnd() : log(labelStyle, endSepFn()); + } + }; + + const hitSourceStringCacheKey = (key) => `hss.${key}`; + const hitSourceRegexpPrefix = 'hsr.'; + const hitSourceRegexpCacheKey = (regexpStr) => hitSourceRegexpPrefix + regexpStr; + const unifiedHitSourceRegexpCacheKey = '$$hsrs'; + const regexpSourceFlagSeparator = '__$<>$__'; + const addItem = (obj, item) => { + obj[item] = 0; + }; + /** + * set or update cache + * @param namespace namespace + * @param key stored key + * @param response Stored response content + * @param expireTimestamp Timestamp representation of expiration time point + * @param storage storage object + * @param tag Storage tags, used to distinguish different storage tags + */ + const setWithCacheAdapter = async (namespace, key, data, expireTimestamp, cacheAdapter, hitSource, tag) => { + // not to cache if expireTimestamp is less than current timestamp + if (expireTimestamp > getTime() && data) { + const methodCacheKey = buildNamespacedCacheKey(namespace, key); + await cacheAdapter.set(methodCacheKey, filterItem([data, expireTimestamp === Infinity ? undefinedValue : expireTimestamp, tag], Boolean)); + // save the relationship between this method and its hitSources. + // cache structure is like this: + /* + { + "$a.[namespace][methodKey]": [cache data], + ... + "hss.[sourceMethodKey]": "{ + [targetMethodKey1]: 0, + [targetMethodKey2]: 0, + ... + }", + "hss.[sourceMethodName]": "{ + [targetMethodKey3]: 0, + [targetMethodKey4]: 0, + ... + }", + "hsr.[sourceMethodNameRegexpSource]": "{ + [targetMethodKey5]: 0, + [targetMethodKey6]: 0, + ... + }", + "hsr.regexp1": ["hss.key1", "hss.key2"], + "hsr.regexp2": ["hss.key1", "hss.key2"] + } + */ + if (hitSource) { + // filter repeat items and categorize the regexp, to prevent unnecessary cost of IO + const hitSourceKeys = {}; + const hitSourceRegexpSources = []; + forEach(hitSource, sourceItem => { + const isRegexp = instanceOf(sourceItem, RegExpCls); + const targetHitSourceKey = isRegexp + ? sourceItem.source + (sourceItem.flags ? regexpSourceFlagSeparator + sourceItem.flags : '') + : sourceItem; + if (targetHitSourceKey) { + if (isRegexp && !hitSourceKeys[targetHitSourceKey]) { + pushItem(hitSourceRegexpSources, targetHitSourceKey); + } + addItem(hitSourceKeys, isRegexp ? hitSourceRegexpCacheKey(targetHitSourceKey) : hitSourceStringCacheKey(targetHitSourceKey)); + } + }); + // save the relationship. Minimize IO as much as possible + const promises = mapItem(objectKeys(hitSourceKeys), async (hitSourceKey) => { + // filter the empty strings. + const targetMethodKeys = (await cacheAdapter.get(hitSourceKey)) || {}; + addItem(targetMethodKeys, methodCacheKey); + await cacheAdapter.set(hitSourceKey, targetMethodKeys); + }); + const saveRegexp = async () => { + // save the regexp source if regexp exists. + if (len(hitSourceRegexpSources)) { + const regexpList = (await cacheAdapter.get(unifiedHitSourceRegexpCacheKey)) || []; + // TODO: hitSourceRegexpSources needs to be deduplicated + pushItem(regexpList, ...hitSourceRegexpSources); + await cacheAdapter.set(unifiedHitSourceRegexpCacheKey, regexpList); + } + }; + // parallel executing all async tasks. + await PromiseCls.all([...promises, saveRegexp()]); + } + } + }; + /** + * Delete stored response data + * @param namespace namespace + * @param key stored key + * @param storage storage object + */ + const removeWithCacheAdapter = async (namespace, key, cacheAdapter) => { + const methodStoreKey = buildNamespacedCacheKey(namespace, key); + await cacheAdapter.remove(methodStoreKey); + }; + /** + * Get stored response data + * @param namespace namespace + * @param key stored key + * @param storage storage object + * @param tag Store tags. If the tag changes, the data will become invalid. + */ + const getRawWithCacheAdapter = async (namespace, key, cacheAdapter, tag) => { + const storagedData = await cacheAdapter.get(buildNamespacedCacheKey(namespace, key)); + if (storagedData) { + // Eslint disable next line + const [dataUnused, expireTimestamp, storedTag] = storagedData; + // If there is no expiration time, it means that the data will never expire. Otherwise, you need to determine whether it has expired. + if (storedTag === tag && (!expireTimestamp || expireTimestamp > getTime())) { + return storagedData; + } + // If expired, delete cache + await removeWithCacheAdapter(namespace, key, cacheAdapter); + } + }; + /** + * Get stored response data + * @param namespace namespace + * @param key stored key + * @param storage storage object + * @param tag Store tags. If the tag changes, the data will become invalid. + */ + const getWithCacheAdapter = async (namespace, key, cacheAdapter, tag) => { + const rawData = await getRawWithCacheAdapter(namespace, key, cacheAdapter, tag); + return rawData ? rawData[0] : undefinedValue; + }; + /** + * clear all cached data + */ + const clearWithCacheAdapter = async (cacheAdapters) => PromiseCls.all(cacheAdapters.map(cacheAdapter => cacheAdapter.clear())); + /** + * query and delete target cache with key and name of source method instance. + * @param sourceKey source method instance key + * @param sourceName source method instance name + * @param cacheAdapter cache adapter + */ + const hitTargetCacheWithCacheAdapter = async (sourceKey, sourceName, cacheAdapter) => { + const sourceNameStr = `${sourceName}`; + // map that recording the source key and target method keys. + const sourceTargetKeyMap = {}; + // get hit key by method key. + const hitSourceKey = hitSourceStringCacheKey(sourceKey); + sourceTargetKeyMap[hitSourceKey] = await cacheAdapter.get(hitSourceKey); + let unifiedHitSourceRegexpChannel; + if (sourceName) { + const hitSourceName = hitSourceStringCacheKey(sourceNameStr); + // get hit key by method name if it is exists. + sourceTargetKeyMap[hitSourceName] = await cacheAdapter.get(hitSourceName); + // match regexped key by source method name and get hit key by method name. + unifiedHitSourceRegexpChannel = await cacheAdapter.get(unifiedHitSourceRegexpCacheKey); + const matchedRegexpStrings = []; + if (unifiedHitSourceRegexpChannel && len(unifiedHitSourceRegexpChannel)) { + forEach(unifiedHitSourceRegexpChannel, regexpStr => { + const [source, flag] = regexpStr.split(regexpSourceFlagSeparator); + if (newInstance(RegExpCls, source, flag).test(sourceNameStr)) { + pushItem(matchedRegexpStrings, regexpStr); + } + }); + // parallel get hit key by matched regexps. + await PromiseCls.all(mapItem(matchedRegexpStrings, async (regexpString) => { + const hitSourceRegexpString = hitSourceRegexpCacheKey(regexpString); + sourceTargetKeyMap[hitSourceRegexpString] = await cacheAdapter.get(hitSourceRegexpString); + })); + } + } + const removeWithTargetKey = async (targetKey) => { + try { + await cacheAdapter.remove(targetKey); + // loop sourceTargetKeyMap and remove this key to prevent unnecessary cost of IO. + for (const sourceKey in sourceTargetKeyMap) { + const targetKeys = sourceTargetKeyMap[sourceKey]; + if (targetKeys) { + deleteAttr(targetKeys, targetKey); + } + } + } + catch (_a) { + // the try-catch is used to prevent throwing error, cause throwing error in `Promise.all` below. + } + }; + // now let's start to delete target caches. + // and filter the finished keys. + const accessedKeys = {}; + await PromiseCls.all(mapItem(objectKeys(sourceTargetKeyMap), async (sourceKey) => { + const targetKeys = sourceTargetKeyMap[sourceKey]; + if (targetKeys) { + const removingPromises = []; + for (const key in targetKeys) { + if (!accessedKeys[key]) { + addItem(accessedKeys, key); + pushItem(removingPromises, removeWithTargetKey(key)); + } + } + await PromiseCls.all(removingPromises); + } + })); + // update source key if there is still has keys. + // remove source key if its keys is empty. + const unifiedHitSourceRegexpChannelLen = len(unifiedHitSourceRegexpChannel || []); + await PromiseCls.all(mapItem(objectKeys(sourceTargetKeyMap), async (sourceKey) => { + const targetKeys = sourceTargetKeyMap[sourceKey]; + if (targetKeys) { + if (len(objectKeys(targetKeys))) { + await cacheAdapter.set(sourceKey, targetKeys); + } + else { + await cacheAdapter.remove(sourceKey); + // if this is a regexped key, need to remove it from unified regexp channel. + if (sourceKey.includes(hitSourceRegexpPrefix) && unifiedHitSourceRegexpChannel) { + unifiedHitSourceRegexpChannel = filterItem(unifiedHitSourceRegexpChannel, rawRegexpStr => hitSourceRegexpCacheKey(rawRegexpStr) !== sourceKey); + } + } + } + })); + // update unified hit source regexp channel if its length was changed. + if (unifiedHitSourceRegexpChannelLen !== len(unifiedHitSourceRegexpChannel || [])) { + await cacheAdapter.set(unifiedHitSourceRegexpCacheKey, unifiedHitSourceRegexpChannel); + } + }; + + var cloneMethod = (methodInstance) => { + const { data, config } = methodInstance; + const newConfig = { ...config }; + const { headers = {}, params = {} } = newConfig; + const ctx = getContext(methodInstance); + newConfig.headers = { ...headers }; + newConfig.params = { ...params }; + const newMethod = newInstance((Method), methodInstance.type, ctx, methodInstance.url, newConfig, data); + return objAssign(newMethod, { + ...methodInstance, + config: newConfig + }); + }; + + /* + * The matchers in the following three functions are Method instance matchers, which are divided into three situations: + * 1. If the matcher is a Method instance, clear the cache of the Method instance. + * 2. If matcher is a string or regular expression, clear the cache of all Method instances that meet the conditions. + * 3. If no matcher is passed in, all caches will be cleared. + */ + /** + * Query cache + * @param matcher Method instance matcher + * @returns Cache data, return undefined if not found + */ + const queryCache = async (matcher, { policy = 'all' } = {}) => { + // if key exists, that means it's a method instance. + if (matcher && matcher.key) { + const { id, l1Cache, l2Cache } = getContext(matcher); + const methodKey = getMethodInternalKey(matcher); + const { f: cacheFor, c: controlled, s: store, e: expireMilliseconds, t: tag } = getLocalCacheConfigParam(matcher); + // if it's controlled cache, it will return the result of cacheFor function. + if (controlled) { + return cacheFor(); + } + let cachedData = policy !== 'l2' ? await getWithCacheAdapter(id, methodKey, l1Cache) : undefinedValue; + if (policy === 'l2') { + cachedData = await getWithCacheAdapter(id, methodKey, l2Cache, tag); + } + else if (policy === 'all' && !cachedData) { + if (store && expireMilliseconds(STORAGE_RESTORE) > getTime()) { + cachedData = await getWithCacheAdapter(id, methodKey, l2Cache, tag); + } + } + return cachedData; + } + }; + /** + * Manually set cache response data. If the corresponding methodInstance sets persistent storage, the cache in the persistent storage will also be checked out. + * @param matcher Method instance matcher cache data + */ + const setCache = async (matcher, dataOrUpdater, { policy = 'all' } = {}) => { + const methodInstances = isArray(matcher) ? matcher : [matcher]; + const batchPromises = methodInstances.map(async (methodInstance) => { + const { hitSource } = methodInstance; + const { id, l1Cache, l2Cache } = getContext(methodInstance); + const methodKey = getMethodInternalKey(methodInstance); + const { e: expireMilliseconds, s: toStore, t: tag, c: controlled } = getLocalCacheConfigParam(methodInstance); + // don't set cache when it's controlled cache. + if (controlled) { + return; + } + let data = dataOrUpdater; + if (isFn(dataOrUpdater)) { + let cachedData = policy !== 'l2' ? await getWithCacheAdapter(id, methodKey, l1Cache) : undefinedValue; + if (policy === 'l2' || + (policy === 'all' && !cachedData && toStore && expireMilliseconds(STORAGE_RESTORE) > getTime())) { + cachedData = await getWithCacheAdapter(id, methodKey, l2Cache, tag); + } + data = dataOrUpdater(cachedData); + if (data === undefinedValue) { + return; + } + } + return PromiseCls.all([ + policy !== 'l2' && setWithCacheAdapter(id, methodKey, data, expireMilliseconds(MEMORY), l1Cache, hitSource), + policy === 'l2' || (policy === 'all' && toStore) + ? setWithCacheAdapter(id, methodKey, data, expireMilliseconds(STORAGE_RESTORE), l2Cache, hitSource, tag) + : undefinedValue + ]); + }); + return PromiseCls.all(batchPromises); + }; + /** + * invalid cache + * @param matcher Method instance matcher + */ + const invalidateCache = async (matcher) => { + if (!matcher) { + await PromiseCls.all([clearWithCacheAdapter(usingL1CacheAdapters), clearWithCacheAdapter(usingL2CacheAdapters)]); + return; + } + const methodInstances = isArray(matcher) ? matcher : [matcher]; + const batchPromises = methodInstances.map(methodInstance => { + const { id, l1Cache, l2Cache } = getContext(methodInstance); + const { c: controlled, m: cacheMode } = getLocalCacheConfigParam(methodInstance); + // don't invalidate cache when it's controlled cache. + if (controlled) { + return; + } + const methodKey = getMethodInternalKey(methodInstance); + return PromiseCls.all([ + removeWithCacheAdapter(id, methodKey, l1Cache), + cacheMode === STORAGE_RESTORE ? removeWithCacheAdapter(id, methodKey, l2Cache) : promiseResolve() + ]); + }); + await PromiseCls.all(batchPromises); + }; + /** + * hit(invalidate) target caches by source method + * this is the implementation of auto invalidate cache + * @param sourceMethod source method instance + */ + const hitCacheBySource = async (sourceMethod) => { + // Find the hit target cache and invalidate its cache + // Control the automatic cache invalidation range through global configuration `autoHitCache` + const { autoHitCache } = exports.globalConfigMap; + const { l1Cache, l2Cache } = getContext(sourceMethod); + const sourceKey = getMethodInternalKey(sourceMethod); + const { name: sourceName } = getConfig(sourceMethod); + const cacheAdaptersInvolved = { + global: [...usingL1CacheAdapters, ...usingL2CacheAdapters], + self: [l1Cache, l2Cache], + close: [] + }[autoHitCache]; + if (cacheAdaptersInvolved && len(cacheAdaptersInvolved)) { + await PromiseCls.all(mapItem(cacheAdaptersInvolved, involvedCacheAdapter => hitTargetCacheWithCacheAdapter(sourceKey, sourceName, involvedCacheAdapter))); + } + }; + + const adapterReturnMap = {}; + /** + * actual request function + * @param method request method object + * @param forceRequest Ignore cache + * @returns response data + */ + function sendRequest(methodInstance, forceRequest) { + let fromCache = trueValue; + let requestAdapterCtrlsPromiseResolveFn; + const requestAdapterCtrlsPromise = newInstance(PromiseCls, resolve => { + requestAdapterCtrlsPromiseResolveFn = resolve; + }); + const response = async () => { + const { beforeRequest = noop, responded, requestAdapter, cacheLogger } = getOptions(methodInstance); + const methodKey = getMethodInternalKey(methodInstance); + const { s: toStorage, t: tag, m: cacheMode, e: expireMilliseconds } = getLocalCacheConfigParam(methodInstance); + const { id, l1Cache, l2Cache, snapshots } = getContext(methodInstance); + // Get controlled cache or uncontrolled cache + const { cacheFor } = getConfig(methodInstance); + const { hitSource: methodHitSource } = methodInstance; + // If the current method sets a controlled cache, check whether there is custom data + let cachedResponse = await (isFn(cacheFor) + ? cacheFor() + : // If it is a forced request, skip the step of getting it from the cache + // Otherwise, determine whether to use cached data + forceRequest + ? undefinedValue + : getWithCacheAdapter(id, methodKey, l1Cache)); + // If it is storage restore mode and there is no data in the cache, the persistent data needs to be restored to the cache, and the cached expiration time must be used. + if (cacheMode === STORAGE_RESTORE && !cachedResponse && !forceRequest) { + const rawL2CacheData = await getRawWithCacheAdapter(id, methodKey, l2Cache, tag); + if (rawL2CacheData) { + const [l2Response, l2ExpireMilliseconds] = rawL2CacheData; + await setWithCacheAdapter(id, methodKey, l2Response, l2ExpireMilliseconds, l1Cache, methodHitSource); + cachedResponse = l2Response; + } + } + // Clone the method as a parameter and pass it to beforeRequest to prevent side effects when using the original method instance request multiple times. + // Place it after `let cachedResponse = await...` to solve the problem of first assigning promise to the method instance in method.send, otherwise the promise will be undefined in clonedMethod. + const clonedMethod = cloneMethod(methodInstance); + // Call the hook function before sending the request + // beforeRequest supports synchronous functions and asynchronous functions + await beforeRequest(clonedMethod); + const { baseURL, url: newUrl, type, data } = clonedMethod; + const { params = {}, headers = {}, transform = $self, shareRequest } = getConfig(clonedMethod); + const namespacedAdapterReturnMap = (adapterReturnMap[id] = adapterReturnMap[id] || {}); + const requestBody = clonedMethod.data; + const requestBodyIsSpecial = isSpecialRequestBody(requestBody); + // Will not share the request when requestBody is special data + let requestAdapterCtrls = requestBodyIsSpecial ? undefinedValue : namespacedAdapterReturnMap[methodKey]; + let responseSuccessHandler = $self; + let responseErrorHandler = undefinedValue; + let responseCompleteHandler = noop; + // uniform handler of onSuccess, onError, onComplete + if (isFn(responded)) { + responseSuccessHandler = responded; + } + else if (isPlainObject(responded)) { + const { onSuccess: successHandler, onError: errorHandler, onComplete: completeHandler } = responded; + responseSuccessHandler = isFn(successHandler) ? successHandler : responseSuccessHandler; + responseErrorHandler = isFn(errorHandler) ? errorHandler : responseErrorHandler; + responseCompleteHandler = isFn(completeHandler) ? completeHandler : responseCompleteHandler; + } + // If there is no cache, make a request + if (cachedResponse !== undefinedValue) { + requestAdapterCtrlsPromiseResolveFn(); // Ctrls will not be passed in when cache is encountered + // Print cache log + clonedMethod.fromCache = trueValue; + sloughFunction(cacheLogger, defaultCacheLogger)(cachedResponse, clonedMethod, cacheMode, tag); + responseCompleteHandler(clonedMethod); + return cachedResponse; + } + fromCache = falseValue; + if (!shareRequest || !requestAdapterCtrls) { + // Request data + const ctrls = requestAdapter({ + url: buildCompletedURL(baseURL, newUrl, params), + type, + data, + headers + }, clonedMethod); + requestAdapterCtrls = namespacedAdapterReturnMap[methodKey] = ctrls; + } + // Pass request adapter ctrls to promise for use in on download, on upload and abort + requestAdapterCtrlsPromiseResolveFn(requestAdapterCtrls); + /** + * Process response tasks and do not cache data on failure + * @param responsePromise Respond to promise instances + * @param responseHeaders Request header + * @param callInSuccess Whether to call in success callback + * @returns Processed response + */ + const handleResponseTask = async (handlerReturns, responseHeaders, callInSuccess = trueValue) => { + const responseData = await handlerReturns; + const transformedData = await transform(responseData, responseHeaders || {}); + snapshots.save(methodInstance); + // Even if the cache operation fails, the response structure will be returned normally to avoid request errors caused by cache operation problems. + // The cache operation results can be obtained through `cacheAdapter.emitter.on('success' | 'fail', event => {})` + try { + // Automatic cache invalidation + await hitCacheBySource(clonedMethod); + } + catch (_a) { } + // Do not save cache when requestBody is special data + // Reason 1: Special data is generally submitted and requires interaction with the server. + // Reason 2: Special data is not convenient for generating cache keys + const toCache = !requestBody || !requestBodyIsSpecial; + // Use the latest expiration time after the response to cache data to avoid the problem of expiration time loss due to too long response time + if (toCache && callInSuccess) { + try { + await PromiseCls.all([ + setWithCacheAdapter(id, methodKey, transformedData, expireMilliseconds(MEMORY), l1Cache, methodHitSource), + toStorage && + setWithCacheAdapter(id, methodKey, transformedData, expireMilliseconds(STORAGE_RESTORE), l2Cache, methodHitSource, tag) + ]); + } + catch (_b) { } + } + // Deep clone the transformed data before returning to avoid reference issues + // the `deepClone` will only clone array and plain object + return deepClone(transformedData); + }; + return promiseFinally(promiseThen(PromiseCls.all([requestAdapterCtrls.response(), requestAdapterCtrls.headers()]), ([rawResponse, rawHeaders]) => { + // Regardless of whether the request succeeds or fails, the shared request needs to be removed first + deleteAttr(namespacedAdapterReturnMap, methodKey); + return handleResponseTask(responseSuccessHandler(rawResponse, clonedMethod), rawHeaders); + }, (error) => { + // Regardless of whether the request succeeds or fails, the shared request needs to be removed first + deleteAttr(namespacedAdapterReturnMap, methodKey); + return isFn(responseErrorHandler) + ? // When responding to an error, if no error is thrown, the successful response process will be processed, but the data will not be cached. + handleResponseTask(responseErrorHandler(error, clonedMethod), undefinedValue, falseValue) + : promiseReject(error); + }), () => { + responseCompleteHandler(clonedMethod); + }); + }; + return { + // request interrupt function + abort: () => { + promiseThen(requestAdapterCtrlsPromise, requestAdapterCtrls => requestAdapterCtrls && requestAdapterCtrls.abort()); + }, + onDownload: (handler) => { + promiseThen(requestAdapterCtrlsPromise, requestAdapterCtrls => requestAdapterCtrls && requestAdapterCtrls.onDownload && requestAdapterCtrls.onDownload(handler)); + }, + onUpload: (handler) => { + promiseThen(requestAdapterCtrlsPromise, requestAdapterCtrls => requestAdapterCtrls && requestAdapterCtrls.onUpload && requestAdapterCtrls.onUpload(handler)); + }, + response, + fromCache: () => fromCache + }; + } + + const offEventCallback = (offHandler, handlers) => () => { + const index = handlers.indexOf(offHandler); + index >= 0 && handlers.splice(index, 1); + }; + class Method { + constructor(type, context, url, config, data) { + this.dhs = []; + this.uhs = []; + this.fromCache = undefinedValue; + const abortRequest = () => { + abortRequest.a(); + }; + abortRequest.a = noop; + const instance = this; + const contextOptions = getContextOptions(context); + instance.abort = abortRequest; + instance.baseURL = contextOptions.baseURL || ''; + instance.url = url; + instance.type = type; + instance.context = context; + // Merge request-related global configuration into the method object + const contextConcatConfig = {}; + const mergedLocalCacheKey = 'cacheFor'; + const globalLocalCache = isPlainObject(contextOptions[mergedLocalCacheKey]) + ? contextOptions[mergedLocalCacheKey][type] + : undefinedValue; + const hitSource = config && config.hitSource; + // Merge parameters + forEach(['timeout', 'shareRequest'], mergedKey => { + if (contextOptions[mergedKey] !== undefinedValue) { + contextConcatConfig[mergedKey] = contextOptions[mergedKey]; + } + }); + // Merge local cache + if (globalLocalCache !== undefinedValue) { + contextConcatConfig[mergedLocalCacheKey] = globalLocalCache; + } + // Unify hit sources into arrays and convert them into method keys when there are method instances + if (hitSource) { + instance.hitSource = mapItem(isArray(hitSource) ? hitSource : [hitSource], sourceItem => instanceOf(sourceItem, Method) ? getMethodInternalKey(sourceItem) : sourceItem); + deleteAttr(config, 'hitSource'); + } + instance.config = { + ...contextConcatConfig, + headers: {}, + params: {}, + ...(config || {}) + }; + instance.data = data; + instance.meta = config ? config.meta : instance.meta; + // The original key needs to be used externally instead of generating the key in real time. + // The reason is that the parameters of the method may pass in reference type values, but when the reference type value changes externally, the key generated in real time also changes, so it is more accurate to use the initial key. + instance.key = instance.generateKey(); + } + /** + * Bind download progress callback function + * @param progressHandler Download progress callback function + * @version 2.17.0 + * @return unbind function + */ + onDownload(downloadHandler) { + pushItem(this.dhs, downloadHandler); + return offEventCallback(downloadHandler, this.dhs); + } + /** + * Bind upload progress callback function + * @param progressHandler Upload progress callback function + * @version 2.17.0 + * @return unbind function + */ + onUpload(uploadHandler) { + pushItem(this.uhs, uploadHandler); + return offEventCallback(uploadHandler, this.uhs); + } + /** + * Send a request through a method instance and return a promise object + */ + send(forceRequest = falseValue) { + const instance = this; + const { response, onDownload, onUpload, abort, fromCache } = sendRequest(instance, forceRequest); + len(instance.dhs) > 0 && + onDownload((loaded, total) => forEach(instance.dhs, handler => handler({ loaded, total }))); + len(instance.uhs) > 0 && onUpload((loaded, total) => forEach(instance.uhs, handler => handler({ loaded, total }))); + // The interrupt function is bound to the method instance for each request. The user can also interrupt the current request through method instance.abort() + instance.abort.a = abort; + instance.fromCache = undefinedValue; + instance.promise = promiseThen(response(), r => { + instance.fromCache = fromCache(); + return r; + }); + return instance.promise; + } + /** + * Set the method name, if there is already a name it will be overwritten + * @param name method name + */ + setName(name) { + getConfig(this).name = name; + } + generateKey() { + return key(this); + } + /** + * Bind callbacks for resolve and/or reject Promise + * @param onfulfilled The callback to be executed when resolving the Promise + * @param onrejected The callback to be executed when the Promise is rejected + * @returns Returns a Promise for executing any callbacks + */ + then(onfulfilled, onrejected) { + return promiseThen(this.send(), onfulfilled, onrejected); + } + /** + * Bind a callback only for reject Promise + * @param onrejected The callback to be executed when the Promise is rejected + * @returns Returns a Promise that completes the callback + */ + catch(onrejected) { + return promiseCatch(this.send(), onrejected); + } + /** + * Bind a callback that is called when the Promise is resolved (resolve or reject) + * @param onfinally Callback executed when Promise is resolved (resolve or reject). + * @return Returns a Promise that completes the callback. + */ + finally(onfinally) { + return promiseFinally(this.send(), onfinally); + } + } + + /** + * Custom assertion function, throws an error when the expression is false + * @param expression Judgment expression, true or false + * @param msg assert message + */ + const myAssert = createAssert(); + + // local storage will not fail the operation. + const EVENT_SUCCESS_KEY = 'success'; + const memoryAdapter = () => { + let l1Cache = {}; + const l1CacheEmitter = createEventManager(); + const adapter = { + set(key, value) { + l1Cache[key] = value; + l1CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'set', key, value, container: l1Cache }); + }, + get: key => { + const value = l1Cache[key]; + l1CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'get', key, value, container: l1Cache }); + return value; + }, + remove(key) { + deleteAttr(l1Cache, key); + l1CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'remove', key, container: l1Cache }); + }, + clear: () => { + l1Cache = {}; + l1CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'clear', key: '', container: l1Cache }); + }, + emitter: l1CacheEmitter + }; + return adapter; + }; + const localStorageAdapter = () => { + const l2CacheEmitter = createEventManager(); + const instance = localStorage; + const adapter = { + set: (key, value) => { + instance.setItem(key, JSONStringify(value)); + l2CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'set', key, value, container: instance }); + }, + get: key => { + const data = instance.getItem(key); + const value = data ? JSONParse(data) : data; + l2CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'get', key, value, container: instance }); + return value; + }, + remove: key => { + instance.removeItem(key); + l2CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'remove', key, container: instance }); + }, + clear: () => { + instance.clear(); + l2CacheEmitter.emit(EVENT_SUCCESS_KEY, { type: 'clear', key: '', container: instance }); + }, + emitter: l2CacheEmitter + }; + return adapter; + }; + const placeholderAdapter = () => { + const l2CacheNotDefinedAssert = () => { + myAssert(falseValue, 'l2Cache is not defined.'); + }; + return { + set: () => { + l2CacheNotDefinedAssert(); + }, + get: () => { + l2CacheNotDefinedAssert(); + return undefinedValue; + }, + remove: () => { + l2CacheNotDefinedAssert(); + }, + clear: () => { } + }; + }; + + const SetCls = Set; + class MethodSnapshotContainer { + constructor(capacity) { + /** + * Method instance snapshot collection, method instances that have sent requests will be saved + */ + this.records = {}; + this.occupy = 0; + myAssert(capacity >= 0, 'expected snapshots limit to be >= 0'); + this.capacity = capacity; + } + /** + * Save method instance snapshot + * @param methodInstance method instance + */ + save(methodInstance) { + const { name } = getConfig(methodInstance); + const { records, occupy, capacity } = this; + if (name && occupy < capacity) { + // Using the name of the method as the key, save the method instance to the snapshot + const targetSnapshots = (records[name] = records[name] || newInstance(SetCls)); + targetSnapshots.add(methodInstance); + // Statistical quantity + this.occupy += 1; + } + } + /** + * Get a Method instance snapshot, which will filter out the corresponding Method instance based on the matcher + * @param matcher Matching snapshot name, which can be a string or regular expression, or an object with a filter function + * @returns Array of matched Method instance snapshots + */ + match(matcher, matchAll = true) { + // Unify the filter parameters into name matcher and match handler + let nameString; + let nameReg; + let matchHandler; + let nameMatcher = matcher; + if (isPlainObject(matcher)) { + nameMatcher = matcher.name; + matchHandler = matcher.filter; + } + if (instanceOf(nameMatcher, RegExpCls)) { + nameReg = nameMatcher; + } + else if (isString(nameMatcher)) { + nameString = nameMatcher; + } + const { records } = this; + // Get the corresponding method instance snapshot through the deconstructed name matcher and filter handler + let matches = newInstance((SetCls)); + // If the namespace parameter is provided, it will only be searched in this namespace, otherwise it will be searched in all cached data. + if (nameString) { + matches = records[nameString] || matches; + } + else if (nameReg) { + forEach(filterItem(objectKeys(records), methodName => nameReg.test(methodName)), methodName => { + records[methodName].forEach(method => matches.add(method)); + }); + } + const fromMatchesArray = isFn(matchHandler) ? filterItem([...matches], matchHandler) : [...matches]; + return (matchAll ? fromMatchesArray : fromMatchesArray[0]); + } + } + + const typeGet = 'GET'; + const typeHead = 'HEAD'; + const typePost = 'POST'; + const typePut = 'PUT'; + const typePatch = 'PATCH'; + const typeDelete = 'DELETE'; + const typeOptions = 'OPTIONS'; + const defaultAlovaOptions = { + /** + * GET requests are cached for 5 minutes (300000 milliseconds) by default, and other requests are not cached by default. + */ + cacheFor: { + [typeGet]: 300000 + }, + /** + * Share requests default to true + */ + shareRequest: trueValue, + /** + * Number of method snapshots, default is 1000 + */ + snapshots: 1000 + }; + let idCount = 0; + class Alova { + constructor(options) { + var _a, _b; + const instance = this; + instance.id = (options.id || (idCount += 1)).toString(); + // If storage is not specified, local storage is used by default. + instance.l1Cache = options.l1Cache || memoryAdapter(); + instance.l2Cache = + options.l2Cache || (typeof localStorage !== 'undefined' ? localStorageAdapter() : placeholderAdapter()); + // Merge default options + instance.options = { + ...defaultAlovaOptions, + ...options + }; + instance.snapshots = newInstance((MethodSnapshotContainer), (_b = (_a = options.snapshots) !== null && _a !== void 0 ? _a : defaultAlovaOptions.snapshots) !== null && _b !== void 0 ? _b : 0); + } + Get(url, config) { + return newInstance((Method), typeGet, this, url, config); + } + Post(url, data, config) { + return newInstance((Method), typePost, this, url, config, data); + } + Delete(url, data, config) { + return newInstance((Method), typeDelete, this, url, config, data); + } + Put(url, data, config) { + return newInstance((Method), typePut, this, url, config, data); + } + Head(url, config) { + return newInstance((Method), typeHead, this, url, config); + } + Patch(url, data, config) { + return newInstance((Method), typePatch, this, url, config, data); + } + Options(url, config) { + return newInstance((Method), typeOptions, this, url, config); + } + } + let boundStatesHook = undefinedValue; + const usingL1CacheAdapters = []; + const usingL2CacheAdapters = []; + /** + * create an alova instance. + * @param options alova configuration. + * @returns alova instance. + */ + const createAlova = (options) => { + const alovaInstance = newInstance((Alova), options); + const newStatesHook = alovaInstance.options.statesHook; + if (boundStatesHook) { + myAssert(boundStatesHook === newStatesHook, 'expected to use the same `statesHook`'); + } + boundStatesHook = newStatesHook; + const { l1Cache, l2Cache } = alovaInstance; + !usingL1CacheAdapters.includes(l1Cache) && pushItem(usingL1CacheAdapters, l1Cache); + !usingL2CacheAdapters.includes(l2Cache) && pushItem(usingL2CacheAdapters, l2Cache); + return alovaInstance; + }; + + const promiseStatesHook = () => { + myAssert(!!boundStatesHook, '`statesHook` is not set in alova instance'); + return boundStatesHook; + }; + + exports.Method = Method; + exports.createAlova = createAlova; + exports.globalConfig = globalConfig; + exports.hitCacheBySource = hitCacheBySource; + exports.invalidateCache = invalidateCache; + exports.promiseStatesHook = promiseStatesHook; + exports.queryCache = queryCache; + exports.setCache = setCache; + +})); diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.umd.min.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.umd.min.js new file mode 100644 index 0000000..f75a3a6 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/alova.umd.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).alova={})}(this,(function(t){"use strict";const e="undefined",a=Promise,o=Object,s=RegExp,n=void 0,r=null,c=!0,i=!1,l=(t,e,a)=>t.then(e,a),h=(t,e)=>t.finally(e),u=(t,e,a)=>JSON.stringify(t,e,a),d=t=>o.keys(t),p=(t,e)=>t.forEach(e),f=(t,...e)=>t.push(...e),m=(t,e)=>t.map(e),y=(t,e)=>t.filter(e),g=t=>t.length,w=t=>Array.isArray(t),C=(t,e)=>delete t[e],v=t=>typeof t,b=typeof window===e&&(typeof process!==e?"function"==typeof process.cwd:typeof Deno!==e),S="memory",$="restore",k=()=>{},x=t=>t,E=t=>"function"===v(t),T=t=>o.prototype.toString.call(t),D=t=>"[object Object]"===T(t),H=(t,e)=>t instanceof e,M=t=>t?t.getTime():Date.now(),O=t=>t.context,R=t=>t.config,U=t=>t.options,j=t=>t.key,P=t=>{const{cacheFor:e}=R(t),a=t=>{return"number"!==v(e=t)||Number.isNaN(e)?M(t||n):M()+t;var e};let o=S,s=()=>0,r=i,c=n;const l=E(e);if(!l){let i=e;if(D(e)){const{mode:t=S,expire:a,tag:s}=e||{};o=t,r=t===$,c=s?s.toString():n,i=a}s=e=>a(E(i)?i({method:t,mode:e}):i)}return{f:e,c:l,e:s,m:o,s:r,t:c}},A=(t,...e)=>new t(...e),N=(t,e)=>"$a."+t+e,q=(t,e,a)=>{t=t.endsWith("/")?t.slice(0,-1):t,""!==e&&(e=e.match(/^(\/|https?:\/\/)/)?e:`/${e}`);const o=t+e,s=m(y(d(a),(t=>a[t]!==n)),(t=>`${t}=${a[t]}`)).join("&");return s?+o.includes("?")?`${o}&${s}`:`${o}?${s}`:o},F=t=>{if(w(t))return m(t,F);if(D(t)&&t.constructor===o){const e={};return p(d(t),(a=>{e[a]=F(t[a])})),e}return t};class L extends Error{constructor(t,e,a){super(e+(a?`\n\nFor detailed: https://alova.js.org/error#${a}`:"")),this.name=`[alova${t?`/${t}`:""}]`}}const B=()=>{const t={};return{eventMap:t,on(e,a){const o=t[e]=t[e]||[];return f(o,a),()=>{t[e]=y(o,(t=>t!==a))}},off(e,a){const o=t[e];if(o)if(a){const t=o.indexOf(a);t>-1&&o.splice(t,1)}else delete t[e]},emit(e,a){const o=t[e]||[];return m(o,(t=>t(a)))}}};t.globalConfigMap={autoHitCache:"global",ssr:b};const I="color: black; font-size: 12px; font-weight: bolder";var _=(e,a,o,s)=>{const n=console,r=(...t)=>console.log(...t),{url:c}=a,i=o===$,l="%s",h="%s",u=` [HitCache]${c} `,d=()=>Array(g(u)+1).join("^");t.globalConfigMap.ssr?(r(l,u),r(h," Cache ",e),r(h," Mode ",o),i&&r(h," Tag ",s),r(h,d())):(n.groupCollapsed?n.groupCollapsed("%cHitCache","padding: 2px 6px; background: #c4fcd3; color: #53b56d;",c):r(l,u),r("%c[Cache]",I,e),r("%c[Mode]",I,o),i&&r("%c[Tag]",I,s),r("%c[Method]",I,a),n.groupEnd?n.groupEnd():r(h,d()))};const G=t=>`hss.${t}`,J="hsr.",K=t=>J+t,z="$$hsrs",W="__$<>$__",Q=(t,e)=>{t[e]=0},V=async(t,e,o,r,c,i,l)=>{if(r>M()&&o){const h=N(t,e);if(await c.set(h,y([o,r===1/0?n:r,l],Boolean)),i){const t={},e=[];p(i,(a=>{const o=H(a,s),n=o?a.source+(a.flags?W+a.flags:""):a;n&&(o&&!t[n]&&f(e,n),Q(t,o?K(n):G(n)))}));const o=m(d(t),(async t=>{const e=await c.get(t)||{};Q(e,h),await c.set(t,e)})),n=async()=>{if(g(e)){const t=await c.get(z)||[];f(t,...e),await c.set(z,t)}};await a.all([...o,n()])}}},X=async(t,e,a)=>{const o=N(t,e);await a.remove(o)},Y=async(t,e,a,o)=>{const s=await a.get(N(t,e));if(s){const[n,r,c]=s;if(c===o&&(!r||r>M()))return s;await X(t,e,a)}},Z=async(t,e,a,o)=>{const s=await Y(t,e,a,o);return s?s[0]:n},tt=async t=>a.all(t.map((t=>t.clear())));var et=t=>{const{data:e,config:a}=t,s={...a},{headers:n={},params:r={}}=s,c=O(t);s.headers={...n},s.params={...r};return((t,...e)=>o.assign(t,...e))(A(rt,t.type,c,t.url,s,e),{...t,config:s})};const at=async e=>{const{autoHitCache:o}=t.globalConfigMap,{l1Cache:n,l2Cache:r}=O(e),c=j(e),{name:i}=R(e),l={global:[...gt,...wt],self:[n,r],close:[]}[o];l&&g(l)&&await a.all(m(l,(t=>(async(t,e,o)=>{const n=`${e}`,r={},c=G(t);let i;if(r[c]=await o.get(c),e){const t=G(n);r[t]=await o.get(t),i=await o.get(z);const e=[];i&&g(i)&&(p(i,(t=>{const[a,o]=t.split(W);A(s,a,o).test(n)&&f(e,t)})),await a.all(m(e,(async t=>{const e=K(t);r[e]=await o.get(e)}))))}const l=async t=>{try{await o.remove(t);for(const e in r){const a=r[e];a&&C(a,t)}}catch(t){}},h={};await a.all(m(d(r),(async t=>{const e=r[t];if(e){const t=[];for(const a in e)h[a]||(Q(h,a),f(t,l(a)));await a.all(t)}})));const u=g(i||[]);await a.all(m(d(r),(async t=>{const e=r[t];e&&(g(d(e))?await o.set(t,e):(await o.remove(t),t.includes(J)&&i&&(i=y(i,(e=>K(e)!==t)))))}))),u!==g(i||[])&&await o.set(z,i)})(c,i,t))))},ot={};function st(t,e){let o,s=c;const u=A(a,(t=>{o=t}));return{abort:()=>{l(u,(t=>t&&t.abort()))},onDownload:t=>{l(u,(e=>e&&e.onDownload&&e.onDownload(t)))},onUpload:t=>{l(u,(e=>e&&e.onUpload&&e.onUpload(t)))},response:async()=>{const{beforeRequest:u=k,responded:d,requestAdapter:p,cacheLogger:f}=(t=>U(O(t)))(t),m=j(t),{s:y,t:g,m:w,e:v}=P(t),{id:b,l1Cache:M,l2Cache:A,snapshots:N}=O(t),{cacheFor:L}=R(t),{hitSource:B}=t;let I=await(E(L)?L():e?n:Z(b,m,M));if(w===$&&!I&&!e){const t=await Y(b,m,A,g);if(t){const[e,a]=t;await V(b,m,e,a,M,B),I=e}}const G=et(t);await u(G);const{baseURL:J,url:K,type:z,data:W}=G,{params:Q={},headers:X={},transform:tt=x,shareRequest:st}=R(G),nt=ot[b]=ot[b]||{},rt=G.data,ct=(t=>{const e=T(t);return/^\[object (Blob|FormData|ReadableStream|URLSearchParams)\]$/i.test(e)||H(t,ArrayBuffer)})(rt);let it=ct?n:nt[m],lt=x,ht=n,ut=k;if(E(d))lt=d;else if(D(d)){const{onSuccess:t,onError:e,onComplete:a}=d;lt=E(t)?t:lt,ht=E(e)?e:ht,ut=E(a)?a:ut}if(I!==n)return o(),G.fromCache=c,(pt=_,E(dt=f)?dt:[i,r].includes(dt)?k:pt)(I,G,w,g),ut(G),I;var dt,pt;if(s=i,!st||!it){const t=p({url:q(J,K,Q),type:z,data:W,headers:X},G);it=nt[m]=t}o(it);const ft=async(e,o,s=true)=>{const n=await e,r=await tt(n,o||{});N.save(t);try{await at(G)}catch(t){}if((!rt||!ct)&&s)try{await a.all([V(b,m,r,v(S),M,B),y&&V(b,m,r,v($),A,B,g)])}catch(t){}return F(r)};return h(l(a.all([it.response(),it.headers()]),(([t,e])=>(C(nt,m),ft(lt(t,G),e))),(t=>{return C(nt,m),E(ht)?ft(ht(t,G),n,i):(e=t,a.reject(e));var e})),(()=>{ut(G)}))},fromCache:()=>s}}const nt=(t,e)=>()=>{const a=e.indexOf(t);a>=0&&e.splice(a,1)};class rt{constructor(t,e,a,o,s){this.dhs=[],this.uhs=[],this.fromCache=n;const r=()=>{r.a()};r.a=k;const c=this,i=U(e);c.abort=r,c.baseURL=i.baseURL||"",c.url=a,c.type=t,c.context=e;const l={},h="cacheFor",u=D(i[h])?i[h][t]:n,d=o&&o.hitSource;p(["timeout","shareRequest"],(t=>{i[t]!==n&&(l[t]=i[t])})),u!==n&&(l[h]=u),d&&(c.hitSource=m(w(d)?d:[d],(t=>H(t,rt)?j(t):t)),C(o,"hitSource")),c.config={...l,headers:{},params:{},...o||{}},c.data=s,c.meta=o?o.meta:c.meta,c.key=c.generateKey()}onDownload(t){return f(this.dhs,t),nt(t,this.dhs)}onUpload(t){return f(this.uhs,t),nt(t,this.uhs)}send(t=i){const e=this,{response:a,onDownload:o,onUpload:s,abort:r,fromCache:c}=st(e,t);return g(e.dhs)>0&&o(((t,a)=>p(e.dhs,(e=>e({loaded:t,total:a}))))),g(e.uhs)>0&&s(((t,a)=>p(e.uhs,(e=>e({loaded:t,total:a}))))),e.abort.a=r,e.fromCache=n,e.promise=l(a(),(t=>(e.fromCache=c(),t))),e.promise}setName(t){R(this).name=t}generateKey(){return(t=>{const{params:e,headers:a}=R(t);return u([t.type,t.url,e,t.data,a])})(this)}then(t,e){return l(this.send(),t,e)}catch(t){return((t,e)=>t.catch(e))(this.send(),t)}finally(t){return h(this.send(),t)}}const ct=((t="")=>(e,a,o)=>{if(!e)throw A(L,t,a,o)})(),it="success",lt=()=>{const t=B(),e=localStorage,a={set:(a,o)=>{e.setItem(a,u(o)),t.emit(it,{type:"set",key:a,value:o,container:e})},get:a=>{const o=e.getItem(a),s=o?(t=>JSON.parse(t))(o):o;return t.emit(it,{type:"get",key:a,value:s,container:e}),s},remove:a=>{e.removeItem(a),t.emit(it,{type:"remove",key:a,container:e})},clear:()=>{e.clear(),t.emit(it,{type:"clear",key:"",container:e})},emitter:t};return a},ht=Set;class ut{constructor(t){this.records={},this.occupy=0,ct(t>=0,"expected snapshots limit to be >= 0"),this.capacity=t}save(t){const{name:e}=R(t),{records:a,occupy:o,capacity:s}=this;if(e&&oo.test(t))),(t=>{c[t].forEach((t=>i.add(t)))}));const l=E(n)?y([...i],n):[...i];return e?l:l[0]}}const dt="GET",pt={cacheFor:{[dt]:3e5},shareRequest:c,snapshots:1e3};let ft=0;class mt{constructor(t){var e,a;const o=this;o.id=(t.id||(ft+=1)).toString(),o.l1Cache=t.l1Cache||(()=>{let t={};const e=B(),a={set(a,o){t[a]=o,e.emit(it,{type:"set",key:a,value:o,container:t})},get:a=>{const o=t[a];return e.emit(it,{type:"get",key:a,value:o,container:t}),o},remove(a){C(t,a),e.emit(it,{type:"remove",key:a,container:t})},clear:()=>{t={},e.emit(it,{type:"clear",key:"",container:t})},emitter:e};return a})(),o.l2Cache=t.l2Cache||("undefined"!=typeof localStorage?lt():(()=>{const t=()=>{ct(i,"l2Cache is not defined.")};return{set:()=>{t()},get:()=>(t(),n),remove:()=>{t()},clear:()=>{}}})()),o.options={...pt,...t},o.snapshots=A(ut,null!==(a=null!==(e=t.snapshots)&&void 0!==e?e:pt.snapshots)&&void 0!==a?a:0)}Get(t,e){return A(rt,"GET",this,t,e)}Post(t,e,a){return A(rt,"POST",this,t,a,e)}Delete(t,e,a){return A(rt,"DELETE",this,t,a,e)}Put(t,e,a){return A(rt,"PUT",this,t,a,e)}Head(t,e){return A(rt,"HEAD",this,t,e)}Patch(t,e,a){return A(rt,"PATCH",this,t,a,e)}Options(t,e){return A(rt,"OPTIONS",this,t,e)}}let yt=n;const gt=[],wt=[];t.Method=rt,t.createAlova=t=>{const e=A(mt,t),a=e.options.statesHook;yt&&ct(yt===a,"expected to use the same `statesHook`"),yt=a;const{l1Cache:o,l2Cache:s}=e;return!gt.includes(o)&&f(gt,o),!wt.includes(s)&&f(wt,s),e},t.globalConfig=e=>{t.globalConfigMap={...t.globalConfigMap,...e}},t.hitCacheBySource=at,t.invalidateCache=async t=>{if(!t)return void await a.all([tt(gt),tt(wt)]);const e=(w(t)?t:[t]).map((t=>{const{id:e,l1Cache:o,l2Cache:s}=O(t),{c:n,m:r}=P(t);if(n)return;const c=j(t);return a.all([X(e,c,o),r===$?X(e,c,s):a.resolve(i)]);var i}));await a.all(e)},t.promiseStatesHook=()=>(ct(!!yt,"`statesHook` is not set in alova instance"),yt),t.queryCache=async(t,{policy:e="all"}={})=>{if(t&&t.key){const{id:a,l1Cache:o,l2Cache:s}=O(t),r=j(t),{f:c,c:i,s:l,e:h,t:u}=P(t);if(i)return c();let d="l2"!==e?await Z(a,r,o):n;return"l2"===e?d=await Z(a,r,s,u):"all"!==e||d||l&&h($)>M()&&(d=await Z(a,r,s,u)),d}},t.setCache=async(t,e,{policy:o="all"}={})=>{const s=(w(t)?t:[t]).map((async t=>{const{hitSource:s}=t,{id:r,l1Cache:c,l2Cache:i}=O(t),l=j(t),{e:h,s:u,t:d,c:p}=P(t);if(p)return;let f=e;if(E(e)){let t="l2"!==o?await Z(r,l,c):n;if(("l2"===o||"all"===o&&!t&&u&&h($)>M())&&(t=await Z(r,l,i,d)),f=e(t),f===n)return}return a.all(["l2"!==o&&V(r,l,f,h(S),c,s),"l2"===o||"all"===o&&u?V(r,l,f,h($),i,s,d):n])}));return a.all(s)}})); diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.common.cjs b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.common.cjs new file mode 100644 index 0000000..e7051ef --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.common.cjs @@ -0,0 +1,3463 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +'use strict'; + +var shared = require('@alova/shared'); +var alova = require('alova'); + +const defaultVisitorMeta = { + authRole: null +}; +const defaultLoginMeta = { + authRole: 'login' +}; +const defaultLogoutMeta = { + authRole: 'logout' +}; +const defaultRefreshTokenMeta = { + authRole: 'refreshToken' +}; +const checkMethodRole = ({ meta }, metaMatches) => { + if (shared.isPlainObject(meta)) { + for (const key in meta) { + if (Object.prototype.hasOwnProperty.call(meta, key)) { + const matchedMetaItem = metaMatches[key]; + if (shared.instanceOf(matchedMetaItem, RegExp) ? matchedMetaItem.test(meta[key]) : meta[key] === matchedMetaItem) { + return shared.trueValue; + } + } + } + } + return shared.falseValue; +}; +const waitForTokenRefreshed = (method, waitingList) => shared.newInstance(shared.PromiseCls, resolve => { + shared.pushItem(waitingList, { + method, + resolve + }); +}); +const callHandlerIfMatchesMeta = (method, authorizationInterceptor, defaultMeta, response) => { + if (checkMethodRole(method, (authorizationInterceptor === null || authorizationInterceptor === void 0 ? void 0 : authorizationInterceptor.metaMatches) || defaultMeta)) { + const handler = shared.isFn(authorizationInterceptor) + ? authorizationInterceptor + : shared.isPlainObject(authorizationInterceptor) && shared.isFn(authorizationInterceptor.handler) + ? authorizationInterceptor.handler + : shared.noop; + return handler(response, method); + } +}; +const refreshTokenIfExpired = async (method, waitingList, updateRefreshStatus, handlerParams, refreshToken, tokenRefreshing) => { + // When the number of handle params is greater than 2, it means that this function is called from the response, and the original interface needs to be requested again. + const fromResponse = shared.len(handlerParams) >= 2; + let isExpired = refreshToken === null || refreshToken === void 0 ? void 0 : refreshToken.isExpired(...handlerParams); + // Compatible with synchronous and asynchronous functions + if (shared.instanceOf(isExpired, shared.PromiseCls)) { + isExpired = await isExpired; + } + if (isExpired) { + try { + // Make another judgment in the response to prevent multiple requests to refresh the token, intercept and wait for the token sent before the token refresh is completed. + let intentToRefreshToken = shared.trueValue; + if (fromResponse && tokenRefreshing) { + intentToRefreshToken = shared.falseValue; // The requests waiting here indicate that the token is being refreshed. When they pass, there is no need to refresh the token again. + await waitForTokenRefreshed(method, waitingList); + } + if (intentToRefreshToken) { + updateRefreshStatus(shared.trueValue); + // Call refresh token + await (refreshToken === null || refreshToken === void 0 ? void 0 : refreshToken.handler(...handlerParams)); + updateRefreshStatus(shared.falseValue); + // After the token refresh is completed, the requests in the waiting list are notified. + shared.forEach(waitingList, ({ resolve }) => resolve()); + } + if (fromResponse) { + // Because the original interface is being requested again, superposition with the previous request will result in repeated calls to transform, so it is necessary to leave transform empty to remove one call. + const { config } = method; + const methodTransformData = config.transform; + config.transform = shared.undefinedValue; + const resentData = await method; + config.transform = methodTransformData; + return resentData; + } + } + finally { + updateRefreshStatus(shared.falseValue); + shared.splice(waitingList, 0, shared.len(waitingList)); // Clear waiting list + } + } +}; +const onResponded2Record = (onRespondedHandlers) => { + let successHandler = shared.undefinedValue; + let errorHandler = shared.undefinedValue; + let onCompleteHandler = shared.undefinedValue; + if (shared.isFn(onRespondedHandlers)) { + successHandler = onRespondedHandlers; + } + else if (shared.isPlainObject(onRespondedHandlers)) { + const { onSuccess, onError, onComplete } = onRespondedHandlers; + successHandler = shared.isFn(onSuccess) ? onSuccess : successHandler; + errorHandler = shared.isFn(onError) ? onError : errorHandler; + onCompleteHandler = shared.isFn(onComplete) ? onComplete : onCompleteHandler; + } + return { + onSuccess: successHandler, + onError: errorHandler, + onComplete: onCompleteHandler + }; +}; + +/** + * Create a client-side token authentication interceptor + * @param options Configuration parameters + * @returns token authentication interceptor function + */ +const createClientTokenAuthentication = ({ visitorMeta, login, logout, refreshToken, assignToken = shared.noop }) => { + let tokenRefreshing = shared.falseValue; + const waitingList = []; + const onAuthRequired = onBeforeRequest => async (method) => { + const isVisitorRole = checkMethodRole(method, visitorMeta || defaultVisitorMeta); + const isLoginRole = checkMethodRole(method, (login === null || login === void 0 ? void 0 : login.metaMatches) || defaultLoginMeta); + // Ignored, login, and token refresh requests do not perform token authentication. + if (!isVisitorRole && + !isLoginRole && + !checkMethodRole(method, (refreshToken === null || refreshToken === void 0 ? void 0 : refreshToken.metaMatches) || defaultRefreshTokenMeta)) { + // If the token is being refreshed, wait for the refresh to complete before sending a request. + if (tokenRefreshing) { + await waitForTokenRefreshed(method, waitingList); + } + await refreshTokenIfExpired(method, waitingList, refreshing => { + tokenRefreshing = refreshing; + }, [method], refreshToken); + } + // Requests from non-guest and logged-in roles will enter the assignment token function + if (!isVisitorRole && !isLoginRole) { + await assignToken(method); + } + return onBeforeRequest === null || onBeforeRequest === void 0 ? void 0 : onBeforeRequest(method); + }; + const onResponseRefreshToken = originalResponded => { + const respondedRecord = onResponded2Record(originalResponded); + return { + ...respondedRecord, + onSuccess: async (response, method) => { + await callHandlerIfMatchesMeta(method, login, defaultLoginMeta, response); + await callHandlerIfMatchesMeta(method, logout, defaultLogoutMeta, response); + return (respondedRecord.onSuccess || shared.$self)(response, method); + } + }; + }; + return { + waitingList, + onAuthRequired, + onResponseRefreshToken + }; +}; +/** + * Create a server-side token authentication interceptor + * @param options Configuration parameters + * @returns token authentication interceptor function + */ +const createServerTokenAuthentication = ({ visitorMeta, login, logout, refreshTokenOnSuccess, refreshTokenOnError, assignToken = shared.noop }) => { + let tokenRefreshing = shared.falseValue; + const waitingList = []; + const onAuthRequired = onBeforeRequest => async (method) => { + const isVisitorRole = checkMethodRole(method, visitorMeta || defaultVisitorMeta); + const isLoginRole = checkMethodRole(method, (login === null || login === void 0 ? void 0 : login.metaMatches) || defaultLoginMeta); + // Ignored, login, and token refresh requests do not perform token authentication. + if (!isVisitorRole && + !isLoginRole && + !checkMethodRole(method, (refreshTokenOnSuccess === null || refreshTokenOnSuccess === void 0 ? void 0 : refreshTokenOnSuccess.metaMatches) || defaultRefreshTokenMeta) && + !checkMethodRole(method, (refreshTokenOnError === null || refreshTokenOnError === void 0 ? void 0 : refreshTokenOnError.metaMatches) || defaultRefreshTokenMeta)) { + // If the token is being refreshed, wait for the refresh to complete before sending a request. + if (tokenRefreshing) { + await waitForTokenRefreshed(method, waitingList); + } + } + if (!isVisitorRole && !isLoginRole) { + await assignToken(method); + } + return onBeforeRequest === null || onBeforeRequest === void 0 ? void 0 : onBeforeRequest(method); + }; + const onResponseRefreshToken = onRespondedHandlers => { + const respondedRecord = onResponded2Record(onRespondedHandlers); + return { + ...respondedRecord, + onSuccess: async (response, method) => { + if (!checkMethodRole(method, visitorMeta || defaultVisitorMeta) && + !checkMethodRole(method, (login === null || login === void 0 ? void 0 : login.metaMatches) || defaultLoginMeta) && + !checkMethodRole(method, (refreshTokenOnSuccess === null || refreshTokenOnSuccess === void 0 ? void 0 : refreshTokenOnSuccess.metaMatches) || defaultRefreshTokenMeta)) { + const dataResent = await refreshTokenIfExpired(method, waitingList, refreshing => { + tokenRefreshing = refreshing; + }, [response, method], refreshTokenOnSuccess, tokenRefreshing); + if (dataResent) { + return dataResent; + } + } + await callHandlerIfMatchesMeta(method, login, defaultLoginMeta, response); + await callHandlerIfMatchesMeta(method, logout, defaultLogoutMeta, response); + return (respondedRecord.onSuccess || shared.$self)(response, method); + }, + onError: async (error, method) => { + if (!checkMethodRole(method, visitorMeta || defaultVisitorMeta) && + !checkMethodRole(method, (login === null || login === void 0 ? void 0 : login.metaMatches) || defaultLoginMeta) && + !checkMethodRole(method, (refreshTokenOnError === null || refreshTokenOnError === void 0 ? void 0 : refreshTokenOnError.metaMatches) || defaultRefreshTokenMeta)) { + const dataResent = await refreshTokenIfExpired(method, waitingList, refreshing => { + tokenRefreshing = refreshing; + }, [error, method], refreshTokenOnError, tokenRefreshing); + if (dataResent) { + return dataResent; + } + } + return (respondedRecord.onError || shared.noop)(error, method); + } + }; + }; + return { + waitingList, + onAuthRequired, + onResponseRefreshToken + }; +}; + +/** + * Compatible functions, throwing parameters + * @param error mistake + */ +const throwFn = (error) => { + throw error; +}; +function useCallback(onCallbackChange = shared.noop) { + let callbacks = []; + const setCallback = (fn) => { + if (!callbacks.includes(fn)) { + callbacks.push(fn); + onCallbackChange(callbacks); + } + // Return unregister function + return () => { + callbacks = shared.filterItem(callbacks, e => e !== fn); + onCallbackChange(callbacks); + }; + }; + const triggerCallback = (...args) => { + if (callbacks.length > 0) { + return shared.forEach(callbacks, fn => fn(...args)); + } + }; + const removeAllCallback = () => { + callbacks = []; + onCallbackChange(callbacks); + }; + return [setCallback, triggerCallback, removeAllCallback]; +} +/** + * Create a debounce function and trigger the function immediately when delay is 0 + * Scenario: When calling useWatcher and setting immediate to true, the first call must be executed immediately, otherwise it will cause a delayed call + * @param {GeneralFn} fn callback function + * @param {number|(...args: any[]) => number} delay Delay description, dynamic delay can be achieved when set as a function + * @returns Delayed callback function + */ +const debounce = (fn, delay) => { + let timer = shared.nullValue; + return function debounceFn(...args) { + const bindFn = fn.bind(this, ...args); + const delayMill = shared.isNumber(delay) ? delay : delay(...args); + timer && shared.clearTimeoutTimer(timer); + if (delayMill > 0) { + timer = shared.setTimeoutFn(bindFn, delayMill); + } + else { + bindFn(); + } + }; +}; +/** + * Get the request method object + * @param methodHandler Request method handle + * @param args Method call parameters + * @returns request method object + */ +const getHandlerMethod = (methodHandler, args = []) => { + const methodInstance = shared.isFn(methodHandler) ? methodHandler(...args) : methodHandler; + shared.createAssert('scene')(shared.instanceOf(methodInstance, alova.Method), 'hook handler must be a method instance or a function that returns method instance'); + return methodInstance; +}; +/** + * Convert each value of the object and return the new object + * @param obj object + * @param callback callback function + * @returns converted object + */ +const mapObject = (obj, callback) => { + const ret = {}; + for (const key in obj) { + ret[key] = callback(obj[key], key, obj); + } + return ret; +}; +var EnumHookType; +(function (EnumHookType) { + EnumHookType[EnumHookType["USE_REQUEST"] = 1] = "USE_REQUEST"; + EnumHookType[EnumHookType["USE_WATCHER"] = 2] = "USE_WATCHER"; + EnumHookType[EnumHookType["USE_FETCHER"] = 3] = "USE_FETCHER"; +})(EnumHookType || (EnumHookType = {})); +/** + * create simple and unified, framework-independent states creators and handlers. + * @param statesHook states hook from `promiseStatesHook` function of alova + * @param referingObject refering object exported from `promiseStatesHook` function + * @returns simple and unified states creators and handlers + */ +function statesHookHelper(statesHook, referingObject = { trackedKeys: {}, bindError: shared.falseValue }) { + const ref = (initialValue) => (statesHook.ref ? statesHook.ref(initialValue) : { current: initialValue }); + referingObject = ref(referingObject).current; + const exportState = (state) => (statesHook.export || shared.$self)(state, referingObject); + const memorize = (fn) => { + if (!shared.isFn(statesHook.memorize)) { + return fn; + } + const memorizedFn = statesHook.memorize(fn); + memorizedFn.memorized = true; + return memorizedFn; + }; + const { dehydrate } = statesHook; + // For performance reasons, only value is different, and the key is tracked can be updated. + const update = (newValue, state, key) => newValue !== dehydrate(state, key, referingObject) && + referingObject.trackedKeys[key] && + statesHook.update(newValue, state, key, referingObject); + const mapDeps = (deps) => shared.mapItem(deps, item => (shared.instanceOf(item, shared.FrameworkReadableState) ? item.e : item)); + const createdStateList = []; + // key of deps on computed + const depKeys = {}; + return { + create: (initialValue, key) => { + shared.pushItem(createdStateList, key); // record the keys of created states. + return shared.newInstance((shared.FrameworkState), statesHook.create(initialValue, key, referingObject), key, state => dehydrate(state, key, referingObject), exportState, (state, newValue) => update(newValue, state, key)); + }, + computed: (getter, depList, key) => { + // Collect all dependencies in computed + shared.forEach(depList, dep => { + if (dep.k) { + depKeys[dep.k] = true; + } + }); + return shared.newInstance((shared.FrameworkReadableState), statesHook.computed(getter, mapDeps(depList), key, referingObject), key, state => dehydrate(state, key, referingObject), exportState); + }, + effectRequest: (effectRequestParams) => statesHook.effectRequest(effectRequestParams, referingObject), + ref, + watch: (source, callback) => statesHook.watch(mapDeps(source), callback, referingObject), + onMounted: (callback) => statesHook.onMounted(callback, referingObject), + onUnmounted: (callback) => statesHook.onUnmounted(callback, referingObject), + memorize, + /** + * refering object that sharing some value with this object. + */ + __referingObj: referingObject, + /** + * expose provider for specified use hook. + * @param object object that contains state proxy, framework state, operating function and event binder. + * @returns provider component. + */ + exposeProvider: (object) => { + const provider = {}; + const originalStatesMap = {}; + for (const key in object) { + const value = object[key]; + const isValueFunction = shared.isFn(value); + // if it's a memorized function, don't memorize it any more, add it to provider directly. + // if it's start with `on`, that indicates it is an event binder, we should define a new function which return provider object. + // if it's a common function, add it to provider with memorize mode. + // Note that: in some situation, state is a function such as solid's signal, and state value is set to function in react, the state will be detected as a function. so we should check whether the key is in `trackedKeys` + if (isValueFunction && !referingObject.trackedKeys[key]) { + provider[key] = key.startsWith('on') + ? (...args) => { + value(...args); + // eslint-disable-next-line + return completedProvider; + } + : value.memorized + ? value + : memorize(value); + } + else { + const isFrameworkState = shared.instanceOf(value, shared.FrameworkReadableState); + if (isFrameworkState) { + originalStatesMap[key] = value.s; + } + // otherwise, it's a state proxy or framework state, add it to provider with getter mode. + shared.ObjectCls.defineProperty(provider, key, { + get: () => { + // record the key that is being tracked. + referingObject.trackedKeys[key] = shared.trueValue; + return isFrameworkState ? value.e : value; + }, + // set need to set an function, + // otherwise it will throw `TypeError: Cannot set property __referingObj of # which has only a getter` when setting value + set: shared.noop, + enumerable: shared.trueValue, + configurable: shared.trueValue + }); + } + } + const { update: nestedHookUpdate, __proxyState: nestedProxyState } = provider; + // reset the tracked keys and bingError flag, so that the nest hook providers can be initialized. + // Always track the dependencies in computed + referingObject.trackedKeys = { + ...depKeys + }; + referingObject.bindError = shared.falseValue; + const extraProvider = { + // expose referingObject automatically. + __referingObj: referingObject, + // the new updating function that can update the new states and nested hook states. + update: memorize((newStates) => { + shared.objectKeys(newStates).forEach(key => { + if (shared.includes(createdStateList, key)) { + update(newStates[key], originalStatesMap[key], key); + } + else if (key in provider && shared.isFn(nestedHookUpdate)) { + nestedHookUpdate({ + [key]: newStates[key] + }); + } + }); + }), + __proxyState: memorize((key) => { + if (shared.includes(createdStateList, key) && shared.instanceOf(object[key], shared.FrameworkReadableState)) { + // need to tag the key that is being tracked so that it can be updated with `state.v = xxx`. + referingObject.trackedKeys[key] = shared.trueValue; + return object[key]; + } + return nestedProxyState(key); + }) + }; + const completedProvider = shared.objAssign(provider, extraProvider); + return completedProvider; + }, + /** + * transform state proxies to object. + * @param states proxy array of framework states + * @param filterKey filter key of state proxy + * @returns an object that contains the states of target form + */ + objectify: (states, filterKey) => states.reduce((result, item) => { + result[item.k] = filterKey ? item[filterKey] : item; + return result; + }, {}), + transformState2Proxy: (state, key) => shared.newInstance((shared.FrameworkState), state, key, state => dehydrate(state, key, referingObject), exportState, (state, newValue) => update(newValue, state, key)) + }; +} + +const coreAssert = shared.createAssert(''); +const requestHookAssert = shared.createAssert('useRequest'); +const watcherHookAssert = shared.createAssert('useWatcher'); +const fetcherHookAssert = shared.createAssert('useFetcher'); +const coreHookAssert = (hookType) => ({ + [EnumHookType.USE_REQUEST]: requestHookAssert, + [EnumHookType.USE_WATCHER]: watcherHookAssert, + [EnumHookType.USE_FETCHER]: fetcherHookAssert +})[hookType]; +/** + * Assert whether it is a method instance + * @param methodInstance method instance + */ +const assertMethod = (assert, methodInstance) => assert(shared.instanceOf(methodInstance, alova.Method), 'expected a method instance.'); + +const KEY_SUCCESS = 'success'; +const KEY_ERROR = 'error'; +const KEY_COMPLETE = 'complete'; + +var createHook = (ht, c, eventManager, ro) => ({ + /** The method instance of the last request */ + m: shared.undefinedValue, + /** saveStatesFns */ + sf: [], + /** removeStatesFns */ + rf: [], + /** frontStates */ + fs: {}, + /** eventManager */ + em: eventManager, + /** hookType, useRequest=1, useWatcher=2, useFetcher=3 */ + ht, + /** hook config */ + c, + /** referingObject */ + ro, + /** managedStates */ + ms: {} +}); + +// base event +class AlovaEventBase { + constructor(method, args) { + this.method = method; + this.args = args; + } + clone() { + return { ...this }; + } + static spawn(method, args) { + return new AlovaEventBase(method, args); + } +} +class AlovaSuccessEvent extends AlovaEventBase { + constructor(base, data, fromCache) { + super(base.method, base.args); + this.data = data; + this.fromCache = fromCache; + } +} +class AlovaErrorEvent extends AlovaEventBase { + constructor(base, error) { + super(base.method, base.args); + this.error = error; + } +} +class AlovaCompleteEvent extends AlovaEventBase { + constructor(base, status, data, fromCache, error) { + super(base.method, base.args); + this.status = status; + this.data = data; + this.fromCache = status === 'error' ? false : fromCache; + this.error = error; + } +} +// extend event +class AlovaSSEEvent extends AlovaEventBase { + constructor(base, eventSource) { + super(base.method, base.args); + this.eventSource = eventSource; + } +} +class AlovaSSEErrorEvent extends AlovaSSEEvent { + constructor(base, error) { + super(base, base.eventSource); + this.error = error; + } +} +class AlovaSSEMessageEvent extends AlovaSSEEvent { + constructor(base, data) { + super(base, base.eventSource); + this.data = data; + } +} +/** Sq top level events */ +class SQEvent { + constructor(behavior, method, silentMethod) { + this.behavior = behavior; + this.method = method; + this.silentMethod = silentMethod; + } +} +/** Sq global events */ +class GlobalSQEvent extends SQEvent { + constructor(behavior, method, silentMethod, queueName, retryTimes) { + super(behavior, method, silentMethod); + this.queueName = queueName; + this.retryTimes = retryTimes; + } +} +class GlobalSQSuccessEvent extends GlobalSQEvent { + constructor(behavior, method, silentMethod, queueName, retryTimes, data, vDataResponse) { + super(behavior, method, silentMethod, queueName, retryTimes); + this.data = data; + this.vDataResponse = vDataResponse; + } +} +class GlobalSQErrorEvent extends GlobalSQEvent { + constructor(behavior, method, silentMethod, queueName, retryTimes, error, retryDelay) { + super(behavior, method, silentMethod, queueName, retryTimes); + this.error = error; + this.retryDelay = retryDelay; + } +} +class GlobalSQFailEvent extends GlobalSQEvent { + constructor(behavior, method, silentMethod, queueName, retryTimes, error) { + super(behavior, method, silentMethod, queueName, retryTimes); + this.error = error; + } +} +/** Sq event */ +class ScopedSQEvent extends SQEvent { + constructor(behavior, method, silentMethod, args) { + super(behavior, method, silentMethod); + this.args = args; + } +} +class ScopedSQSuccessEvent extends ScopedSQEvent { + constructor(behavior, method, silentMethod, args, data) { + super(behavior, method, silentMethod, args); + this.data = data; + } +} +class ScopedSQErrorEvent extends ScopedSQEvent { + constructor(behavior, method, silentMethod, args, error) { + super(behavior, method, silentMethod, args); + this.error = error; + } +} +class ScopedSQRetryEvent extends ScopedSQEvent { + constructor(behavior, method, silentMethod, args, retryTimes, retryDelay) { + super(behavior, method, silentMethod, args); + this.retryTimes = retryTimes; + this.retryDelay = retryDelay; + } +} +class ScopedSQCompleteEvent extends ScopedSQEvent { + constructor(behavior, method, silentMethod, args, status, data, error) { + super(behavior, method, silentMethod, args); + this.status = status; + this.data = data; + this.error = error; + } +} +class RetriableRetryEvent extends AlovaEventBase { + constructor(base, retryTimes, retryDelay) { + super(base.method, base.args); + this.retryTimes = retryTimes; + this.retryDelay = retryDelay; + } +} +class RetriableFailEvent extends AlovaErrorEvent { + constructor(base, error, retryTimes) { + super(base, error); + this.retryTimes = retryTimes; + } +} + +const defaultMiddleware = (_, next) => next(); + +const stateCache = {}; +/** + * @description Get State cache data + * @param baseURL Base URL + * @param key Request key value + * @returns Cached response data, if not returned {} + */ +const getStateCache = (namespace, key) => { + const cachedState = stateCache[namespace] || {}; + return cachedState[key] || {}; +}; +/** + * @description Set State cache data + * @param baseURL Base URL + * @param key Request key value + * @param data cache data + */ +const setStateCache = (namespace, key, data, hookInstance) => { + const cachedState = (stateCache[namespace] = stateCache[namespace] || {}); + cachedState[key] = { + s: data, + h: hookInstance + }; +}; +/** + * @description Clear State cache data + * @param baseURL Base URL + * @param key Request key value + */ +const removeStateCache = (namespace, key) => { + const cachedState = stateCache[namespace]; + if (cachedState) { + shared.deleteAttr(cachedState, key); + } +}; + +/** + * Unified processing of request logic for useRequest/useWatcher/useFetcher and other request hook functions + * @param hookInstance hook instance + * @param methodHandler Request method object or get function + * @param sendCallingArgs send function parameters + * @returns Request status + */ +function useHookToSendRequest(hookInstance, methodHandler, sendCallingArgs = []) { + const currentHookAssert = coreHookAssert(hookInstance.ht); + let methodInstance = shared.getHandlerMethod(methodHandler, currentHookAssert, sendCallingArgs); + const { fs: frontStates, ht: hookType, c: useHookConfig, ms: managedStates } = hookInstance; + const { loading: loadingState, data: dataState, error: errorState } = frontStates; + const isFetcher = hookType === EnumHookType.USE_FETCHER; + const { force: forceRequest = shared.falseValue, middleware = defaultMiddleware } = useHookConfig; + const alovaInstance = shared.getContext(methodInstance); + const { id } = alovaInstance; + // If it is a silent request, on success will be called directly after the request, on error will not be triggered, and progress will not be updated. + const methodKey = shared.getMethodInternalKey(methodInstance); + const { abortLast = shared.trueValue } = useHookConfig; + const isFirstRequest = !hookInstance.m; + hookInstance.m = methodInstance; + return (async () => { + // Initialize status data, which does not need to be loaded when pulling data, because pulling data does not require returning data. + let removeStates = shared.noop; + let saveStates = shared.noop; + let isNextCalled = shared.falseValue; + let responseHandlePromise = shared.promiseResolve(shared.undefinedValue); + let offDownloadEvent = shared.noop; + let offUploadEvent = shared.noop; + const cachedResponse = await alova.queryCache(methodInstance); + let fromCache = () => !!cachedResponse; + // Whether it is a controlled loading state. When it is true, loading will no longer be set to false in response processing. + let controlledLoading = shared.falseValue; + if (!isFetcher) { + // Store the initial state in cache for subsequent updates + saveStates = frontStates => setStateCache(id, methodKey, frontStates, hookInstance); + saveStates({ ...frontStates, ...managedStates }); + // Setting the state removal function will be passed to the effect request in the hook, and it will be set to be called when the component is unloaded. + removeStates = () => removeStateCache(id, methodKey); + } + // The middleware function next callback function allows you to modify mandatory request parameters and even replace the method instance that is about to send the request. + const guardNext = guardNextConfig => { + isNextCalled = shared.trueValue; + const { force: guardNextForceRequest = forceRequest, method: guardNextReplacingMethod = methodInstance } = guardNextConfig || {}; + const forceRequestFinally = shared.sloughConfig(guardNextForceRequest, [ + shared.newInstance((AlovaEventBase), methodInstance, sendCallingArgs) + ]); + const progressUpdater = (stage) => ({ loaded, total }) => { + frontStates[stage].v = { + loaded, + total + }; + }; + methodInstance = guardNextReplacingMethod; + // The latest controller needs to be saved every time a request is sent + shared.pushItem(hookInstance.sf, saveStates); + shared.pushItem(hookInstance.rf, removeStates); + // Loading will not be changed when the loading state is controlled + // The cache is missed, or loading needs to be set to true when forcing a request. + if (!controlledLoading) { + loadingState.v = !!forceRequestFinally || !cachedResponse; + } + // Determine whether to trigger a progress update based on the tracking status of downloading and uploading + const { downloading: enableDownload, uploading: enableUpload } = hookInstance.ro.trackedKeys; + offDownloadEvent = enableDownload ? methodInstance.onDownload(progressUpdater('downloading')) : offDownloadEvent; + offUploadEvent = enableUpload ? methodInstance.onUpload(progressUpdater('uploading')) : offUploadEvent; + responseHandlePromise = methodInstance.send(forceRequestFinally); + fromCache = () => methodInstance.fromCache || shared.falseValue; + return responseHandlePromise; + }; + // Call middleware function + const commonContext = { + method: methodInstance, + cachedResponse, + config: useHookConfig, + abort: () => methodInstance.abort() + }; + // Whether it is necessary to update the response data and call the response callback + const toUpdateResponse = () => hookType !== EnumHookType.USE_WATCHER || !abortLast || hookInstance.m === methodInstance; + const controlLoading = (control = shared.trueValue) => { + // only reset loading state in first request + if (control && isFirstRequest) { + loadingState.v = shared.falseValue; + } + controlledLoading = control; + }; + // Call middleware function + const middlewareCompletePromise = isFetcher + ? middleware({ + ...commonContext, + args: sendCallingArgs, + fetch: (methodInstance, ...args) => { + assertMethod(currentHookAssert, methodInstance); + return useHookToSendRequest(hookInstance, methodInstance, args); + }, + proxyStates: shared.omit(frontStates, 'data'), + controlLoading + }, guardNext) + : middleware({ + ...commonContext, + args: sendCallingArgs, + send: (...args) => useHookToSendRequest(hookInstance, methodHandler, args), + proxyStates: frontStates, + controlLoading + }, guardNext); + let finallyResponse = shared.undefinedValue; + const baseEvent = (AlovaEventBase).spawn(methodInstance, sendCallingArgs); + try { + // Unified processing of responses + const middlewareReturnedData = await middlewareCompletePromise; + const afterSuccess = (data) => { + // Update cached response data + if (!isFetcher) { + toUpdateResponse() && (dataState.v = data); + } + else if (hookInstance.c.updateState !== shared.falseValue) { + // Update the status in the cache, usually entered in use fetcher + const cachedState = getStateCache(id, methodKey).s; + cachedState && (cachedState.data.v = data); + } + // If the response data needs to be updated, the corresponding callback function is triggered after the request. + if (toUpdateResponse()) { + errorState.v = shared.undefinedValue; + // Loading status will no longer change to false when controlled + !controlledLoading && (loadingState.v = shared.falseValue); + hookInstance.em.emit(KEY_SUCCESS, shared.newInstance((AlovaSuccessEvent), baseEvent, data, fromCache())); + hookInstance.em.emit(KEY_COMPLETE, shared.newInstance((AlovaCompleteEvent), baseEvent, KEY_SUCCESS, data, fromCache(), shared.undefinedValue)); + } + return data; + }; + finallyResponse = + // When no data is returned or undefined is returned in the middleware, get the real response data + // Otherwise, use the returned data and no longer wait for the response promise. At this time, you also need to call the response callback. + middlewareReturnedData !== shared.undefinedValue + ? afterSuccess(middlewareReturnedData) + : isNextCalled + ? // There are two possibilities when middlewareCompletePromise is resolve + // 1. The request is normal + // 2. The request is incorrect, but the error is captured by the middleware function. At this time, the success callback will also be called, that is, afterSuccess(undefinedValue) + await shared.promiseThen(responseHandlePromise, afterSuccess, () => afterSuccess(shared.undefinedValue)) + : // If is next called is not called, no data is returned + shared.undefinedValue; + // When the next function is not called, update loading to false. + !isNextCalled && !controlledLoading && (loadingState.v = shared.falseValue); + } + catch (error) { + if (toUpdateResponse()) { + // Controls the output of error messages + errorState.v = error; + // Loading status will no longer change to false when controlled + !controlledLoading && (loadingState.v = shared.falseValue); + hookInstance.em.emit(KEY_ERROR, shared.newInstance((AlovaErrorEvent), baseEvent, error)); + hookInstance.em.emit(KEY_COMPLETE, shared.newInstance((AlovaCompleteEvent), baseEvent, KEY_ERROR, shared.undefinedValue, fromCache(), error)); + } + throw error; + } + // Unbind download and upload events after responding + offDownloadEvent(); + offUploadEvent(); + return finallyResponse; + })(); +} + +const refCurrent = (ref) => ref.current; +/** + * Create request status and uniformly process consistent logic in useRequest, useWatcher, and useFetcher + * This function will call the creation function of statesHook to create the corresponding request state. + * When the value is empty, it means useFetcher enters, and data status and cache status are not needed at this time. + * @param methodInstance request method object + * @param useHookConfig hook request configuration object + * @param initialData Initial data data + * @param immediate Whether to initiate a request immediately + * @param watchingStates The monitored status, if not passed in, call handleRequest directly. + * @param debounceDelay Delay time for request initiation + * @returns Current request status, operation function and event binding function + */ +function createRequestState(hookType, methodHandler, useHookConfig, initialData, immediate = shared.falseValue, watchingStates, debounceDelay = 0) { + var _a; + // shallow clone config object to avoid passing the same useHookConfig object which may cause vue2 state update error + useHookConfig = { ...useHookConfig }; + const { __referingObj: referingObject = { trackedKeys: {}, bindError: shared.falseValue } } = useHookConfig; + let initialLoading = !!immediate; + let cachedResponse = shared.undefinedValue; + // When sending a request immediately, you need to determine the initial loading value by whether to force the request and whether there is a cache. This has the following two benefits: + // 1. Sending the request immediately under react can save one rendering time + // 2. In the HTML rendered by SSR, the initial view is in the loading state to avoid the loading view flashing when displayed on the client. + if (immediate) { + // An error may be reported when calling the get handler method, and try/catch is required. + try { + const methodInstance = shared.getHandlerMethod(methodHandler, coreHookAssert(hookType)); + const alovaInstance = shared.getContext(methodInstance); + const l1CacheResult = alovaInstance.l1Cache.get(shared.buildNamespacedCacheKey(alovaInstance.id, shared.getMethodInternalKey(methodInstance))); + // The cache is only checked synchronously, so it does not take effect on asynchronous l1Cache adapters. + // It is recommended not to set up the asynchronous l1Cache adapter on the client side + if (l1CacheResult && !shared.instanceOf(l1CacheResult, shared.PromiseCls)) { + const [data, expireTimestamp] = l1CacheResult; + // If there is no expiration time, it means that the data will never expire. Otherwise, you need to determine whether it has expired. + if (!expireTimestamp || expireTimestamp > shared.getTime()) { + cachedResponse = data; + } + } + const forceRequestFinally = shared.sloughConfig((_a = useHookConfig.force) !== null && _a !== void 0 ? _a : shared.falseValue); + initialLoading = !!forceRequestFinally || !cachedResponse; + } + catch (_b) { } + } + const { create, effectRequest, ref, objectify, exposeProvider, transformState2Proxy } = statesHookHelper(alova.promiseStatesHook(), referingObject); + const progress = { + total: 0, + loaded: 0 + }; + // Put the externally incoming supervised states into the front states collection together + const { managedStates = {} } = useHookConfig; + const managedStatesProxy = mapObject(managedStates, (state, key) => transformState2Proxy(state, key)); + const data = create(cachedResponse !== null && cachedResponse !== void 0 ? cachedResponse : (shared.isFn(initialData) ? initialData() : initialData), 'data'); + const loading = create(initialLoading, 'loading'); + const error = create(shared.undefinedValue, 'error'); + const downloading = create({ ...progress }, 'downloading'); + const uploading = create({ ...progress }, 'uploading'); + const frontStates = objectify([data, loading, error, downloading, uploading]); + const eventManager = shared.createEventManager(); + const hookInstance = refCurrent(ref(createHook(hookType, useHookConfig, eventManager, referingObject))); + /** + * ## react ##Every time the function is executed, the following items need to be reset + */ + hookInstance.fs = frontStates; + hookInstance.em = eventManager; + hookInstance.c = useHookConfig; + hookInstance.ms = managedStatesProxy; + const hasWatchingStates = watchingStates !== shared.undefinedValue; + // Initialize request event + // Unified send request function + const handleRequest = (handler = methodHandler, sendCallingArgs) => useHookToSendRequest(hookInstance, handler, sendCallingArgs); + // only call once when multiple values changed at the same time + const onceRunner = refCurrent(ref(shared.createSyncOnceRunner())); + // Call handleRequest in a way that catches the exception + // Catching exceptions prevents exceptions from being thrown out + const wrapEffectRequest = (ro = referingObject, handler) => { + onceRunner(() => { + shared.promiseCatch(handleRequest(handler), error => { + // the error tracking indicates that the error need to throw. + if (!ro.bindError && !ro.trackedKeys.error) { + throw error; + } + }); + }); + }; + /** + * fix: #421 + * Use ref wraps to prevent react from creating new debounce function in every render + * Explicit passing is required because the context will change + */ + const debouncingSendHandler = ref(debounce((_, ro, handler) => wrapEffectRequest(ro, handler), (changedIndex) => shared.isNumber(changedIndex) ? (shared.isArray(debounceDelay) ? debounceDelay[changedIndex] : debounceDelay) : 0)); + // Do not send requests when rendering on the server side + if (!alova.globalConfigMap.ssr) { + effectRequest({ + handler: + // When `watchingStates` is an array, it indicates the watching states (including an empty array). When it is undefined, it indicates the non-watching state. + hasWatchingStates + ? (changedIndex) => debouncingSendHandler.current(changedIndex, referingObject, methodHandler) + : () => wrapEffectRequest(referingObject), + removeStates: () => shared.forEach(hookInstance.rf, fn => fn()), + saveStates: states => shared.forEach(hookInstance.sf, fn => fn(states)), + frontStates: { ...frontStates, ...managedStatesProxy }, + watchingStates, + immediate: immediate !== null && immediate !== void 0 ? immediate : shared.trueValue + }); + } + return exposeProvider({ + ...objectify([data, loading, error, downloading, uploading]), + abort: () => hookInstance.m && hookInstance.m.abort(), + /** + * Manually initiate a request by executing this method + * @param sendCallingArgs Parameters passed in when calling the send function + * @param methodInstance method object + * @param isFetcher Whether to call isFetcher + * @returns Request promise + */ + send: (sendCallingArgs, methodInstance) => handleRequest(methodInstance, sendCallingArgs), + onSuccess(handler) { + eventManager.on(KEY_SUCCESS, handler); + }, + onError(handler) { + // will not throw error when bindError is true. + // it will reset in `exposeProvider` so that ignore the error binding in custom use hooks. + referingObject.bindError = shared.trueValue; + eventManager.on(KEY_ERROR, handler); + }, + onComplete(handler) { + eventManager.on(KEY_COMPLETE, handler); + } + }); +} + +/** + * Fetch request data and cache request method object + */ +function useFetcher(config = {}) { + const props = createRequestState(EnumHookType.USE_FETCHER, shared.noop, config); + const { send } = props; + shared.deleteAttr(props, 'send'); + return shared.objAssign(props, { + /** + * Fetch data fetch will definitely send a request, and if the currently requested data has a corresponding management state, this state will be updated. + * @param matcher Method object + */ + fetch: (matcher, ...args) => { + assertMethod(fetcherHookAssert, matcher); + return send(args, matcher); + } + }); +} + +function useRequest(handler, config = {}) { + const { immediate = shared.trueValue, initialData } = config; + const props = createRequestState(EnumHookType.USE_REQUEST, handler, config, initialData, !!immediate); + const { send } = props; + return shared.objAssign(props, { + send: (...args) => send(args) + }); +} + +function useWatcher(handler, watchingStates, config = {}) { + watcherHookAssert(watchingStates && shared.len(watchingStates) > 0, 'expected at least one watching state'); + const { immediate, debounce = 0, initialData } = config; + const props = createRequestState(EnumHookType.USE_WATCHER, handler, config, initialData, !!immediate, // !!immediate means not send request immediately + watchingStates, debounce); + const { send } = props; + return shared.objAssign(props, { + send: (...args) => send(args) + }); +} + +var createSnapshotMethodsManager = (handler) => { + let methodSnapshots = {}; + return { + snapshots: () => methodSnapshots, + save(methodInstance, force = shared.falseValue) { + const key = shared.getMethodInternalKey(methodInstance); + // Because it is impossible to locate the location of the total data in the cache + // Therefore, this field is maintained redundantly here. + if (!methodSnapshots[key] || force) { + methodSnapshots[key] = { + entity: methodInstance + }; + } + }, + get: (entityOrPage) => methodSnapshots[shared.getMethodInternalKey(shared.instanceOf(entityOrPage, (alova.Method)) ? entityOrPage : handler(entityOrPage))], + remove(key) { + if (key) { + delete methodSnapshots[key]; + } + else { + methodSnapshots = {}; + } + } + }; +}; + +const paginationAssert = shared.createAssert('usePagination'); +const indexAssert = (index, rawData) => paginationAssert(shared.isNumber(index) && index < shared.len(rawData), 'index must be a number that less than list length'); +const parseSendArgs = (args) => [ + args[args.length - 2], // refreshPage + args[args.length - 1], // isRefresh + args.slice(0, args.length - 2) // send args +]; +var usePagination = (handler, config = {}) => { + const { create, computed, ref, watch, exposeProvider, objectify, __referingObj: referingObject } = statesHookHelper(alova.promiseStatesHook()); + const { preloadPreviousPage = shared.trueValue, preloadNextPage = shared.trueValue, total: totalGetter = res => res.total, data: dataGetter = res => res.data, append = shared.falseValue, initialPage = 1, initialPageSize = 10, watchingStates = [], initialData, immediate = shared.trueValue, middleware, force = shared.noop, ...others } = config; + const handlerRef = ref(handler); + const isReset = ref(shared.falseValue); // Used to control whether to reset + // The number of requests during reset. In order to prevent repeated requests during reset, use this parameter to limit requests. + const page = create(initialPage, 'page'); + const pageSize = create(initialPageSize, 'pageSize'); + const data = create((initialData ? dataGetter(initialData) || [] : []), 'data'); + const total = create(initialData ? totalGetter(initialData) : shared.undefinedValue, 'total'); + // Save snapshots of all method instances used by the current hook + const { snapshots: methodSnapshots, get: getSnapshotMethods, save: saveSnapshot, remove: removeSnapshot } = ref(createSnapshotMethodsManager(page => handlerRef.current(page, pageSize.v))).current; + const listDataGetter = (rawData) => dataGetter(rawData) || rawData; + // Initialize fetcher + const fetchStates = useFetcher({ + __referingObj: referingObject, + updateState: shared.falseValue, + force: ({ args }) => args[shared.len(args) - 1] + }); + const { loading, fetch, abort: abortFetch, onSuccess: onFetchSuccess } = fetchStates; + const fetchingRef = ref(loading); + const getHandlerMethod = (refreshPage = page.v, customArgs = []) => { + const handlerMethod = handler(refreshPage, pageSize.v, ...customArgs); + // Define unified additional names to facilitate management + saveSnapshot(handlerMethod); + return handlerMethod; + }; + // When monitoring status changes, reset page to 1 + watch(watchingStates, () => { + page.v = initialPage; + isReset.current = shared.trueValue; + }); + // Compatible with react, store functions that require proxy here + // In this way, the latest operation function can be called in the proxy function and avoid the react closure trap. + const delegationActions = ref({}); + // Calculate data, total, is last page parameters + const pageCount = computed(() => { + const totalVal = total.v; + return totalVal !== shared.undefinedValue ? Math.ceil(totalVal / pageSize.v) : shared.undefinedValue; + }, [pageSize, total], 'pageCount'); + const createDelegationAction = (actionName) => (...args) => delegationActions.current[actionName](...args); + const states = useWatcher((...args) => { + const [refreshPage, , customArgs] = parseSendArgs(args); + return getHandlerMethod(refreshPage, customArgs); + }, [...watchingStates, page.e, pageSize.e], { + __referingObj: referingObject, + immediate, + initialData, + managedStates: objectify([data, page, pageSize, total], 's'), + middleware(ctx, next) { + if (!middleware) { + return next(); + } + return middleware({ + ...ctx, + delegatingActions: { + refresh: createDelegationAction('refresh'), + insert: createDelegationAction('insert'), + remove: createDelegationAction('remove'), + replace: createDelegationAction('replace'), + reload: createDelegationAction('reload'), + getState: (stateKey) => { + const states = { + page, + pageSize, + data, + pageCount, + total, + // eslint-disable-next-line @typescript-eslint/no-use-before-define + isLastPage + }; + return states[stateKey].v; + } + } + }, next); + }, + force: event => event.args[1] || (shared.isFn(force) ? force(event) : force), + ...others + }); + const { send } = states; + const nestedData = states.__proxyState('data'); + // Determine whether data can be preloaded + const canPreload = async (payload) => { + const { rawData = nestedData.v, preloadPage, fetchMethod, forceRequest = shared.falseValue, isNextPage = shared.falseValue } = payload; + const pageCountVal = pageCount.v; + const exceedPageCount = pageCountVal + ? preloadPage > pageCountVal + : isNextPage // If it is judged to preload the next page of data and there is no page count, it is judged by whether the data volume of the last page reaches the page size. + ? shared.len(listDataGetter(rawData)) < pageSize.v + : shared.falseValue; + const isMatchPageScope = preloadPage > 0 && !exceedPageCount; + if (!isMatchPageScope) { + return shared.falseValue; + } + const { e: expireMilliseconds } = shared.getLocalCacheConfigParam(fetchMethod); + const hasCache = await alova.queryCache(fetchMethod); + // If the cache time is less than or equal to the current time, it means that the cache is not set and the data will no longer be pre-pulled at this time. + // Or there is already a cache and it is not pre-fetched. + return expireMilliseconds(shared.MEMORY) <= shared.getTime() ? shared.falseValue : forceRequest || !hasCache; + }; + // Preload next page data + const fetchNextPage = async (rawData, force, customArgs = []) => { + const nextPage = page.v + 1; + const fetchMethod = getHandlerMethod(nextPage, customArgs); + if (preloadNextPage && + (await canPreload({ + rawData, + preloadPage: nextPage, + fetchMethod, + isNextPage: shared.trueValue, + forceRequest: force + }))) { + shared.promiseCatch(fetch(fetchMethod, ...customArgs, force), shared.noop); + } + }; + // Preload previous page data + const fetchPreviousPage = async (rawData, customArgs = []) => { + const prevPage = page.v - 1; + const fetchMethod = getHandlerMethod(prevPage, customArgs); + if (preloadPreviousPage && + (await canPreload({ + rawData, + preloadPage: prevPage, + fetchMethod + }))) { + shared.promiseCatch(fetch(fetchMethod, ...customArgs, shared.undefinedValue), shared.noop); + } + }; + // If the returned data is smaller than the page size, it is considered the last page. + const isLastPage = computed(() => { + const dataRaw = nestedData.v; + if (!dataRaw) { + return shared.trueValue; + } + const statesDataVal = listDataGetter(dataRaw); + const pageVal = page.v; + const pageCountVal = pageCount.v; + const dataLen = shared.isArray(statesDataVal) ? shared.len(statesDataVal) : 0; + return pageCountVal ? pageVal >= pageCountVal : dataLen < pageSize.v; + }, [page, pageCount, nestedData, pageSize], 'isLastPage'); + // Update current page cache + const updateCurrentPageCache = async () => { + const snapshotItem = getSnapshotMethods(page.v); + if (snapshotItem) { + await alova.setCache(snapshotItem.entity, (rawData) => { + // When caching is turned off, raw data is undefined + if (rawData) { + const cachedListData = listDataGetter(rawData) || []; + shared.splice(cachedListData, 0, shared.len(cachedListData), ...data.v); + return rawData; + } + }); + } + }; + onFetchSuccess(({ method, data: rawData }) => { + // When fetch has not responded yet and the page is flipped to the page number corresponding to fetch, the list data needs to be updated manually. + const snapshotItem = getSnapshotMethods(page.v); + if (snapshotItem && shared.getMethodInternalKey(snapshotItem.entity) === shared.getMethodInternalKey(method)) { + // If data is appended, data is updated + const listData = listDataGetter(rawData); // Update data parameters + if (append) { + // The current page data needs to be replaced during pull-down loading. + const dataRaw = data.v; + const pageSizeVal = pageSize.v; + // When performing a removal operation, the number of replacements is less than pageSize, and dataRaw % pageSizeVal will be greater than 0. + // When adding a new operation, the number of replacements is equal to pageSize. At this time, dataRaw % pageSizeVal will be equal to 0. No replacement is needed at this time. + const replaceNumber = shared.len(dataRaw) % pageSizeVal; + if (replaceNumber > 0) { + const rawData = [...data.v]; + shared.splice(rawData, (page.v - 1) * pageSizeVal, replaceNumber, ...listData); + data.v = rawData; + } + } + else { + data.v = listData; + } + } + }); + const awaitResolve = ref(shared.undefinedValue); + const awaitReject = ref(shared.undefinedValue); + states + .onSuccess(({ data: rawData, args, method }) => { + const [refreshPage, isRefresh, customArgs] = parseSendArgs(args); + const { total: cachedTotal } = getSnapshotMethods(method) || {}; + const typedRawData = rawData; + total.v = cachedTotal !== shared.undefinedValue ? cachedTotal : totalGetter(typedRawData); + if (!isRefresh) { + fetchPreviousPage(typedRawData, customArgs); + fetchNextPage(typedRawData, shared.falseValue, customArgs); + } + const pageSizeVal = pageSize.v; + const listData = listDataGetter(typedRawData); // Get array + paginationAssert(shared.isArray(listData), 'Got wrong array, did you return the correct array of list in `data` function'); + // If data is appended, data is updated + if (append) { + // If it is reset, clear the data first + if (isReset.current) { + data.v = []; + } + if (refreshPage === shared.undefinedValue) { + data.v = [...data.v, ...listData]; + } + else if (refreshPage) { + const rawData = [...data.v]; + // If the page is refreshed, the data on that page is replaced. + shared.splice(rawData, (refreshPage - 1) * pageSizeVal, pageSizeVal, ...listData); + data.v = rawData; + } + } + else { + data.v = listData; + } + }) + .onSuccess(({ data }) => { + var _a; + (_a = awaitResolve.current) === null || _a === void 0 ? void 0 : _a.call(awaitResolve, data); + }) + .onError(({ error }) => { + var _a; + (_a = awaitReject.current) === null || _a === void 0 ? void 0 : _a.call(awaitReject, error); + }) + .onComplete(() => { + // Whether the request is successful or not, it must be reset is reset + isReset.current = shared.falseValue; + }); + // Get the location of a list item + const getItemIndex = (item) => { + const index = data.v.indexOf(item); + paginationAssert(index >= 0, 'item is not found in list'); + return index; + }; + const { addQueue: add2AsyncQueue, onComplete: onAsyncQueueRunComplete } = ref(shared.createAsyncQueue()).current; + /** + * Refresh the specified page number data. This function will ignore the cache and force the request to be sent. + * If no page number is passed in, the current page will be refreshed. + * If a list item is passed in, the page where the list item is located will be refreshed, which is only valid in append mode. + * @param pageOrItemPage Refreshed page number or list item + */ + const refresh = async (pageOrItemPage = page.v) => { + let refreshPage = pageOrItemPage; + let awaitPromise = shared.promiseResolve(); + if (append) { + if (!shared.isNumber(pageOrItemPage)) { + const itemIndex = getItemIndex(pageOrItemPage); + refreshPage = Math.floor(itemIndex / pageSize.v) + 1; + } + paginationAssert(refreshPage <= page.v, "refresh page can't greater than page"); + // Update current page data + awaitPromise = send(refreshPage, shared.trueValue); + } + else { + paginationAssert(shared.isNumber(refreshPage), 'unable to calculate refresh page by item in pagination mode'); + // If the number of pages is equal, refresh the current page, otherwise fetch data + awaitPromise = + refreshPage === page.v + ? send(shared.undefinedValue, shared.trueValue) + : fetch(handler(refreshPage, pageSize.v), shared.trueValue); + } + return awaitPromise; + }; + // Delete all related caches except the current page and next page of this usehook + const invalidatePaginationCache = async (all = shared.falseValue) => { + const pageVal = page.v; + const snapshotObj = methodSnapshots(); + let snapshots = shared.objectValues(snapshotObj); + if (all) { + removeSnapshot(); + } + else { + // Filter out data from the previous page, current page, and next page + const excludeSnapshotKeys = shared.mapItem(shared.filterItem([getSnapshotMethods(pageVal - 1), getSnapshotMethods(pageVal), getSnapshotMethods(pageVal + 1)], Boolean), ({ entity }) => shared.getMethodInternalKey(entity)); + snapshots = shared.mapItem(shared.filterItem(shared.objectKeys(snapshotObj), key => !shared.includes(excludeSnapshotKeys, key)), key => { + const item = snapshotObj[key]; + delete snapshotObj[key]; + return item; + }); + } + await alova.invalidateCache(shared.mapItem(snapshots, ({ entity }) => entity)); + }; + // The reason for taking it out separately is that + // No matter how many times insert, remove, or a combination of them is called synchronously, the reset operation only needs to be executed asynchronously once + const resetCache = async () => { + fetchingRef.current && abortFetch(); + // cache invalidation + await invalidatePaginationCache(); + // When the amount of data on the next page does not exceed the page size, the next page is forced to be requested. Because there is a request for sharing, the fetching needs to be performed asynchronously after interrupting the request. + const snapshotItem = getSnapshotMethods(page.v + 1); + if (snapshotItem) { + const cachedListData = listDataGetter((await alova.queryCache(snapshotItem.entity)) || {}) || []; + fetchNextPage(shared.undefinedValue, shared.len(cachedListData) < pageSize.v); + } + }; + // Unified update of total number of items + const updateTotal = (offset) => { + if (offset === 0) { + return; + } + // Update current page + const totalVal = total.v; + if (shared.isNumber(totalVal)) { + const offsetedTotal = Math.max(totalVal + offset, 0); + total.v = offsetedTotal; + const pageVal = page.v; + // Update redundant total field + shared.forEach([getSnapshotMethods(pageVal - 1), getSnapshotMethods(pageVal), getSnapshotMethods(pageVal + 1)], item => { + item && (item.total = offsetedTotal); + }); + } + }; + /** + * Insert a piece of data + * If no index is passed in, it will be inserted at the front by default. + * If a list item is passed in, it will be inserted after the list item. If the list item is not in the list data, an error will be thrown. + * @param item insert + * @param position Insert position (index) or list item + */ + const insert = (item, position = 0) => { + onAsyncQueueRunComplete(resetCache); // The cache needs to be reset at the end of execution + return add2AsyncQueue(async () => { + const index = shared.isNumber(position) ? position : getItemIndex(position) + 1; + let popItem = shared.undefinedValue; + const rawData = [...data.v]; + // Only when the number of items currently displayed is exactly a multiple of page size, you need to remove an item of data to ensure that the number of operating pages is page size. + if (shared.len(rawData) % pageSize.v === 0) { + popItem = rawData.pop(); + } + // If the insertion position is empty, it will be inserted to the front by default. + shared.splice(rawData, index, 0, item); + data.v = rawData; + updateTotal(1); + // The cache of the current page is updated synchronously + await updateCurrentPageCache(); + // If there is a pop item, put it at the head of the next page cache, consistent with the remove operation. + // In this way, the performance will be consistent when insert and remove are called synchronously. + if (popItem) { + const snapshotItem = getSnapshotMethods(page.v + 1); + if (snapshotItem) { + await alova.setCache(snapshotItem.entity, (rawData) => { + if (rawData) { + const cachedListData = listDataGetter(rawData) || []; + cachedListData.unshift(popItem); + cachedListData.pop(); + return rawData; + } + }); + } + } + }); + }; + /** + * Remove a piece of data + * If a list item is passed in, the list item will be removed. If the list item is not in the list data, an error will be thrown. + * @param position Removed index or list item + */ + const remove = (...positions) => { + onAsyncQueueRunComplete(resetCache); // The cache needs to be reset at the end of execution + return add2AsyncQueue(async () => { + const indexes = shared.mapItem(positions, position => { + const index = shared.isNumber(position) ? position : getItemIndex(position); + indexAssert(index, data.v); + return index; + }); + const pageVal = page.v; + const nextPage = pageVal + 1; + const snapshotItem = getSnapshotMethods(nextPage); + const fillingItems = []; // padding data item + if (snapshotItem) { + await alova.setCache(snapshotItem.entity, (rawData) => { + if (rawData) { + const cachedListData = listDataGetter(rawData); + // Start filling data from the head of the list on the next page + if (shared.isArray(cachedListData)) { + shared.pushItem(fillingItems, ...shared.splice(cachedListData, 0, shared.len(indexes))); + } + return rawData; + } + }); + } + const isLastPageVal = isLastPage.v; + const fillingItemsLen = shared.len(fillingItems); + let isLastEmptyPageInNonAppendMode = false; + if (fillingItemsLen > 0 || isLastPageVal) { + // Delete data at the specified index + const newListData = shared.filterItem(data.v, (_, index) => !shared.includes(indexes, index)); + // In page turning mode, if it is the last page and all items have been deleted, then turn one page forward. + isLastEmptyPageInNonAppendMode = !append && isLastPageVal && shared.len(newListData) <= 0; + if (!isLastEmptyPageInNonAppendMode && fillingItemsLen > 0) { + shared.pushItem(newListData, ...fillingItems); + } + data.v = newListData; + } + else if (fillingItemsLen <= 0 && !isLastPageVal) { + // When the last page of data is removed, there is no need to refresh + refresh(pageVal); + } + updateTotal(-shared.len(indexes)); + // The cache of the current page is updated synchronously + return updateCurrentPageCache().then(() => { + if (isLastEmptyPageInNonAppendMode) { + page.v = pageVal - 1; + } + }); + }); + }; + /** + * Replace a piece of data + * If the position passed in is a list item, this list item will be replaced. If the list item is not in the list data, an error will be thrown. + * @param item replacement + * @param position Replace position (index) or list item + */ + const replace = (item, position) => add2AsyncQueue(async () => { + paginationAssert(position !== shared.undefinedValue, 'expect specify the replace position'); + const index = shared.isNumber(position) ? position : getItemIndex(position); + indexAssert(index, data.v); + const rawData = [...data.v]; + shared.splice(rawData, index, 1, item); + data.v = rawData; + // The cache of the current page is updated synchronously + await updateCurrentPageCache(); + }); + /** + * Reload the list starting from page ${initialPage} and clear the cache + */ + const reload = async () => { + await invalidatePaginationCache(shared.trueValue); + isReset.current = shared.trueValue; + page.v === initialPage ? shared.promiseCatch(send(), shared.noop) : (page.v = initialPage); + const { resolve, reject, promise } = shared.usePromise(); + awaitResolve.current = resolve; + awaitReject.current = reject; + return promise; + }; + // Compatible with react, caches the latest operation function each time, avoiding closure traps + delegationActions.current = { + refresh, + insert, + remove, + replace, + reload + }; + /** @Returns */ + return exposeProvider({ + ...states, + ...objectify([data, page, pageCount, pageSize, total, isLastPage]), + send: (...args) => send(...args, shared.undefinedValue, shared.undefinedValue), + fetching: fetchStates.loading, + onFetchSuccess: fetchStates.onSuccess, + onFetchError: fetchStates.onError, + onFetchComplete: fetchStates.onComplete, + refresh, + insert, + remove, + replace, + reload + }); +}; + +/** + * Assert serialHandlers + * @param hookName hook name + * @param serialHandlers Serial request method acquisition function + */ +const assertSerialHandlers = (hookName, serialHandlers) => shared.createAssert(hookName)(shared.isArray(serialHandlers) && shared.len(serialHandlers) > 0, 'please use an array to represent serial requests'); +/** + * Create serial request middleware + * @param serialHandlers Serial request method acquisition function + * @param hookMiddleware use hook middleware + * @returns Serial request middleware + */ +const serialMiddleware = (serialHandlers, hookMiddleware, serialRequestMethods = []) => { + // The first handler is passed to the use hook externally and does not need to be requested again. + serialHandlers.shift(); + return ((ctx, next) => { + hookMiddleware === null || hookMiddleware === void 0 ? void 0 : hookMiddleware(ctx, () => shared.promiseResolve(shared.undefinedValue)); + ctx.controlLoading(); + const loadingState = ctx.proxyStates.loading; + loadingState.v = shared.trueValue; + let serialPromise = next(); + for (const handler of serialHandlers) { + serialPromise = shared.promiseThen(serialPromise, value => { + const methodItem = handler(value, ...ctx.args); + shared.pushItem(serialRequestMethods, methodItem); + return methodItem.send(); + }); + } + return serialPromise.finally(() => { + loadingState.v = shared.falseValue; + }); + }); +}; + +/** + * Serial request hook, each serialHandlers will receive the result of the previous request + * Applicable scenario: Serial request for a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialRequest related data and operation functions + */ +var useSerialRequest = (serialHandlers, config = {}) => { + assertSerialHandlers('useSerialRequest', serialHandlers); + // eslint-disable-next-line + const { ref, __referingObj } = statesHookHelper(alova.promiseStatesHook()); + const methods = ref([]).current; + const exposures = useRequest(serialHandlers[0], { + ...config, + __referingObj, + middleware: serialMiddleware(serialHandlers, config.middleware, methods) + }); + // Decorate the error callback function and set event.method to the instance of the error + exposures.onError = shared.decorateEvent(exposures.onError, (handler, event) => { + event.method = methods[shared.len(methods) - 1]; + handler(event); + }); + return exposures; +}; + +/** + * Serial request hook, each serialHandlers will receive the result of the previous request + * Applicable scenario: After monitoring status changes, serially request a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialRequest related data and operation functions + */ +var useSerialWatcher = (serialHandlers, watchingStates, config = {}) => { + assertSerialHandlers('useSerialWatcher', serialHandlers); + // eslint-disable-next-line + const { ref, __referingObj } = statesHookHelper(alova.promiseStatesHook()); + const methods = ref([]).current; + const exposures = useWatcher(serialHandlers[0], watchingStates, { + ...config, + __referingObj, + middleware: serialMiddleware(serialHandlers, config.middleware, methods) + }); + // Decorate the error callback function and set event.method to the instance of the error + exposures.onError = shared.decorateEvent(exposures.onError, (handler, event) => { + event.method = methods[shared.len(methods) - 1]; + handler(event); + }); + return exposures; +}; + +const STR_VALUE_OF = 'valueOf'; +const DEFAULT_QUEUE_NAME = 'default'; +const BEHAVIOR_SILENT = 'silent'; +const BEHAVIOR_QUEUE = 'queue'; +const BEHAVIOR_STATIC = 'static'; +/** + * Global virtual data collection array + * It will only be an array when the method is created, and undefined at other times + * + * Explanation: The purpose of collecting virtual data is to determine whether virtual data is used in a method instance. + * Includes the following forms: + * useSQRequest((vDataId) => createMethod({ vDataId }) //Reference function parameters + * useSQRequest(() => createMethod({ vDataId }) //Directly reference scope parameters + * + * Or even: + * function createMethod(obj) { + * return alovaInst.Get('/list', { + * params: { status: obj.vDataId ? 1 : 0 } + * }) + * } + * useSQRequest(() => createMethod(obj) //Directly reference scope parameters + * + * Ways to use dummy data include: + * 1. Directly assign values as parameters + * 2. Use dummy data id + * 3. Indirect use of virtual data, such as + * vData ? 1 : 0 + * !!vData + * vData+1 + * etc. as calculation parameters. + */ +let vDataIdCollectBasket; +const setVDataIdCollectBasket = (value) => { + vDataIdCollectBasket = value; +}; +/** + * The dependent alova instance, its storage adapter, request adapter, etc. will be used to access the SilentMethod instance and send silent submissions + */ +let dependentAlovaInstance; +const setDependentAlova = (alovaInst) => { + dependentAlovaInstance = alovaInst; +}; +/** + * Set up a custom serializer + */ +let customSerializers = {}; +const setCustomSerializers = (serializers = {}) => { + customSerializers = serializers; +}; +/** + * silentFactory status + * 0 means not started + * 1 means in progress, changed after calling bootSilentFactory + * 2 indicates that the request failed, that is, when the maximum number of requests is reached according to the retry rules, or when the retry rules are not matched, the request is changed. + */ +let silentFactoryStatus = 0; +const setSilentFactoryStatus = (status) => { + silentFactoryStatus = status; +}; +/** + * The request waiting time in silentQueue, in milliseconds (ms) + * It indicates the waiting time of the silentMethod that is about to send the request + * If not set, or set to 0, the silentMethod request is triggered immediately + * + * Tips: + * 1. When set directly, it is effective for the default queue by default. + * 2. If you need to set other queue settings, you can specify them as objects, such as: + * [ + * Indicates waiting 5000ms for the queue setting request named customName + * { name: 'customName', wait: 5000 }, + * + * //Indicates that in all queues with the prefix prefix, the request setting with method instance name xxx is set to wait 5000ms + * { name: /^prefix/, wait: silentMethod => silentMethod.entity.config.name === 'xxx' ? 5000 : 0 }, + * ] + * + * >>> It only works if the request succeeds, if it fails it will use the retry policy parameters + */ +let queueRequestWaitSetting = []; +const setQueueRequestWaitSetting = (requestWaitSetting = 0) => { + queueRequestWaitSetting = shared.isArray(requestWaitSetting) + ? requestWaitSetting + : [ + { + queue: DEFAULT_QUEUE_NAME, + wait: requestWaitSetting + } + ]; +}; +const BootEventKey = Symbol('GlobalSQBoot'); +const BeforeEventKey = Symbol('GlobalSQBefore'); +const SuccessEventKey = Symbol('GlobalSQSuccess'); +const ErrorEventKey = Symbol('GlobalSQError'); +const FailEventKey$1 = Symbol('GlobalSQFail'); +/** Global silent event management object */ +const globalSQEventManager = shared.createEventManager(); +/** Silent assert */ +const silentAssert = shared.createAssert('useSQRequest'); + +/** + * Update the status of the corresponding method + * @param method request method object + * @param handleUpdate update callback + * @returns Whether the update is successful or not. If the corresponding status is not found, the update will not be successful. + */ +async function updateState(matcher, handleUpdate) { + let updated = shared.falseValue; + // Only process the first method instance that meets the conditions. If there is no instance that meets the conditions, it will not be processed. + if (matcher) { + const { update } = alova.promiseStatesHook(); + const methodKey = shared.getMethodInternalKey(matcher); + const { id } = shared.getContext(matcher); + const { s: frontStates, h: hookInstance } = getStateCache(id, methodKey); + const updateStateCollection = shared.isFn(handleUpdate) + ? { data: handleUpdate } + : handleUpdate; + let updatedDataColumnData = shared.undefinedValue; + if (frontStates) { + // Loop through the updated data and assign it to the supervised state + shared.forEach(shared.objectKeys(updateStateCollection), stateName => { + coreAssert(stateName in frontStates, `state named \`${stateName}\` is not found`); + const targetStateProxy = frontStates[stateName]; + let updatedData = updateStateCollection[stateName](targetStateProxy.v); + // shallow clone the updatedData so that can effect in react. + updatedData = shared.isArray(updatedData) + ? [...updatedData] + : shared.isObject(updatedData) + ? { ...updatedData } + : updatedData; + // Record the updated value of the data field, used to update cached data + if (stateName === 'data') { + updatedDataColumnData = updatedData; + } + // Update directly using update without checking referring object.tracked keys + update(updatedData, frontStates[stateName].s, stateName, hookInstance.ro); + }); + updated = shared.trueValue; + } + // If data is updated, cache and persistent data need to be updated at the same time + if (updatedDataColumnData !== shared.undefinedValue) { + alova.setCache(matcher, updatedDataColumnData); + } + } + return updated; +} + +var dateSerializer = { + forward: data => (shared.instanceOf(data, Date) ? data.getTime() : shared.undefinedValue), + backward: ts => shared.newInstance(Date, ts) +}; + +var regexpSerializer = { + forward: data => (shared.instanceOf(data, RegExp) ? data.source : undefined), + backward: source => shared.newInstance(RegExp, source) +}; + +const createSerializerPerformer = (customSerializers = {}) => { + /** + * Merge built-in serializers and custom serializers + */ + const serializers = { + date: dateSerializer, + regexp: regexpSerializer, + ...customSerializers + }; + /** + * serialized data + */ + const serialize = (payload) => { + if (shared.isObject(payload)) { + payload = shared.walkObject(shared.isArray(payload) ? [...payload] : { ...payload }, value => { + let finallyApplySerializerName = shared.undefinedValue; + // Find a matching serializer and serialize the value. If not found, return the original value. + const serializedValue = shared.objectKeys(serializers).reduce((currentValue, serializerName) => { + if (!finallyApplySerializerName) { + const serializedValueItem = serializers[serializerName].forward(currentValue); + if (serializedValueItem !== shared.undefinedValue) { + finallyApplySerializerName = serializerName; + currentValue = serializedValueItem; + } + } + return currentValue; + }, value); + // You need to use the original value to judge, otherwise packaging classes such as new Number(1) will also be [object Object] + const toStringTag = shared.ObjectCls.prototype.toString.call(value); + if (toStringTag === '[object Object]') { + value = { ...value }; + } + else if (shared.isArray(value)) { + value = [...value]; + } + return finallyApplySerializerName !== shared.undefinedValue ? [finallyApplySerializerName, serializedValue] : value; + }); + } + return payload; + }; + /** + * Deserialize data + */ + const deserialize = (payload) => shared.isObject(payload) + ? shared.walkObject(payload, value => { + if (shared.isArray(value) && shared.len(value) === 2) { + const foundSerializer = serializers[value[0]]; + value = foundSerializer ? foundSerializer.backward(value[1]) : value; + } + return value; + }, shared.falseValue) + : payload; + return { + serialize, + deserialize + }; +}; + +const symbolVDataId = Symbol('vdid'); +const symbolOriginal = Symbol('original'); +const regVDataId = /\[vd:([0-9a-z]+)\]/; + +/** + * Unified vData collection function + * It will be called in the following 4 places + * 1. When accessing sub-properties + * 2. When participating in calculation and triggering [Symbol.toPrimitive] + * 3. When getting the id of vData + * 4. When getting its original value + * + * @param returnValue Return value, if it is a function then call it + * @returns collection function + */ +const vDataCollectUnified = (target) => { + const vDataId = target === null || target === void 0 ? void 0 : target[symbolVDataId]; + vDataId && vDataIdCollectBasket && (vDataIdCollectBasket[vDataId] = shared.undefinedValue); +}; +// export const vDataGetter = (key: string) => vDataCollectGetter((thisObj: any) => thisObj.__proto__[key].call(thisObj)); + +/** + * Dummy data is stringified. If the parameter is not dummy data, the original data is returned. + * @param target dummy data + * @param returnOriginalIfNotVData If it is not virtual data, return the original value. + * @returns Virtual data id or original data + */ +const stringifyVData = (target, returnOriginalIfNotVData = shared.trueValue) => { + vDataCollectUnified(target); + const vDataIdRaw = target === null || target === void 0 ? void 0 : target[symbolVDataId]; + const vDataId = vDataIdRaw ? `[vd:${vDataIdRaw}]` : shared.undefinedValue; + return vDataId || (returnOriginalIfNotVData ? target : shared.undefinedValue); +}; +/** + * Create a getter function for virtual data id collection + * @param valueReturnFn return value function + * @returns getter function + */ +function stringifyWithThis() { + return stringifyVData(this); +} + +/** + * Null wrapper class implementation + */ +const Null = function Null() { }; +Null.prototype = shared.ObjectCls.create(shared.nullValue, { + [STR_VALUE_OF]: shared.valueObject(stringifyWithThis) +}); + +/** + * Undefined wrapper class implementation + */ +const Undefined = function Undefined() { }; +Undefined.prototype = shared.ObjectCls.create(shared.nullValue, { + [STR_VALUE_OF]: shared.valueObject(stringifyWithThis) +}); + +/** + * Create dummy response data + * @returns Virtual response data proxy instance + */ +var createVirtualResponse = (structure, vDataId = shared.uuid()) => { + const transform2VData = (value, vDataIdInner = shared.uuid()) => { + if (value === shared.nullValue) { + value = shared.newInstance(Null); + } + else if (value === shared.undefinedValue) { + value = shared.newInstance(Undefined); + } + else { + const newValue = shared.ObjectCls(value); + shared.defineProperty(newValue, STR_VALUE_OF, stringifyWithThis); + shared.defineProperty(newValue, symbolOriginal, value); + value = newValue; + } + shared.defineProperty(value, symbolVDataId, vDataIdInner); + return value; + }; + const virtualResponse = transform2VData(structure, vDataId); + if (shared.isPlainObject(virtualResponse) || shared.isArray(virtualResponse)) { + shared.walkObject(virtualResponse, value => transform2VData(value)); + } + return virtualResponse; +}; + +/** + * Get original value of variable with dummy data + * This function will also perform vData collection + * @param target target value + * @param deepDehydrate Whether the depth of dehydration value + * @returns target value with primitive type + */ +const dehydrateVDataUnified = (target, deepDehydrate = shared.trueValue) => { + const dehydrateItem = (value) => { + vDataCollectUnified(value); + if (value === null || value === void 0 ? void 0 : value[symbolVDataId]) { + if (shared.instanceOf(value, Undefined)) { + value = shared.undefinedValue; + } + else if (shared.instanceOf(value, Null)) { + value = shared.nullValue; + } + else if (shared.instanceOf(value, Number) || shared.instanceOf(value, String) || shared.instanceOf(value, Boolean)) { + value = value[symbolOriginal]; + } + } + return value; + }; + const newTarget = dehydrateItem(target); + // If it is an object or array, deep traversal is required to obtain the virtual data value. + if (deepDehydrate && (shared.isObject(newTarget) || shared.isArray(newTarget))) { + shared.walkObject(newTarget, value => dehydrateItem(value)); + } + return newTarget; +}; +/** + * The version above where deepDehydrate is true + */ +var dehydrateVData = (target) => dehydrateVDataUnified(target); + +const vDataKey = '__$k'; +const vDataValueKey = '__$v'; +const getAlovaStorage = () => { + // Provide prompt when silent factory is not started + silentAssert(!!dependentAlovaInstance, 'alova instance is not found, Do you forget to set `alova` or call `bootSilentFactory`?'); + return dependentAlovaInstance.l2Cache; +}; +let serializerPerformer = shared.undefinedValue; +const silentMethodIdQueueMapStorageKey = 'alova.SQ'; // Queue collection cache key composed of Silent method instance id +const silentMethodStorageKeyPrefix = 'alova.SM.'; // silentMethod instance cache key prefix +/** + * Persistence of data collections with dummy data and serializable data + * @param key persistence key + * @param payload Persistent data + */ +const storageSetItem = async (key, payload) => { + const storage = getAlovaStorage(); + if (shared.isObject(payload)) { + payload = shared.walkObject(shared.isArray(payload) ? [...payload] : { ...payload }, (value, key, parent) => { + var _a; + if (key === vDataValueKey && parent[vDataKey]) { + return value; + } + // If a silent method instance is serialized, the alova instance is filtered out + if (key === 'context' && ((_a = value === null || value === void 0 ? void 0 : value.constructor) === null || _a === void 0 ? void 0 : _a.name) === 'Alova') { + return shared.undefinedValue; + } + const vDataId = value === null || value === void 0 ? void 0 : value[symbolVDataId]; + let primitiveValue = dehydrateVDataUnified(value, shared.falseValue); + // You need to use the original value to judge, otherwise packaging classes such as new Number(1) will also be [object Object] + const toStringTag = shared.globalToString(primitiveValue); + if (toStringTag === '[object Object]') { + value = { ...value }; + primitiveValue = {}; + } + else if (shared.isArray(value)) { + value = [...value]; + primitiveValue = []; + } + if (vDataId) { + const valueWithVData = { + [vDataKey]: vDataId, + // For objects and arrays, all their internal properties will be put to the outside through `...value`, so the internal ones do not need to be traversed and converted. + // Therefore, empty the array or object to avoid repeated conversions and contamination of the original object. + [vDataValueKey]: primitiveValue, + ...value + }; + // If it is a string type, there will be items like arrays such as 0, 1, and 2 as subscripts and values as characters, and they need to be filtered out. + if (shared.instanceOf(value, String)) { + for (let i = 0; i < shared.len(value); i += 1) { + valueWithVData === null || valueWithVData === void 0 ? true : delete valueWithVData[i]; + } + } + // If it is converted into virtual data, the converted value is assigned to it internally, and is uniformly processed by value in the following logic. + value = valueWithVData; + } + return value; + }); + } + serializerPerformer = serializerPerformer || createSerializerPerformer(customSerializers); + await storage.set(key, serializerPerformer.serialize(payload)); +}; +/** + * Take out the persistent data and convert the data into virtual data and serialized data + * @param key Key to persistent data + */ +const storageGetItem = async (key) => { + const storagedResponse = await getAlovaStorage().get(key); + serializerPerformer = serializerPerformer || createSerializerPerformer(customSerializers); + return shared.isObject(storagedResponse) + ? shared.walkObject(serializerPerformer.deserialize(storagedResponse), value => { + // Convert virtual data format back to virtual data instance + if (shared.isObject(value) && (value === null || value === void 0 ? void 0 : value[vDataKey])) { + const vDataId = value[vDataKey]; + const vDataValue = createVirtualResponse(value[vDataValueKey], vDataId); + shared.forEach(shared.objectKeys(value), key => { + if (!shared.includes([vDataKey, vDataValueKey], key)) { + vDataValue[key] = value[key]; + } + }); + value = vDataValue; + } + return value; + }, shared.falseValue) + : storagedResponse; +}; +/** + * Remove persistent data + * @param key Key to persistent data + */ +const storageRemoveItem = async (key) => { + await getAlovaStorage().remove(key); +}; + +/** + * Serialize and save silentMethod instance + * @param silentMethodInstance silentMethod instance + */ +const persistSilentMethod = (silentMethodInstance) => storageSetItem(silentMethodStorageKeyPrefix + silentMethodInstance.id, silentMethodInstance); +/** + * Put the configuration information of silent request into the corresponding storage + * Logic: Construct a key and use this key to put the configuration information of the silent method into the corresponding storage, and then store the key in the unified management key storage. + * @param silentMethod SilentMethodInstance + * @param queue Operation queue name + */ +const push2PersistentSilentQueue = async (silentMethodInstance, queueName) => { + await persistSilentMethod(silentMethodInstance); + // Save the silent method instance id to queue storage + const silentMethodIdQueueMap = ((await storageGetItem(silentMethodIdQueueMapStorageKey)) || + {}); + const currentQueue = (silentMethodIdQueueMap[queueName] = silentMethodIdQueueMap[queueName] || []); + shared.pushItem(currentQueue, silentMethodInstance.id); + await storageSetItem(silentMethodIdQueueMapStorageKey, silentMethodIdQueueMap); +}; +/** + * Remove or replace silentMethod instances in the cache + * @param queue Operation queue name + * @param targetSilentMethodId Target silentMethod instance id + * @param newSilentMethod The new silentMethod instance to replace. If not passed, it means deleted. + */ +const spliceStorageSilentMethod = async (queueName, targetSilentMethodId, newSilentMethod) => { + // Remove the silent method instance id from the queue + const silentMethodIdQueueMap = ((await storageGetItem(silentMethodIdQueueMapStorageKey)) || + {}); + const currentQueue = silentMethodIdQueueMap[queueName] || []; + const index = currentQueue.findIndex(id => id === targetSilentMethodId); + if (index >= 0) { + if (newSilentMethod) { + shared.splice(currentQueue, index, 1, newSilentMethod.id); + await persistSilentMethod(newSilentMethod); + } + else { + shared.splice(currentQueue, index, 1); + } + await storageRemoveItem(silentMethodStorageKeyPrefix + targetSilentMethodId); + // Delete this queue when it is empty + shared.len(currentQueue) <= 0 && delete silentMethodIdQueueMap[queueName]; + if (shared.len(shared.objectKeys(silentMethodIdQueueMap)) > 0) { + await storageSetItem(silentMethodIdQueueMapStorageKey, silentMethodIdQueueMap); + } + else { + // Remove the queue collection when it is empty + await storageRemoveItem(silentMethodIdQueueMapStorageKey); + } + } +}; + +/** Silent method queue collection */ +let silentQueueMap = {}; +/** + * Merge queueMap into silentMethod queue collection + * @param queueMap silentMethod queue collection + */ +const merge2SilentQueueMap = (queueMap) => { + shared.forEach(shared.objectKeys(queueMap), targetQueueName => { + const currentQueue = (silentQueueMap[targetQueueName] = silentQueueMap[targetQueueName] || []); + shared.pushItem(currentQueue, ...queueMap[targetQueueName]); + }); +}; +/** + * Deeply traverse the target data and replace dummy data with real data + * @param target target data + * @param vDataResponse Collection of dummy data and real data + * @returns Is there any replacement data? + */ +const deepReplaceVData = (target, vDataResponse) => { + // Search for a single value and replace a dummy data object or dummy data id with an actual value + const replaceVData = (value) => { + const vData = stringifyVData(value); + // If directly a dummy data object and in a vDataResponse, replace the Map with the value in the vDataResponse + // If it is a string, it may contain virtual data id and in vDataResponse, it also needs to be replaced with the actual value Map + // The virtual data not in this vDataResponse will remain unchanged. It may be the virtual data Map requested next time. + if (vData in vDataResponse) { + return vDataResponse[vData]; + } + if (shared.isString(value)) { + return value.replace(shared.newInstance(shared.RegExpCls, regVDataId.source, 'g'), mat => mat in vDataResponse ? vDataResponse[mat] : mat); + } + return value; + }; + if (shared.isObject(target) && !stringifyVData(target, shared.falseValue)) { + shared.walkObject(target, replaceVData); + } + else { + target = replaceVData(target); + } + return target; +}; +/** + * Update the method instance in the queue and replace the dummy data with actual data + * @param vDataResponse A collection of virtual IDs and corresponding real data + * @param targetQueue target queue + */ +const updateQueueMethodEntities = (vDataResponse, targetQueue) => shared.PromiseCls.all(shared.mapItem(targetQueue, async (silentMethodItem) => { + // Traverse the entity object deeply. If virtual data or virtual data ID is found, replace it with actual data. + deepReplaceVData(silentMethodItem.entity, vDataResponse); + // If the method instance is updated, re-persist this silent method instance + silentMethodItem.cache && (await persistSilentMethod(silentMethodItem)); +})); +/** + * Replace dummy data with response data + * @param response real response data + * @param virtualResponse dummy response data + * @returns The corresponding real data set composed of virtual data id + */ +const replaceVirtualResponseWithResponse = (virtualResponse, response) => { + let vDataResponse = {}; + const vDataId = stringifyVData(virtualResponse, shared.falseValue); + vDataId && (vDataResponse[vDataId] = response); + if (shared.isObject(virtualResponse)) { + for (const i in virtualResponse) { + vDataResponse = { + ...vDataResponse, + ...replaceVirtualResponseWithResponse(virtualResponse[i], response === null || response === void 0 ? void 0 : response[i]) + }; + } + } + return vDataResponse; +}; +/** + * Start the SilentMethod queue + * 1. Silent submission will be put into the queue and requests will be sent in order. Only after the previous request responds will it continue to send subsequent requests. + * 2. The number of retries is only triggered when there is no response. If the server responds incorrectly or is disconnected, it will not retry. + * 3. When the number of retries is reached and still fails, when nextRound (next round) is set, delay the time specified by nextRound and then request again, otherwise it will try again after refreshing. + * 4. If there is resolveHandler and rejectHandler, they will be called after the request is completed (whether successful or failed) to notify the corresponding request to continue responding. + * + * @param queue SilentMethodqueue + */ +const setSilentMethodActive = (silentMethodInstance, active) => { + if (active) { + silentMethodInstance.active = active; + } + else { + delete silentMethodInstance.active; + } +}; +const defaultBackoffDelay = 1000; +const bootSilentQueue = (queue, queueName) => { + /** + * The callback function is controlled by waiting parameters according to the request. If it is not set or is less than or equal to 0, it will be triggered immediately. + * @param queueName queue name + * @param callback callback function + */ + const emitWithRequestDelay = (queueName) => { + const nextSilentMethod = queue[0]; + if (nextSilentMethod) { + const targetSetting = queueRequestWaitSetting.find(({ queue }) => shared.instanceOf(queue, shared.RegExpCls) ? shared.regexpTest(queue, queueName) : queue === queueName); + // eslint-disable-next-line @typescript-eslint/no-use-before-define + const callback = () => queue[0] && silentMethodRequest(queue[0]); + const delay = (targetSetting === null || targetSetting === void 0 ? void 0 : targetSetting.wait) ? shared.sloughConfig(targetSetting.wait, [nextSilentMethod, queueName]) : 0; + delay && delay > 0 ? shared.setTimeoutFn(callback, delay) : callback(); + } + }; + /** + * Run a single silentMethod instance + * @param silentMethodInstance silentMethod instance + * @param retryTimes Number of retries + */ + const silentMethodRequest = (silentMethodInstance, retryTimes = 0) => { + // Set the current silent method instance to active status + setSilentMethodActive(silentMethodInstance, shared.trueValue); + const { cache, id, behavior, entity, retryError = /.*/, maxRetryTimes = 0, backoff = { delay: defaultBackoffDelay }, resolveHandler = shared.noop, rejectHandler = shared.noop, emitter: methodEmitter, handlerArgs = [], virtualResponse, force } = silentMethodInstance; + // Trigger pre-request event + globalSQEventManager.emit(BeforeEventKey, shared.newInstance((GlobalSQEvent), behavior, entity, silentMethodInstance, queueName, retryTimes)); + shared.promiseThen(entity.send(force), async (data) => { + // The request is successful, remove the successful silent method, and continue with the next request + shared.shift(queue); + // If the request is successful, remove the successful silent method instance from storage and continue with the next request. + cache && (await spliceStorageSilentMethod(queueName, id)); + // If there is a resolve handler, call it to notify the outside + resolveHandler(data); + // Only when there is a virtualResponse, virtual data is traversed and replaced, and global events are triggered. + // Generally, it is silent behavior, but queue behavior is not required. + if (behavior === BEHAVIOR_SILENT) { + // Replace dummy data in subsequent method instances in the queue with real data + // Only after unlocking can you access the hierarchical structure of virtualResponse normally. + const vDataResponse = replaceVirtualResponseWithResponse(virtualResponse, data); + const { targetRefMethod, updateStates } = silentMethodInstance; // It is accurate to obtain it in real time + // If this silentMethod has targetRefMethod, call updateState again to update the data + // This is an implementation of delayed data updates + if (shared.instanceOf(targetRefMethod, alova.Method) && updateStates && shared.len(updateStates) > 0) { + const updateStateCollection = {}; + shared.forEach(updateStates, stateName => { + // After the request is successful, replace the data with dummy data with real data + updateStateCollection[stateName] = dataRaw => deepReplaceVData(dataRaw, vDataResponse); + }); + const updated = updateState(targetRefMethod, updateStateCollection); + // If the status modification is unsuccessful, modify the cached data. + if (!updated) { + await alova.setCache(targetRefMethod, (dataRaw) => deepReplaceVData(dataRaw, vDataResponse)); + } + } + // Perform dummy data replacement on subsequent silent method instances of the current queue + await updateQueueMethodEntities(vDataResponse, queue); + // Trigger global success event + globalSQEventManager.emit(SuccessEventKey, shared.newInstance((GlobalSQSuccessEvent), behavior, entity, silentMethodInstance, queueName, retryTimes, data, vDataResponse)); + } + // Set to inactive state + setSilentMethodActive(silentMethodInstance, shared.falseValue); + // Continue to the next silent method processing + emitWithRequestDelay(queueName); + }, reason => { + if (behavior !== BEHAVIOR_SILENT) { + // When the behavior is not silent and the request fails, rejectHandler is triggered. + // and removed from the queue and will not be retried. + shared.shift(queue); + rejectHandler(reason); + } + else { + // Each request error will trigger an error callback + const runGlobalErrorEvent = (retryDelay) => globalSQEventManager.emit(ErrorEventKey, shared.newInstance((GlobalSQErrorEvent), behavior, entity, silentMethodInstance, queueName, retryTimes, reason, retryDelay)); + // In silent behavior mode, determine whether retry is needed + // Retry is only effective when the response error matches the retryError regular match + const { name: errorName = '', message: errorMsg = '' } = reason || {}; + let regRetryErrorName; + let regRetryErrorMsg; + if (shared.instanceOf(retryError, RegExp)) { + regRetryErrorMsg = retryError; + } + else if (shared.isObject(retryError)) { + regRetryErrorName = retryError.name; + regRetryErrorMsg = retryError.message; + } + const matchRetryError = (regRetryErrorName && shared.regexpTest(regRetryErrorName, errorName)) || + (regRetryErrorMsg && shared.regexpTest(regRetryErrorMsg, errorMsg)); + // If there are still retry times, try again + if (retryTimes < maxRetryTimes && matchRetryError) { + // The next retry times need to be used to calculate the delay time, so +1 is needed here. + const retryDelay = shared.delayWithBackoff(backoff, retryTimes + 1); + runGlobalErrorEvent(retryDelay); + shared.setTimeoutFn(() => { + retryTimes += 1; + silentMethodRequest(silentMethodInstance, retryTimes); + methodEmitter.emit('retry', shared.newInstance((ScopedSQRetryEvent), behavior, entity, silentMethodInstance, handlerArgs, retryTimes, retryDelay)); + }, + // When there are still retry times, use timeout as the next request time. + retryDelay); + } + else { + setSilentFactoryStatus(2); + runGlobalErrorEvent(); + // When the number of failures is reached, or the error message does not match the retry, the failure callback is triggered. + methodEmitter.emit('fallback', shared.newInstance((ScopedSQErrorEvent), behavior, entity, silentMethodInstance, handlerArgs, reason)); + globalSQEventManager.emit(FailEventKey$1, shared.newInstance((GlobalSQFailEvent), behavior, entity, silentMethodInstance, queueName, retryTimes, reason)); + } + } + // Set to inactive state + setSilentMethodActive(silentMethodInstance, shared.falseValue); + }); + }; + emitWithRequestDelay(queueName); +}; +/** + * Put a new silentMethod instance into the queue + * @param silentMethodInstance silentMethod instance + * @param cache Does silentMethod have cache? + * @param targetQueueName target queue name + * @param onBeforePush Events before silentMethod instance push + */ +const pushNewSilentMethod2Queue = async (silentMethodInstance, cache, targetQueueName = DEFAULT_QUEUE_NAME, onBeforePush = () => []) => { + silentMethodInstance.cache = cache; + const currentQueue = (silentQueueMap[targetQueueName] = + silentQueueMap[targetQueueName] || []); + const isNewQueue = shared.len(currentQueue) <= 0; + const beforePushReturns = await Promise.all(onBeforePush()); + const isPush2Queue = !beforePushReturns.some(returns => returns === shared.falseValue); + // Under silent behavior, if there is no fallback event callback bound, it will be persisted. + // If false is returned in onBeforePushQueue, it will no longer be placed in the queue. + if (isPush2Queue) { + cache && (await push2PersistentSilentQueue(silentMethodInstance, targetQueueName)); + shared.pushItem(currentQueue, silentMethodInstance); + // If it is a new queue and the status is started, execute it + isNewQueue && silentFactoryStatus === 1 && bootSilentQueue(currentQueue, targetQueueName); + } + return isPush2Queue; +}; + +/** + * Locate the location of the silentMethod instance + * @param silentMethodInstance silentMethod instance + */ +const getBelongQueuePosition = (silentMethodInstance) => { + let queue = shared.undefinedValue; + let queueName = ''; + let position = 0; + for (const queueNameLoop in silentQueueMap) { + position = silentQueueMap[queueNameLoop].indexOf(silentMethodInstance); + if (position >= 0) { + queue = silentQueueMap[queueNameLoop]; + queueName = queueNameLoop; + break; + } + } + return [queue, queueName, position]; +}; +/** + * silentMethod instance + * Requests that need to enter silentQueue will be packaged into silentMethod instances, which will carry various parameters of the request strategy. + */ +class SilentMethod { + constructor(entity, behavior, emitter, id = shared.uuid(), force, retryError, maxRetryTimes, backoff, resolveHandler, rejectHandler, handlerArgs, vDatas) { + const thisObj = this; + thisObj.entity = entity; + thisObj.behavior = behavior; + thisObj.id = id; + thisObj.emitter = emitter; + thisObj.force = !!force; + thisObj.retryError = retryError; + thisObj.maxRetryTimes = maxRetryTimes; + thisObj.backoff = backoff; + thisObj.resolveHandler = resolveHandler; + thisObj.rejectHandler = rejectHandler; + thisObj.handlerArgs = handlerArgs; + thisObj.vDatas = vDatas; + } + /** + * Allow cache-time persistent updates to the current instance + */ + async save() { + this.cache && (await persistSilentMethod(this)); + } + /** + * Replace the current instance with a new silentMethod instance in the queue + * If there is a persistent cache, the cache will also be updated. + * @param newSilentMethod new silentMethod instance + */ + async replace(newSilentMethod) { + const targetSilentMethod = this; + silentAssert(newSilentMethod.cache === targetSilentMethod.cache, 'the cache of new silentMethod must equal with this silentMethod'); + const [queue, queueName, position] = getBelongQueuePosition(targetSilentMethod); + if (queue) { + shared.splice(queue, position, 1, newSilentMethod); + targetSilentMethod.cache && (await spliceStorageSilentMethod(queueName, targetSilentMethod.id, newSilentMethod)); + } + } + /** + * Remove the current instance. If there is persistent data, it will also be removed synchronously. + */ + async remove() { + const targetSilentMethod = this; + const [queue, queueName, position] = getBelongQueuePosition(targetSilentMethod); + if (queue) { + shared.splice(queue, position, 1); + targetSilentMethod.cache && (await spliceStorageSilentMethod(queueName, targetSilentMethod.id)); + } + } + /** + * Set the method instance corresponding to the delayed update status and the corresponding status name + * It will find the corresponding status data and update vData to the actual data after responding to this silentMethod + * + * @param method method instance + * @param updateStateName Updated status name, the default is data, you can also set multiple + */ + setUpdateState(method, updateStateName = 'data') { + if (method) { + this.targetRefMethod = method; + this.updateStates = shared.isArray(updateStateName) ? updateStateName : [updateStateName]; + } + } +} + +/** + * Deserialize the silentMethod instance according to the name of the serializer. + * @param methodInstance Request method instance + * @returns Request method instance + */ +var convertPayload2SilentMethod = (payload) => { + const { id, behavior, entity, retryError, maxRetryTimes, backoff, resolveHandler, rejectHandler, handlerArgs, targetRefMethod, force } = payload; + // Method class instantiation + const deserializeMethod = (methodPayload) => { + const { type, url, config, data } = methodPayload; + return shared.newInstance(alova.Method, type, dependentAlovaInstance, url, config, data); + }; + const silentMethodInstance = shared.newInstance(SilentMethod, deserializeMethod(entity), behavior, shared.createEventManager(), id, force, retryError, maxRetryTimes, backoff, resolveHandler, rejectHandler, handlerArgs); + silentMethodInstance.cache = shared.trueValue; + // Target ref method deserialization + if (targetRefMethod) { + silentMethodInstance.targetRefMethod = deserializeMethod(targetRefMethod); + } + // Put extra content on the silent method instance + shared.forEach(shared.objectKeys(payload), key => { + if (!shared.includes([ + 'id', + 'behavior', + 'emitter', + 'entity', + 'retryError', + 'maxRetryTimes', + 'backoff', + 'resolveHandler', + 'rejectHandler', + 'handlerArgs', + 'targetRefMethod', + 'force' + ], key)) { + silentMethodInstance[key] = payload[key]; + } + }); + return silentMethodInstance; +}; + +/** + * Load silent queue data from storage + * @returns All queue data + */ +var loadSilentQueueMapFromStorage = async () => { + const silentMethodIdQueueMap = ((await storageGetItem(silentMethodIdQueueMapStorageKey)) || + {}); + const silentQueueMap = {}; + const readingPromises = []; + shared.forEach(shared.objectKeys(silentMethodIdQueueMap), queueName => { + const currentQueue = (silentQueueMap[queueName] = silentQueueMap[queueName] || []); + shared.pushItem(readingPromises, ...shared.mapItem(silentMethodIdQueueMap[queueName], async (silentMethodId) => { + const serializedSilentMethodPayload = await storageGetItem(silentMethodStorageKeyPrefix + silentMethodId); + serializedSilentMethodPayload && + shared.pushItem(currentQueue, convertPayload2SilentMethod(serializedSilentMethodPayload)); + })); + }); + await shared.PromiseCls.all(readingPromises); + return silentQueueMap; +}; + +/** + * Bind silentSubmit startup event + * @param {SilentSubmitBootHandler} handler event callback function + * @returns unbind function + */ +const onSilentSubmitBoot = (handler) => globalSQEventManager.on(BootEventKey, handler); +/** + * Bind silentSubmit success event + * @param {SilentSubmitSuccessHandler} handler event callback function + * @returns unbind function + */ +const onSilentSubmitSuccess = (handler) => globalSQEventManager.on(SuccessEventKey, handler); +/** + * Bind silentSubmit error event + * Every time there is a request error, an error callback is triggered. + * @param {SilentSubmitErrorHandler} handler event callback function + * @returns unbind function + */ +const onSilentSubmitError = (handler) => globalSQEventManager.on(ErrorEventKey, handler); +/** + * Binding silentSubmit failure event + * The failure event will be triggered when the maximum number of requests is reached, or when the error message does not match + * @param {SilentSubmitFailHandler} handler event callback function + * @returns unbind function + */ +const onSilentSubmitFail = (handler) => globalSQEventManager.on(FailEventKey$1, handler); +/** + * Bind silentSubmit to initiate a pre-request event + * @param {BeforeSilentSubmitHandler} handler event callback function + * @returns unbind function + */ +const onBeforeSilentSubmit = (handler) => globalSQEventManager.on(BeforeEventKey, handler); +/** + * Start silent submission, which will load the silent method in the cache and start silent submission + * If no delay time is passed in, the sync starts immediately + * @param {SilentFactoryBootOptions} options Delay in milliseconds + */ +const bootSilentFactory = (options) => { + if (silentFactoryStatus === 0) { + const { alova, delay = 500 } = options; + setDependentAlova(alova); + setCustomSerializers(options.serializers); + setQueueRequestWaitSetting(options.requestWait); + shared.setTimeoutFn(async () => { + // Delayed loading puts the page’s queue at the front + merge2SilentQueueMap(await loadSilentQueueMapFromStorage()); + // Loop start queue silent submission + // Multiple queues are executed in parallel + shared.forEach(shared.objectKeys(silentQueueMap), queueName => { + bootSilentQueue(silentQueueMap[queueName], queueName); + }); + setSilentFactoryStatus(1); // Set status to Started + globalSQEventManager.emit(BootEventKey, shared.undefinedValue); + }, delay); + } +}; + +/** + * A global silentMethod instance that will have a value from before the first success event is triggered to after the last success event is triggered (synchronization period) + * In this way, the current silentMethod instance can be obtained in updateStateEffect in onSuccess. + */ +let currentSilentMethod = shared.undefinedValue; +/** + * Create SilentQueue middleware function + * @param config Configuration object + * @returns middleware function + */ +var createSilentQueueMiddlewares = (handler, config) => { + const { behavior = 'queue', queue = DEFAULT_QUEUE_NAME, retryError, maxRetryTimes, backoff } = config || {}; + const eventEmitter = shared.createEventManager(); + let handlerArgs; + let behaviorFinally; + let queueFinally = DEFAULT_QUEUE_NAME; + let forceRequest = shared.falseValue; + let silentMethodInstance; + /** + * method instance creation function + * @param args Call the function passed in by send + * @returns method instance + */ + const createMethod = (...args) => { + silentAssert(shared.isFn(handler), 'method handler must be a function. eg. useSQRequest(() => method)'); + setVDataIdCollectBasket({}); + handlerArgs = args; + return handler(...args); + }; + // Decorate success/error/complete event + const decorateRequestEvent = (requestExposure) => { + // Set event callback decorator + requestExposure.onSuccess = shared.decorateEvent(requestExposure.onSuccess, (handler, event) => { + currentSilentMethod = silentMethodInstance; + handler(shared.newInstance((ScopedSQSuccessEvent), behaviorFinally, event.method, silentMethodInstance, event.args, event.data)); + }); + requestExposure.onError = shared.decorateEvent(requestExposure.onError, (handler, event) => { + handler(shared.newInstance((ScopedSQErrorEvent), behaviorFinally, event.method, silentMethodInstance, event.args, event.error)); + }); + requestExposure.onComplete = shared.decorateEvent(requestExposure.onComplete, (handler, event) => { + handler(shared.newInstance((ScopedSQCompleteEvent), behaviorFinally, event.method, silentMethodInstance, event.args, event.status, event.data, event.error)); + }); + }; + /** + * middleware function + * @param context Request context, containing request-related values + * @param next continue executing function + * @returns Promise object + */ + const middleware = ({ method, args, cachedResponse, proxyStates, config }, next) => { + const { silentDefaultResponse, vDataCaptured, force = shared.falseValue } = config; + // Because the behavior return value may change, it should be called for each request to re-obtain the return value. + const baseEvent = AlovaEventBase.spawn(method, args); + behaviorFinally = shared.sloughConfig(behavior, [baseEvent]); + queueFinally = shared.sloughConfig(queue, [baseEvent]); + forceRequest = shared.sloughConfig(force, [baseEvent]); + // Empty temporary collection variables + // They need to be cleared before returning + const resetCollectBasket = () => { + setVDataIdCollectBasket((handlerArgs = shared.undefinedValue)); + }; + // If v data captured is set, first determine whether the request-related data contains virtual data. + if (shared.isFn(vDataCaptured)) { + let hasVData = vDataIdCollectBasket && shared.len(shared.objectKeys(vDataIdCollectBasket)) > 0; + if (!hasVData) { + const { url, data } = method; + const { params, headers } = shared.getConfig(method); + shared.walkObject({ url, params, data, headers }, value => { + if (!hasVData && (stringifyVData(value, shared.falseValue) || shared.regexpTest(regVDataId, value))) { + hasVData = shared.trueValue; + } + return value; + }); + } + // If v data captured has return data, use it as the response data, otherwise continue the request + const customResponse = hasVData ? vDataCaptured(method) : shared.undefinedValue; + if (customResponse !== shared.undefinedValue) { + resetCollectBasket(); // Reset when captured by v data captured + return shared.promiseResolve(customResponse); + } + } + if (behaviorFinally !== BEHAVIOR_STATIC) { + // Wait for the method in the queue to complete execution + const createSilentMethodPromise = () => { + const queueResolvePromise = shared.newInstance(shared.PromiseCls, (resolveHandler, rejectHandler) => { + silentMethodInstance = shared.newInstance((SilentMethod), method, behaviorFinally, eventEmitter, shared.undefinedValue, !!forceRequest, retryError, maxRetryTimes, backoff, resolveHandler, rejectHandler, handlerArgs, vDataIdCollectBasket && shared.objectKeys(vDataIdCollectBasket)); + resetCollectBasket(); // Reset when Behavior is queue and silent + }); + // On before push and on pushed events are bound synchronously, so they need to be queued asynchronously to trigger the event normally. + shared.promiseThen(shared.promiseResolve(shared.undefinedValue), async () => { + const createPushEvent = () => shared.newInstance((ScopedSQEvent), behaviorFinally, method, silentMethodInstance, args); + // Put the silent method into the queue and persist it + const isPushed = await pushNewSilentMethod2Queue(silentMethodInstance, + // After the onFallback event is bound, even the silent behavior mode is no longer stored. + // onFallback will be called synchronously, so it needs to be determined asynchronously whether there are fallbackHandlers + shared.len(eventEmitter.eventMap.fallback || []) <= 0 && behaviorFinally === BEHAVIOR_SILENT, queueFinally, + // Execute the callback before putting it into the queue. If false is returned, it will prevent putting it into the queue. + () => eventEmitter.emit('beforePushQueue', createPushEvent())); + // Only after putting it into the queue, the callback after putting it into the queue will be executed. + isPushed && eventEmitter.emit('pushedQueue', createPushEvent()); + }); + return queueResolvePromise; + }; + if (behaviorFinally === BEHAVIOR_QUEUE) { + // Forced request, or loading status needs to be updated when cache is hit + const needSendRequest = forceRequest || !cachedResponse; + if (needSendRequest) { + // Manually set to true + proxyStates.loading.v = shared.trueValue; + } + // When using the cache, use the cache directly, otherwise enter the request queue + return needSendRequest ? createSilentMethodPromise() : shared.promiseThen(shared.promiseResolve(cachedResponse)); + } + const silentMethodPromise = createSilentMethodPromise(); + // Create virtual response data in silent mode. Virtual response data can generate arbitrary virtual data. + const virtualResponse = (silentMethodInstance.virtualResponse = createVirtualResponse(shared.isFn(silentDefaultResponse) ? silentDefaultResponse() : shared.undefinedValue)); + shared.promiseThen(silentMethodPromise, realResponse => { + // Update after obtaining real data + proxyStates.data.v = realResponse; + }); + // In Silent mode, the virtual response value is returned immediately, and then updated when the real data is returned. + return shared.promiseResolve(virtualResponse); + } + resetCollectBasket(); // Reset when Behavior is static + return next(); + }; + return { + c: createMethod, + m: middleware, + d: decorateRequestEvent, + // event binding function + b: { + /** + * Bind fallback event + * @param handler Fallback event callback + */ + onFallback: (handler) => { + eventEmitter.on('fallback', handler); + }, + /** + * Event before binding to queue + * @param handler Event callback before enqueuing + */ + onBeforePushQueue: (handler) => { + eventEmitter.on('beforePushQueue', handler); + }, + /** + * Event after binding to queue + * @param handler Event callback after being queued + */ + onPushedQueue: (handler) => { + eventEmitter.on('pushedQueue', handler); + }, + /** + * retry event + * @param handler Retry event callback + */ + onRetry: (handler) => { + eventEmitter.on('retry', handler); + } + } + }; +}; + +function useSQRequest(handler, config = {}) { + const { exposeProvider, __referingObj: referingObj } = statesHookHelper(alova.promiseStatesHook()); + const { middleware = shared.noop } = config; + const { c: methodCreateHandler, m: silentMiddleware, b: binders, d: decorateEvent } = createSilentQueueMiddlewares(handler, config); + const states = useRequest(methodCreateHandler, { + ...config, + __referingObj: referingObj, + middleware: (ctx, next) => { + const silentMidPromise = silentMiddleware(ctx, next); + middleware(ctx, () => silentMidPromise); + return silentMidPromise; + } + }); + decorateEvent(states); + return exposeProvider({ + ...states, + ...binders + }); +} + +/** + * Determine whether two values are equal in a way that is compatible with virtual data + * @param prevValue Antecedent value + * @param nextValue consequent value + * @returns Are they equal? + */ +var equals = (prevValue, nextValue) => { + // If equal, return directly + if (prevValue === nextValue) { + return shared.trueValue; + } + return stringifyVData(prevValue) === stringifyVData(nextValue); +}; + +/** + * Filter all silentMethod instances that meet the criteria by method name or regular expression + * @param methodNameMatcher method name matcher + * @param queueName Find the queue name, the default is default queue + * @param filterActive Whether to filter out active instances + * @returns array of silentMethod instances + */ +const filterSilentMethods = async (methodNameMatcher, queueName = DEFAULT_QUEUE_NAME, filterActive = shared.falseValue) => { + const matchSilentMethods = (targetQueue = []) => targetQueue.filter(silentMethodItem => { + if (methodNameMatcher === shared.undefinedValue) { + return shared.trueValue; + } + const name = shared.getConfig(silentMethodItem.entity).name || ''; + const retain = shared.instanceOf(methodNameMatcher, RegExp) + ? shared.regexpTest(methodNameMatcher, name) + : name === methodNameMatcher; + return retain && (filterActive ? silentMethodItem.active : shared.trueValue); + }); + return [ + ...matchSilentMethods(silentQueueMap[queueName]), + // If the silent factory is not currently started, you also need to match the silent methods in the persistent storage. + ...(silentFactoryStatus === 0 ? matchSilentMethods((await loadSilentQueueMapFromStorage())[queueName]) : []) + ]; +}; +/** + * Find the first silentMethod instance that meets the condition by method name or regular expression + * @param methodNameMatcher method name matcher + * @param queueName Find the queue name, the default is default queue + * @param filterActive Whether to filter out active instances + * @returns silentMethod instance, undefined when not found + */ +const getSilentMethod = async (methodNameMatcher, queueName = DEFAULT_QUEUE_NAME, filterActive = shared.falseValue) => (await filterSilentMethods(methodNameMatcher, queueName, filterActive))[0]; + +/** + * Determine whether the target data is virtual data + * @param target target data + * @returns Is it virtual data? + */ +var isVData = (target) => !!stringifyVData(target, shared.falseValue) || shared.regexpTest(regVDataId, target); + +/** + * Update the status of the corresponding method + * Unlike updateState, in addition to updating the state immediately, it will also update again after responding in silent mode in order to replace the virtual data with actual data. + * @param method request method object + * @param handleUpdate update callback + */ +const updateStateEffect = async (matcher, handleUpdate) => { + // Save the target method instance to the current silent method instance + if (currentSilentMethod) { + currentSilentMethod.setUpdateState(matcher, shared.isFn(updateState) ? shared.undefinedValue : shared.objectKeys(updateState)); + await currentSilentMethod.save(); + } + return updateState(matcher, handleUpdate); +}; + +const useAutoRequest = (handler, config = {}) => { + let notifiable = shared.trueValue; + const { enableFocus = shared.trueValue, enableVisibility = shared.trueValue, enableNetwork = shared.trueValue, pollingTime = 0, throttle = 1000 } = config; + const { onMounted, onUnmounted, __referingObj: referingObject } = statesHookHelper(alova.promiseStatesHook()); + const states = useRequest(handler, { + ...config, + __referingObj: referingObject + }); + const notify = () => { + if (notifiable) { + states.send(); + if (throttle > 0) { + notifiable = shared.falseValue; + setTimeout(() => { + notifiable = shared.trueValue; + }, throttle); + } + } + }; + let offNetwork = shared.noop; + let offFocus = shared.noop; + let offVisiblity = shared.noop; + let offPolling = shared.noop; + onMounted(() => { + if (!alova.globalConfigMap.ssr) { + offNetwork = enableNetwork ? useAutoRequest.onNetwork(notify, config) : offNetwork; + offFocus = enableFocus ? useAutoRequest.onFocus(notify, config) : offFocus; + offVisiblity = enableVisibility ? useAutoRequest.onVisibility(notify, config) : offVisiblity; + offPolling = pollingTime > 0 ? useAutoRequest.onPolling(notify, config) : offPolling; + } + }); + onUnmounted(() => { + offNetwork(); + offFocus(); + offVisiblity(); + offPolling(); + }); + return states; +}; +const on = (type, handler) => { + window.addEventListener(type, handler); + return () => window.removeEventListener(type, handler); +}; +useAutoRequest.onNetwork = notify => on('online', notify); +useAutoRequest.onFocus = notify => on('focus', notify); +useAutoRequest.onVisibility = notify => { + const handle = () => document.visibilityState === 'visible' && notify(); + return on('visibilitychange', handle); +}; +useAutoRequest.onPolling = (notify, config) => { + const timer = setInterval(notify, config.pollingTime); + return () => clearInterval(timer); +}; + +const hookPrefix$1 = 'useCaptcha'; +const captchaAssert = shared.createAssert(hookPrefix$1); +var useCaptcha = (handler, config = {}) => { + const { initialCountdown, middleware } = config; + captchaAssert(initialCountdown === shared.undefinedValue || initialCountdown > 0, 'initialCountdown must be greater than 0'); + const { create, ref, objectify, exposeProvider, __referingObj: referingObject } = statesHookHelper(alova.promiseStatesHook()); + const countdown = create(0, 'countdown'); + const requestReturned = useRequest(handler, { + ...config, + __referingObj: referingObject, + immediate: shared.falseValue, + managedStates: objectify([countdown], 's'), + // eslint-disable-next-line @typescript-eslint/no-use-before-define + middleware: middleware ? (ctx, next) => middleware({ ...ctx, send }, next) : shared.undefinedValue + }); + const timer = ref(shared.undefinedValue); + const send = (...args) => shared.newInstance(shared.PromiseCls, (resolve, reject) => { + if (countdown.v <= 0) { + requestReturned + .send(...args) + .then(result => { + countdown.v = config.initialCountdown || 60; + timer.current = setInterval(() => { + countdown.v -= 1; + if (countdown.v <= 0) { + clearInterval(timer.current); + } + }, 1000); + resolve(result); + }) + .catch(reason => reject(reason)); + } + else { + reject(shared.newInstance(shared.AlovaError, hookPrefix$1, 'the countdown is not over yet')); + } + }); + return exposeProvider({ + ...requestReturned, + send, + ...objectify([countdown]) + }); +}; + +const RestoreEventKey = Symbol('FormRestore'); +const getStoragedKey = (methodInstance, id) => `alova/form-${id || shared.getMethodInternalKey(methodInstance)}`; +const sharedStates = {}; +const cloneFormData = (form) => { + const shallowClone = (value) => (shared.isArray(value) ? [...value] : shared.isPlainObject(value) ? { ...value } : value); + return shared.walkObject(shallowClone(form), shallowClone); +}; +var useForm = (handler, config = {}) => { + const typedSharedStates = sharedStates; + const { id, initialForm, store, resetAfterSubmiting, immediate = shared.falseValue, middleware } = config; + alova.promiseStatesHook(); + const { create, ref: useFlag$, onMounted, watch, objectify, exposeProvider, __referingObj: referingObject } = statesHookHelper(alova.promiseStatesHook()); + const isStoreObject = shared.isPlainObject(store); + const enableStore = isStoreObject ? store.enable : store; + // If the id in config also has a corresponding shared state, it will also be returned. + // The reason for continuing the execution is to be compatible with the problem that the number of hook executions in react cannot be changed, otherwise it will throw "Rendered fewer hooks than expected. This may be caused by an accidental early return statement." + const sharedState = id ? typedSharedStates[id] : shared.undefinedValue; + const form = create(cloneFormData(initialForm), 'form'); + const methodHandler = handler; + const eventManager = shared.createEventManager(); + // Use computed properties to avoid calling methodHandler every time this use hook is executed. + const initialMethodInstance = useFlag$(shared.sloughConfig(methodHandler, [form.v])); + const storageContext = shared.getContext(initialMethodInstance.current).l2Cache; + const storagedKey = getStoragedKey(initialMethodInstance.current, id); + const reseting = useFlag$(shared.falseValue); + const serializerPerformer = useFlag$(createSerializerPerformer(isStoreObject ? store.serializers : shared.undefinedValue)); + // Whether the shared state created by the current hook is initiated. The hook that initiates the creation needs to return the latest state. Otherwise, because the hook is called in react, the latest state cannot be obtained from the hook initiated. + const isCreateShardState = useFlag$(false); + const originalHookProvider = useRequest((...args) => methodHandler(form.v, ...args), { + ...config, + __referingObj: referingObject, + // Middleware function, also supports subscriber middleware + middleware: middleware + ? (ctx, next) => middleware({ + ...ctx, + // eslint-disable-next-line + delegatingActions: { updateForm, reset } + }, next) + : shared.undefinedValue, + // 1. When persistence is required, it will be triggered after data recovery + // 2. When there is a shared state, it means that it has been initialized before (regardless of whether there is an immediate request), and subsequent requests will no longer be automatically initiated. This is to be compatible with the issue of repeated requests when multiple forms initiate requests immediately. + immediate: enableStore || sharedState ? shared.falseValue : immediate + }); + /** + * Reset form data + */ + const reset = () => { + reseting.current = shared.trueValue; + const clonedFormData = cloneFormData(initialForm); + clonedFormData && (form.v = clonedFormData); + enableStore && storageContext.remove(storagedKey); + }; + /** + * Update form data + * @param newForm new form data + */ + const updateForm = (newForm) => { + form.v = { + ...form.v, + ...newForm + }; + }; + const hookProvider = exposeProvider({ + // The first parameter is fixed to form data + ...originalHookProvider, + ...objectify([form]), + updateForm, + reset, + // Persistent data recovery event binding + onRestore(handler) { + eventManager.on(RestoreEventKey, handler); + } + }); + // Only when there is an id, it is saved to sharedStates. + // In react, because a new form will be generated after updating the form, it needs to be resaved every time it is called. + if (id) { + // If there is no shared status yet, it means that the current hook is a created hook. + if (!sharedState) { + isCreateShardState.current = shared.trueValue; + } + // Only the shared state of the created hook is saved + if (isCreateShardState.current) { + typedSharedStates[id] = { + hookProvider: hookProvider, + config + }; + } + } + const { send, onSuccess } = hookProvider; + onMounted(() => { + // Update data when persistence is required + if (enableStore && !sharedState) { + // Get storage and update data + // It needs to be called in onMounted, otherwise it will cause it to be called repeatedly in react. + const storagedForm = serializerPerformer.current.deserialize(storageContext.get(storagedKey)); + // When there is draft data, the data is restored asynchronously, otherwise the on restore event cannot be bound normally. + if (storagedForm) { + form.v = storagedForm; + // Trigger persistent data recovery event + eventManager.emit(RestoreEventKey, shared.undefinedValue); + } + enableStore && immediate && send(...[]); + } + }); + // Monitor changes and store them synchronously. If it is triggered by reset, no further serialization is required. + watch([form], () => { + if (reseting.current || !enableStore) { + reseting.current = shared.falseValue; + return; + } + storageContext.set(storagedKey, serializerPerformer.current.serialize(form.v)); + }); + // If data needs to be cleared after submission, call reset + onSuccess(() => { + resetAfterSubmiting && reset(); + }); + // If there is a saved sharedState, return it + // If it is the shared state created by the current hook, the latest one is returned instead of the cached one. + return sharedState && !isCreateShardState.current ? sharedState.hookProvider : hookProvider; +}; + +const RetryEventKey = Symbol('RetriableRetry'); +const FailEventKey = Symbol('RetriableFail'); +const hookPrefix = 'useRetriableRequest'; +const assert$2 = shared.createAssert(hookPrefix); +var useRetriableRequest = (handler, config = {}) => { + const { retry = 3, backoff = { delay: 1000 }, middleware = shared.noop } = config; + const { ref: useFlag$, exposeProvider, __referingObj: referingObject } = statesHookHelper(alova.promiseStatesHook()); + const eventManager = shared.createEventManager(); + const retryTimes = useFlag$(0); + const stopManuallyError = useFlag$(shared.undefinedValue); // Stop error object, has value when stop is triggered manually + const methodInstanceLastest = useFlag$(shared.undefinedValue); + const argsLatest = useFlag$(shared.undefinedValue); + const requesting = useFlag$(shared.falseValue); // Is it being requested? + const retryTimer = useFlag$(shared.undefinedValue); + const stopPromiseObj = useFlag$(shared.usePromise()); + const emitOnFail = (method, args, error) => { + // On fail needs to be triggered asynchronously, and on error and on complete should be triggered first. + shared.setTimeoutFn(() => { + eventManager.emit(FailEventKey, shared.newInstance((RetriableFailEvent), AlovaEventBase.spawn(method, args), error, retryTimes.current)); + stopManuallyError.current = shared.undefinedValue; + retryTimes.current = 0; // Reset the number of retries + }); + }; + const nestedHookProvider = useRequest(handler, { + ...config, + __referingObj: referingObject, + middleware(ctx, next) { + middleware({ + ...ctx, + delegatingActions: { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + stop + } + }, () => shared.promiseResolve()); + const { proxyStates, args, send, method, controlLoading } = ctx; + controlLoading(); + const { loading } = proxyStates; + const setLoading = (value = shared.falseValue) => { + loading.v = value; + }; + const resolveFail = (error) => { + setLoading(); + proxyStates.error.v = error; + clearTimeout(retryTimer.current); // Clear retry timer + emitOnFail(method, args, error); + }; + if (!loading.v) { + shared.promiseCatch(stopPromiseObj.current.promise, error => { + resolveFail(error); + stopPromiseObj.current = shared.usePromise(); + }); + } + setLoading(shared.trueValue); + requesting.current = shared.trueValue; + methodInstanceLastest.current = method; + argsLatest.current = args; + /** + * Consider this situation: user call stop() and send another request immediately, but now the previous request haven't finished. `next()` will raises the branch on completion. + * + * By using Promise.race(), we can cause the returned promise to be rejected immediately when call `stop()` + */ + return next() + .then(val => { + // set `loading` to false when request is successful + setLoading(); + return val; + }, + // Trigger retry mechanism when request fails + error => { + // There is no manual trigger to stop, and a retry is triggered when the number of retries does not reach the maximum. + if (!stopManuallyError.current && (shared.isNumber(retry) ? retryTimes.current < retry : retry(error, ...args))) { + retryTimes.current += 1; + // Calculate retry delay time + const retryDelay = shared.delayWithBackoff(backoff, retryTimes.current); + // Delay the corresponding time and try again + retryTimer.current = shared.setTimeoutFn(() => { + // trigger retry event + eventManager.emit(RetryEventKey, shared.newInstance((RetriableRetryEvent), AlovaEventBase.spawn(method, args), retryTimes.current, retryDelay)); + // If stopped manually, retry will no longer be triggered. + shared.promiseCatch(send(...args), shared.noop); // Captured errors will no longer be thrown out, otherwise errors will be thrown when retrying. + }, retryDelay); + } + else { + error = stopManuallyError.current || error; // If stop manually error has a value, it means that the stop is triggered through the stop function. + resolveFail(error); + } + // Return reject to execute the subsequent error process + return shared.promiseReject(error); + }) + .finally(() => { + requesting.current = shared.falseValue; + }); + } + }); + /** + * Stop retrying, only valid when called during retrying + * If the request is in progress, trigger an interrupt request and let the request error throw an error. Otherwise, manually modify the status and trigger onFail. + * The onFail event will be triggered immediately after stopping + */ + const stop = () => { + assert$2(nestedHookProvider.__proxyState('loading').v, 'there is no requests being retried'); + stopManuallyError.current = shared.newInstance(shared.AlovaError, hookPrefix, 'stop retry manually'); + if (requesting.current) { + nestedHookProvider.abort(); + } + else { + stopPromiseObj.current.reject(stopManuallyError.current); + } + }; + /** + * Retry event binding + * They will be triggered after the retry is initiated + * @param handler Retry event callback + */ + const onRetry = (handler) => { + eventManager.on(RetryEventKey, event => handler(event)); + }; + /** + * failed event binding + * They will be triggered when there are no more retries, such as when the maximum number of retries is reached, when the retry callback returns false, or when stop is manually called to stop retries. + * The onError event of alova will be triggered every time an error is requested. + * + * Note: If there are no retries, onError, onComplete and onFail will be triggered at the same time. + * + * @param handler Failure event callback + */ + const onFail = (handler) => { + eventManager.on(FailEventKey, event => handler(event)); + }; + return exposeProvider({ + ...nestedHookProvider, + stop, + onRetry, + onFail + }); +}; + +const SSEOpenEventKey = Symbol('SSEOpen'); +const SSEMessageEventKey = Symbol('SSEMessage'); +const SSEErrorEventKey = Symbol('SSEError'); +var SSEHookReadyState; +(function (SSEHookReadyState) { + SSEHookReadyState[SSEHookReadyState["CONNECTING"] = 0] = "CONNECTING"; + SSEHookReadyState[SSEHookReadyState["OPEN"] = 1] = "OPEN"; + SSEHookReadyState[SSEHookReadyState["CLOSED"] = 2] = "CLOSED"; +})(SSEHookReadyState || (SSEHookReadyState = {})); +const assert$1 = shared.createAssert('useSSE'); +const MessageType = { + Open: 'open', + Error: 'error', + Message: 'message' +}; +var useSSE = (handler, config = {}) => { + const { initialData, withCredentials, interceptByGlobalResponded = shared.trueValue, + /** abortLast = trueValue, */ + immediate = shared.falseValue } = config; + // ! Temporarily does not support specifying abortLast + const abortLast = shared.trueValue; + let { memorize } = alova.promiseStatesHook(); + memorize !== null && memorize !== void 0 ? memorize : (memorize = shared.$self); + const { create, ref, onMounted, onUnmounted, objectify, exposeProvider } = statesHookHelper(alova.promiseStatesHook()); + const usingArgs = ref([]); + const eventSource = ref(shared.undefinedValue); + const sendPromiseObject = ref(shared.undefinedValue); + const data = create(initialData, 'data'); + const readyState = create(SSEHookReadyState.CLOSED, 'readyState'); + let methodInstance = getHandlerMethod(handler); + let responseUnified; + const eventManager = shared.createEventManager(); + // UseCallback object that stores custom events, where key is eventName + const customEventMap = ref(new Map()); + const onOpen = (handler) => { + eventManager.on(SSEOpenEventKey, handler); + }; + const onMessage = (handler) => { + eventManager.on(SSEMessageEventKey, handler); + }; + const onError = (handler) => { + eventManager.on(SSEErrorEventKey, handler); + }; + const responseSuccessHandler = ref(shared.$self); + const responseErrorHandler = ref(throwFn); + const responseCompleteHandler = ref(shared.noop); + /** + * Set up a response interceptor, which needs to be called after each send + */ + const setResponseHandler = (instance) => { + // responded removed since 3.0 + const { responded } = shared.getOptions(instance); + responseUnified = responded; + if (shared.isFn(responseUnified)) { + responseSuccessHandler.current = responseUnified; + } + else if (responseUnified && shared.isPlainObject(responseUnified)) { + const { onSuccess: successHandler, onError: errorHandler, onComplete: completeHandler } = responseUnified; + responseSuccessHandler.current = shared.isFn(successHandler) ? successHandler : responseSuccessHandler.current; + responseErrorHandler.current = shared.isFn(errorHandler) ? errorHandler : responseErrorHandler.current; + responseCompleteHandler.current = shared.isFn(completeHandler) ? completeHandler : responseCompleteHandler.current; + } + }; + /** + * Process response tasks and do not cache data on failure + * @param handlerReturns Data returned by the interceptor + * @returns Processed response + */ + const handleResponseTask = async (handlerReturns) => { + const { headers, transform: transformFn = shared.$self } = shared.getConfig(methodInstance); + const returnsData = await handlerReturns; + const transformedData = await transformFn(returnsData, (headers || {})); + data.v = transformedData; + // invalidate cache + alova.hitCacheBySource(methodInstance); + return transformedData; + }; + /** + * Create AlovaSSEHook event + * For specific data processing procedures, please refer to the following link + * @link https://alova.js.org/zh-CN/tutorial/combine-framework/response + */ + const createSSEEvent = async (eventFrom, dataOrError) => { + assert$1(!!eventSource.current, 'EventSource is not initialized'); + const es = eventSource.current; + const baseEvent = new AlovaSSEEvent(AlovaEventBase.spawn(methodInstance, usingArgs.current), es); + if (eventFrom === MessageType.Open) { + return Promise.resolve(baseEvent); + } + const globalSuccess = interceptByGlobalResponded ? responseSuccessHandler.current : shared.$self; + const globalError = interceptByGlobalResponded ? responseErrorHandler.current : throwFn; + const globalFinally = interceptByGlobalResponded ? responseCompleteHandler.current : shared.noop; + const p = shared.promiseFinally(shared.promiseThen(dataOrError, res => handleResponseTask(globalSuccess(res, methodInstance)), error => handleResponseTask(globalError(error, methodInstance))), + // Finally + () => { + globalFinally(methodInstance); + }); + // Regardless, the Promise object returned by the function must be fulfilled + return shared.promiseThen(p, + // Get processed data (data after transform) + res => new AlovaSSEMessageEvent(baseEvent, res), + // There is an error + error => new AlovaSSEErrorEvent(baseEvent, error)); + }; + /** + * Select the required trigger function based on the event. If the event has no errors, the callback function passed in is triggered. + * @param callback Callback function triggered when there is no error + */ + const sendSSEEvent = (callback) => (event) => { + if (event.error === shared.undefinedValue) { + return callback(event); + } + return eventManager.emit(SSEErrorEventKey, event); + }; + // * MARK: Event handling of EventSource + const onCustomEvent = (eventName, callbackHandler) => { + var _a; + const currentMap = customEventMap.current; + if (!currentMap.has(eventName)) { + const useCallbackObject = useCallback(callbacks => { + var _a; + if (callbacks.length === 0) { + (_a = eventSource.current) === null || _a === void 0 ? void 0 : _a.removeEventListener(eventName, useCallbackObject[1]); + customEventMap.current.delete(eventName); + } + }); + const trigger = useCallbackObject[1]; + currentMap.set(eventName, useCallbackObject); + (_a = eventSource.current) === null || _a === void 0 ? void 0 : _a.addEventListener(eventName, event => { + shared.promiseThen(createSSEEvent(eventName, Promise.resolve(event.data)), sendSSEEvent(trigger)); + }); + } + const [onEvent] = currentMap.get(eventName); + return onEvent(callbackHandler); + }; + /** + * Cancel the registration of custom events in useCallback + */ + const offCustomEvent = () => { + customEventMap.current.forEach(([_1, _2, offTrigger]) => { + offTrigger(); + }); + }; + const esOpen = memorize(() => { + var _a; + // resolve the promise returned when using send() + readyState.v = SSEHookReadyState.OPEN; + shared.promiseThen(createSSEEvent(MessageType.Open, Promise.resolve()), event => eventManager.emit(SSEOpenEventKey, event)); + // ! Must be resolved after calling onOpen + (_a = sendPromiseObject.current) === null || _a === void 0 ? void 0 : _a.resolve(); + }); + const esError = memorize((event) => { + var _a, _b; + readyState.v = SSEHookReadyState.CLOSED; + shared.promiseThen(createSSEEvent(MessageType.Error, Promise.reject((_a = event === null || event === void 0 ? void 0 : event.message) !== null && _a !== void 0 ? _a : 'SSE Error')), sendSSEEvent(event => eventManager.emit(SSEMessageEventKey, event))); + (_b = sendPromiseObject.current) === null || _b === void 0 ? void 0 : _b.resolve(); + }); + const esMessage = memorize((event) => { + shared.promiseThen(createSSEEvent(MessageType.Message, Promise.resolve(event.data)), sendSSEEvent(event => eventManager.emit(SSEMessageEventKey, event))); + }); + /** + * Close the registration of the current eventSource + */ + const close = () => { + const es = eventSource.current; + if (!es) { + return; + } + if (sendPromiseObject.current) { + // If the promise is still there when close + sendPromiseObject.current.resolve(); + } + // * MARK: Unbinding event handling + es.close(); + es.removeEventListener(MessageType.Open, esOpen); + es.removeEventListener(MessageType.Error, esError); + es.removeEventListener(MessageType.Message, esMessage); + readyState.v = SSEHookReadyState.CLOSED; + // After eventSource is closed, unregister all custom events + // Otherwise it may cause memory leaks + customEventMap.current.forEach(([_, eventTrigger], eventName) => { + es.removeEventListener(eventName, eventTrigger); + }); + }; + /** + * Send request and initialize eventSource + */ + const connect = (...args) => { + let es = eventSource.current; + let promiseObj = sendPromiseObject.current; + if (es && abortLast) { + // When abortLast === true, close the previous connection and re-establish it + close(); + } + // Set the promise object used by the send function + if (!promiseObj) { + promiseObj = sendPromiseObject.current = shared.usePromise(); + // Clear the promise object after open + promiseObj && + promiseObj.promise.finally(() => { + promiseObj = shared.undefinedValue; + }); + } + usingArgs.current = args; + methodInstance = getHandlerMethod(handler, args); + // Set up response interceptor + setResponseHandler(methodInstance); + const { params } = shared.getConfig(methodInstance); + const { baseURL, url } = methodInstance; + const fullURL = shared.buildCompletedURL(baseURL, url, params); + // Establish connection + es = new EventSource(fullURL, { withCredentials }); + eventSource.current = es; + readyState.v = SSEHookReadyState.CONNECTING; + // * MARK: Register to handle events + // Register to handle event open error message + es.addEventListener(MessageType.Open, esOpen); + es.addEventListener(MessageType.Error, esError); + es.addEventListener(MessageType.Message, esMessage); + // and custom events + // If the on listener is used before connect (send), there will already be events in customEventMap. + customEventMap.current.forEach(([_, eventTrigger], eventName) => { + es === null || es === void 0 ? void 0 : es.addEventListener(eventName, event => { + shared.promiseThen(createSSEEvent(eventName, Promise.resolve(event.data)), sendSSEEvent(eventTrigger)); + }); + }); + return promiseObj.promise; + }; + onUnmounted(() => { + close(); + // The above use of eventSource.removeEventListener just disconnects eventSource and trigger. + // Here is the cancellation of the event registration in the useCallback object + eventManager.off(SSEOpenEventKey); + eventManager.off(SSEMessageEventKey); + eventManager.off(SSEErrorEventKey); + offCustomEvent(); + }); + // * MARK: initialization action + onMounted(() => { + var _a; + if (immediate) { + connect(...[]); + (_a = sendPromiseObject.current) === null || _a === void 0 ? void 0 : _a.promise.catch(() => { }); + } + }); + return exposeProvider({ + send: connect, + close, + on: onCustomEvent, + onMessage, + onError, + onOpen, + eventSource, + ...objectify([readyState, data]) + }); +}; + +let currentHookIndex = 0; +// (id, (hookIndex, Actions)) +const actionsMap = {}; +const isFrontMiddlewareContext = (context) => !!context.send; +const assert = shared.createAssert('subscriber'); +/** + * Operation function delegation middleware + * After using this middleware, you can call the delegated function through accessAction. + * Can delegate multiple identical IDs + * In order to eliminate the hierarchical restrictions of components + * @param id Client ID + * @returns alova middleware function + */ +const actionDelegationMiddleware = (id) => { + const { ref, onUnmounted } = statesHookHelper(alova.promiseStatesHook()); + const hookIndex = ref(currentHookIndex + 1); + if (hookIndex.current > currentHookIndex) { + currentHookIndex += 1; + } + onUnmounted(() => { + var _a; + if ((_a = actionsMap[id]) === null || _a === void 0 ? void 0 : _a[hookIndex.current]) { + // delete action on unmount + delete actionsMap[id][hookIndex.current]; + } + }); + return (context, next) => { + // The middleware will be called repeatedly. If you have already subscribed, you do not need to subscribe again. + const { abort, proxyStates, delegatingActions = {} } = context; + const update = (newStates) => { + for (const key in newStates) { + proxyStates[key] && (proxyStates[key].v = newStates[key]); + } + }; + // Those with the same ID will be saved together in the form of an array + const hooks = (actionsMap[id] = actionsMap[id] || []); + const handler = isFrontMiddlewareContext(context) + ? { + ...delegatingActions, + send: context.send, + abort, + update + } + : { + ...delegatingActions, + fetch: context.fetch, + abort, + update + }; + hooks[hookIndex.current] = handler; + return next(); + }; +}; +/** + * Access the operation function, if there are multiple matches, onMatch will be called with this + * @param id Delegator id, or regular expression + * @param onMatch matching subscribers + * @param silent Default is false. If true, no error will be reported if there is no match + */ +const accessAction = (id, onMatch, silent = false) => { + const matched = []; + if (typeof id === 'symbol' || shared.isString(id) || shared.isNumber(id)) { + actionsMap[id] && shared.pushItem(matched, ...shared.objectValues(actionsMap[id])); + } + else if (shared.instanceOf(id, RegExp)) { + shared.forEach(shared.filterItem(shared.objectKeys(actionsMap), idItem => id.test(idItem)), idItem => { + shared.pushItem(matched, ...shared.objectValues(actionsMap[idItem])); + }); + } + // its opposite expression is too obscure + if (matched.length === 0 && !silent) { + assert(false, `no handler can be matched by using \`${id.toString()}\``); + } + shared.forEach(shared.filterItem(matched, shared.$self), onMatch); +}; + +exports.accessAction = accessAction; +exports.actionDelegationMiddleware = actionDelegationMiddleware; +exports.bootSilentFactory = bootSilentFactory; +exports.createClientTokenAuthentication = createClientTokenAuthentication; +exports.createServerTokenAuthentication = createServerTokenAuthentication; +exports.dehydrateVData = dehydrateVData; +exports.equals = equals; +exports.filterSilentMethods = filterSilentMethods; +exports.getSilentMethod = getSilentMethod; +exports.isVData = isVData; +exports.onBeforeSilentSubmit = onBeforeSilentSubmit; +exports.onSilentSubmitBoot = onSilentSubmitBoot; +exports.onSilentSubmitError = onSilentSubmitError; +exports.onSilentSubmitFail = onSilentSubmitFail; +exports.onSilentSubmitSuccess = onSilentSubmitSuccess; +exports.silentQueueMap = silentQueueMap; +exports.statesHookHelper = statesHookHelper; +exports.stringifyVData = stringifyVData; +exports.updateState = updateState; +exports.updateStateEffect = updateStateEffect; +exports.useAutoRequest = useAutoRequest; +exports.useCaptcha = useCaptcha; +exports.useFetcher = useFetcher; +exports.useForm = useForm; +exports.usePagination = usePagination; +exports.useRequest = useRequest; +exports.useRetriableRequest = useRetriableRequest; +exports.useSQRequest = useSQRequest; +exports.useSSE = useSSE; +exports.useSerialRequest = useSerialRequest; +exports.useSerialWatcher = useSerialWatcher; +exports.useWatcher = useWatcher; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.esm.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.esm.js new file mode 100644 index 0000000..f63d80a --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.esm.js @@ -0,0 +1,3430 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +import { isPlainObject, instanceOf, trueValue, falseValue, newInstance, PromiseCls, pushItem, isFn, noop, len, forEach, undefinedValue, splice, $self, isNumber, clearTimeoutTimer, setTimeoutFn, createAssert, FrameworkState, FrameworkReadableState, ObjectCls, objAssign, nullValue, mapItem, objectKeys, includes, filterItem, deleteAttr, getHandlerMethod as getHandlerMethod$1, getContext, getMethodInternalKey, promiseResolve, omit, promiseThen, sloughConfig, buildNamespacedCacheKey, getTime, createEventManager, createSyncOnceRunner, promiseCatch, isArray, createAsyncQueue, usePromise, getLocalCacheConfigParam, MEMORY, objectValues, decorateEvent, isObject, walkObject, valueObject, uuid, defineProperty, globalToString, RegExpCls, regexpTest, shift, delayWithBackoff, isString, getConfig, AlovaError, promiseReject, promiseFinally, buildCompletedURL, getOptions } from '@alova/shared'; +import { Method, queryCache, promiseStatesHook, globalConfigMap, setCache, invalidateCache, hitCacheBySource } from 'alova'; + +const defaultVisitorMeta = { + authRole: null +}; +const defaultLoginMeta = { + authRole: 'login' +}; +const defaultLogoutMeta = { + authRole: 'logout' +}; +const defaultRefreshTokenMeta = { + authRole: 'refreshToken' +}; +const checkMethodRole = ({ meta }, metaMatches) => { + if (isPlainObject(meta)) { + for (const key in meta) { + if (Object.prototype.hasOwnProperty.call(meta, key)) { + const matchedMetaItem = metaMatches[key]; + if (instanceOf(matchedMetaItem, RegExp) ? matchedMetaItem.test(meta[key]) : meta[key] === matchedMetaItem) { + return trueValue; + } + } + } + } + return falseValue; +}; +const waitForTokenRefreshed = (method, waitingList) => newInstance(PromiseCls, resolve => { + pushItem(waitingList, { + method, + resolve + }); +}); +const callHandlerIfMatchesMeta = (method, authorizationInterceptor, defaultMeta, response) => { + if (checkMethodRole(method, (authorizationInterceptor === null || authorizationInterceptor === void 0 ? void 0 : authorizationInterceptor.metaMatches) || defaultMeta)) { + const handler = isFn(authorizationInterceptor) + ? authorizationInterceptor + : isPlainObject(authorizationInterceptor) && isFn(authorizationInterceptor.handler) + ? authorizationInterceptor.handler + : noop; + return handler(response, method); + } +}; +const refreshTokenIfExpired = async (method, waitingList, updateRefreshStatus, handlerParams, refreshToken, tokenRefreshing) => { + // When the number of handle params is greater than 2, it means that this function is called from the response, and the original interface needs to be requested again. + const fromResponse = len(handlerParams) >= 2; + let isExpired = refreshToken === null || refreshToken === void 0 ? void 0 : refreshToken.isExpired(...handlerParams); + // Compatible with synchronous and asynchronous functions + if (instanceOf(isExpired, PromiseCls)) { + isExpired = await isExpired; + } + if (isExpired) { + try { + // Make another judgment in the response to prevent multiple requests to refresh the token, intercept and wait for the token sent before the token refresh is completed. + let intentToRefreshToken = trueValue; + if (fromResponse && tokenRefreshing) { + intentToRefreshToken = falseValue; // The requests waiting here indicate that the token is being refreshed. When they pass, there is no need to refresh the token again. + await waitForTokenRefreshed(method, waitingList); + } + if (intentToRefreshToken) { + updateRefreshStatus(trueValue); + // Call refresh token + await (refreshToken === null || refreshToken === void 0 ? void 0 : refreshToken.handler(...handlerParams)); + updateRefreshStatus(falseValue); + // After the token refresh is completed, the requests in the waiting list are notified. + forEach(waitingList, ({ resolve }) => resolve()); + } + if (fromResponse) { + // Because the original interface is being requested again, superposition with the previous request will result in repeated calls to transform, so it is necessary to leave transform empty to remove one call. + const { config } = method; + const methodTransformData = config.transform; + config.transform = undefinedValue; + const resentData = await method; + config.transform = methodTransformData; + return resentData; + } + } + finally { + updateRefreshStatus(falseValue); + splice(waitingList, 0, len(waitingList)); // Clear waiting list + } + } +}; +const onResponded2Record = (onRespondedHandlers) => { + let successHandler = undefinedValue; + let errorHandler = undefinedValue; + let onCompleteHandler = undefinedValue; + if (isFn(onRespondedHandlers)) { + successHandler = onRespondedHandlers; + } + else if (isPlainObject(onRespondedHandlers)) { + const { onSuccess, onError, onComplete } = onRespondedHandlers; + successHandler = isFn(onSuccess) ? onSuccess : successHandler; + errorHandler = isFn(onError) ? onError : errorHandler; + onCompleteHandler = isFn(onComplete) ? onComplete : onCompleteHandler; + } + return { + onSuccess: successHandler, + onError: errorHandler, + onComplete: onCompleteHandler + }; +}; + +/** + * Create a client-side token authentication interceptor + * @param options Configuration parameters + * @returns token authentication interceptor function + */ +const createClientTokenAuthentication = ({ visitorMeta, login, logout, refreshToken, assignToken = noop }) => { + let tokenRefreshing = falseValue; + const waitingList = []; + const onAuthRequired = onBeforeRequest => async (method) => { + const isVisitorRole = checkMethodRole(method, visitorMeta || defaultVisitorMeta); + const isLoginRole = checkMethodRole(method, (login === null || login === void 0 ? void 0 : login.metaMatches) || defaultLoginMeta); + // Ignored, login, and token refresh requests do not perform token authentication. + if (!isVisitorRole && + !isLoginRole && + !checkMethodRole(method, (refreshToken === null || refreshToken === void 0 ? void 0 : refreshToken.metaMatches) || defaultRefreshTokenMeta)) { + // If the token is being refreshed, wait for the refresh to complete before sending a request. + if (tokenRefreshing) { + await waitForTokenRefreshed(method, waitingList); + } + await refreshTokenIfExpired(method, waitingList, refreshing => { + tokenRefreshing = refreshing; + }, [method], refreshToken); + } + // Requests from non-guest and logged-in roles will enter the assignment token function + if (!isVisitorRole && !isLoginRole) { + await assignToken(method); + } + return onBeforeRequest === null || onBeforeRequest === void 0 ? void 0 : onBeforeRequest(method); + }; + const onResponseRefreshToken = originalResponded => { + const respondedRecord = onResponded2Record(originalResponded); + return { + ...respondedRecord, + onSuccess: async (response, method) => { + await callHandlerIfMatchesMeta(method, login, defaultLoginMeta, response); + await callHandlerIfMatchesMeta(method, logout, defaultLogoutMeta, response); + return (respondedRecord.onSuccess || $self)(response, method); + } + }; + }; + return { + waitingList, + onAuthRequired, + onResponseRefreshToken + }; +}; +/** + * Create a server-side token authentication interceptor + * @param options Configuration parameters + * @returns token authentication interceptor function + */ +const createServerTokenAuthentication = ({ visitorMeta, login, logout, refreshTokenOnSuccess, refreshTokenOnError, assignToken = noop }) => { + let tokenRefreshing = falseValue; + const waitingList = []; + const onAuthRequired = onBeforeRequest => async (method) => { + const isVisitorRole = checkMethodRole(method, visitorMeta || defaultVisitorMeta); + const isLoginRole = checkMethodRole(method, (login === null || login === void 0 ? void 0 : login.metaMatches) || defaultLoginMeta); + // Ignored, login, and token refresh requests do not perform token authentication. + if (!isVisitorRole && + !isLoginRole && + !checkMethodRole(method, (refreshTokenOnSuccess === null || refreshTokenOnSuccess === void 0 ? void 0 : refreshTokenOnSuccess.metaMatches) || defaultRefreshTokenMeta) && + !checkMethodRole(method, (refreshTokenOnError === null || refreshTokenOnError === void 0 ? void 0 : refreshTokenOnError.metaMatches) || defaultRefreshTokenMeta)) { + // If the token is being refreshed, wait for the refresh to complete before sending a request. + if (tokenRefreshing) { + await waitForTokenRefreshed(method, waitingList); + } + } + if (!isVisitorRole && !isLoginRole) { + await assignToken(method); + } + return onBeforeRequest === null || onBeforeRequest === void 0 ? void 0 : onBeforeRequest(method); + }; + const onResponseRefreshToken = onRespondedHandlers => { + const respondedRecord = onResponded2Record(onRespondedHandlers); + return { + ...respondedRecord, + onSuccess: async (response, method) => { + if (!checkMethodRole(method, visitorMeta || defaultVisitorMeta) && + !checkMethodRole(method, (login === null || login === void 0 ? void 0 : login.metaMatches) || defaultLoginMeta) && + !checkMethodRole(method, (refreshTokenOnSuccess === null || refreshTokenOnSuccess === void 0 ? void 0 : refreshTokenOnSuccess.metaMatches) || defaultRefreshTokenMeta)) { + const dataResent = await refreshTokenIfExpired(method, waitingList, refreshing => { + tokenRefreshing = refreshing; + }, [response, method], refreshTokenOnSuccess, tokenRefreshing); + if (dataResent) { + return dataResent; + } + } + await callHandlerIfMatchesMeta(method, login, defaultLoginMeta, response); + await callHandlerIfMatchesMeta(method, logout, defaultLogoutMeta, response); + return (respondedRecord.onSuccess || $self)(response, method); + }, + onError: async (error, method) => { + if (!checkMethodRole(method, visitorMeta || defaultVisitorMeta) && + !checkMethodRole(method, (login === null || login === void 0 ? void 0 : login.metaMatches) || defaultLoginMeta) && + !checkMethodRole(method, (refreshTokenOnError === null || refreshTokenOnError === void 0 ? void 0 : refreshTokenOnError.metaMatches) || defaultRefreshTokenMeta)) { + const dataResent = await refreshTokenIfExpired(method, waitingList, refreshing => { + tokenRefreshing = refreshing; + }, [error, method], refreshTokenOnError, tokenRefreshing); + if (dataResent) { + return dataResent; + } + } + return (respondedRecord.onError || noop)(error, method); + } + }; + }; + return { + waitingList, + onAuthRequired, + onResponseRefreshToken + }; +}; + +/** + * Compatible functions, throwing parameters + * @param error mistake + */ +const throwFn = (error) => { + throw error; +}; +function useCallback(onCallbackChange = noop) { + let callbacks = []; + const setCallback = (fn) => { + if (!callbacks.includes(fn)) { + callbacks.push(fn); + onCallbackChange(callbacks); + } + // Return unregister function + return () => { + callbacks = filterItem(callbacks, e => e !== fn); + onCallbackChange(callbacks); + }; + }; + const triggerCallback = (...args) => { + if (callbacks.length > 0) { + return forEach(callbacks, fn => fn(...args)); + } + }; + const removeAllCallback = () => { + callbacks = []; + onCallbackChange(callbacks); + }; + return [setCallback, triggerCallback, removeAllCallback]; +} +/** + * Create a debounce function and trigger the function immediately when delay is 0 + * Scenario: When calling useWatcher and setting immediate to true, the first call must be executed immediately, otherwise it will cause a delayed call + * @param {GeneralFn} fn callback function + * @param {number|(...args: any[]) => number} delay Delay description, dynamic delay can be achieved when set as a function + * @returns Delayed callback function + */ +const debounce = (fn, delay) => { + let timer = nullValue; + return function debounceFn(...args) { + const bindFn = fn.bind(this, ...args); + const delayMill = isNumber(delay) ? delay : delay(...args); + timer && clearTimeoutTimer(timer); + if (delayMill > 0) { + timer = setTimeoutFn(bindFn, delayMill); + } + else { + bindFn(); + } + }; +}; +/** + * Get the request method object + * @param methodHandler Request method handle + * @param args Method call parameters + * @returns request method object + */ +const getHandlerMethod = (methodHandler, args = []) => { + const methodInstance = isFn(methodHandler) ? methodHandler(...args) : methodHandler; + createAssert('scene')(instanceOf(methodInstance, Method), 'hook handler must be a method instance or a function that returns method instance'); + return methodInstance; +}; +/** + * Convert each value of the object and return the new object + * @param obj object + * @param callback callback function + * @returns converted object + */ +const mapObject = (obj, callback) => { + const ret = {}; + for (const key in obj) { + ret[key] = callback(obj[key], key, obj); + } + return ret; +}; +var EnumHookType; +(function (EnumHookType) { + EnumHookType[EnumHookType["USE_REQUEST"] = 1] = "USE_REQUEST"; + EnumHookType[EnumHookType["USE_WATCHER"] = 2] = "USE_WATCHER"; + EnumHookType[EnumHookType["USE_FETCHER"] = 3] = "USE_FETCHER"; +})(EnumHookType || (EnumHookType = {})); +/** + * create simple and unified, framework-independent states creators and handlers. + * @param statesHook states hook from `promiseStatesHook` function of alova + * @param referingObject refering object exported from `promiseStatesHook` function + * @returns simple and unified states creators and handlers + */ +function statesHookHelper(statesHook, referingObject = { trackedKeys: {}, bindError: falseValue }) { + const ref = (initialValue) => (statesHook.ref ? statesHook.ref(initialValue) : { current: initialValue }); + referingObject = ref(referingObject).current; + const exportState = (state) => (statesHook.export || $self)(state, referingObject); + const memorize = (fn) => { + if (!isFn(statesHook.memorize)) { + return fn; + } + const memorizedFn = statesHook.memorize(fn); + memorizedFn.memorized = true; + return memorizedFn; + }; + const { dehydrate } = statesHook; + // For performance reasons, only value is different, and the key is tracked can be updated. + const update = (newValue, state, key) => newValue !== dehydrate(state, key, referingObject) && + referingObject.trackedKeys[key] && + statesHook.update(newValue, state, key, referingObject); + const mapDeps = (deps) => mapItem(deps, item => (instanceOf(item, FrameworkReadableState) ? item.e : item)); + const createdStateList = []; + // key of deps on computed + const depKeys = {}; + return { + create: (initialValue, key) => { + pushItem(createdStateList, key); // record the keys of created states. + return newInstance((FrameworkState), statesHook.create(initialValue, key, referingObject), key, state => dehydrate(state, key, referingObject), exportState, (state, newValue) => update(newValue, state, key)); + }, + computed: (getter, depList, key) => { + // Collect all dependencies in computed + forEach(depList, dep => { + if (dep.k) { + depKeys[dep.k] = true; + } + }); + return newInstance((FrameworkReadableState), statesHook.computed(getter, mapDeps(depList), key, referingObject), key, state => dehydrate(state, key, referingObject), exportState); + }, + effectRequest: (effectRequestParams) => statesHook.effectRequest(effectRequestParams, referingObject), + ref, + watch: (source, callback) => statesHook.watch(mapDeps(source), callback, referingObject), + onMounted: (callback) => statesHook.onMounted(callback, referingObject), + onUnmounted: (callback) => statesHook.onUnmounted(callback, referingObject), + memorize, + /** + * refering object that sharing some value with this object. + */ + __referingObj: referingObject, + /** + * expose provider for specified use hook. + * @param object object that contains state proxy, framework state, operating function and event binder. + * @returns provider component. + */ + exposeProvider: (object) => { + const provider = {}; + const originalStatesMap = {}; + for (const key in object) { + const value = object[key]; + const isValueFunction = isFn(value); + // if it's a memorized function, don't memorize it any more, add it to provider directly. + // if it's start with `on`, that indicates it is an event binder, we should define a new function which return provider object. + // if it's a common function, add it to provider with memorize mode. + // Note that: in some situation, state is a function such as solid's signal, and state value is set to function in react, the state will be detected as a function. so we should check whether the key is in `trackedKeys` + if (isValueFunction && !referingObject.trackedKeys[key]) { + provider[key] = key.startsWith('on') + ? (...args) => { + value(...args); + // eslint-disable-next-line + return completedProvider; + } + : value.memorized + ? value + : memorize(value); + } + else { + const isFrameworkState = instanceOf(value, FrameworkReadableState); + if (isFrameworkState) { + originalStatesMap[key] = value.s; + } + // otherwise, it's a state proxy or framework state, add it to provider with getter mode. + ObjectCls.defineProperty(provider, key, { + get: () => { + // record the key that is being tracked. + referingObject.trackedKeys[key] = trueValue; + return isFrameworkState ? value.e : value; + }, + // set need to set an function, + // otherwise it will throw `TypeError: Cannot set property __referingObj of # which has only a getter` when setting value + set: noop, + enumerable: trueValue, + configurable: trueValue + }); + } + } + const { update: nestedHookUpdate, __proxyState: nestedProxyState } = provider; + // reset the tracked keys and bingError flag, so that the nest hook providers can be initialized. + // Always track the dependencies in computed + referingObject.trackedKeys = { + ...depKeys + }; + referingObject.bindError = falseValue; + const extraProvider = { + // expose referingObject automatically. + __referingObj: referingObject, + // the new updating function that can update the new states and nested hook states. + update: memorize((newStates) => { + objectKeys(newStates).forEach(key => { + if (includes(createdStateList, key)) { + update(newStates[key], originalStatesMap[key], key); + } + else if (key in provider && isFn(nestedHookUpdate)) { + nestedHookUpdate({ + [key]: newStates[key] + }); + } + }); + }), + __proxyState: memorize((key) => { + if (includes(createdStateList, key) && instanceOf(object[key], FrameworkReadableState)) { + // need to tag the key that is being tracked so that it can be updated with `state.v = xxx`. + referingObject.trackedKeys[key] = trueValue; + return object[key]; + } + return nestedProxyState(key); + }) + }; + const completedProvider = objAssign(provider, extraProvider); + return completedProvider; + }, + /** + * transform state proxies to object. + * @param states proxy array of framework states + * @param filterKey filter key of state proxy + * @returns an object that contains the states of target form + */ + objectify: (states, filterKey) => states.reduce((result, item) => { + result[item.k] = filterKey ? item[filterKey] : item; + return result; + }, {}), + transformState2Proxy: (state, key) => newInstance((FrameworkState), state, key, state => dehydrate(state, key, referingObject), exportState, (state, newValue) => update(newValue, state, key)) + }; +} + +const coreAssert = createAssert(''); +const requestHookAssert = createAssert('useRequest'); +const watcherHookAssert = createAssert('useWatcher'); +const fetcherHookAssert = createAssert('useFetcher'); +const coreHookAssert = (hookType) => ({ + [EnumHookType.USE_REQUEST]: requestHookAssert, + [EnumHookType.USE_WATCHER]: watcherHookAssert, + [EnumHookType.USE_FETCHER]: fetcherHookAssert +})[hookType]; +/** + * Assert whether it is a method instance + * @param methodInstance method instance + */ +const assertMethod = (assert, methodInstance) => assert(instanceOf(methodInstance, Method), 'expected a method instance.'); + +const KEY_SUCCESS = 'success'; +const KEY_ERROR = 'error'; +const KEY_COMPLETE = 'complete'; + +var createHook = (ht, c, eventManager, ro) => ({ + /** The method instance of the last request */ + m: undefinedValue, + /** saveStatesFns */ + sf: [], + /** removeStatesFns */ + rf: [], + /** frontStates */ + fs: {}, + /** eventManager */ + em: eventManager, + /** hookType, useRequest=1, useWatcher=2, useFetcher=3 */ + ht, + /** hook config */ + c, + /** referingObject */ + ro, + /** managedStates */ + ms: {} +}); + +// base event +class AlovaEventBase { + constructor(method, args) { + this.method = method; + this.args = args; + } + clone() { + return { ...this }; + } + static spawn(method, args) { + return new AlovaEventBase(method, args); + } +} +class AlovaSuccessEvent extends AlovaEventBase { + constructor(base, data, fromCache) { + super(base.method, base.args); + this.data = data; + this.fromCache = fromCache; + } +} +class AlovaErrorEvent extends AlovaEventBase { + constructor(base, error) { + super(base.method, base.args); + this.error = error; + } +} +class AlovaCompleteEvent extends AlovaEventBase { + constructor(base, status, data, fromCache, error) { + super(base.method, base.args); + this.status = status; + this.data = data; + this.fromCache = status === 'error' ? false : fromCache; + this.error = error; + } +} +// extend event +class AlovaSSEEvent extends AlovaEventBase { + constructor(base, eventSource) { + super(base.method, base.args); + this.eventSource = eventSource; + } +} +class AlovaSSEErrorEvent extends AlovaSSEEvent { + constructor(base, error) { + super(base, base.eventSource); + this.error = error; + } +} +class AlovaSSEMessageEvent extends AlovaSSEEvent { + constructor(base, data) { + super(base, base.eventSource); + this.data = data; + } +} +/** Sq top level events */ +class SQEvent { + constructor(behavior, method, silentMethod) { + this.behavior = behavior; + this.method = method; + this.silentMethod = silentMethod; + } +} +/** Sq global events */ +class GlobalSQEvent extends SQEvent { + constructor(behavior, method, silentMethod, queueName, retryTimes) { + super(behavior, method, silentMethod); + this.queueName = queueName; + this.retryTimes = retryTimes; + } +} +class GlobalSQSuccessEvent extends GlobalSQEvent { + constructor(behavior, method, silentMethod, queueName, retryTimes, data, vDataResponse) { + super(behavior, method, silentMethod, queueName, retryTimes); + this.data = data; + this.vDataResponse = vDataResponse; + } +} +class GlobalSQErrorEvent extends GlobalSQEvent { + constructor(behavior, method, silentMethod, queueName, retryTimes, error, retryDelay) { + super(behavior, method, silentMethod, queueName, retryTimes); + this.error = error; + this.retryDelay = retryDelay; + } +} +class GlobalSQFailEvent extends GlobalSQEvent { + constructor(behavior, method, silentMethod, queueName, retryTimes, error) { + super(behavior, method, silentMethod, queueName, retryTimes); + this.error = error; + } +} +/** Sq event */ +class ScopedSQEvent extends SQEvent { + constructor(behavior, method, silentMethod, args) { + super(behavior, method, silentMethod); + this.args = args; + } +} +class ScopedSQSuccessEvent extends ScopedSQEvent { + constructor(behavior, method, silentMethod, args, data) { + super(behavior, method, silentMethod, args); + this.data = data; + } +} +class ScopedSQErrorEvent extends ScopedSQEvent { + constructor(behavior, method, silentMethod, args, error) { + super(behavior, method, silentMethod, args); + this.error = error; + } +} +class ScopedSQRetryEvent extends ScopedSQEvent { + constructor(behavior, method, silentMethod, args, retryTimes, retryDelay) { + super(behavior, method, silentMethod, args); + this.retryTimes = retryTimes; + this.retryDelay = retryDelay; + } +} +class ScopedSQCompleteEvent extends ScopedSQEvent { + constructor(behavior, method, silentMethod, args, status, data, error) { + super(behavior, method, silentMethod, args); + this.status = status; + this.data = data; + this.error = error; + } +} +class RetriableRetryEvent extends AlovaEventBase { + constructor(base, retryTimes, retryDelay) { + super(base.method, base.args); + this.retryTimes = retryTimes; + this.retryDelay = retryDelay; + } +} +class RetriableFailEvent extends AlovaErrorEvent { + constructor(base, error, retryTimes) { + super(base, error); + this.retryTimes = retryTimes; + } +} + +const defaultMiddleware = (_, next) => next(); + +const stateCache = {}; +/** + * @description Get State cache data + * @param baseURL Base URL + * @param key Request key value + * @returns Cached response data, if not returned {} + */ +const getStateCache = (namespace, key) => { + const cachedState = stateCache[namespace] || {}; + return cachedState[key] || {}; +}; +/** + * @description Set State cache data + * @param baseURL Base URL + * @param key Request key value + * @param data cache data + */ +const setStateCache = (namespace, key, data, hookInstance) => { + const cachedState = (stateCache[namespace] = stateCache[namespace] || {}); + cachedState[key] = { + s: data, + h: hookInstance + }; +}; +/** + * @description Clear State cache data + * @param baseURL Base URL + * @param key Request key value + */ +const removeStateCache = (namespace, key) => { + const cachedState = stateCache[namespace]; + if (cachedState) { + deleteAttr(cachedState, key); + } +}; + +/** + * Unified processing of request logic for useRequest/useWatcher/useFetcher and other request hook functions + * @param hookInstance hook instance + * @param methodHandler Request method object or get function + * @param sendCallingArgs send function parameters + * @returns Request status + */ +function useHookToSendRequest(hookInstance, methodHandler, sendCallingArgs = []) { + const currentHookAssert = coreHookAssert(hookInstance.ht); + let methodInstance = getHandlerMethod$1(methodHandler, currentHookAssert, sendCallingArgs); + const { fs: frontStates, ht: hookType, c: useHookConfig, ms: managedStates } = hookInstance; + const { loading: loadingState, data: dataState, error: errorState } = frontStates; + const isFetcher = hookType === EnumHookType.USE_FETCHER; + const { force: forceRequest = falseValue, middleware = defaultMiddleware } = useHookConfig; + const alovaInstance = getContext(methodInstance); + const { id } = alovaInstance; + // If it is a silent request, on success will be called directly after the request, on error will not be triggered, and progress will not be updated. + const methodKey = getMethodInternalKey(methodInstance); + const { abortLast = trueValue } = useHookConfig; + const isFirstRequest = !hookInstance.m; + hookInstance.m = methodInstance; + return (async () => { + // Initialize status data, which does not need to be loaded when pulling data, because pulling data does not require returning data. + let removeStates = noop; + let saveStates = noop; + let isNextCalled = falseValue; + let responseHandlePromise = promiseResolve(undefinedValue); + let offDownloadEvent = noop; + let offUploadEvent = noop; + const cachedResponse = await queryCache(methodInstance); + let fromCache = () => !!cachedResponse; + // Whether it is a controlled loading state. When it is true, loading will no longer be set to false in response processing. + let controlledLoading = falseValue; + if (!isFetcher) { + // Store the initial state in cache for subsequent updates + saveStates = frontStates => setStateCache(id, methodKey, frontStates, hookInstance); + saveStates({ ...frontStates, ...managedStates }); + // Setting the state removal function will be passed to the effect request in the hook, and it will be set to be called when the component is unloaded. + removeStates = () => removeStateCache(id, methodKey); + } + // The middleware function next callback function allows you to modify mandatory request parameters and even replace the method instance that is about to send the request. + const guardNext = guardNextConfig => { + isNextCalled = trueValue; + const { force: guardNextForceRequest = forceRequest, method: guardNextReplacingMethod = methodInstance } = guardNextConfig || {}; + const forceRequestFinally = sloughConfig(guardNextForceRequest, [ + newInstance((AlovaEventBase), methodInstance, sendCallingArgs) + ]); + const progressUpdater = (stage) => ({ loaded, total }) => { + frontStates[stage].v = { + loaded, + total + }; + }; + methodInstance = guardNextReplacingMethod; + // The latest controller needs to be saved every time a request is sent + pushItem(hookInstance.sf, saveStates); + pushItem(hookInstance.rf, removeStates); + // Loading will not be changed when the loading state is controlled + // The cache is missed, or loading needs to be set to true when forcing a request. + if (!controlledLoading) { + loadingState.v = !!forceRequestFinally || !cachedResponse; + } + // Determine whether to trigger a progress update based on the tracking status of downloading and uploading + const { downloading: enableDownload, uploading: enableUpload } = hookInstance.ro.trackedKeys; + offDownloadEvent = enableDownload ? methodInstance.onDownload(progressUpdater('downloading')) : offDownloadEvent; + offUploadEvent = enableUpload ? methodInstance.onUpload(progressUpdater('uploading')) : offUploadEvent; + responseHandlePromise = methodInstance.send(forceRequestFinally); + fromCache = () => methodInstance.fromCache || falseValue; + return responseHandlePromise; + }; + // Call middleware function + const commonContext = { + method: methodInstance, + cachedResponse, + config: useHookConfig, + abort: () => methodInstance.abort() + }; + // Whether it is necessary to update the response data and call the response callback + const toUpdateResponse = () => hookType !== EnumHookType.USE_WATCHER || !abortLast || hookInstance.m === methodInstance; + const controlLoading = (control = trueValue) => { + // only reset loading state in first request + if (control && isFirstRequest) { + loadingState.v = falseValue; + } + controlledLoading = control; + }; + // Call middleware function + const middlewareCompletePromise = isFetcher + ? middleware({ + ...commonContext, + args: sendCallingArgs, + fetch: (methodInstance, ...args) => { + assertMethod(currentHookAssert, methodInstance); + return useHookToSendRequest(hookInstance, methodInstance, args); + }, + proxyStates: omit(frontStates, 'data'), + controlLoading + }, guardNext) + : middleware({ + ...commonContext, + args: sendCallingArgs, + send: (...args) => useHookToSendRequest(hookInstance, methodHandler, args), + proxyStates: frontStates, + controlLoading + }, guardNext); + let finallyResponse = undefinedValue; + const baseEvent = (AlovaEventBase).spawn(methodInstance, sendCallingArgs); + try { + // Unified processing of responses + const middlewareReturnedData = await middlewareCompletePromise; + const afterSuccess = (data) => { + // Update cached response data + if (!isFetcher) { + toUpdateResponse() && (dataState.v = data); + } + else if (hookInstance.c.updateState !== falseValue) { + // Update the status in the cache, usually entered in use fetcher + const cachedState = getStateCache(id, methodKey).s; + cachedState && (cachedState.data.v = data); + } + // If the response data needs to be updated, the corresponding callback function is triggered after the request. + if (toUpdateResponse()) { + errorState.v = undefinedValue; + // Loading status will no longer change to false when controlled + !controlledLoading && (loadingState.v = falseValue); + hookInstance.em.emit(KEY_SUCCESS, newInstance((AlovaSuccessEvent), baseEvent, data, fromCache())); + hookInstance.em.emit(KEY_COMPLETE, newInstance((AlovaCompleteEvent), baseEvent, KEY_SUCCESS, data, fromCache(), undefinedValue)); + } + return data; + }; + finallyResponse = + // When no data is returned or undefined is returned in the middleware, get the real response data + // Otherwise, use the returned data and no longer wait for the response promise. At this time, you also need to call the response callback. + middlewareReturnedData !== undefinedValue + ? afterSuccess(middlewareReturnedData) + : isNextCalled + ? // There are two possibilities when middlewareCompletePromise is resolve + // 1. The request is normal + // 2. The request is incorrect, but the error is captured by the middleware function. At this time, the success callback will also be called, that is, afterSuccess(undefinedValue) + await promiseThen(responseHandlePromise, afterSuccess, () => afterSuccess(undefinedValue)) + : // If is next called is not called, no data is returned + undefinedValue; + // When the next function is not called, update loading to false. + !isNextCalled && !controlledLoading && (loadingState.v = falseValue); + } + catch (error) { + if (toUpdateResponse()) { + // Controls the output of error messages + errorState.v = error; + // Loading status will no longer change to false when controlled + !controlledLoading && (loadingState.v = falseValue); + hookInstance.em.emit(KEY_ERROR, newInstance((AlovaErrorEvent), baseEvent, error)); + hookInstance.em.emit(KEY_COMPLETE, newInstance((AlovaCompleteEvent), baseEvent, KEY_ERROR, undefinedValue, fromCache(), error)); + } + throw error; + } + // Unbind download and upload events after responding + offDownloadEvent(); + offUploadEvent(); + return finallyResponse; + })(); +} + +const refCurrent = (ref) => ref.current; +/** + * Create request status and uniformly process consistent logic in useRequest, useWatcher, and useFetcher + * This function will call the creation function of statesHook to create the corresponding request state. + * When the value is empty, it means useFetcher enters, and data status and cache status are not needed at this time. + * @param methodInstance request method object + * @param useHookConfig hook request configuration object + * @param initialData Initial data data + * @param immediate Whether to initiate a request immediately + * @param watchingStates The monitored status, if not passed in, call handleRequest directly. + * @param debounceDelay Delay time for request initiation + * @returns Current request status, operation function and event binding function + */ +function createRequestState(hookType, methodHandler, useHookConfig, initialData, immediate = falseValue, watchingStates, debounceDelay = 0) { + var _a; + // shallow clone config object to avoid passing the same useHookConfig object which may cause vue2 state update error + useHookConfig = { ...useHookConfig }; + const { __referingObj: referingObject = { trackedKeys: {}, bindError: falseValue } } = useHookConfig; + let initialLoading = !!immediate; + let cachedResponse = undefinedValue; + // When sending a request immediately, you need to determine the initial loading value by whether to force the request and whether there is a cache. This has the following two benefits: + // 1. Sending the request immediately under react can save one rendering time + // 2. In the HTML rendered by SSR, the initial view is in the loading state to avoid the loading view flashing when displayed on the client. + if (immediate) { + // An error may be reported when calling the get handler method, and try/catch is required. + try { + const methodInstance = getHandlerMethod$1(methodHandler, coreHookAssert(hookType)); + const alovaInstance = getContext(methodInstance); + const l1CacheResult = alovaInstance.l1Cache.get(buildNamespacedCacheKey(alovaInstance.id, getMethodInternalKey(methodInstance))); + // The cache is only checked synchronously, so it does not take effect on asynchronous l1Cache adapters. + // It is recommended not to set up the asynchronous l1Cache adapter on the client side + if (l1CacheResult && !instanceOf(l1CacheResult, PromiseCls)) { + const [data, expireTimestamp] = l1CacheResult; + // If there is no expiration time, it means that the data will never expire. Otherwise, you need to determine whether it has expired. + if (!expireTimestamp || expireTimestamp > getTime()) { + cachedResponse = data; + } + } + const forceRequestFinally = sloughConfig((_a = useHookConfig.force) !== null && _a !== void 0 ? _a : falseValue); + initialLoading = !!forceRequestFinally || !cachedResponse; + } + catch (_b) { } + } + const { create, effectRequest, ref, objectify, exposeProvider, transformState2Proxy } = statesHookHelper(promiseStatesHook(), referingObject); + const progress = { + total: 0, + loaded: 0 + }; + // Put the externally incoming supervised states into the front states collection together + const { managedStates = {} } = useHookConfig; + const managedStatesProxy = mapObject(managedStates, (state, key) => transformState2Proxy(state, key)); + const data = create(cachedResponse !== null && cachedResponse !== void 0 ? cachedResponse : (isFn(initialData) ? initialData() : initialData), 'data'); + const loading = create(initialLoading, 'loading'); + const error = create(undefinedValue, 'error'); + const downloading = create({ ...progress }, 'downloading'); + const uploading = create({ ...progress }, 'uploading'); + const frontStates = objectify([data, loading, error, downloading, uploading]); + const eventManager = createEventManager(); + const hookInstance = refCurrent(ref(createHook(hookType, useHookConfig, eventManager, referingObject))); + /** + * ## react ##Every time the function is executed, the following items need to be reset + */ + hookInstance.fs = frontStates; + hookInstance.em = eventManager; + hookInstance.c = useHookConfig; + hookInstance.ms = managedStatesProxy; + const hasWatchingStates = watchingStates !== undefinedValue; + // Initialize request event + // Unified send request function + const handleRequest = (handler = methodHandler, sendCallingArgs) => useHookToSendRequest(hookInstance, handler, sendCallingArgs); + // only call once when multiple values changed at the same time + const onceRunner = refCurrent(ref(createSyncOnceRunner())); + // Call handleRequest in a way that catches the exception + // Catching exceptions prevents exceptions from being thrown out + const wrapEffectRequest = (ro = referingObject, handler) => { + onceRunner(() => { + promiseCatch(handleRequest(handler), error => { + // the error tracking indicates that the error need to throw. + if (!ro.bindError && !ro.trackedKeys.error) { + throw error; + } + }); + }); + }; + /** + * fix: #421 + * Use ref wraps to prevent react from creating new debounce function in every render + * Explicit passing is required because the context will change + */ + const debouncingSendHandler = ref(debounce((_, ro, handler) => wrapEffectRequest(ro, handler), (changedIndex) => isNumber(changedIndex) ? (isArray(debounceDelay) ? debounceDelay[changedIndex] : debounceDelay) : 0)); + // Do not send requests when rendering on the server side + if (!globalConfigMap.ssr) { + effectRequest({ + handler: + // When `watchingStates` is an array, it indicates the watching states (including an empty array). When it is undefined, it indicates the non-watching state. + hasWatchingStates + ? (changedIndex) => debouncingSendHandler.current(changedIndex, referingObject, methodHandler) + : () => wrapEffectRequest(referingObject), + removeStates: () => forEach(hookInstance.rf, fn => fn()), + saveStates: states => forEach(hookInstance.sf, fn => fn(states)), + frontStates: { ...frontStates, ...managedStatesProxy }, + watchingStates, + immediate: immediate !== null && immediate !== void 0 ? immediate : trueValue + }); + } + return exposeProvider({ + ...objectify([data, loading, error, downloading, uploading]), + abort: () => hookInstance.m && hookInstance.m.abort(), + /** + * Manually initiate a request by executing this method + * @param sendCallingArgs Parameters passed in when calling the send function + * @param methodInstance method object + * @param isFetcher Whether to call isFetcher + * @returns Request promise + */ + send: (sendCallingArgs, methodInstance) => handleRequest(methodInstance, sendCallingArgs), + onSuccess(handler) { + eventManager.on(KEY_SUCCESS, handler); + }, + onError(handler) { + // will not throw error when bindError is true. + // it will reset in `exposeProvider` so that ignore the error binding in custom use hooks. + referingObject.bindError = trueValue; + eventManager.on(KEY_ERROR, handler); + }, + onComplete(handler) { + eventManager.on(KEY_COMPLETE, handler); + } + }); +} + +/** + * Fetch request data and cache request method object + */ +function useFetcher(config = {}) { + const props = createRequestState(EnumHookType.USE_FETCHER, noop, config); + const { send } = props; + deleteAttr(props, 'send'); + return objAssign(props, { + /** + * Fetch data fetch will definitely send a request, and if the currently requested data has a corresponding management state, this state will be updated. + * @param matcher Method object + */ + fetch: (matcher, ...args) => { + assertMethod(fetcherHookAssert, matcher); + return send(args, matcher); + } + }); +} + +function useRequest(handler, config = {}) { + const { immediate = trueValue, initialData } = config; + const props = createRequestState(EnumHookType.USE_REQUEST, handler, config, initialData, !!immediate); + const { send } = props; + return objAssign(props, { + send: (...args) => send(args) + }); +} + +function useWatcher(handler, watchingStates, config = {}) { + watcherHookAssert(watchingStates && len(watchingStates) > 0, 'expected at least one watching state'); + const { immediate, debounce = 0, initialData } = config; + const props = createRequestState(EnumHookType.USE_WATCHER, handler, config, initialData, !!immediate, // !!immediate means not send request immediately + watchingStates, debounce); + const { send } = props; + return objAssign(props, { + send: (...args) => send(args) + }); +} + +var createSnapshotMethodsManager = (handler) => { + let methodSnapshots = {}; + return { + snapshots: () => methodSnapshots, + save(methodInstance, force = falseValue) { + const key = getMethodInternalKey(methodInstance); + // Because it is impossible to locate the location of the total data in the cache + // Therefore, this field is maintained redundantly here. + if (!methodSnapshots[key] || force) { + methodSnapshots[key] = { + entity: methodInstance + }; + } + }, + get: (entityOrPage) => methodSnapshots[getMethodInternalKey(instanceOf(entityOrPage, (Method)) ? entityOrPage : handler(entityOrPage))], + remove(key) { + if (key) { + delete methodSnapshots[key]; + } + else { + methodSnapshots = {}; + } + } + }; +}; + +const paginationAssert = createAssert('usePagination'); +const indexAssert = (index, rawData) => paginationAssert(isNumber(index) && index < len(rawData), 'index must be a number that less than list length'); +const parseSendArgs = (args) => [ + args[args.length - 2], // refreshPage + args[args.length - 1], // isRefresh + args.slice(0, args.length - 2) // send args +]; +var usePagination = (handler, config = {}) => { + const { create, computed, ref, watch, exposeProvider, objectify, __referingObj: referingObject } = statesHookHelper(promiseStatesHook()); + const { preloadPreviousPage = trueValue, preloadNextPage = trueValue, total: totalGetter = res => res.total, data: dataGetter = res => res.data, append = falseValue, initialPage = 1, initialPageSize = 10, watchingStates = [], initialData, immediate = trueValue, middleware, force = noop, ...others } = config; + const handlerRef = ref(handler); + const isReset = ref(falseValue); // Used to control whether to reset + // The number of requests during reset. In order to prevent repeated requests during reset, use this parameter to limit requests. + const page = create(initialPage, 'page'); + const pageSize = create(initialPageSize, 'pageSize'); + const data = create((initialData ? dataGetter(initialData) || [] : []), 'data'); + const total = create(initialData ? totalGetter(initialData) : undefinedValue, 'total'); + // Save snapshots of all method instances used by the current hook + const { snapshots: methodSnapshots, get: getSnapshotMethods, save: saveSnapshot, remove: removeSnapshot } = ref(createSnapshotMethodsManager(page => handlerRef.current(page, pageSize.v))).current; + const listDataGetter = (rawData) => dataGetter(rawData) || rawData; + // Initialize fetcher + const fetchStates = useFetcher({ + __referingObj: referingObject, + updateState: falseValue, + force: ({ args }) => args[len(args) - 1] + }); + const { loading, fetch, abort: abortFetch, onSuccess: onFetchSuccess } = fetchStates; + const fetchingRef = ref(loading); + const getHandlerMethod = (refreshPage = page.v, customArgs = []) => { + const handlerMethod = handler(refreshPage, pageSize.v, ...customArgs); + // Define unified additional names to facilitate management + saveSnapshot(handlerMethod); + return handlerMethod; + }; + // When monitoring status changes, reset page to 1 + watch(watchingStates, () => { + page.v = initialPage; + isReset.current = trueValue; + }); + // Compatible with react, store functions that require proxy here + // In this way, the latest operation function can be called in the proxy function and avoid the react closure trap. + const delegationActions = ref({}); + // Calculate data, total, is last page parameters + const pageCount = computed(() => { + const totalVal = total.v; + return totalVal !== undefinedValue ? Math.ceil(totalVal / pageSize.v) : undefinedValue; + }, [pageSize, total], 'pageCount'); + const createDelegationAction = (actionName) => (...args) => delegationActions.current[actionName](...args); + const states = useWatcher((...args) => { + const [refreshPage, , customArgs] = parseSendArgs(args); + return getHandlerMethod(refreshPage, customArgs); + }, [...watchingStates, page.e, pageSize.e], { + __referingObj: referingObject, + immediate, + initialData, + managedStates: objectify([data, page, pageSize, total], 's'), + middleware(ctx, next) { + if (!middleware) { + return next(); + } + return middleware({ + ...ctx, + delegatingActions: { + refresh: createDelegationAction('refresh'), + insert: createDelegationAction('insert'), + remove: createDelegationAction('remove'), + replace: createDelegationAction('replace'), + reload: createDelegationAction('reload'), + getState: (stateKey) => { + const states = { + page, + pageSize, + data, + pageCount, + total, + // eslint-disable-next-line @typescript-eslint/no-use-before-define + isLastPage + }; + return states[stateKey].v; + } + } + }, next); + }, + force: event => event.args[1] || (isFn(force) ? force(event) : force), + ...others + }); + const { send } = states; + const nestedData = states.__proxyState('data'); + // Determine whether data can be preloaded + const canPreload = async (payload) => { + const { rawData = nestedData.v, preloadPage, fetchMethod, forceRequest = falseValue, isNextPage = falseValue } = payload; + const pageCountVal = pageCount.v; + const exceedPageCount = pageCountVal + ? preloadPage > pageCountVal + : isNextPage // If it is judged to preload the next page of data and there is no page count, it is judged by whether the data volume of the last page reaches the page size. + ? len(listDataGetter(rawData)) < pageSize.v + : falseValue; + const isMatchPageScope = preloadPage > 0 && !exceedPageCount; + if (!isMatchPageScope) { + return falseValue; + } + const { e: expireMilliseconds } = getLocalCacheConfigParam(fetchMethod); + const hasCache = await queryCache(fetchMethod); + // If the cache time is less than or equal to the current time, it means that the cache is not set and the data will no longer be pre-pulled at this time. + // Or there is already a cache and it is not pre-fetched. + return expireMilliseconds(MEMORY) <= getTime() ? falseValue : forceRequest || !hasCache; + }; + // Preload next page data + const fetchNextPage = async (rawData, force, customArgs = []) => { + const nextPage = page.v + 1; + const fetchMethod = getHandlerMethod(nextPage, customArgs); + if (preloadNextPage && + (await canPreload({ + rawData, + preloadPage: nextPage, + fetchMethod, + isNextPage: trueValue, + forceRequest: force + }))) { + promiseCatch(fetch(fetchMethod, ...customArgs, force), noop); + } + }; + // Preload previous page data + const fetchPreviousPage = async (rawData, customArgs = []) => { + const prevPage = page.v - 1; + const fetchMethod = getHandlerMethod(prevPage, customArgs); + if (preloadPreviousPage && + (await canPreload({ + rawData, + preloadPage: prevPage, + fetchMethod + }))) { + promiseCatch(fetch(fetchMethod, ...customArgs, undefinedValue), noop); + } + }; + // If the returned data is smaller than the page size, it is considered the last page. + const isLastPage = computed(() => { + const dataRaw = nestedData.v; + if (!dataRaw) { + return trueValue; + } + const statesDataVal = listDataGetter(dataRaw); + const pageVal = page.v; + const pageCountVal = pageCount.v; + const dataLen = isArray(statesDataVal) ? len(statesDataVal) : 0; + return pageCountVal ? pageVal >= pageCountVal : dataLen < pageSize.v; + }, [page, pageCount, nestedData, pageSize], 'isLastPage'); + // Update current page cache + const updateCurrentPageCache = async () => { + const snapshotItem = getSnapshotMethods(page.v); + if (snapshotItem) { + await setCache(snapshotItem.entity, (rawData) => { + // When caching is turned off, raw data is undefined + if (rawData) { + const cachedListData = listDataGetter(rawData) || []; + splice(cachedListData, 0, len(cachedListData), ...data.v); + return rawData; + } + }); + } + }; + onFetchSuccess(({ method, data: rawData }) => { + // When fetch has not responded yet and the page is flipped to the page number corresponding to fetch, the list data needs to be updated manually. + const snapshotItem = getSnapshotMethods(page.v); + if (snapshotItem && getMethodInternalKey(snapshotItem.entity) === getMethodInternalKey(method)) { + // If data is appended, data is updated + const listData = listDataGetter(rawData); // Update data parameters + if (append) { + // The current page data needs to be replaced during pull-down loading. + const dataRaw = data.v; + const pageSizeVal = pageSize.v; + // When performing a removal operation, the number of replacements is less than pageSize, and dataRaw % pageSizeVal will be greater than 0. + // When adding a new operation, the number of replacements is equal to pageSize. At this time, dataRaw % pageSizeVal will be equal to 0. No replacement is needed at this time. + const replaceNumber = len(dataRaw) % pageSizeVal; + if (replaceNumber > 0) { + const rawData = [...data.v]; + splice(rawData, (page.v - 1) * pageSizeVal, replaceNumber, ...listData); + data.v = rawData; + } + } + else { + data.v = listData; + } + } + }); + const awaitResolve = ref(undefinedValue); + const awaitReject = ref(undefinedValue); + states + .onSuccess(({ data: rawData, args, method }) => { + const [refreshPage, isRefresh, customArgs] = parseSendArgs(args); + const { total: cachedTotal } = getSnapshotMethods(method) || {}; + const typedRawData = rawData; + total.v = cachedTotal !== undefinedValue ? cachedTotal : totalGetter(typedRawData); + if (!isRefresh) { + fetchPreviousPage(typedRawData, customArgs); + fetchNextPage(typedRawData, falseValue, customArgs); + } + const pageSizeVal = pageSize.v; + const listData = listDataGetter(typedRawData); // Get array + paginationAssert(isArray(listData), 'Got wrong array, did you return the correct array of list in `data` function'); + // If data is appended, data is updated + if (append) { + // If it is reset, clear the data first + if (isReset.current) { + data.v = []; + } + if (refreshPage === undefinedValue) { + data.v = [...data.v, ...listData]; + } + else if (refreshPage) { + const rawData = [...data.v]; + // If the page is refreshed, the data on that page is replaced. + splice(rawData, (refreshPage - 1) * pageSizeVal, pageSizeVal, ...listData); + data.v = rawData; + } + } + else { + data.v = listData; + } + }) + .onSuccess(({ data }) => { + var _a; + (_a = awaitResolve.current) === null || _a === void 0 ? void 0 : _a.call(awaitResolve, data); + }) + .onError(({ error }) => { + var _a; + (_a = awaitReject.current) === null || _a === void 0 ? void 0 : _a.call(awaitReject, error); + }) + .onComplete(() => { + // Whether the request is successful or not, it must be reset is reset + isReset.current = falseValue; + }); + // Get the location of a list item + const getItemIndex = (item) => { + const index = data.v.indexOf(item); + paginationAssert(index >= 0, 'item is not found in list'); + return index; + }; + const { addQueue: add2AsyncQueue, onComplete: onAsyncQueueRunComplete } = ref(createAsyncQueue()).current; + /** + * Refresh the specified page number data. This function will ignore the cache and force the request to be sent. + * If no page number is passed in, the current page will be refreshed. + * If a list item is passed in, the page where the list item is located will be refreshed, which is only valid in append mode. + * @param pageOrItemPage Refreshed page number or list item + */ + const refresh = async (pageOrItemPage = page.v) => { + let refreshPage = pageOrItemPage; + let awaitPromise = promiseResolve(); + if (append) { + if (!isNumber(pageOrItemPage)) { + const itemIndex = getItemIndex(pageOrItemPage); + refreshPage = Math.floor(itemIndex / pageSize.v) + 1; + } + paginationAssert(refreshPage <= page.v, "refresh page can't greater than page"); + // Update current page data + awaitPromise = send(refreshPage, trueValue); + } + else { + paginationAssert(isNumber(refreshPage), 'unable to calculate refresh page by item in pagination mode'); + // If the number of pages is equal, refresh the current page, otherwise fetch data + awaitPromise = + refreshPage === page.v + ? send(undefinedValue, trueValue) + : fetch(handler(refreshPage, pageSize.v), trueValue); + } + return awaitPromise; + }; + // Delete all related caches except the current page and next page of this usehook + const invalidatePaginationCache = async (all = falseValue) => { + const pageVal = page.v; + const snapshotObj = methodSnapshots(); + let snapshots = objectValues(snapshotObj); + if (all) { + removeSnapshot(); + } + else { + // Filter out data from the previous page, current page, and next page + const excludeSnapshotKeys = mapItem(filterItem([getSnapshotMethods(pageVal - 1), getSnapshotMethods(pageVal), getSnapshotMethods(pageVal + 1)], Boolean), ({ entity }) => getMethodInternalKey(entity)); + snapshots = mapItem(filterItem(objectKeys(snapshotObj), key => !includes(excludeSnapshotKeys, key)), key => { + const item = snapshotObj[key]; + delete snapshotObj[key]; + return item; + }); + } + await invalidateCache(mapItem(snapshots, ({ entity }) => entity)); + }; + // The reason for taking it out separately is that + // No matter how many times insert, remove, or a combination of them is called synchronously, the reset operation only needs to be executed asynchronously once + const resetCache = async () => { + fetchingRef.current && abortFetch(); + // cache invalidation + await invalidatePaginationCache(); + // When the amount of data on the next page does not exceed the page size, the next page is forced to be requested. Because there is a request for sharing, the fetching needs to be performed asynchronously after interrupting the request. + const snapshotItem = getSnapshotMethods(page.v + 1); + if (snapshotItem) { + const cachedListData = listDataGetter((await queryCache(snapshotItem.entity)) || {}) || []; + fetchNextPage(undefinedValue, len(cachedListData) < pageSize.v); + } + }; + // Unified update of total number of items + const updateTotal = (offset) => { + if (offset === 0) { + return; + } + // Update current page + const totalVal = total.v; + if (isNumber(totalVal)) { + const offsetedTotal = Math.max(totalVal + offset, 0); + total.v = offsetedTotal; + const pageVal = page.v; + // Update redundant total field + forEach([getSnapshotMethods(pageVal - 1), getSnapshotMethods(pageVal), getSnapshotMethods(pageVal + 1)], item => { + item && (item.total = offsetedTotal); + }); + } + }; + /** + * Insert a piece of data + * If no index is passed in, it will be inserted at the front by default. + * If a list item is passed in, it will be inserted after the list item. If the list item is not in the list data, an error will be thrown. + * @param item insert + * @param position Insert position (index) or list item + */ + const insert = (item, position = 0) => { + onAsyncQueueRunComplete(resetCache); // The cache needs to be reset at the end of execution + return add2AsyncQueue(async () => { + const index = isNumber(position) ? position : getItemIndex(position) + 1; + let popItem = undefinedValue; + const rawData = [...data.v]; + // Only when the number of items currently displayed is exactly a multiple of page size, you need to remove an item of data to ensure that the number of operating pages is page size. + if (len(rawData) % pageSize.v === 0) { + popItem = rawData.pop(); + } + // If the insertion position is empty, it will be inserted to the front by default. + splice(rawData, index, 0, item); + data.v = rawData; + updateTotal(1); + // The cache of the current page is updated synchronously + await updateCurrentPageCache(); + // If there is a pop item, put it at the head of the next page cache, consistent with the remove operation. + // In this way, the performance will be consistent when insert and remove are called synchronously. + if (popItem) { + const snapshotItem = getSnapshotMethods(page.v + 1); + if (snapshotItem) { + await setCache(snapshotItem.entity, (rawData) => { + if (rawData) { + const cachedListData = listDataGetter(rawData) || []; + cachedListData.unshift(popItem); + cachedListData.pop(); + return rawData; + } + }); + } + } + }); + }; + /** + * Remove a piece of data + * If a list item is passed in, the list item will be removed. If the list item is not in the list data, an error will be thrown. + * @param position Removed index or list item + */ + const remove = (...positions) => { + onAsyncQueueRunComplete(resetCache); // The cache needs to be reset at the end of execution + return add2AsyncQueue(async () => { + const indexes = mapItem(positions, position => { + const index = isNumber(position) ? position : getItemIndex(position); + indexAssert(index, data.v); + return index; + }); + const pageVal = page.v; + const nextPage = pageVal + 1; + const snapshotItem = getSnapshotMethods(nextPage); + const fillingItems = []; // padding data item + if (snapshotItem) { + await setCache(snapshotItem.entity, (rawData) => { + if (rawData) { + const cachedListData = listDataGetter(rawData); + // Start filling data from the head of the list on the next page + if (isArray(cachedListData)) { + pushItem(fillingItems, ...splice(cachedListData, 0, len(indexes))); + } + return rawData; + } + }); + } + const isLastPageVal = isLastPage.v; + const fillingItemsLen = len(fillingItems); + let isLastEmptyPageInNonAppendMode = false; + if (fillingItemsLen > 0 || isLastPageVal) { + // Delete data at the specified index + const newListData = filterItem(data.v, (_, index) => !includes(indexes, index)); + // In page turning mode, if it is the last page and all items have been deleted, then turn one page forward. + isLastEmptyPageInNonAppendMode = !append && isLastPageVal && len(newListData) <= 0; + if (!isLastEmptyPageInNonAppendMode && fillingItemsLen > 0) { + pushItem(newListData, ...fillingItems); + } + data.v = newListData; + } + else if (fillingItemsLen <= 0 && !isLastPageVal) { + // When the last page of data is removed, there is no need to refresh + refresh(pageVal); + } + updateTotal(-len(indexes)); + // The cache of the current page is updated synchronously + return updateCurrentPageCache().then(() => { + if (isLastEmptyPageInNonAppendMode) { + page.v = pageVal - 1; + } + }); + }); + }; + /** + * Replace a piece of data + * If the position passed in is a list item, this list item will be replaced. If the list item is not in the list data, an error will be thrown. + * @param item replacement + * @param position Replace position (index) or list item + */ + const replace = (item, position) => add2AsyncQueue(async () => { + paginationAssert(position !== undefinedValue, 'expect specify the replace position'); + const index = isNumber(position) ? position : getItemIndex(position); + indexAssert(index, data.v); + const rawData = [...data.v]; + splice(rawData, index, 1, item); + data.v = rawData; + // The cache of the current page is updated synchronously + await updateCurrentPageCache(); + }); + /** + * Reload the list starting from page ${initialPage} and clear the cache + */ + const reload = async () => { + await invalidatePaginationCache(trueValue); + isReset.current = trueValue; + page.v === initialPage ? promiseCatch(send(), noop) : (page.v = initialPage); + const { resolve, reject, promise } = usePromise(); + awaitResolve.current = resolve; + awaitReject.current = reject; + return promise; + }; + // Compatible with react, caches the latest operation function each time, avoiding closure traps + delegationActions.current = { + refresh, + insert, + remove, + replace, + reload + }; + /** @Returns */ + return exposeProvider({ + ...states, + ...objectify([data, page, pageCount, pageSize, total, isLastPage]), + send: (...args) => send(...args, undefinedValue, undefinedValue), + fetching: fetchStates.loading, + onFetchSuccess: fetchStates.onSuccess, + onFetchError: fetchStates.onError, + onFetchComplete: fetchStates.onComplete, + refresh, + insert, + remove, + replace, + reload + }); +}; + +/** + * Assert serialHandlers + * @param hookName hook name + * @param serialHandlers Serial request method acquisition function + */ +const assertSerialHandlers = (hookName, serialHandlers) => createAssert(hookName)(isArray(serialHandlers) && len(serialHandlers) > 0, 'please use an array to represent serial requests'); +/** + * Create serial request middleware + * @param serialHandlers Serial request method acquisition function + * @param hookMiddleware use hook middleware + * @returns Serial request middleware + */ +const serialMiddleware = (serialHandlers, hookMiddleware, serialRequestMethods = []) => { + // The first handler is passed to the use hook externally and does not need to be requested again. + serialHandlers.shift(); + return ((ctx, next) => { + hookMiddleware === null || hookMiddleware === void 0 ? void 0 : hookMiddleware(ctx, () => promiseResolve(undefinedValue)); + ctx.controlLoading(); + const loadingState = ctx.proxyStates.loading; + loadingState.v = trueValue; + let serialPromise = next(); + for (const handler of serialHandlers) { + serialPromise = promiseThen(serialPromise, value => { + const methodItem = handler(value, ...ctx.args); + pushItem(serialRequestMethods, methodItem); + return methodItem.send(); + }); + } + return serialPromise.finally(() => { + loadingState.v = falseValue; + }); + }); +}; + +/** + * Serial request hook, each serialHandlers will receive the result of the previous request + * Applicable scenario: Serial request for a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialRequest related data and operation functions + */ +var useSerialRequest = (serialHandlers, config = {}) => { + assertSerialHandlers('useSerialRequest', serialHandlers); + // eslint-disable-next-line + const { ref, __referingObj } = statesHookHelper(promiseStatesHook()); + const methods = ref([]).current; + const exposures = useRequest(serialHandlers[0], { + ...config, + __referingObj, + middleware: serialMiddleware(serialHandlers, config.middleware, methods) + }); + // Decorate the error callback function and set event.method to the instance of the error + exposures.onError = decorateEvent(exposures.onError, (handler, event) => { + event.method = methods[len(methods) - 1]; + handler(event); + }); + return exposures; +}; + +/** + * Serial request hook, each serialHandlers will receive the result of the previous request + * Applicable scenario: After monitoring status changes, serially request a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialRequest related data and operation functions + */ +var useSerialWatcher = (serialHandlers, watchingStates, config = {}) => { + assertSerialHandlers('useSerialWatcher', serialHandlers); + // eslint-disable-next-line + const { ref, __referingObj } = statesHookHelper(promiseStatesHook()); + const methods = ref([]).current; + const exposures = useWatcher(serialHandlers[0], watchingStates, { + ...config, + __referingObj, + middleware: serialMiddleware(serialHandlers, config.middleware, methods) + }); + // Decorate the error callback function and set event.method to the instance of the error + exposures.onError = decorateEvent(exposures.onError, (handler, event) => { + event.method = methods[len(methods) - 1]; + handler(event); + }); + return exposures; +}; + +const STR_VALUE_OF = 'valueOf'; +const DEFAULT_QUEUE_NAME = 'default'; +const BEHAVIOR_SILENT = 'silent'; +const BEHAVIOR_QUEUE = 'queue'; +const BEHAVIOR_STATIC = 'static'; +/** + * Global virtual data collection array + * It will only be an array when the method is created, and undefined at other times + * + * Explanation: The purpose of collecting virtual data is to determine whether virtual data is used in a method instance. + * Includes the following forms: + * useSQRequest((vDataId) => createMethod({ vDataId }) //Reference function parameters + * useSQRequest(() => createMethod({ vDataId }) //Directly reference scope parameters + * + * Or even: + * function createMethod(obj) { + * return alovaInst.Get('/list', { + * params: { status: obj.vDataId ? 1 : 0 } + * }) + * } + * useSQRequest(() => createMethod(obj) //Directly reference scope parameters + * + * Ways to use dummy data include: + * 1. Directly assign values as parameters + * 2. Use dummy data id + * 3. Indirect use of virtual data, such as + * vData ? 1 : 0 + * !!vData + * vData+1 + * etc. as calculation parameters. + */ +let vDataIdCollectBasket; +const setVDataIdCollectBasket = (value) => { + vDataIdCollectBasket = value; +}; +/** + * The dependent alova instance, its storage adapter, request adapter, etc. will be used to access the SilentMethod instance and send silent submissions + */ +let dependentAlovaInstance; +const setDependentAlova = (alovaInst) => { + dependentAlovaInstance = alovaInst; +}; +/** + * Set up a custom serializer + */ +let customSerializers = {}; +const setCustomSerializers = (serializers = {}) => { + customSerializers = serializers; +}; +/** + * silentFactory status + * 0 means not started + * 1 means in progress, changed after calling bootSilentFactory + * 2 indicates that the request failed, that is, when the maximum number of requests is reached according to the retry rules, or when the retry rules are not matched, the request is changed. + */ +let silentFactoryStatus = 0; +const setSilentFactoryStatus = (status) => { + silentFactoryStatus = status; +}; +/** + * The request waiting time in silentQueue, in milliseconds (ms) + * It indicates the waiting time of the silentMethod that is about to send the request + * If not set, or set to 0, the silentMethod request is triggered immediately + * + * Tips: + * 1. When set directly, it is effective for the default queue by default. + * 2. If you need to set other queue settings, you can specify them as objects, such as: + * [ + * Indicates waiting 5000ms for the queue setting request named customName + * { name: 'customName', wait: 5000 }, + * + * //Indicates that in all queues with the prefix prefix, the request setting with method instance name xxx is set to wait 5000ms + * { name: /^prefix/, wait: silentMethod => silentMethod.entity.config.name === 'xxx' ? 5000 : 0 }, + * ] + * + * >>> It only works if the request succeeds, if it fails it will use the retry policy parameters + */ +let queueRequestWaitSetting = []; +const setQueueRequestWaitSetting = (requestWaitSetting = 0) => { + queueRequestWaitSetting = isArray(requestWaitSetting) + ? requestWaitSetting + : [ + { + queue: DEFAULT_QUEUE_NAME, + wait: requestWaitSetting + } + ]; +}; +const BootEventKey = Symbol('GlobalSQBoot'); +const BeforeEventKey = Symbol('GlobalSQBefore'); +const SuccessEventKey = Symbol('GlobalSQSuccess'); +const ErrorEventKey = Symbol('GlobalSQError'); +const FailEventKey$1 = Symbol('GlobalSQFail'); +/** Global silent event management object */ +const globalSQEventManager = createEventManager(); +/** Silent assert */ +const silentAssert = createAssert('useSQRequest'); + +/** + * Update the status of the corresponding method + * @param method request method object + * @param handleUpdate update callback + * @returns Whether the update is successful or not. If the corresponding status is not found, the update will not be successful. + */ +async function updateState(matcher, handleUpdate) { + let updated = falseValue; + // Only process the first method instance that meets the conditions. If there is no instance that meets the conditions, it will not be processed. + if (matcher) { + const { update } = promiseStatesHook(); + const methodKey = getMethodInternalKey(matcher); + const { id } = getContext(matcher); + const { s: frontStates, h: hookInstance } = getStateCache(id, methodKey); + const updateStateCollection = isFn(handleUpdate) + ? { data: handleUpdate } + : handleUpdate; + let updatedDataColumnData = undefinedValue; + if (frontStates) { + // Loop through the updated data and assign it to the supervised state + forEach(objectKeys(updateStateCollection), stateName => { + coreAssert(stateName in frontStates, `state named \`${stateName}\` is not found`); + const targetStateProxy = frontStates[stateName]; + let updatedData = updateStateCollection[stateName](targetStateProxy.v); + // shallow clone the updatedData so that can effect in react. + updatedData = isArray(updatedData) + ? [...updatedData] + : isObject(updatedData) + ? { ...updatedData } + : updatedData; + // Record the updated value of the data field, used to update cached data + if (stateName === 'data') { + updatedDataColumnData = updatedData; + } + // Update directly using update without checking referring object.tracked keys + update(updatedData, frontStates[stateName].s, stateName, hookInstance.ro); + }); + updated = trueValue; + } + // If data is updated, cache and persistent data need to be updated at the same time + if (updatedDataColumnData !== undefinedValue) { + setCache(matcher, updatedDataColumnData); + } + } + return updated; +} + +var dateSerializer = { + forward: data => (instanceOf(data, Date) ? data.getTime() : undefinedValue), + backward: ts => newInstance(Date, ts) +}; + +var regexpSerializer = { + forward: data => (instanceOf(data, RegExp) ? data.source : undefined), + backward: source => newInstance(RegExp, source) +}; + +const createSerializerPerformer = (customSerializers = {}) => { + /** + * Merge built-in serializers and custom serializers + */ + const serializers = { + date: dateSerializer, + regexp: regexpSerializer, + ...customSerializers + }; + /** + * serialized data + */ + const serialize = (payload) => { + if (isObject(payload)) { + payload = walkObject(isArray(payload) ? [...payload] : { ...payload }, value => { + let finallyApplySerializerName = undefinedValue; + // Find a matching serializer and serialize the value. If not found, return the original value. + const serializedValue = objectKeys(serializers).reduce((currentValue, serializerName) => { + if (!finallyApplySerializerName) { + const serializedValueItem = serializers[serializerName].forward(currentValue); + if (serializedValueItem !== undefinedValue) { + finallyApplySerializerName = serializerName; + currentValue = serializedValueItem; + } + } + return currentValue; + }, value); + // You need to use the original value to judge, otherwise packaging classes such as new Number(1) will also be [object Object] + const toStringTag = ObjectCls.prototype.toString.call(value); + if (toStringTag === '[object Object]') { + value = { ...value }; + } + else if (isArray(value)) { + value = [...value]; + } + return finallyApplySerializerName !== undefinedValue ? [finallyApplySerializerName, serializedValue] : value; + }); + } + return payload; + }; + /** + * Deserialize data + */ + const deserialize = (payload) => isObject(payload) + ? walkObject(payload, value => { + if (isArray(value) && len(value) === 2) { + const foundSerializer = serializers[value[0]]; + value = foundSerializer ? foundSerializer.backward(value[1]) : value; + } + return value; + }, falseValue) + : payload; + return { + serialize, + deserialize + }; +}; + +const symbolVDataId = Symbol('vdid'); +const symbolOriginal = Symbol('original'); +const regVDataId = /\[vd:([0-9a-z]+)\]/; + +/** + * Unified vData collection function + * It will be called in the following 4 places + * 1. When accessing sub-properties + * 2. When participating in calculation and triggering [Symbol.toPrimitive] + * 3. When getting the id of vData + * 4. When getting its original value + * + * @param returnValue Return value, if it is a function then call it + * @returns collection function + */ +const vDataCollectUnified = (target) => { + const vDataId = target === null || target === void 0 ? void 0 : target[symbolVDataId]; + vDataId && vDataIdCollectBasket && (vDataIdCollectBasket[vDataId] = undefinedValue); +}; +// export const vDataGetter = (key: string) => vDataCollectGetter((thisObj: any) => thisObj.__proto__[key].call(thisObj)); + +/** + * Dummy data is stringified. If the parameter is not dummy data, the original data is returned. + * @param target dummy data + * @param returnOriginalIfNotVData If it is not virtual data, return the original value. + * @returns Virtual data id or original data + */ +const stringifyVData = (target, returnOriginalIfNotVData = trueValue) => { + vDataCollectUnified(target); + const vDataIdRaw = target === null || target === void 0 ? void 0 : target[symbolVDataId]; + const vDataId = vDataIdRaw ? `[vd:${vDataIdRaw}]` : undefinedValue; + return vDataId || (returnOriginalIfNotVData ? target : undefinedValue); +}; +/** + * Create a getter function for virtual data id collection + * @param valueReturnFn return value function + * @returns getter function + */ +function stringifyWithThis() { + return stringifyVData(this); +} + +/** + * Null wrapper class implementation + */ +const Null = function Null() { }; +Null.prototype = ObjectCls.create(nullValue, { + [STR_VALUE_OF]: valueObject(stringifyWithThis) +}); + +/** + * Undefined wrapper class implementation + */ +const Undefined = function Undefined() { }; +Undefined.prototype = ObjectCls.create(nullValue, { + [STR_VALUE_OF]: valueObject(stringifyWithThis) +}); + +/** + * Create dummy response data + * @returns Virtual response data proxy instance + */ +var createVirtualResponse = (structure, vDataId = uuid()) => { + const transform2VData = (value, vDataIdInner = uuid()) => { + if (value === nullValue) { + value = newInstance(Null); + } + else if (value === undefinedValue) { + value = newInstance(Undefined); + } + else { + const newValue = ObjectCls(value); + defineProperty(newValue, STR_VALUE_OF, stringifyWithThis); + defineProperty(newValue, symbolOriginal, value); + value = newValue; + } + defineProperty(value, symbolVDataId, vDataIdInner); + return value; + }; + const virtualResponse = transform2VData(structure, vDataId); + if (isPlainObject(virtualResponse) || isArray(virtualResponse)) { + walkObject(virtualResponse, value => transform2VData(value)); + } + return virtualResponse; +}; + +/** + * Get original value of variable with dummy data + * This function will also perform vData collection + * @param target target value + * @param deepDehydrate Whether the depth of dehydration value + * @returns target value with primitive type + */ +const dehydrateVDataUnified = (target, deepDehydrate = trueValue) => { + const dehydrateItem = (value) => { + vDataCollectUnified(value); + if (value === null || value === void 0 ? void 0 : value[symbolVDataId]) { + if (instanceOf(value, Undefined)) { + value = undefinedValue; + } + else if (instanceOf(value, Null)) { + value = nullValue; + } + else if (instanceOf(value, Number) || instanceOf(value, String) || instanceOf(value, Boolean)) { + value = value[symbolOriginal]; + } + } + return value; + }; + const newTarget = dehydrateItem(target); + // If it is an object or array, deep traversal is required to obtain the virtual data value. + if (deepDehydrate && (isObject(newTarget) || isArray(newTarget))) { + walkObject(newTarget, value => dehydrateItem(value)); + } + return newTarget; +}; +/** + * The version above where deepDehydrate is true + */ +var dehydrateVData = (target) => dehydrateVDataUnified(target); + +const vDataKey = '__$k'; +const vDataValueKey = '__$v'; +const getAlovaStorage = () => { + // Provide prompt when silent factory is not started + silentAssert(!!dependentAlovaInstance, 'alova instance is not found, Do you forget to set `alova` or call `bootSilentFactory`?'); + return dependentAlovaInstance.l2Cache; +}; +let serializerPerformer = undefinedValue; +const silentMethodIdQueueMapStorageKey = 'alova.SQ'; // Queue collection cache key composed of Silent method instance id +const silentMethodStorageKeyPrefix = 'alova.SM.'; // silentMethod instance cache key prefix +/** + * Persistence of data collections with dummy data and serializable data + * @param key persistence key + * @param payload Persistent data + */ +const storageSetItem = async (key, payload) => { + const storage = getAlovaStorage(); + if (isObject(payload)) { + payload = walkObject(isArray(payload) ? [...payload] : { ...payload }, (value, key, parent) => { + var _a; + if (key === vDataValueKey && parent[vDataKey]) { + return value; + } + // If a silent method instance is serialized, the alova instance is filtered out + if (key === 'context' && ((_a = value === null || value === void 0 ? void 0 : value.constructor) === null || _a === void 0 ? void 0 : _a.name) === 'Alova') { + return undefinedValue; + } + const vDataId = value === null || value === void 0 ? void 0 : value[symbolVDataId]; + let primitiveValue = dehydrateVDataUnified(value, falseValue); + // You need to use the original value to judge, otherwise packaging classes such as new Number(1) will also be [object Object] + const toStringTag = globalToString(primitiveValue); + if (toStringTag === '[object Object]') { + value = { ...value }; + primitiveValue = {}; + } + else if (isArray(value)) { + value = [...value]; + primitiveValue = []; + } + if (vDataId) { + const valueWithVData = { + [vDataKey]: vDataId, + // For objects and arrays, all their internal properties will be put to the outside through `...value`, so the internal ones do not need to be traversed and converted. + // Therefore, empty the array or object to avoid repeated conversions and contamination of the original object. + [vDataValueKey]: primitiveValue, + ...value + }; + // If it is a string type, there will be items like arrays such as 0, 1, and 2 as subscripts and values as characters, and they need to be filtered out. + if (instanceOf(value, String)) { + for (let i = 0; i < len(value); i += 1) { + valueWithVData === null || valueWithVData === void 0 ? true : delete valueWithVData[i]; + } + } + // If it is converted into virtual data, the converted value is assigned to it internally, and is uniformly processed by value in the following logic. + value = valueWithVData; + } + return value; + }); + } + serializerPerformer = serializerPerformer || createSerializerPerformer(customSerializers); + await storage.set(key, serializerPerformer.serialize(payload)); +}; +/** + * Take out the persistent data and convert the data into virtual data and serialized data + * @param key Key to persistent data + */ +const storageGetItem = async (key) => { + const storagedResponse = await getAlovaStorage().get(key); + serializerPerformer = serializerPerformer || createSerializerPerformer(customSerializers); + return isObject(storagedResponse) + ? walkObject(serializerPerformer.deserialize(storagedResponse), value => { + // Convert virtual data format back to virtual data instance + if (isObject(value) && (value === null || value === void 0 ? void 0 : value[vDataKey])) { + const vDataId = value[vDataKey]; + const vDataValue = createVirtualResponse(value[vDataValueKey], vDataId); + forEach(objectKeys(value), key => { + if (!includes([vDataKey, vDataValueKey], key)) { + vDataValue[key] = value[key]; + } + }); + value = vDataValue; + } + return value; + }, falseValue) + : storagedResponse; +}; +/** + * Remove persistent data + * @param key Key to persistent data + */ +const storageRemoveItem = async (key) => { + await getAlovaStorage().remove(key); +}; + +/** + * Serialize and save silentMethod instance + * @param silentMethodInstance silentMethod instance + */ +const persistSilentMethod = (silentMethodInstance) => storageSetItem(silentMethodStorageKeyPrefix + silentMethodInstance.id, silentMethodInstance); +/** + * Put the configuration information of silent request into the corresponding storage + * Logic: Construct a key and use this key to put the configuration information of the silent method into the corresponding storage, and then store the key in the unified management key storage. + * @param silentMethod SilentMethodInstance + * @param queue Operation queue name + */ +const push2PersistentSilentQueue = async (silentMethodInstance, queueName) => { + await persistSilentMethod(silentMethodInstance); + // Save the silent method instance id to queue storage + const silentMethodIdQueueMap = ((await storageGetItem(silentMethodIdQueueMapStorageKey)) || + {}); + const currentQueue = (silentMethodIdQueueMap[queueName] = silentMethodIdQueueMap[queueName] || []); + pushItem(currentQueue, silentMethodInstance.id); + await storageSetItem(silentMethodIdQueueMapStorageKey, silentMethodIdQueueMap); +}; +/** + * Remove or replace silentMethod instances in the cache + * @param queue Operation queue name + * @param targetSilentMethodId Target silentMethod instance id + * @param newSilentMethod The new silentMethod instance to replace. If not passed, it means deleted. + */ +const spliceStorageSilentMethod = async (queueName, targetSilentMethodId, newSilentMethod) => { + // Remove the silent method instance id from the queue + const silentMethodIdQueueMap = ((await storageGetItem(silentMethodIdQueueMapStorageKey)) || + {}); + const currentQueue = silentMethodIdQueueMap[queueName] || []; + const index = currentQueue.findIndex(id => id === targetSilentMethodId); + if (index >= 0) { + if (newSilentMethod) { + splice(currentQueue, index, 1, newSilentMethod.id); + await persistSilentMethod(newSilentMethod); + } + else { + splice(currentQueue, index, 1); + } + await storageRemoveItem(silentMethodStorageKeyPrefix + targetSilentMethodId); + // Delete this queue when it is empty + len(currentQueue) <= 0 && delete silentMethodIdQueueMap[queueName]; + if (len(objectKeys(silentMethodIdQueueMap)) > 0) { + await storageSetItem(silentMethodIdQueueMapStorageKey, silentMethodIdQueueMap); + } + else { + // Remove the queue collection when it is empty + await storageRemoveItem(silentMethodIdQueueMapStorageKey); + } + } +}; + +/** Silent method queue collection */ +let silentQueueMap = {}; +/** + * Merge queueMap into silentMethod queue collection + * @param queueMap silentMethod queue collection + */ +const merge2SilentQueueMap = (queueMap) => { + forEach(objectKeys(queueMap), targetQueueName => { + const currentQueue = (silentQueueMap[targetQueueName] = silentQueueMap[targetQueueName] || []); + pushItem(currentQueue, ...queueMap[targetQueueName]); + }); +}; +/** + * Deeply traverse the target data and replace dummy data with real data + * @param target target data + * @param vDataResponse Collection of dummy data and real data + * @returns Is there any replacement data? + */ +const deepReplaceVData = (target, vDataResponse) => { + // Search for a single value and replace a dummy data object or dummy data id with an actual value + const replaceVData = (value) => { + const vData = stringifyVData(value); + // If directly a dummy data object and in a vDataResponse, replace the Map with the value in the vDataResponse + // If it is a string, it may contain virtual data id and in vDataResponse, it also needs to be replaced with the actual value Map + // The virtual data not in this vDataResponse will remain unchanged. It may be the virtual data Map requested next time. + if (vData in vDataResponse) { + return vDataResponse[vData]; + } + if (isString(value)) { + return value.replace(newInstance(RegExpCls, regVDataId.source, 'g'), mat => mat in vDataResponse ? vDataResponse[mat] : mat); + } + return value; + }; + if (isObject(target) && !stringifyVData(target, falseValue)) { + walkObject(target, replaceVData); + } + else { + target = replaceVData(target); + } + return target; +}; +/** + * Update the method instance in the queue and replace the dummy data with actual data + * @param vDataResponse A collection of virtual IDs and corresponding real data + * @param targetQueue target queue + */ +const updateQueueMethodEntities = (vDataResponse, targetQueue) => PromiseCls.all(mapItem(targetQueue, async (silentMethodItem) => { + // Traverse the entity object deeply. If virtual data or virtual data ID is found, replace it with actual data. + deepReplaceVData(silentMethodItem.entity, vDataResponse); + // If the method instance is updated, re-persist this silent method instance + silentMethodItem.cache && (await persistSilentMethod(silentMethodItem)); +})); +/** + * Replace dummy data with response data + * @param response real response data + * @param virtualResponse dummy response data + * @returns The corresponding real data set composed of virtual data id + */ +const replaceVirtualResponseWithResponse = (virtualResponse, response) => { + let vDataResponse = {}; + const vDataId = stringifyVData(virtualResponse, falseValue); + vDataId && (vDataResponse[vDataId] = response); + if (isObject(virtualResponse)) { + for (const i in virtualResponse) { + vDataResponse = { + ...vDataResponse, + ...replaceVirtualResponseWithResponse(virtualResponse[i], response === null || response === void 0 ? void 0 : response[i]) + }; + } + } + return vDataResponse; +}; +/** + * Start the SilentMethod queue + * 1. Silent submission will be put into the queue and requests will be sent in order. Only after the previous request responds will it continue to send subsequent requests. + * 2. The number of retries is only triggered when there is no response. If the server responds incorrectly or is disconnected, it will not retry. + * 3. When the number of retries is reached and still fails, when nextRound (next round) is set, delay the time specified by nextRound and then request again, otherwise it will try again after refreshing. + * 4. If there is resolveHandler and rejectHandler, they will be called after the request is completed (whether successful or failed) to notify the corresponding request to continue responding. + * + * @param queue SilentMethodqueue + */ +const setSilentMethodActive = (silentMethodInstance, active) => { + if (active) { + silentMethodInstance.active = active; + } + else { + delete silentMethodInstance.active; + } +}; +const defaultBackoffDelay = 1000; +const bootSilentQueue = (queue, queueName) => { + /** + * The callback function is controlled by waiting parameters according to the request. If it is not set or is less than or equal to 0, it will be triggered immediately. + * @param queueName queue name + * @param callback callback function + */ + const emitWithRequestDelay = (queueName) => { + const nextSilentMethod = queue[0]; + if (nextSilentMethod) { + const targetSetting = queueRequestWaitSetting.find(({ queue }) => instanceOf(queue, RegExpCls) ? regexpTest(queue, queueName) : queue === queueName); + // eslint-disable-next-line @typescript-eslint/no-use-before-define + const callback = () => queue[0] && silentMethodRequest(queue[0]); + const delay = (targetSetting === null || targetSetting === void 0 ? void 0 : targetSetting.wait) ? sloughConfig(targetSetting.wait, [nextSilentMethod, queueName]) : 0; + delay && delay > 0 ? setTimeoutFn(callback, delay) : callback(); + } + }; + /** + * Run a single silentMethod instance + * @param silentMethodInstance silentMethod instance + * @param retryTimes Number of retries + */ + const silentMethodRequest = (silentMethodInstance, retryTimes = 0) => { + // Set the current silent method instance to active status + setSilentMethodActive(silentMethodInstance, trueValue); + const { cache, id, behavior, entity, retryError = /.*/, maxRetryTimes = 0, backoff = { delay: defaultBackoffDelay }, resolveHandler = noop, rejectHandler = noop, emitter: methodEmitter, handlerArgs = [], virtualResponse, force } = silentMethodInstance; + // Trigger pre-request event + globalSQEventManager.emit(BeforeEventKey, newInstance((GlobalSQEvent), behavior, entity, silentMethodInstance, queueName, retryTimes)); + promiseThen(entity.send(force), async (data) => { + // The request is successful, remove the successful silent method, and continue with the next request + shift(queue); + // If the request is successful, remove the successful silent method instance from storage and continue with the next request. + cache && (await spliceStorageSilentMethod(queueName, id)); + // If there is a resolve handler, call it to notify the outside + resolveHandler(data); + // Only when there is a virtualResponse, virtual data is traversed and replaced, and global events are triggered. + // Generally, it is silent behavior, but queue behavior is not required. + if (behavior === BEHAVIOR_SILENT) { + // Replace dummy data in subsequent method instances in the queue with real data + // Only after unlocking can you access the hierarchical structure of virtualResponse normally. + const vDataResponse = replaceVirtualResponseWithResponse(virtualResponse, data); + const { targetRefMethod, updateStates } = silentMethodInstance; // It is accurate to obtain it in real time + // If this silentMethod has targetRefMethod, call updateState again to update the data + // This is an implementation of delayed data updates + if (instanceOf(targetRefMethod, Method) && updateStates && len(updateStates) > 0) { + const updateStateCollection = {}; + forEach(updateStates, stateName => { + // After the request is successful, replace the data with dummy data with real data + updateStateCollection[stateName] = dataRaw => deepReplaceVData(dataRaw, vDataResponse); + }); + const updated = updateState(targetRefMethod, updateStateCollection); + // If the status modification is unsuccessful, modify the cached data. + if (!updated) { + await setCache(targetRefMethod, (dataRaw) => deepReplaceVData(dataRaw, vDataResponse)); + } + } + // Perform dummy data replacement on subsequent silent method instances of the current queue + await updateQueueMethodEntities(vDataResponse, queue); + // Trigger global success event + globalSQEventManager.emit(SuccessEventKey, newInstance((GlobalSQSuccessEvent), behavior, entity, silentMethodInstance, queueName, retryTimes, data, vDataResponse)); + } + // Set to inactive state + setSilentMethodActive(silentMethodInstance, falseValue); + // Continue to the next silent method processing + emitWithRequestDelay(queueName); + }, reason => { + if (behavior !== BEHAVIOR_SILENT) { + // When the behavior is not silent and the request fails, rejectHandler is triggered. + // and removed from the queue and will not be retried. + shift(queue); + rejectHandler(reason); + } + else { + // Each request error will trigger an error callback + const runGlobalErrorEvent = (retryDelay) => globalSQEventManager.emit(ErrorEventKey, newInstance((GlobalSQErrorEvent), behavior, entity, silentMethodInstance, queueName, retryTimes, reason, retryDelay)); + // In silent behavior mode, determine whether retry is needed + // Retry is only effective when the response error matches the retryError regular match + const { name: errorName = '', message: errorMsg = '' } = reason || {}; + let regRetryErrorName; + let regRetryErrorMsg; + if (instanceOf(retryError, RegExp)) { + regRetryErrorMsg = retryError; + } + else if (isObject(retryError)) { + regRetryErrorName = retryError.name; + regRetryErrorMsg = retryError.message; + } + const matchRetryError = (regRetryErrorName && regexpTest(regRetryErrorName, errorName)) || + (regRetryErrorMsg && regexpTest(regRetryErrorMsg, errorMsg)); + // If there are still retry times, try again + if (retryTimes < maxRetryTimes && matchRetryError) { + // The next retry times need to be used to calculate the delay time, so +1 is needed here. + const retryDelay = delayWithBackoff(backoff, retryTimes + 1); + runGlobalErrorEvent(retryDelay); + setTimeoutFn(() => { + retryTimes += 1; + silentMethodRequest(silentMethodInstance, retryTimes); + methodEmitter.emit('retry', newInstance((ScopedSQRetryEvent), behavior, entity, silentMethodInstance, handlerArgs, retryTimes, retryDelay)); + }, + // When there are still retry times, use timeout as the next request time. + retryDelay); + } + else { + setSilentFactoryStatus(2); + runGlobalErrorEvent(); + // When the number of failures is reached, or the error message does not match the retry, the failure callback is triggered. + methodEmitter.emit('fallback', newInstance((ScopedSQErrorEvent), behavior, entity, silentMethodInstance, handlerArgs, reason)); + globalSQEventManager.emit(FailEventKey$1, newInstance((GlobalSQFailEvent), behavior, entity, silentMethodInstance, queueName, retryTimes, reason)); + } + } + // Set to inactive state + setSilentMethodActive(silentMethodInstance, falseValue); + }); + }; + emitWithRequestDelay(queueName); +}; +/** + * Put a new silentMethod instance into the queue + * @param silentMethodInstance silentMethod instance + * @param cache Does silentMethod have cache? + * @param targetQueueName target queue name + * @param onBeforePush Events before silentMethod instance push + */ +const pushNewSilentMethod2Queue = async (silentMethodInstance, cache, targetQueueName = DEFAULT_QUEUE_NAME, onBeforePush = () => []) => { + silentMethodInstance.cache = cache; + const currentQueue = (silentQueueMap[targetQueueName] = + silentQueueMap[targetQueueName] || []); + const isNewQueue = len(currentQueue) <= 0; + const beforePushReturns = await Promise.all(onBeforePush()); + const isPush2Queue = !beforePushReturns.some(returns => returns === falseValue); + // Under silent behavior, if there is no fallback event callback bound, it will be persisted. + // If false is returned in onBeforePushQueue, it will no longer be placed in the queue. + if (isPush2Queue) { + cache && (await push2PersistentSilentQueue(silentMethodInstance, targetQueueName)); + pushItem(currentQueue, silentMethodInstance); + // If it is a new queue and the status is started, execute it + isNewQueue && silentFactoryStatus === 1 && bootSilentQueue(currentQueue, targetQueueName); + } + return isPush2Queue; +}; + +/** + * Locate the location of the silentMethod instance + * @param silentMethodInstance silentMethod instance + */ +const getBelongQueuePosition = (silentMethodInstance) => { + let queue = undefinedValue; + let queueName = ''; + let position = 0; + for (const queueNameLoop in silentQueueMap) { + position = silentQueueMap[queueNameLoop].indexOf(silentMethodInstance); + if (position >= 0) { + queue = silentQueueMap[queueNameLoop]; + queueName = queueNameLoop; + break; + } + } + return [queue, queueName, position]; +}; +/** + * silentMethod instance + * Requests that need to enter silentQueue will be packaged into silentMethod instances, which will carry various parameters of the request strategy. + */ +class SilentMethod { + constructor(entity, behavior, emitter, id = uuid(), force, retryError, maxRetryTimes, backoff, resolveHandler, rejectHandler, handlerArgs, vDatas) { + const thisObj = this; + thisObj.entity = entity; + thisObj.behavior = behavior; + thisObj.id = id; + thisObj.emitter = emitter; + thisObj.force = !!force; + thisObj.retryError = retryError; + thisObj.maxRetryTimes = maxRetryTimes; + thisObj.backoff = backoff; + thisObj.resolveHandler = resolveHandler; + thisObj.rejectHandler = rejectHandler; + thisObj.handlerArgs = handlerArgs; + thisObj.vDatas = vDatas; + } + /** + * Allow cache-time persistent updates to the current instance + */ + async save() { + this.cache && (await persistSilentMethod(this)); + } + /** + * Replace the current instance with a new silentMethod instance in the queue + * If there is a persistent cache, the cache will also be updated. + * @param newSilentMethod new silentMethod instance + */ + async replace(newSilentMethod) { + const targetSilentMethod = this; + silentAssert(newSilentMethod.cache === targetSilentMethod.cache, 'the cache of new silentMethod must equal with this silentMethod'); + const [queue, queueName, position] = getBelongQueuePosition(targetSilentMethod); + if (queue) { + splice(queue, position, 1, newSilentMethod); + targetSilentMethod.cache && (await spliceStorageSilentMethod(queueName, targetSilentMethod.id, newSilentMethod)); + } + } + /** + * Remove the current instance. If there is persistent data, it will also be removed synchronously. + */ + async remove() { + const targetSilentMethod = this; + const [queue, queueName, position] = getBelongQueuePosition(targetSilentMethod); + if (queue) { + splice(queue, position, 1); + targetSilentMethod.cache && (await spliceStorageSilentMethod(queueName, targetSilentMethod.id)); + } + } + /** + * Set the method instance corresponding to the delayed update status and the corresponding status name + * It will find the corresponding status data and update vData to the actual data after responding to this silentMethod + * + * @param method method instance + * @param updateStateName Updated status name, the default is data, you can also set multiple + */ + setUpdateState(method, updateStateName = 'data') { + if (method) { + this.targetRefMethod = method; + this.updateStates = isArray(updateStateName) ? updateStateName : [updateStateName]; + } + } +} + +/** + * Deserialize the silentMethod instance according to the name of the serializer. + * @param methodInstance Request method instance + * @returns Request method instance + */ +var convertPayload2SilentMethod = (payload) => { + const { id, behavior, entity, retryError, maxRetryTimes, backoff, resolveHandler, rejectHandler, handlerArgs, targetRefMethod, force } = payload; + // Method class instantiation + const deserializeMethod = (methodPayload) => { + const { type, url, config, data } = methodPayload; + return newInstance(Method, type, dependentAlovaInstance, url, config, data); + }; + const silentMethodInstance = newInstance(SilentMethod, deserializeMethod(entity), behavior, createEventManager(), id, force, retryError, maxRetryTimes, backoff, resolveHandler, rejectHandler, handlerArgs); + silentMethodInstance.cache = trueValue; + // Target ref method deserialization + if (targetRefMethod) { + silentMethodInstance.targetRefMethod = deserializeMethod(targetRefMethod); + } + // Put extra content on the silent method instance + forEach(objectKeys(payload), key => { + if (!includes([ + 'id', + 'behavior', + 'emitter', + 'entity', + 'retryError', + 'maxRetryTimes', + 'backoff', + 'resolveHandler', + 'rejectHandler', + 'handlerArgs', + 'targetRefMethod', + 'force' + ], key)) { + silentMethodInstance[key] = payload[key]; + } + }); + return silentMethodInstance; +}; + +/** + * Load silent queue data from storage + * @returns All queue data + */ +var loadSilentQueueMapFromStorage = async () => { + const silentMethodIdQueueMap = ((await storageGetItem(silentMethodIdQueueMapStorageKey)) || + {}); + const silentQueueMap = {}; + const readingPromises = []; + forEach(objectKeys(silentMethodIdQueueMap), queueName => { + const currentQueue = (silentQueueMap[queueName] = silentQueueMap[queueName] || []); + pushItem(readingPromises, ...mapItem(silentMethodIdQueueMap[queueName], async (silentMethodId) => { + const serializedSilentMethodPayload = await storageGetItem(silentMethodStorageKeyPrefix + silentMethodId); + serializedSilentMethodPayload && + pushItem(currentQueue, convertPayload2SilentMethod(serializedSilentMethodPayload)); + })); + }); + await PromiseCls.all(readingPromises); + return silentQueueMap; +}; + +/** + * Bind silentSubmit startup event + * @param {SilentSubmitBootHandler} handler event callback function + * @returns unbind function + */ +const onSilentSubmitBoot = (handler) => globalSQEventManager.on(BootEventKey, handler); +/** + * Bind silentSubmit success event + * @param {SilentSubmitSuccessHandler} handler event callback function + * @returns unbind function + */ +const onSilentSubmitSuccess = (handler) => globalSQEventManager.on(SuccessEventKey, handler); +/** + * Bind silentSubmit error event + * Every time there is a request error, an error callback is triggered. + * @param {SilentSubmitErrorHandler} handler event callback function + * @returns unbind function + */ +const onSilentSubmitError = (handler) => globalSQEventManager.on(ErrorEventKey, handler); +/** + * Binding silentSubmit failure event + * The failure event will be triggered when the maximum number of requests is reached, or when the error message does not match + * @param {SilentSubmitFailHandler} handler event callback function + * @returns unbind function + */ +const onSilentSubmitFail = (handler) => globalSQEventManager.on(FailEventKey$1, handler); +/** + * Bind silentSubmit to initiate a pre-request event + * @param {BeforeSilentSubmitHandler} handler event callback function + * @returns unbind function + */ +const onBeforeSilentSubmit = (handler) => globalSQEventManager.on(BeforeEventKey, handler); +/** + * Start silent submission, which will load the silent method in the cache and start silent submission + * If no delay time is passed in, the sync starts immediately + * @param {SilentFactoryBootOptions} options Delay in milliseconds + */ +const bootSilentFactory = (options) => { + if (silentFactoryStatus === 0) { + const { alova, delay = 500 } = options; + setDependentAlova(alova); + setCustomSerializers(options.serializers); + setQueueRequestWaitSetting(options.requestWait); + setTimeoutFn(async () => { + // Delayed loading puts the page’s queue at the front + merge2SilentQueueMap(await loadSilentQueueMapFromStorage()); + // Loop start queue silent submission + // Multiple queues are executed in parallel + forEach(objectKeys(silentQueueMap), queueName => { + bootSilentQueue(silentQueueMap[queueName], queueName); + }); + setSilentFactoryStatus(1); // Set status to Started + globalSQEventManager.emit(BootEventKey, undefinedValue); + }, delay); + } +}; + +/** + * A global silentMethod instance that will have a value from before the first success event is triggered to after the last success event is triggered (synchronization period) + * In this way, the current silentMethod instance can be obtained in updateStateEffect in onSuccess. + */ +let currentSilentMethod = undefinedValue; +/** + * Create SilentQueue middleware function + * @param config Configuration object + * @returns middleware function + */ +var createSilentQueueMiddlewares = (handler, config) => { + const { behavior = 'queue', queue = DEFAULT_QUEUE_NAME, retryError, maxRetryTimes, backoff } = config || {}; + const eventEmitter = createEventManager(); + let handlerArgs; + let behaviorFinally; + let queueFinally = DEFAULT_QUEUE_NAME; + let forceRequest = falseValue; + let silentMethodInstance; + /** + * method instance creation function + * @param args Call the function passed in by send + * @returns method instance + */ + const createMethod = (...args) => { + silentAssert(isFn(handler), 'method handler must be a function. eg. useSQRequest(() => method)'); + setVDataIdCollectBasket({}); + handlerArgs = args; + return handler(...args); + }; + // Decorate success/error/complete event + const decorateRequestEvent = (requestExposure) => { + // Set event callback decorator + requestExposure.onSuccess = decorateEvent(requestExposure.onSuccess, (handler, event) => { + currentSilentMethod = silentMethodInstance; + handler(newInstance((ScopedSQSuccessEvent), behaviorFinally, event.method, silentMethodInstance, event.args, event.data)); + }); + requestExposure.onError = decorateEvent(requestExposure.onError, (handler, event) => { + handler(newInstance((ScopedSQErrorEvent), behaviorFinally, event.method, silentMethodInstance, event.args, event.error)); + }); + requestExposure.onComplete = decorateEvent(requestExposure.onComplete, (handler, event) => { + handler(newInstance((ScopedSQCompleteEvent), behaviorFinally, event.method, silentMethodInstance, event.args, event.status, event.data, event.error)); + }); + }; + /** + * middleware function + * @param context Request context, containing request-related values + * @param next continue executing function + * @returns Promise object + */ + const middleware = ({ method, args, cachedResponse, proxyStates, config }, next) => { + const { silentDefaultResponse, vDataCaptured, force = falseValue } = config; + // Because the behavior return value may change, it should be called for each request to re-obtain the return value. + const baseEvent = AlovaEventBase.spawn(method, args); + behaviorFinally = sloughConfig(behavior, [baseEvent]); + queueFinally = sloughConfig(queue, [baseEvent]); + forceRequest = sloughConfig(force, [baseEvent]); + // Empty temporary collection variables + // They need to be cleared before returning + const resetCollectBasket = () => { + setVDataIdCollectBasket((handlerArgs = undefinedValue)); + }; + // If v data captured is set, first determine whether the request-related data contains virtual data. + if (isFn(vDataCaptured)) { + let hasVData = vDataIdCollectBasket && len(objectKeys(vDataIdCollectBasket)) > 0; + if (!hasVData) { + const { url, data } = method; + const { params, headers } = getConfig(method); + walkObject({ url, params, data, headers }, value => { + if (!hasVData && (stringifyVData(value, falseValue) || regexpTest(regVDataId, value))) { + hasVData = trueValue; + } + return value; + }); + } + // If v data captured has return data, use it as the response data, otherwise continue the request + const customResponse = hasVData ? vDataCaptured(method) : undefinedValue; + if (customResponse !== undefinedValue) { + resetCollectBasket(); // Reset when captured by v data captured + return promiseResolve(customResponse); + } + } + if (behaviorFinally !== BEHAVIOR_STATIC) { + // Wait for the method in the queue to complete execution + const createSilentMethodPromise = () => { + const queueResolvePromise = newInstance(PromiseCls, (resolveHandler, rejectHandler) => { + silentMethodInstance = newInstance((SilentMethod), method, behaviorFinally, eventEmitter, undefinedValue, !!forceRequest, retryError, maxRetryTimes, backoff, resolveHandler, rejectHandler, handlerArgs, vDataIdCollectBasket && objectKeys(vDataIdCollectBasket)); + resetCollectBasket(); // Reset when Behavior is queue and silent + }); + // On before push and on pushed events are bound synchronously, so they need to be queued asynchronously to trigger the event normally. + promiseThen(promiseResolve(undefinedValue), async () => { + const createPushEvent = () => newInstance((ScopedSQEvent), behaviorFinally, method, silentMethodInstance, args); + // Put the silent method into the queue and persist it + const isPushed = await pushNewSilentMethod2Queue(silentMethodInstance, + // After the onFallback event is bound, even the silent behavior mode is no longer stored. + // onFallback will be called synchronously, so it needs to be determined asynchronously whether there are fallbackHandlers + len(eventEmitter.eventMap.fallback || []) <= 0 && behaviorFinally === BEHAVIOR_SILENT, queueFinally, + // Execute the callback before putting it into the queue. If false is returned, it will prevent putting it into the queue. + () => eventEmitter.emit('beforePushQueue', createPushEvent())); + // Only after putting it into the queue, the callback after putting it into the queue will be executed. + isPushed && eventEmitter.emit('pushedQueue', createPushEvent()); + }); + return queueResolvePromise; + }; + if (behaviorFinally === BEHAVIOR_QUEUE) { + // Forced request, or loading status needs to be updated when cache is hit + const needSendRequest = forceRequest || !cachedResponse; + if (needSendRequest) { + // Manually set to true + proxyStates.loading.v = trueValue; + } + // When using the cache, use the cache directly, otherwise enter the request queue + return needSendRequest ? createSilentMethodPromise() : promiseThen(promiseResolve(cachedResponse)); + } + const silentMethodPromise = createSilentMethodPromise(); + // Create virtual response data in silent mode. Virtual response data can generate arbitrary virtual data. + const virtualResponse = (silentMethodInstance.virtualResponse = createVirtualResponse(isFn(silentDefaultResponse) ? silentDefaultResponse() : undefinedValue)); + promiseThen(silentMethodPromise, realResponse => { + // Update after obtaining real data + proxyStates.data.v = realResponse; + }); + // In Silent mode, the virtual response value is returned immediately, and then updated when the real data is returned. + return promiseResolve(virtualResponse); + } + resetCollectBasket(); // Reset when Behavior is static + return next(); + }; + return { + c: createMethod, + m: middleware, + d: decorateRequestEvent, + // event binding function + b: { + /** + * Bind fallback event + * @param handler Fallback event callback + */ + onFallback: (handler) => { + eventEmitter.on('fallback', handler); + }, + /** + * Event before binding to queue + * @param handler Event callback before enqueuing + */ + onBeforePushQueue: (handler) => { + eventEmitter.on('beforePushQueue', handler); + }, + /** + * Event after binding to queue + * @param handler Event callback after being queued + */ + onPushedQueue: (handler) => { + eventEmitter.on('pushedQueue', handler); + }, + /** + * retry event + * @param handler Retry event callback + */ + onRetry: (handler) => { + eventEmitter.on('retry', handler); + } + } + }; +}; + +function useSQRequest(handler, config = {}) { + const { exposeProvider, __referingObj: referingObj } = statesHookHelper(promiseStatesHook()); + const { middleware = noop } = config; + const { c: methodCreateHandler, m: silentMiddleware, b: binders, d: decorateEvent } = createSilentQueueMiddlewares(handler, config); + const states = useRequest(methodCreateHandler, { + ...config, + __referingObj: referingObj, + middleware: (ctx, next) => { + const silentMidPromise = silentMiddleware(ctx, next); + middleware(ctx, () => silentMidPromise); + return silentMidPromise; + } + }); + decorateEvent(states); + return exposeProvider({ + ...states, + ...binders + }); +} + +/** + * Determine whether two values are equal in a way that is compatible with virtual data + * @param prevValue Antecedent value + * @param nextValue consequent value + * @returns Are they equal? + */ +var equals = (prevValue, nextValue) => { + // If equal, return directly + if (prevValue === nextValue) { + return trueValue; + } + return stringifyVData(prevValue) === stringifyVData(nextValue); +}; + +/** + * Filter all silentMethod instances that meet the criteria by method name or regular expression + * @param methodNameMatcher method name matcher + * @param queueName Find the queue name, the default is default queue + * @param filterActive Whether to filter out active instances + * @returns array of silentMethod instances + */ +const filterSilentMethods = async (methodNameMatcher, queueName = DEFAULT_QUEUE_NAME, filterActive = falseValue) => { + const matchSilentMethods = (targetQueue = []) => targetQueue.filter(silentMethodItem => { + if (methodNameMatcher === undefinedValue) { + return trueValue; + } + const name = getConfig(silentMethodItem.entity).name || ''; + const retain = instanceOf(methodNameMatcher, RegExp) + ? regexpTest(methodNameMatcher, name) + : name === methodNameMatcher; + return retain && (filterActive ? silentMethodItem.active : trueValue); + }); + return [ + ...matchSilentMethods(silentQueueMap[queueName]), + // If the silent factory is not currently started, you also need to match the silent methods in the persistent storage. + ...(silentFactoryStatus === 0 ? matchSilentMethods((await loadSilentQueueMapFromStorage())[queueName]) : []) + ]; +}; +/** + * Find the first silentMethod instance that meets the condition by method name or regular expression + * @param methodNameMatcher method name matcher + * @param queueName Find the queue name, the default is default queue + * @param filterActive Whether to filter out active instances + * @returns silentMethod instance, undefined when not found + */ +const getSilentMethod = async (methodNameMatcher, queueName = DEFAULT_QUEUE_NAME, filterActive = falseValue) => (await filterSilentMethods(methodNameMatcher, queueName, filterActive))[0]; + +/** + * Determine whether the target data is virtual data + * @param target target data + * @returns Is it virtual data? + */ +var isVData = (target) => !!stringifyVData(target, falseValue) || regexpTest(regVDataId, target); + +/** + * Update the status of the corresponding method + * Unlike updateState, in addition to updating the state immediately, it will also update again after responding in silent mode in order to replace the virtual data with actual data. + * @param method request method object + * @param handleUpdate update callback + */ +const updateStateEffect = async (matcher, handleUpdate) => { + // Save the target method instance to the current silent method instance + if (currentSilentMethod) { + currentSilentMethod.setUpdateState(matcher, isFn(updateState) ? undefinedValue : objectKeys(updateState)); + await currentSilentMethod.save(); + } + return updateState(matcher, handleUpdate); +}; + +const useAutoRequest = (handler, config = {}) => { + let notifiable = trueValue; + const { enableFocus = trueValue, enableVisibility = trueValue, enableNetwork = trueValue, pollingTime = 0, throttle = 1000 } = config; + const { onMounted, onUnmounted, __referingObj: referingObject } = statesHookHelper(promiseStatesHook()); + const states = useRequest(handler, { + ...config, + __referingObj: referingObject + }); + const notify = () => { + if (notifiable) { + states.send(); + if (throttle > 0) { + notifiable = falseValue; + setTimeout(() => { + notifiable = trueValue; + }, throttle); + } + } + }; + let offNetwork = noop; + let offFocus = noop; + let offVisiblity = noop; + let offPolling = noop; + onMounted(() => { + if (!globalConfigMap.ssr) { + offNetwork = enableNetwork ? useAutoRequest.onNetwork(notify, config) : offNetwork; + offFocus = enableFocus ? useAutoRequest.onFocus(notify, config) : offFocus; + offVisiblity = enableVisibility ? useAutoRequest.onVisibility(notify, config) : offVisiblity; + offPolling = pollingTime > 0 ? useAutoRequest.onPolling(notify, config) : offPolling; + } + }); + onUnmounted(() => { + offNetwork(); + offFocus(); + offVisiblity(); + offPolling(); + }); + return states; +}; +const on = (type, handler) => { + window.addEventListener(type, handler); + return () => window.removeEventListener(type, handler); +}; +useAutoRequest.onNetwork = notify => on('online', notify); +useAutoRequest.onFocus = notify => on('focus', notify); +useAutoRequest.onVisibility = notify => { + const handle = () => document.visibilityState === 'visible' && notify(); + return on('visibilitychange', handle); +}; +useAutoRequest.onPolling = (notify, config) => { + const timer = setInterval(notify, config.pollingTime); + return () => clearInterval(timer); +}; + +const hookPrefix$1 = 'useCaptcha'; +const captchaAssert = createAssert(hookPrefix$1); +var useCaptcha = (handler, config = {}) => { + const { initialCountdown, middleware } = config; + captchaAssert(initialCountdown === undefinedValue || initialCountdown > 0, 'initialCountdown must be greater than 0'); + const { create, ref, objectify, exposeProvider, __referingObj: referingObject } = statesHookHelper(promiseStatesHook()); + const countdown = create(0, 'countdown'); + const requestReturned = useRequest(handler, { + ...config, + __referingObj: referingObject, + immediate: falseValue, + managedStates: objectify([countdown], 's'), + // eslint-disable-next-line @typescript-eslint/no-use-before-define + middleware: middleware ? (ctx, next) => middleware({ ...ctx, send }, next) : undefinedValue + }); + const timer = ref(undefinedValue); + const send = (...args) => newInstance(PromiseCls, (resolve, reject) => { + if (countdown.v <= 0) { + requestReturned + .send(...args) + .then(result => { + countdown.v = config.initialCountdown || 60; + timer.current = setInterval(() => { + countdown.v -= 1; + if (countdown.v <= 0) { + clearInterval(timer.current); + } + }, 1000); + resolve(result); + }) + .catch(reason => reject(reason)); + } + else { + reject(newInstance(AlovaError, hookPrefix$1, 'the countdown is not over yet')); + } + }); + return exposeProvider({ + ...requestReturned, + send, + ...objectify([countdown]) + }); +}; + +const RestoreEventKey = Symbol('FormRestore'); +const getStoragedKey = (methodInstance, id) => `alova/form-${id || getMethodInternalKey(methodInstance)}`; +const sharedStates = {}; +const cloneFormData = (form) => { + const shallowClone = (value) => (isArray(value) ? [...value] : isPlainObject(value) ? { ...value } : value); + return walkObject(shallowClone(form), shallowClone); +}; +var useForm = (handler, config = {}) => { + const typedSharedStates = sharedStates; + const { id, initialForm, store, resetAfterSubmiting, immediate = falseValue, middleware } = config; + promiseStatesHook(); + const { create, ref: useFlag$, onMounted, watch, objectify, exposeProvider, __referingObj: referingObject } = statesHookHelper(promiseStatesHook()); + const isStoreObject = isPlainObject(store); + const enableStore = isStoreObject ? store.enable : store; + // If the id in config also has a corresponding shared state, it will also be returned. + // The reason for continuing the execution is to be compatible with the problem that the number of hook executions in react cannot be changed, otherwise it will throw "Rendered fewer hooks than expected. This may be caused by an accidental early return statement." + const sharedState = id ? typedSharedStates[id] : undefinedValue; + const form = create(cloneFormData(initialForm), 'form'); + const methodHandler = handler; + const eventManager = createEventManager(); + // Use computed properties to avoid calling methodHandler every time this use hook is executed. + const initialMethodInstance = useFlag$(sloughConfig(methodHandler, [form.v])); + const storageContext = getContext(initialMethodInstance.current).l2Cache; + const storagedKey = getStoragedKey(initialMethodInstance.current, id); + const reseting = useFlag$(falseValue); + const serializerPerformer = useFlag$(createSerializerPerformer(isStoreObject ? store.serializers : undefinedValue)); + // Whether the shared state created by the current hook is initiated. The hook that initiates the creation needs to return the latest state. Otherwise, because the hook is called in react, the latest state cannot be obtained from the hook initiated. + const isCreateShardState = useFlag$(false); + const originalHookProvider = useRequest((...args) => methodHandler(form.v, ...args), { + ...config, + __referingObj: referingObject, + // Middleware function, also supports subscriber middleware + middleware: middleware + ? (ctx, next) => middleware({ + ...ctx, + // eslint-disable-next-line + delegatingActions: { updateForm, reset } + }, next) + : undefinedValue, + // 1. When persistence is required, it will be triggered after data recovery + // 2. When there is a shared state, it means that it has been initialized before (regardless of whether there is an immediate request), and subsequent requests will no longer be automatically initiated. This is to be compatible with the issue of repeated requests when multiple forms initiate requests immediately. + immediate: enableStore || sharedState ? falseValue : immediate + }); + /** + * Reset form data + */ + const reset = () => { + reseting.current = trueValue; + const clonedFormData = cloneFormData(initialForm); + clonedFormData && (form.v = clonedFormData); + enableStore && storageContext.remove(storagedKey); + }; + /** + * Update form data + * @param newForm new form data + */ + const updateForm = (newForm) => { + form.v = { + ...form.v, + ...newForm + }; + }; + const hookProvider = exposeProvider({ + // The first parameter is fixed to form data + ...originalHookProvider, + ...objectify([form]), + updateForm, + reset, + // Persistent data recovery event binding + onRestore(handler) { + eventManager.on(RestoreEventKey, handler); + } + }); + // Only when there is an id, it is saved to sharedStates. + // In react, because a new form will be generated after updating the form, it needs to be resaved every time it is called. + if (id) { + // If there is no shared status yet, it means that the current hook is a created hook. + if (!sharedState) { + isCreateShardState.current = trueValue; + } + // Only the shared state of the created hook is saved + if (isCreateShardState.current) { + typedSharedStates[id] = { + hookProvider: hookProvider, + config + }; + } + } + const { send, onSuccess } = hookProvider; + onMounted(() => { + // Update data when persistence is required + if (enableStore && !sharedState) { + // Get storage and update data + // It needs to be called in onMounted, otherwise it will cause it to be called repeatedly in react. + const storagedForm = serializerPerformer.current.deserialize(storageContext.get(storagedKey)); + // When there is draft data, the data is restored asynchronously, otherwise the on restore event cannot be bound normally. + if (storagedForm) { + form.v = storagedForm; + // Trigger persistent data recovery event + eventManager.emit(RestoreEventKey, undefinedValue); + } + enableStore && immediate && send(...[]); + } + }); + // Monitor changes and store them synchronously. If it is triggered by reset, no further serialization is required. + watch([form], () => { + if (reseting.current || !enableStore) { + reseting.current = falseValue; + return; + } + storageContext.set(storagedKey, serializerPerformer.current.serialize(form.v)); + }); + // If data needs to be cleared after submission, call reset + onSuccess(() => { + resetAfterSubmiting && reset(); + }); + // If there is a saved sharedState, return it + // If it is the shared state created by the current hook, the latest one is returned instead of the cached one. + return sharedState && !isCreateShardState.current ? sharedState.hookProvider : hookProvider; +}; + +const RetryEventKey = Symbol('RetriableRetry'); +const FailEventKey = Symbol('RetriableFail'); +const hookPrefix = 'useRetriableRequest'; +const assert$2 = createAssert(hookPrefix); +var useRetriableRequest = (handler, config = {}) => { + const { retry = 3, backoff = { delay: 1000 }, middleware = noop } = config; + const { ref: useFlag$, exposeProvider, __referingObj: referingObject } = statesHookHelper(promiseStatesHook()); + const eventManager = createEventManager(); + const retryTimes = useFlag$(0); + const stopManuallyError = useFlag$(undefinedValue); // Stop error object, has value when stop is triggered manually + const methodInstanceLastest = useFlag$(undefinedValue); + const argsLatest = useFlag$(undefinedValue); + const requesting = useFlag$(falseValue); // Is it being requested? + const retryTimer = useFlag$(undefinedValue); + const stopPromiseObj = useFlag$(usePromise()); + const emitOnFail = (method, args, error) => { + // On fail needs to be triggered asynchronously, and on error and on complete should be triggered first. + setTimeoutFn(() => { + eventManager.emit(FailEventKey, newInstance((RetriableFailEvent), AlovaEventBase.spawn(method, args), error, retryTimes.current)); + stopManuallyError.current = undefinedValue; + retryTimes.current = 0; // Reset the number of retries + }); + }; + const nestedHookProvider = useRequest(handler, { + ...config, + __referingObj: referingObject, + middleware(ctx, next) { + middleware({ + ...ctx, + delegatingActions: { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + stop + } + }, () => promiseResolve()); + const { proxyStates, args, send, method, controlLoading } = ctx; + controlLoading(); + const { loading } = proxyStates; + const setLoading = (value = falseValue) => { + loading.v = value; + }; + const resolveFail = (error) => { + setLoading(); + proxyStates.error.v = error; + clearTimeout(retryTimer.current); // Clear retry timer + emitOnFail(method, args, error); + }; + if (!loading.v) { + promiseCatch(stopPromiseObj.current.promise, error => { + resolveFail(error); + stopPromiseObj.current = usePromise(); + }); + } + setLoading(trueValue); + requesting.current = trueValue; + methodInstanceLastest.current = method; + argsLatest.current = args; + /** + * Consider this situation: user call stop() and send another request immediately, but now the previous request haven't finished. `next()` will raises the branch on completion. + * + * By using Promise.race(), we can cause the returned promise to be rejected immediately when call `stop()` + */ + return next() + .then(val => { + // set `loading` to false when request is successful + setLoading(); + return val; + }, + // Trigger retry mechanism when request fails + error => { + // There is no manual trigger to stop, and a retry is triggered when the number of retries does not reach the maximum. + if (!stopManuallyError.current && (isNumber(retry) ? retryTimes.current < retry : retry(error, ...args))) { + retryTimes.current += 1; + // Calculate retry delay time + const retryDelay = delayWithBackoff(backoff, retryTimes.current); + // Delay the corresponding time and try again + retryTimer.current = setTimeoutFn(() => { + // trigger retry event + eventManager.emit(RetryEventKey, newInstance((RetriableRetryEvent), AlovaEventBase.spawn(method, args), retryTimes.current, retryDelay)); + // If stopped manually, retry will no longer be triggered. + promiseCatch(send(...args), noop); // Captured errors will no longer be thrown out, otherwise errors will be thrown when retrying. + }, retryDelay); + } + else { + error = stopManuallyError.current || error; // If stop manually error has a value, it means that the stop is triggered through the stop function. + resolveFail(error); + } + // Return reject to execute the subsequent error process + return promiseReject(error); + }) + .finally(() => { + requesting.current = falseValue; + }); + } + }); + /** + * Stop retrying, only valid when called during retrying + * If the request is in progress, trigger an interrupt request and let the request error throw an error. Otherwise, manually modify the status and trigger onFail. + * The onFail event will be triggered immediately after stopping + */ + const stop = () => { + assert$2(nestedHookProvider.__proxyState('loading').v, 'there is no requests being retried'); + stopManuallyError.current = newInstance(AlovaError, hookPrefix, 'stop retry manually'); + if (requesting.current) { + nestedHookProvider.abort(); + } + else { + stopPromiseObj.current.reject(stopManuallyError.current); + } + }; + /** + * Retry event binding + * They will be triggered after the retry is initiated + * @param handler Retry event callback + */ + const onRetry = (handler) => { + eventManager.on(RetryEventKey, event => handler(event)); + }; + /** + * failed event binding + * They will be triggered when there are no more retries, such as when the maximum number of retries is reached, when the retry callback returns false, or when stop is manually called to stop retries. + * The onError event of alova will be triggered every time an error is requested. + * + * Note: If there are no retries, onError, onComplete and onFail will be triggered at the same time. + * + * @param handler Failure event callback + */ + const onFail = (handler) => { + eventManager.on(FailEventKey, event => handler(event)); + }; + return exposeProvider({ + ...nestedHookProvider, + stop, + onRetry, + onFail + }); +}; + +const SSEOpenEventKey = Symbol('SSEOpen'); +const SSEMessageEventKey = Symbol('SSEMessage'); +const SSEErrorEventKey = Symbol('SSEError'); +var SSEHookReadyState; +(function (SSEHookReadyState) { + SSEHookReadyState[SSEHookReadyState["CONNECTING"] = 0] = "CONNECTING"; + SSEHookReadyState[SSEHookReadyState["OPEN"] = 1] = "OPEN"; + SSEHookReadyState[SSEHookReadyState["CLOSED"] = 2] = "CLOSED"; +})(SSEHookReadyState || (SSEHookReadyState = {})); +const assert$1 = createAssert('useSSE'); +const MessageType = { + Open: 'open', + Error: 'error', + Message: 'message' +}; +var useSSE = (handler, config = {}) => { + const { initialData, withCredentials, interceptByGlobalResponded = trueValue, + /** abortLast = trueValue, */ + immediate = falseValue } = config; + // ! Temporarily does not support specifying abortLast + const abortLast = trueValue; + let { memorize } = promiseStatesHook(); + memorize !== null && memorize !== void 0 ? memorize : (memorize = $self); + const { create, ref, onMounted, onUnmounted, objectify, exposeProvider } = statesHookHelper(promiseStatesHook()); + const usingArgs = ref([]); + const eventSource = ref(undefinedValue); + const sendPromiseObject = ref(undefinedValue); + const data = create(initialData, 'data'); + const readyState = create(SSEHookReadyState.CLOSED, 'readyState'); + let methodInstance = getHandlerMethod(handler); + let responseUnified; + const eventManager = createEventManager(); + // UseCallback object that stores custom events, where key is eventName + const customEventMap = ref(new Map()); + const onOpen = (handler) => { + eventManager.on(SSEOpenEventKey, handler); + }; + const onMessage = (handler) => { + eventManager.on(SSEMessageEventKey, handler); + }; + const onError = (handler) => { + eventManager.on(SSEErrorEventKey, handler); + }; + const responseSuccessHandler = ref($self); + const responseErrorHandler = ref(throwFn); + const responseCompleteHandler = ref(noop); + /** + * Set up a response interceptor, which needs to be called after each send + */ + const setResponseHandler = (instance) => { + // responded removed since 3.0 + const { responded } = getOptions(instance); + responseUnified = responded; + if (isFn(responseUnified)) { + responseSuccessHandler.current = responseUnified; + } + else if (responseUnified && isPlainObject(responseUnified)) { + const { onSuccess: successHandler, onError: errorHandler, onComplete: completeHandler } = responseUnified; + responseSuccessHandler.current = isFn(successHandler) ? successHandler : responseSuccessHandler.current; + responseErrorHandler.current = isFn(errorHandler) ? errorHandler : responseErrorHandler.current; + responseCompleteHandler.current = isFn(completeHandler) ? completeHandler : responseCompleteHandler.current; + } + }; + /** + * Process response tasks and do not cache data on failure + * @param handlerReturns Data returned by the interceptor + * @returns Processed response + */ + const handleResponseTask = async (handlerReturns) => { + const { headers, transform: transformFn = $self } = getConfig(methodInstance); + const returnsData = await handlerReturns; + const transformedData = await transformFn(returnsData, (headers || {})); + data.v = transformedData; + // invalidate cache + hitCacheBySource(methodInstance); + return transformedData; + }; + /** + * Create AlovaSSEHook event + * For specific data processing procedures, please refer to the following link + * @link https://alova.js.org/zh-CN/tutorial/combine-framework/response + */ + const createSSEEvent = async (eventFrom, dataOrError) => { + assert$1(!!eventSource.current, 'EventSource is not initialized'); + const es = eventSource.current; + const baseEvent = new AlovaSSEEvent(AlovaEventBase.spawn(methodInstance, usingArgs.current), es); + if (eventFrom === MessageType.Open) { + return Promise.resolve(baseEvent); + } + const globalSuccess = interceptByGlobalResponded ? responseSuccessHandler.current : $self; + const globalError = interceptByGlobalResponded ? responseErrorHandler.current : throwFn; + const globalFinally = interceptByGlobalResponded ? responseCompleteHandler.current : noop; + const p = promiseFinally(promiseThen(dataOrError, res => handleResponseTask(globalSuccess(res, methodInstance)), error => handleResponseTask(globalError(error, methodInstance))), + // Finally + () => { + globalFinally(methodInstance); + }); + // Regardless, the Promise object returned by the function must be fulfilled + return promiseThen(p, + // Get processed data (data after transform) + res => new AlovaSSEMessageEvent(baseEvent, res), + // There is an error + error => new AlovaSSEErrorEvent(baseEvent, error)); + }; + /** + * Select the required trigger function based on the event. If the event has no errors, the callback function passed in is triggered. + * @param callback Callback function triggered when there is no error + */ + const sendSSEEvent = (callback) => (event) => { + if (event.error === undefinedValue) { + return callback(event); + } + return eventManager.emit(SSEErrorEventKey, event); + }; + // * MARK: Event handling of EventSource + const onCustomEvent = (eventName, callbackHandler) => { + var _a; + const currentMap = customEventMap.current; + if (!currentMap.has(eventName)) { + const useCallbackObject = useCallback(callbacks => { + var _a; + if (callbacks.length === 0) { + (_a = eventSource.current) === null || _a === void 0 ? void 0 : _a.removeEventListener(eventName, useCallbackObject[1]); + customEventMap.current.delete(eventName); + } + }); + const trigger = useCallbackObject[1]; + currentMap.set(eventName, useCallbackObject); + (_a = eventSource.current) === null || _a === void 0 ? void 0 : _a.addEventListener(eventName, event => { + promiseThen(createSSEEvent(eventName, Promise.resolve(event.data)), sendSSEEvent(trigger)); + }); + } + const [onEvent] = currentMap.get(eventName); + return onEvent(callbackHandler); + }; + /** + * Cancel the registration of custom events in useCallback + */ + const offCustomEvent = () => { + customEventMap.current.forEach(([_1, _2, offTrigger]) => { + offTrigger(); + }); + }; + const esOpen = memorize(() => { + var _a; + // resolve the promise returned when using send() + readyState.v = SSEHookReadyState.OPEN; + promiseThen(createSSEEvent(MessageType.Open, Promise.resolve()), event => eventManager.emit(SSEOpenEventKey, event)); + // ! Must be resolved after calling onOpen + (_a = sendPromiseObject.current) === null || _a === void 0 ? void 0 : _a.resolve(); + }); + const esError = memorize((event) => { + var _a, _b; + readyState.v = SSEHookReadyState.CLOSED; + promiseThen(createSSEEvent(MessageType.Error, Promise.reject((_a = event === null || event === void 0 ? void 0 : event.message) !== null && _a !== void 0 ? _a : 'SSE Error')), sendSSEEvent(event => eventManager.emit(SSEMessageEventKey, event))); + (_b = sendPromiseObject.current) === null || _b === void 0 ? void 0 : _b.resolve(); + }); + const esMessage = memorize((event) => { + promiseThen(createSSEEvent(MessageType.Message, Promise.resolve(event.data)), sendSSEEvent(event => eventManager.emit(SSEMessageEventKey, event))); + }); + /** + * Close the registration of the current eventSource + */ + const close = () => { + const es = eventSource.current; + if (!es) { + return; + } + if (sendPromiseObject.current) { + // If the promise is still there when close + sendPromiseObject.current.resolve(); + } + // * MARK: Unbinding event handling + es.close(); + es.removeEventListener(MessageType.Open, esOpen); + es.removeEventListener(MessageType.Error, esError); + es.removeEventListener(MessageType.Message, esMessage); + readyState.v = SSEHookReadyState.CLOSED; + // After eventSource is closed, unregister all custom events + // Otherwise it may cause memory leaks + customEventMap.current.forEach(([_, eventTrigger], eventName) => { + es.removeEventListener(eventName, eventTrigger); + }); + }; + /** + * Send request and initialize eventSource + */ + const connect = (...args) => { + let es = eventSource.current; + let promiseObj = sendPromiseObject.current; + if (es && abortLast) { + // When abortLast === true, close the previous connection and re-establish it + close(); + } + // Set the promise object used by the send function + if (!promiseObj) { + promiseObj = sendPromiseObject.current = usePromise(); + // Clear the promise object after open + promiseObj && + promiseObj.promise.finally(() => { + promiseObj = undefinedValue; + }); + } + usingArgs.current = args; + methodInstance = getHandlerMethod(handler, args); + // Set up response interceptor + setResponseHandler(methodInstance); + const { params } = getConfig(methodInstance); + const { baseURL, url } = methodInstance; + const fullURL = buildCompletedURL(baseURL, url, params); + // Establish connection + es = new EventSource(fullURL, { withCredentials }); + eventSource.current = es; + readyState.v = SSEHookReadyState.CONNECTING; + // * MARK: Register to handle events + // Register to handle event open error message + es.addEventListener(MessageType.Open, esOpen); + es.addEventListener(MessageType.Error, esError); + es.addEventListener(MessageType.Message, esMessage); + // and custom events + // If the on listener is used before connect (send), there will already be events in customEventMap. + customEventMap.current.forEach(([_, eventTrigger], eventName) => { + es === null || es === void 0 ? void 0 : es.addEventListener(eventName, event => { + promiseThen(createSSEEvent(eventName, Promise.resolve(event.data)), sendSSEEvent(eventTrigger)); + }); + }); + return promiseObj.promise; + }; + onUnmounted(() => { + close(); + // The above use of eventSource.removeEventListener just disconnects eventSource and trigger. + // Here is the cancellation of the event registration in the useCallback object + eventManager.off(SSEOpenEventKey); + eventManager.off(SSEMessageEventKey); + eventManager.off(SSEErrorEventKey); + offCustomEvent(); + }); + // * MARK: initialization action + onMounted(() => { + var _a; + if (immediate) { + connect(...[]); + (_a = sendPromiseObject.current) === null || _a === void 0 ? void 0 : _a.promise.catch(() => { }); + } + }); + return exposeProvider({ + send: connect, + close, + on: onCustomEvent, + onMessage, + onError, + onOpen, + eventSource, + ...objectify([readyState, data]) + }); +}; + +let currentHookIndex = 0; +// (id, (hookIndex, Actions)) +const actionsMap = {}; +const isFrontMiddlewareContext = (context) => !!context.send; +const assert = createAssert('subscriber'); +/** + * Operation function delegation middleware + * After using this middleware, you can call the delegated function through accessAction. + * Can delegate multiple identical IDs + * In order to eliminate the hierarchical restrictions of components + * @param id Client ID + * @returns alova middleware function + */ +const actionDelegationMiddleware = (id) => { + const { ref, onUnmounted } = statesHookHelper(promiseStatesHook()); + const hookIndex = ref(currentHookIndex + 1); + if (hookIndex.current > currentHookIndex) { + currentHookIndex += 1; + } + onUnmounted(() => { + var _a; + if ((_a = actionsMap[id]) === null || _a === void 0 ? void 0 : _a[hookIndex.current]) { + // delete action on unmount + delete actionsMap[id][hookIndex.current]; + } + }); + return (context, next) => { + // The middleware will be called repeatedly. If you have already subscribed, you do not need to subscribe again. + const { abort, proxyStates, delegatingActions = {} } = context; + const update = (newStates) => { + for (const key in newStates) { + proxyStates[key] && (proxyStates[key].v = newStates[key]); + } + }; + // Those with the same ID will be saved together in the form of an array + const hooks = (actionsMap[id] = actionsMap[id] || []); + const handler = isFrontMiddlewareContext(context) + ? { + ...delegatingActions, + send: context.send, + abort, + update + } + : { + ...delegatingActions, + fetch: context.fetch, + abort, + update + }; + hooks[hookIndex.current] = handler; + return next(); + }; +}; +/** + * Access the operation function, if there are multiple matches, onMatch will be called with this + * @param id Delegator id, or regular expression + * @param onMatch matching subscribers + * @param silent Default is false. If true, no error will be reported if there is no match + */ +const accessAction = (id, onMatch, silent = false) => { + const matched = []; + if (typeof id === 'symbol' || isString(id) || isNumber(id)) { + actionsMap[id] && pushItem(matched, ...objectValues(actionsMap[id])); + } + else if (instanceOf(id, RegExp)) { + forEach(filterItem(objectKeys(actionsMap), idItem => id.test(idItem)), idItem => { + pushItem(matched, ...objectValues(actionsMap[idItem])); + }); + } + // its opposite expression is too obscure + if (matched.length === 0 && !silent) { + assert(false, `no handler can be matched by using \`${id.toString()}\``); + } + forEach(filterItem(matched, $self), onMatch); +}; + +export { accessAction, actionDelegationMiddleware, bootSilentFactory, createClientTokenAuthentication, createServerTokenAuthentication, dehydrateVData, equals, filterSilentMethods, getSilentMethod, isVData, onBeforeSilentSubmit, onSilentSubmitBoot, onSilentSubmitError, onSilentSubmitFail, onSilentSubmitSuccess, silentQueueMap, statesHookHelper, stringifyVData, updateState, updateStateEffect, useAutoRequest, useCaptcha, useFetcher, useForm, usePagination, useRequest, useRetriableRequest, useSQRequest, useSSE, useSerialRequest, useSerialWatcher, useWatcher }; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.umd.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.umd.js new file mode 100644 index 0000000..6428611 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.umd.js @@ -0,0 +1,3897 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('alova')) : + typeof define === 'function' && define.amd ? define(['exports', 'alova'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.AlovaClientHook = {}, global.alova)); +})(this, (function (exports, alova) { 'use strict'; + + /** + * @alova/shared 1.1.2 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) + */ + + const undefStr = 'undefined'; + // The following unified processing functions or variables added to reduce the amount of compiled code + const PromiseCls = Promise; + const promiseResolve = (value) => PromiseCls.resolve(value); + const promiseReject = (value) => PromiseCls.reject(value); + const ObjectCls = Object; + const RegExpCls = RegExp; + const undefinedValue = undefined; + const nullValue = null; + const trueValue = true; + const falseValue = false; + const promiseThen = (promise, onFulfilled, onrejected) => promise.then(onFulfilled, onrejected); + const promiseCatch = (promise, onrejected) => promise.catch(onrejected); + const promiseFinally = (promise, onfinally) => promise.finally(onfinally); + const setTimeoutFn = (fn, delay = 0) => setTimeout(fn, delay); + const clearTimeoutTimer = (timer) => clearTimeout(timer); + const objectKeys = (obj) => ObjectCls.keys(obj); + const objectValues = (obj) => ObjectCls.values(obj); + const forEach = (ary, fn) => ary.forEach(fn); + const pushItem = (ary, ...item) => ary.push(...item); + const mapItem = (ary, callbackfn) => ary.map(callbackfn); + const filterItem = (ary, predicate) => ary.filter(predicate); + const shift = (ary) => ary.shift(); + const splice = (ary, start, deleteCount = 0, ...items) => ary.splice(start, deleteCount, ...items); + const len = (data) => data.length; + const isArray = (arg) => Array.isArray(arg); + const deleteAttr = (arg, attr) => delete arg[attr]; + const typeOf = (arg) => typeof arg; + const regexpTest = (reg, str) => reg.test(`${str}`); + const includes = (ary, target) => ary.includes(target); + const valueObject = (value, writable = falseValue) => ({ value, writable }); + const defineProperty = (o, key, value, isDescriptor = falseValue) => ObjectCls.defineProperty(o, key, isDescriptor ? value : valueObject(value, falseValue)); + // Whether it is running on the server side, node and bun are judged by process, and deno is judged by Deno. + // Some frameworks (such as Alipay and uniapp) will inject the process object as a global variable. + // Therefore, the process.cwd function unique to the server is used as the basis for judgment. + typeof window === undefStr && + (typeof process !== undefStr ? typeof process.cwd === 'function' : typeof Deno !== undefStr); + /** cache mode */ + // only cache in memory, it's default option + const MEMORY = 'memory'; + // persistent cache, and will be read to memory when page is refreshed, it means that the memory cache always exist until cache is expired. + const STORAGE_RESTORE = 'restore'; + + /** + * Empty function for compatibility processing + */ + const noop = () => { }; + /** + * A function that returns the parameter itself, used for compatibility processing + * Since some systems use self as a reserved word, $self is used to distinguish it. + * @param arg any parameter + * @returns return parameter itself + */ + const $self = (arg) => arg; + /** + * Determine whether the parameter is a function any parameter + * @returns Whether the parameter is a function + */ + const isFn = (arg) => typeOf(arg) === 'function'; + /** + * Determine whether the parameter is a number any parameter + * @returns Whether the parameter is a number + */ + const isNumber = (arg) => typeOf(arg) === 'number' && !Number.isNaN(arg); + /** + * Determine whether the parameter is a string any parameter + * @returns Whether the parameter is a string + */ + const isString = (arg) => typeOf(arg) === 'string'; + /** + * Determine whether the parameter is an object any parameter + * @returns Whether the parameter is an object + */ + const isObject = (arg) => arg !== nullValue && typeOf(arg) === 'object'; + /** + * Global toString any parameter stringified parameters + */ + const globalToString = (arg) => ObjectCls.prototype.toString.call(arg); + /** + * Determine whether it is a normal object any parameter + * @returns Judgment result + */ + const isPlainObject = (arg) => globalToString(arg) === '[object Object]'; + /** + * Determine whether it is an instance of a certain class any parameter + * @returns Judgment result + */ + const instanceOf = (arg, cls) => arg instanceof cls; + /** + * Unified timestamp acquisition function + * @returns Timestamp + */ + const getTime = (date) => (date ? date.getTime() : Date.now()); + /** + * Get the alova instance through the method instance alova example + */ + const getContext = (methodInstance) => methodInstance.context; + /** + * Get method instance configuration data + * @returns Configuration object + */ + const getConfig = (methodInstance) => methodInstance.config; + /** + * Get alova configuration data alova configuration object + */ + const getContextOptions = (alovaInstance) => alovaInstance.options; + /** + * Get alova configuration data through method instance alova configuration object + */ + const getOptions = (methodInstance) => getContextOptions(getContext(methodInstance)); + /** + * Create uuid simple version uuid + */ + const uuid = () => { + const timestamp = new Date().getTime(); + return Math.floor(Math.random() * timestamp).toString(36); + }; + /** + * Get the key value of the method instance method instance + * @returns The key value of this method instance + */ + const getMethodInternalKey = (methodInstance) => methodInstance.key; + /** + * Get the request method object + * @param methodHandler Request method handle + * @param args Method call parameters request method object + */ + const getHandlerMethod$1 = (methodHandler, assert, args = []) => { + const methodInstance = isFn(methodHandler) ? methodHandler(...args) : methodHandler; + assert(!!methodInstance.key, 'hook handler must be a method instance or a function that returns method instance'); + return methodInstance; + }; + const objAssign = (target, ...sources) => ObjectCls.assign(target, ...sources); + /** + * Excludes specified attributes from a data collection and returns a new data collection data collection + * @param keys Excluded keys new data collection + */ + const omit = (obj, ...keys) => { + const result = {}; + for (const key in obj) { + if (!keys.includes(key)) { + result[key] = obj[key]; + } + } + return result; + }; + /** + * the same as `Promise.withResolvers` + * @returns promise with resolvers. + */ + function usePromise() { + let retResolve; + let retReject; + const promise = new Promise((resolve, reject) => { + retResolve = resolve; + retReject = reject; + }); + return { promise, resolve: retResolve, reject: retReject }; + } + /** + * Get cached configuration parameters, fixedly returning an object in the format { e: function, c: any, f: any, m: number, s: boolean, t: string } e is the abbreviation of expire, which returns the cache expiration time point (timestamp) in milliseconds. + * c is controlled, indicating whether it is a controlled cache + * f is the original value of cacheFor, which is used to call to obtain cached data when c is true. + * m is the abbreviation of mode, storage mode + * s is the abbreviation of storage, whether to store it locally + * t is the abbreviation of tag, which stores tags persistently. + * @param methodInstance method instance + * @returns Unified cache parameter object + */ + const getLocalCacheConfigParam = (methodInstance) => { + const { cacheFor } = getConfig(methodInstance); + const getCacheExpireTs = (cacheExpire) => isNumber(cacheExpire) ? getTime() + cacheExpire : getTime(cacheExpire || undefinedValue); + let cacheMode = MEMORY; + let expire = () => 0; + let store = falseValue; + let tag = undefinedValue; + const controlled = isFn(cacheFor); + if (!controlled) { + let expireColumn = cacheFor; + if (isPlainObject(cacheFor)) { + const { mode = MEMORY, expire, tag: configTag } = cacheFor || {}; + cacheMode = mode; + store = mode === STORAGE_RESTORE; + tag = configTag ? configTag.toString() : undefinedValue; + expireColumn = expire; + } + expire = (mode) => getCacheExpireTs(isFn(expireColumn) ? expireColumn({ method: methodInstance, mode }) : expireColumn); + } + return { + f: cacheFor, + c: controlled, + e: expire, + m: cacheMode, + s: store, + t: tag + }; + }; + /** + * Create class instance + * @param Cls Constructor + * @param args Constructor parameters class instance + */ + const newInstance = (Cls, ...args) => new Cls(...args); + /** + * Unified configuration + * @param data + * @returns unified configuration + */ + const sloughConfig = (config, args = []) => isFn(config) ? config(...args) : config; + /** + * Create an executor that calls multiple times synchronously and only executes it once asynchronously + */ + const createSyncOnceRunner = (delay = 0) => { + let timer = undefinedValue; + // Executing multiple calls to this function will execute once asynchronously + return (fn) => { + if (timer) { + clearTimeout(timer); + } + timer = setTimeoutFn(fn, delay); + }; + }; + /** + * Create an asynchronous function queue, the asynchronous function will be executed serially queue add function + */ + const createAsyncQueue = (catchError = falseValue) => { + const queue = []; + let completedHandler = undefinedValue; + let executing = false; + const executeQueue = async () => { + executing = true; + while (len(queue) > 0) { + const asyncFunc = shift(queue); + if (asyncFunc) { + await asyncFunc(); + } + } + completedHandler && completedHandler(); + executing = false; + }; + const addQueue = (asyncFunc) => newInstance((PromiseCls), (resolve, reject) => { + const wrappedFunc = () => promiseThen(asyncFunc(), resolve, err => { + catchError ? resolve(undefinedValue) : reject(err); + }); + pushItem(queue, wrappedFunc); + if (!executing) { + executeQueue(); + } + }); + const onComplete = (fn) => { + completedHandler = fn; + }; + return { + addQueue, + onComplete + }; + }; + /** + * Traverse the target object deeply target audience + * @param callback Traversal callback + * @param preorder Whether to traverse in preorder, the default is true + * @param key The currently traversed key + * @param parent The parent node currently traversed + */ + const walkObject = (target, callback, preorder = trueValue, key, parent) => { + const callCallback = () => { + if (parent && key) { + target = callback(target, key, parent); + if (target !== parent[key]) { + parent[key] = target; + } + } + }; + // Preorder traversal + preorder && callCallback(); + if (isObject(target)) { + for (const i in target) { + if (!instanceOf(target, String)) { + walkObject(target[i], callback, preorder, i, target); + } + } + } + // Postal order traversal + !preorder && callCallback(); + return target; + }; + const cacheKeyPrefix = '$a.'; + /** + * build common cache key. + */ + const buildNamespacedCacheKey = (namespace, key) => cacheKeyPrefix + namespace + key; + /** + * Calculate retry delay time based on avoidance strategy and number of retries avoid parameters + * @param retryTimes Number of retries + * @returns Retry delay time + */ + const delayWithBackoff = (backoff, retryTimes) => { + let { startQuiver, endQuiver } = backoff; + const { delay, multiplier = 1 } = backoff; + let retryDelayFinally = (delay || 0) * multiplier ** (retryTimes - 1); + // If start quiver or end quiver has a value, you need to increase the random jitter value in the specified range + if (startQuiver || endQuiver) { + startQuiver = startQuiver || 0; + endQuiver = endQuiver || 1; + retryDelayFinally += + retryDelayFinally * startQuiver + Math.random() * retryDelayFinally * (endQuiver - startQuiver); + retryDelayFinally = Math.floor(retryDelayFinally); // round delay + } + return retryDelayFinally; + }; + /** + * Build the complete url baseURL path url parameters complete url + */ + const buildCompletedURL = (baseURL, url, params) => { + // If the Base url ends with /, remove / + baseURL = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL; + // If it does not start with /or http protocol, you need to add / + // Compatible with some RESTful usage fix: https://github.com/alovajs/alova/issues/382 + if (url !== '') { + url = url.match(/^(\/|https?:\/\/)/) ? url : `/${url}`; + } + const completeURL = baseURL + url; + // Convert params object to get string + // Filter out those whose value is undefined + const paramsStr = mapItem(filterItem(objectKeys(params), key => params[key] !== undefinedValue), key => `${key}=${params[key]}`).join('&'); + // Splice the get parameters behind the url. Note that the url may already have parameters. + return paramsStr + ? +completeURL.includes('?') + ? `${completeURL}&${paramsStr}` + : `${completeURL}?${paramsStr}` + : completeURL; + }; + + /** + * alova error class + */ + class AlovaError extends Error { + constructor(prefix, message, errorCode) { + super(message + (errorCode ? `\n\nFor detailed: https://alova.js.org/error#${errorCode}` : '')); + this.name = `[alova${prefix ? `/${prefix}` : ''}]`; + } + } + /** + * Custom assertion function that throws an error when the expression is false + * When errorCode is passed in, a link to the error document will be provided to guide the user to correct it. + * @param expression Judgment expression, true or false + * @param message Assert message + */ + const createAssert = (prefix = '') => (expression, message, errorCode) => { + if (!expression) { + throw newInstance(AlovaError, prefix, message, errorCode); + } + }; + + const createEventManager = () => { + const eventMap = {}; + return { + eventMap, + on(type, handler) { + const eventTypeItem = (eventMap[type] = eventMap[type] || []); + pushItem(eventTypeItem, handler); + // return the off function + return () => { + eventMap[type] = filterItem(eventTypeItem, item => item !== handler); + }; + }, + off(type, handler) { + const handlers = eventMap[type]; + if (!handlers) { + return; + } + if (handler) { + const index = handlers.indexOf(handler); + index > -1 && handlers.splice(index, 1); + } + else { + delete eventMap[type]; + } + }, + emit(type, event) { + const handlers = eventMap[type] || []; + return mapItem(handlers, handler => handler(event)); + } + }; + }; + const decorateEvent = (onEvent, decoratedHandler) => { + const emitter = createEventManager(); + const eventType = uuid(); + const eventReturn = onEvent(event => emitter.emit(eventType, event)); + return (handler) => { + emitter.on(eventType, event => { + decoratedHandler(handler, event); + }); + return eventReturn; + }; + }; + + class FrameworkReadableState { + constructor(state, key, dehydrate, exportState) { + this.s = state; + this.k = key; + this.$dhy = dehydrate; + this.$exp = exportState; + } + get v() { + return this.$dhy(this.s); + } + get e() { + return this.$exp(this.s); + } + } + class FrameworkState extends FrameworkReadableState { + constructor(state, key, dehydrate, exportState, update) { + super(state, key, dehydrate, exportState); + this.$upd = update; + } + set v(newValue) { + this.$upd(this.s, newValue); + } + get v() { + return super.v; + } + } + + const defaultVisitorMeta = { + authRole: null + }; + const defaultLoginMeta = { + authRole: 'login' + }; + const defaultLogoutMeta = { + authRole: 'logout' + }; + const defaultRefreshTokenMeta = { + authRole: 'refreshToken' + }; + const checkMethodRole = ({ meta }, metaMatches) => { + if (isPlainObject(meta)) { + for (const key in meta) { + if (Object.prototype.hasOwnProperty.call(meta, key)) { + const matchedMetaItem = metaMatches[key]; + if (instanceOf(matchedMetaItem, RegExp) ? matchedMetaItem.test(meta[key]) : meta[key] === matchedMetaItem) { + return trueValue; + } + } + } + } + return falseValue; + }; + const waitForTokenRefreshed = (method, waitingList) => newInstance(PromiseCls, resolve => { + pushItem(waitingList, { + method, + resolve + }); + }); + const callHandlerIfMatchesMeta = (method, authorizationInterceptor, defaultMeta, response) => { + if (checkMethodRole(method, (authorizationInterceptor === null || authorizationInterceptor === void 0 ? void 0 : authorizationInterceptor.metaMatches) || defaultMeta)) { + const handler = isFn(authorizationInterceptor) + ? authorizationInterceptor + : isPlainObject(authorizationInterceptor) && isFn(authorizationInterceptor.handler) + ? authorizationInterceptor.handler + : noop; + return handler(response, method); + } + }; + const refreshTokenIfExpired = async (method, waitingList, updateRefreshStatus, handlerParams, refreshToken, tokenRefreshing) => { + // When the number of handle params is greater than 2, it means that this function is called from the response, and the original interface needs to be requested again. + const fromResponse = len(handlerParams) >= 2; + let isExpired = refreshToken === null || refreshToken === void 0 ? void 0 : refreshToken.isExpired(...handlerParams); + // Compatible with synchronous and asynchronous functions + if (instanceOf(isExpired, PromiseCls)) { + isExpired = await isExpired; + } + if (isExpired) { + try { + // Make another judgment in the response to prevent multiple requests to refresh the token, intercept and wait for the token sent before the token refresh is completed. + let intentToRefreshToken = trueValue; + if (fromResponse && tokenRefreshing) { + intentToRefreshToken = falseValue; // The requests waiting here indicate that the token is being refreshed. When they pass, there is no need to refresh the token again. + await waitForTokenRefreshed(method, waitingList); + } + if (intentToRefreshToken) { + updateRefreshStatus(trueValue); + // Call refresh token + await (refreshToken === null || refreshToken === void 0 ? void 0 : refreshToken.handler(...handlerParams)); + updateRefreshStatus(falseValue); + // After the token refresh is completed, the requests in the waiting list are notified. + forEach(waitingList, ({ resolve }) => resolve()); + } + if (fromResponse) { + // Because the original interface is being requested again, superposition with the previous request will result in repeated calls to transform, so it is necessary to leave transform empty to remove one call. + const { config } = method; + const methodTransformData = config.transform; + config.transform = undefinedValue; + const resentData = await method; + config.transform = methodTransformData; + return resentData; + } + } + finally { + updateRefreshStatus(falseValue); + splice(waitingList, 0, len(waitingList)); // Clear waiting list + } + } + }; + const onResponded2Record = (onRespondedHandlers) => { + let successHandler = undefinedValue; + let errorHandler = undefinedValue; + let onCompleteHandler = undefinedValue; + if (isFn(onRespondedHandlers)) { + successHandler = onRespondedHandlers; + } + else if (isPlainObject(onRespondedHandlers)) { + const { onSuccess, onError, onComplete } = onRespondedHandlers; + successHandler = isFn(onSuccess) ? onSuccess : successHandler; + errorHandler = isFn(onError) ? onError : errorHandler; + onCompleteHandler = isFn(onComplete) ? onComplete : onCompleteHandler; + } + return { + onSuccess: successHandler, + onError: errorHandler, + onComplete: onCompleteHandler + }; + }; + + /** + * Create a client-side token authentication interceptor + * @param options Configuration parameters + * @returns token authentication interceptor function + */ + const createClientTokenAuthentication = ({ visitorMeta, login, logout, refreshToken, assignToken = noop }) => { + let tokenRefreshing = falseValue; + const waitingList = []; + const onAuthRequired = onBeforeRequest => async (method) => { + const isVisitorRole = checkMethodRole(method, visitorMeta || defaultVisitorMeta); + const isLoginRole = checkMethodRole(method, (login === null || login === void 0 ? void 0 : login.metaMatches) || defaultLoginMeta); + // Ignored, login, and token refresh requests do not perform token authentication. + if (!isVisitorRole && + !isLoginRole && + !checkMethodRole(method, (refreshToken === null || refreshToken === void 0 ? void 0 : refreshToken.metaMatches) || defaultRefreshTokenMeta)) { + // If the token is being refreshed, wait for the refresh to complete before sending a request. + if (tokenRefreshing) { + await waitForTokenRefreshed(method, waitingList); + } + await refreshTokenIfExpired(method, waitingList, refreshing => { + tokenRefreshing = refreshing; + }, [method], refreshToken); + } + // Requests from non-guest and logged-in roles will enter the assignment token function + if (!isVisitorRole && !isLoginRole) { + await assignToken(method); + } + return onBeforeRequest === null || onBeforeRequest === void 0 ? void 0 : onBeforeRequest(method); + }; + const onResponseRefreshToken = originalResponded => { + const respondedRecord = onResponded2Record(originalResponded); + return { + ...respondedRecord, + onSuccess: async (response, method) => { + await callHandlerIfMatchesMeta(method, login, defaultLoginMeta, response); + await callHandlerIfMatchesMeta(method, logout, defaultLogoutMeta, response); + return (respondedRecord.onSuccess || $self)(response, method); + } + }; + }; + return { + waitingList, + onAuthRequired, + onResponseRefreshToken + }; + }; + /** + * Create a server-side token authentication interceptor + * @param options Configuration parameters + * @returns token authentication interceptor function + */ + const createServerTokenAuthentication = ({ visitorMeta, login, logout, refreshTokenOnSuccess, refreshTokenOnError, assignToken = noop }) => { + let tokenRefreshing = falseValue; + const waitingList = []; + const onAuthRequired = onBeforeRequest => async (method) => { + const isVisitorRole = checkMethodRole(method, visitorMeta || defaultVisitorMeta); + const isLoginRole = checkMethodRole(method, (login === null || login === void 0 ? void 0 : login.metaMatches) || defaultLoginMeta); + // Ignored, login, and token refresh requests do not perform token authentication. + if (!isVisitorRole && + !isLoginRole && + !checkMethodRole(method, (refreshTokenOnSuccess === null || refreshTokenOnSuccess === void 0 ? void 0 : refreshTokenOnSuccess.metaMatches) || defaultRefreshTokenMeta) && + !checkMethodRole(method, (refreshTokenOnError === null || refreshTokenOnError === void 0 ? void 0 : refreshTokenOnError.metaMatches) || defaultRefreshTokenMeta)) { + // If the token is being refreshed, wait for the refresh to complete before sending a request. + if (tokenRefreshing) { + await waitForTokenRefreshed(method, waitingList); + } + } + if (!isVisitorRole && !isLoginRole) { + await assignToken(method); + } + return onBeforeRequest === null || onBeforeRequest === void 0 ? void 0 : onBeforeRequest(method); + }; + const onResponseRefreshToken = onRespondedHandlers => { + const respondedRecord = onResponded2Record(onRespondedHandlers); + return { + ...respondedRecord, + onSuccess: async (response, method) => { + if (!checkMethodRole(method, visitorMeta || defaultVisitorMeta) && + !checkMethodRole(method, (login === null || login === void 0 ? void 0 : login.metaMatches) || defaultLoginMeta) && + !checkMethodRole(method, (refreshTokenOnSuccess === null || refreshTokenOnSuccess === void 0 ? void 0 : refreshTokenOnSuccess.metaMatches) || defaultRefreshTokenMeta)) { + const dataResent = await refreshTokenIfExpired(method, waitingList, refreshing => { + tokenRefreshing = refreshing; + }, [response, method], refreshTokenOnSuccess, tokenRefreshing); + if (dataResent) { + return dataResent; + } + } + await callHandlerIfMatchesMeta(method, login, defaultLoginMeta, response); + await callHandlerIfMatchesMeta(method, logout, defaultLogoutMeta, response); + return (respondedRecord.onSuccess || $self)(response, method); + }, + onError: async (error, method) => { + if (!checkMethodRole(method, visitorMeta || defaultVisitorMeta) && + !checkMethodRole(method, (login === null || login === void 0 ? void 0 : login.metaMatches) || defaultLoginMeta) && + !checkMethodRole(method, (refreshTokenOnError === null || refreshTokenOnError === void 0 ? void 0 : refreshTokenOnError.metaMatches) || defaultRefreshTokenMeta)) { + const dataResent = await refreshTokenIfExpired(method, waitingList, refreshing => { + tokenRefreshing = refreshing; + }, [error, method], refreshTokenOnError, tokenRefreshing); + if (dataResent) { + return dataResent; + } + } + return (respondedRecord.onError || noop)(error, method); + } + }; + }; + return { + waitingList, + onAuthRequired, + onResponseRefreshToken + }; + }; + + /** + * Compatible functions, throwing parameters + * @param error mistake + */ + const throwFn = (error) => { + throw error; + }; + function useCallback(onCallbackChange = noop) { + let callbacks = []; + const setCallback = (fn) => { + if (!callbacks.includes(fn)) { + callbacks.push(fn); + onCallbackChange(callbacks); + } + // Return unregister function + return () => { + callbacks = filterItem(callbacks, e => e !== fn); + onCallbackChange(callbacks); + }; + }; + const triggerCallback = (...args) => { + if (callbacks.length > 0) { + return forEach(callbacks, fn => fn(...args)); + } + }; + const removeAllCallback = () => { + callbacks = []; + onCallbackChange(callbacks); + }; + return [setCallback, triggerCallback, removeAllCallback]; + } + /** + * Create a debounce function and trigger the function immediately when delay is 0 + * Scenario: When calling useWatcher and setting immediate to true, the first call must be executed immediately, otherwise it will cause a delayed call + * @param {GeneralFn} fn callback function + * @param {number|(...args: any[]) => number} delay Delay description, dynamic delay can be achieved when set as a function + * @returns Delayed callback function + */ + const debounce = (fn, delay) => { + let timer = nullValue; + return function debounceFn(...args) { + const bindFn = fn.bind(this, ...args); + const delayMill = isNumber(delay) ? delay : delay(...args); + timer && clearTimeoutTimer(timer); + if (delayMill > 0) { + timer = setTimeoutFn(bindFn, delayMill); + } + else { + bindFn(); + } + }; + }; + /** + * Get the request method object + * @param methodHandler Request method handle + * @param args Method call parameters + * @returns request method object + */ + const getHandlerMethod = (methodHandler, args = []) => { + const methodInstance = isFn(methodHandler) ? methodHandler(...args) : methodHandler; + createAssert('scene')(instanceOf(methodInstance, alova.Method), 'hook handler must be a method instance or a function that returns method instance'); + return methodInstance; + }; + /** + * Convert each value of the object and return the new object + * @param obj object + * @param callback callback function + * @returns converted object + */ + const mapObject = (obj, callback) => { + const ret = {}; + for (const key in obj) { + ret[key] = callback(obj[key], key, obj); + } + return ret; + }; + var EnumHookType; + (function (EnumHookType) { + EnumHookType[EnumHookType["USE_REQUEST"] = 1] = "USE_REQUEST"; + EnumHookType[EnumHookType["USE_WATCHER"] = 2] = "USE_WATCHER"; + EnumHookType[EnumHookType["USE_FETCHER"] = 3] = "USE_FETCHER"; + })(EnumHookType || (EnumHookType = {})); + /** + * create simple and unified, framework-independent states creators and handlers. + * @param statesHook states hook from `promiseStatesHook` function of alova + * @param referingObject refering object exported from `promiseStatesHook` function + * @returns simple and unified states creators and handlers + */ + function statesHookHelper(statesHook, referingObject = { trackedKeys: {}, bindError: falseValue }) { + const ref = (initialValue) => (statesHook.ref ? statesHook.ref(initialValue) : { current: initialValue }); + referingObject = ref(referingObject).current; + const exportState = (state) => (statesHook.export || $self)(state, referingObject); + const memorize = (fn) => { + if (!isFn(statesHook.memorize)) { + return fn; + } + const memorizedFn = statesHook.memorize(fn); + memorizedFn.memorized = true; + return memorizedFn; + }; + const { dehydrate } = statesHook; + // For performance reasons, only value is different, and the key is tracked can be updated. + const update = (newValue, state, key) => newValue !== dehydrate(state, key, referingObject) && + referingObject.trackedKeys[key] && + statesHook.update(newValue, state, key, referingObject); + const mapDeps = (deps) => mapItem(deps, item => (instanceOf(item, FrameworkReadableState) ? item.e : item)); + const createdStateList = []; + // key of deps on computed + const depKeys = {}; + return { + create: (initialValue, key) => { + pushItem(createdStateList, key); // record the keys of created states. + return newInstance((FrameworkState), statesHook.create(initialValue, key, referingObject), key, state => dehydrate(state, key, referingObject), exportState, (state, newValue) => update(newValue, state, key)); + }, + computed: (getter, depList, key) => { + // Collect all dependencies in computed + forEach(depList, dep => { + if (dep.k) { + depKeys[dep.k] = true; + } + }); + return newInstance((FrameworkReadableState), statesHook.computed(getter, mapDeps(depList), key, referingObject), key, state => dehydrate(state, key, referingObject), exportState); + }, + effectRequest: (effectRequestParams) => statesHook.effectRequest(effectRequestParams, referingObject), + ref, + watch: (source, callback) => statesHook.watch(mapDeps(source), callback, referingObject), + onMounted: (callback) => statesHook.onMounted(callback, referingObject), + onUnmounted: (callback) => statesHook.onUnmounted(callback, referingObject), + memorize, + /** + * refering object that sharing some value with this object. + */ + __referingObj: referingObject, + /** + * expose provider for specified use hook. + * @param object object that contains state proxy, framework state, operating function and event binder. + * @returns provider component. + */ + exposeProvider: (object) => { + const provider = {}; + const originalStatesMap = {}; + for (const key in object) { + const value = object[key]; + const isValueFunction = isFn(value); + // if it's a memorized function, don't memorize it any more, add it to provider directly. + // if it's start with `on`, that indicates it is an event binder, we should define a new function which return provider object. + // if it's a common function, add it to provider with memorize mode. + // Note that: in some situation, state is a function such as solid's signal, and state value is set to function in react, the state will be detected as a function. so we should check whether the key is in `trackedKeys` + if (isValueFunction && !referingObject.trackedKeys[key]) { + provider[key] = key.startsWith('on') + ? (...args) => { + value(...args); + // eslint-disable-next-line + return completedProvider; + } + : value.memorized + ? value + : memorize(value); + } + else { + const isFrameworkState = instanceOf(value, FrameworkReadableState); + if (isFrameworkState) { + originalStatesMap[key] = value.s; + } + // otherwise, it's a state proxy or framework state, add it to provider with getter mode. + ObjectCls.defineProperty(provider, key, { + get: () => { + // record the key that is being tracked. + referingObject.trackedKeys[key] = trueValue; + return isFrameworkState ? value.e : value; + }, + // set need to set an function, + // otherwise it will throw `TypeError: Cannot set property __referingObj of # which has only a getter` when setting value + set: noop, + enumerable: trueValue, + configurable: trueValue + }); + } + } + const { update: nestedHookUpdate, __proxyState: nestedProxyState } = provider; + // reset the tracked keys and bingError flag, so that the nest hook providers can be initialized. + // Always track the dependencies in computed + referingObject.trackedKeys = { + ...depKeys + }; + referingObject.bindError = falseValue; + const extraProvider = { + // expose referingObject automatically. + __referingObj: referingObject, + // the new updating function that can update the new states and nested hook states. + update: memorize((newStates) => { + objectKeys(newStates).forEach(key => { + if (includes(createdStateList, key)) { + update(newStates[key], originalStatesMap[key], key); + } + else if (key in provider && isFn(nestedHookUpdate)) { + nestedHookUpdate({ + [key]: newStates[key] + }); + } + }); + }), + __proxyState: memorize((key) => { + if (includes(createdStateList, key) && instanceOf(object[key], FrameworkReadableState)) { + // need to tag the key that is being tracked so that it can be updated with `state.v = xxx`. + referingObject.trackedKeys[key] = trueValue; + return object[key]; + } + return nestedProxyState(key); + }) + }; + const completedProvider = objAssign(provider, extraProvider); + return completedProvider; + }, + /** + * transform state proxies to object. + * @param states proxy array of framework states + * @param filterKey filter key of state proxy + * @returns an object that contains the states of target form + */ + objectify: (states, filterKey) => states.reduce((result, item) => { + result[item.k] = filterKey ? item[filterKey] : item; + return result; + }, {}), + transformState2Proxy: (state, key) => newInstance((FrameworkState), state, key, state => dehydrate(state, key, referingObject), exportState, (state, newValue) => update(newValue, state, key)) + }; + } + + const coreAssert = createAssert(''); + const requestHookAssert = createAssert('useRequest'); + const watcherHookAssert = createAssert('useWatcher'); + const fetcherHookAssert = createAssert('useFetcher'); + const coreHookAssert = (hookType) => ({ + [EnumHookType.USE_REQUEST]: requestHookAssert, + [EnumHookType.USE_WATCHER]: watcherHookAssert, + [EnumHookType.USE_FETCHER]: fetcherHookAssert + })[hookType]; + /** + * Assert whether it is a method instance + * @param methodInstance method instance + */ + const assertMethod = (assert, methodInstance) => assert(instanceOf(methodInstance, alova.Method), 'expected a method instance.'); + + const KEY_SUCCESS = 'success'; + const KEY_ERROR = 'error'; + const KEY_COMPLETE = 'complete'; + + var createHook = (ht, c, eventManager, ro) => ({ + /** The method instance of the last request */ + m: undefinedValue, + /** saveStatesFns */ + sf: [], + /** removeStatesFns */ + rf: [], + /** frontStates */ + fs: {}, + /** eventManager */ + em: eventManager, + /** hookType, useRequest=1, useWatcher=2, useFetcher=3 */ + ht, + /** hook config */ + c, + /** referingObject */ + ro, + /** managedStates */ + ms: {} + }); + + // base event + class AlovaEventBase { + constructor(method, args) { + this.method = method; + this.args = args; + } + clone() { + return { ...this }; + } + static spawn(method, args) { + return new AlovaEventBase(method, args); + } + } + class AlovaSuccessEvent extends AlovaEventBase { + constructor(base, data, fromCache) { + super(base.method, base.args); + this.data = data; + this.fromCache = fromCache; + } + } + class AlovaErrorEvent extends AlovaEventBase { + constructor(base, error) { + super(base.method, base.args); + this.error = error; + } + } + class AlovaCompleteEvent extends AlovaEventBase { + constructor(base, status, data, fromCache, error) { + super(base.method, base.args); + this.status = status; + this.data = data; + this.fromCache = status === 'error' ? false : fromCache; + this.error = error; + } + } + // extend event + class AlovaSSEEvent extends AlovaEventBase { + constructor(base, eventSource) { + super(base.method, base.args); + this.eventSource = eventSource; + } + } + class AlovaSSEErrorEvent extends AlovaSSEEvent { + constructor(base, error) { + super(base, base.eventSource); + this.error = error; + } + } + class AlovaSSEMessageEvent extends AlovaSSEEvent { + constructor(base, data) { + super(base, base.eventSource); + this.data = data; + } + } + /** Sq top level events */ + class SQEvent { + constructor(behavior, method, silentMethod) { + this.behavior = behavior; + this.method = method; + this.silentMethod = silentMethod; + } + } + /** Sq global events */ + class GlobalSQEvent extends SQEvent { + constructor(behavior, method, silentMethod, queueName, retryTimes) { + super(behavior, method, silentMethod); + this.queueName = queueName; + this.retryTimes = retryTimes; + } + } + class GlobalSQSuccessEvent extends GlobalSQEvent { + constructor(behavior, method, silentMethod, queueName, retryTimes, data, vDataResponse) { + super(behavior, method, silentMethod, queueName, retryTimes); + this.data = data; + this.vDataResponse = vDataResponse; + } + } + class GlobalSQErrorEvent extends GlobalSQEvent { + constructor(behavior, method, silentMethod, queueName, retryTimes, error, retryDelay) { + super(behavior, method, silentMethod, queueName, retryTimes); + this.error = error; + this.retryDelay = retryDelay; + } + } + class GlobalSQFailEvent extends GlobalSQEvent { + constructor(behavior, method, silentMethod, queueName, retryTimes, error) { + super(behavior, method, silentMethod, queueName, retryTimes); + this.error = error; + } + } + /** Sq event */ + class ScopedSQEvent extends SQEvent { + constructor(behavior, method, silentMethod, args) { + super(behavior, method, silentMethod); + this.args = args; + } + } + class ScopedSQSuccessEvent extends ScopedSQEvent { + constructor(behavior, method, silentMethod, args, data) { + super(behavior, method, silentMethod, args); + this.data = data; + } + } + class ScopedSQErrorEvent extends ScopedSQEvent { + constructor(behavior, method, silentMethod, args, error) { + super(behavior, method, silentMethod, args); + this.error = error; + } + } + class ScopedSQRetryEvent extends ScopedSQEvent { + constructor(behavior, method, silentMethod, args, retryTimes, retryDelay) { + super(behavior, method, silentMethod, args); + this.retryTimes = retryTimes; + this.retryDelay = retryDelay; + } + } + class ScopedSQCompleteEvent extends ScopedSQEvent { + constructor(behavior, method, silentMethod, args, status, data, error) { + super(behavior, method, silentMethod, args); + this.status = status; + this.data = data; + this.error = error; + } + } + class RetriableRetryEvent extends AlovaEventBase { + constructor(base, retryTimes, retryDelay) { + super(base.method, base.args); + this.retryTimes = retryTimes; + this.retryDelay = retryDelay; + } + } + class RetriableFailEvent extends AlovaErrorEvent { + constructor(base, error, retryTimes) { + super(base, error); + this.retryTimes = retryTimes; + } + } + + const defaultMiddleware = (_, next) => next(); + + const stateCache = {}; + /** + * @description Get State cache data + * @param baseURL Base URL + * @param key Request key value + * @returns Cached response data, if not returned {} + */ + const getStateCache = (namespace, key) => { + const cachedState = stateCache[namespace] || {}; + return cachedState[key] || {}; + }; + /** + * @description Set State cache data + * @param baseURL Base URL + * @param key Request key value + * @param data cache data + */ + const setStateCache = (namespace, key, data, hookInstance) => { + const cachedState = (stateCache[namespace] = stateCache[namespace] || {}); + cachedState[key] = { + s: data, + h: hookInstance + }; + }; + /** + * @description Clear State cache data + * @param baseURL Base URL + * @param key Request key value + */ + const removeStateCache = (namespace, key) => { + const cachedState = stateCache[namespace]; + if (cachedState) { + deleteAttr(cachedState, key); + } + }; + + /** + * Unified processing of request logic for useRequest/useWatcher/useFetcher and other request hook functions + * @param hookInstance hook instance + * @param methodHandler Request method object or get function + * @param sendCallingArgs send function parameters + * @returns Request status + */ + function useHookToSendRequest(hookInstance, methodHandler, sendCallingArgs = []) { + const currentHookAssert = coreHookAssert(hookInstance.ht); + let methodInstance = getHandlerMethod$1(methodHandler, currentHookAssert, sendCallingArgs); + const { fs: frontStates, ht: hookType, c: useHookConfig, ms: managedStates } = hookInstance; + const { loading: loadingState, data: dataState, error: errorState } = frontStates; + const isFetcher = hookType === EnumHookType.USE_FETCHER; + const { force: forceRequest = falseValue, middleware = defaultMiddleware } = useHookConfig; + const alovaInstance = getContext(methodInstance); + const { id } = alovaInstance; + // If it is a silent request, on success will be called directly after the request, on error will not be triggered, and progress will not be updated. + const methodKey = getMethodInternalKey(methodInstance); + const { abortLast = trueValue } = useHookConfig; + const isFirstRequest = !hookInstance.m; + hookInstance.m = methodInstance; + return (async () => { + // Initialize status data, which does not need to be loaded when pulling data, because pulling data does not require returning data. + let removeStates = noop; + let saveStates = noop; + let isNextCalled = falseValue; + let responseHandlePromise = promiseResolve(undefinedValue); + let offDownloadEvent = noop; + let offUploadEvent = noop; + const cachedResponse = await alova.queryCache(methodInstance); + let fromCache = () => !!cachedResponse; + // Whether it is a controlled loading state. When it is true, loading will no longer be set to false in response processing. + let controlledLoading = falseValue; + if (!isFetcher) { + // Store the initial state in cache for subsequent updates + saveStates = frontStates => setStateCache(id, methodKey, frontStates, hookInstance); + saveStates({ ...frontStates, ...managedStates }); + // Setting the state removal function will be passed to the effect request in the hook, and it will be set to be called when the component is unloaded. + removeStates = () => removeStateCache(id, methodKey); + } + // The middleware function next callback function allows you to modify mandatory request parameters and even replace the method instance that is about to send the request. + const guardNext = guardNextConfig => { + isNextCalled = trueValue; + const { force: guardNextForceRequest = forceRequest, method: guardNextReplacingMethod = methodInstance } = guardNextConfig || {}; + const forceRequestFinally = sloughConfig(guardNextForceRequest, [ + newInstance((AlovaEventBase), methodInstance, sendCallingArgs) + ]); + const progressUpdater = (stage) => ({ loaded, total }) => { + frontStates[stage].v = { + loaded, + total + }; + }; + methodInstance = guardNextReplacingMethod; + // The latest controller needs to be saved every time a request is sent + pushItem(hookInstance.sf, saveStates); + pushItem(hookInstance.rf, removeStates); + // Loading will not be changed when the loading state is controlled + // The cache is missed, or loading needs to be set to true when forcing a request. + if (!controlledLoading) { + loadingState.v = !!forceRequestFinally || !cachedResponse; + } + // Determine whether to trigger a progress update based on the tracking status of downloading and uploading + const { downloading: enableDownload, uploading: enableUpload } = hookInstance.ro.trackedKeys; + offDownloadEvent = enableDownload ? methodInstance.onDownload(progressUpdater('downloading')) : offDownloadEvent; + offUploadEvent = enableUpload ? methodInstance.onUpload(progressUpdater('uploading')) : offUploadEvent; + responseHandlePromise = methodInstance.send(forceRequestFinally); + fromCache = () => methodInstance.fromCache || falseValue; + return responseHandlePromise; + }; + // Call middleware function + const commonContext = { + method: methodInstance, + cachedResponse, + config: useHookConfig, + abort: () => methodInstance.abort() + }; + // Whether it is necessary to update the response data and call the response callback + const toUpdateResponse = () => hookType !== EnumHookType.USE_WATCHER || !abortLast || hookInstance.m === methodInstance; + const controlLoading = (control = trueValue) => { + // only reset loading state in first request + if (control && isFirstRequest) { + loadingState.v = falseValue; + } + controlledLoading = control; + }; + // Call middleware function + const middlewareCompletePromise = isFetcher + ? middleware({ + ...commonContext, + args: sendCallingArgs, + fetch: (methodInstance, ...args) => { + assertMethod(currentHookAssert, methodInstance); + return useHookToSendRequest(hookInstance, methodInstance, args); + }, + proxyStates: omit(frontStates, 'data'), + controlLoading + }, guardNext) + : middleware({ + ...commonContext, + args: sendCallingArgs, + send: (...args) => useHookToSendRequest(hookInstance, methodHandler, args), + proxyStates: frontStates, + controlLoading + }, guardNext); + let finallyResponse = undefinedValue; + const baseEvent = (AlovaEventBase).spawn(methodInstance, sendCallingArgs); + try { + // Unified processing of responses + const middlewareReturnedData = await middlewareCompletePromise; + const afterSuccess = (data) => { + // Update cached response data + if (!isFetcher) { + toUpdateResponse() && (dataState.v = data); + } + else if (hookInstance.c.updateState !== falseValue) { + // Update the status in the cache, usually entered in use fetcher + const cachedState = getStateCache(id, methodKey).s; + cachedState && (cachedState.data.v = data); + } + // If the response data needs to be updated, the corresponding callback function is triggered after the request. + if (toUpdateResponse()) { + errorState.v = undefinedValue; + // Loading status will no longer change to false when controlled + !controlledLoading && (loadingState.v = falseValue); + hookInstance.em.emit(KEY_SUCCESS, newInstance((AlovaSuccessEvent), baseEvent, data, fromCache())); + hookInstance.em.emit(KEY_COMPLETE, newInstance((AlovaCompleteEvent), baseEvent, KEY_SUCCESS, data, fromCache(), undefinedValue)); + } + return data; + }; + finallyResponse = + // When no data is returned or undefined is returned in the middleware, get the real response data + // Otherwise, use the returned data and no longer wait for the response promise. At this time, you also need to call the response callback. + middlewareReturnedData !== undefinedValue + ? afterSuccess(middlewareReturnedData) + : isNextCalled + ? // There are two possibilities when middlewareCompletePromise is resolve + // 1. The request is normal + // 2. The request is incorrect, but the error is captured by the middleware function. At this time, the success callback will also be called, that is, afterSuccess(undefinedValue) + await promiseThen(responseHandlePromise, afterSuccess, () => afterSuccess(undefinedValue)) + : // If is next called is not called, no data is returned + undefinedValue; + // When the next function is not called, update loading to false. + !isNextCalled && !controlledLoading && (loadingState.v = falseValue); + } + catch (error) { + if (toUpdateResponse()) { + // Controls the output of error messages + errorState.v = error; + // Loading status will no longer change to false when controlled + !controlledLoading && (loadingState.v = falseValue); + hookInstance.em.emit(KEY_ERROR, newInstance((AlovaErrorEvent), baseEvent, error)); + hookInstance.em.emit(KEY_COMPLETE, newInstance((AlovaCompleteEvent), baseEvent, KEY_ERROR, undefinedValue, fromCache(), error)); + } + throw error; + } + // Unbind download and upload events after responding + offDownloadEvent(); + offUploadEvent(); + return finallyResponse; + })(); + } + + const refCurrent = (ref) => ref.current; + /** + * Create request status and uniformly process consistent logic in useRequest, useWatcher, and useFetcher + * This function will call the creation function of statesHook to create the corresponding request state. + * When the value is empty, it means useFetcher enters, and data status and cache status are not needed at this time. + * @param methodInstance request method object + * @param useHookConfig hook request configuration object + * @param initialData Initial data data + * @param immediate Whether to initiate a request immediately + * @param watchingStates The monitored status, if not passed in, call handleRequest directly. + * @param debounceDelay Delay time for request initiation + * @returns Current request status, operation function and event binding function + */ + function createRequestState(hookType, methodHandler, useHookConfig, initialData, immediate = falseValue, watchingStates, debounceDelay = 0) { + var _a; + // shallow clone config object to avoid passing the same useHookConfig object which may cause vue2 state update error + useHookConfig = { ...useHookConfig }; + const { __referingObj: referingObject = { trackedKeys: {}, bindError: falseValue } } = useHookConfig; + let initialLoading = !!immediate; + let cachedResponse = undefinedValue; + // When sending a request immediately, you need to determine the initial loading value by whether to force the request and whether there is a cache. This has the following two benefits: + // 1. Sending the request immediately under react can save one rendering time + // 2. In the HTML rendered by SSR, the initial view is in the loading state to avoid the loading view flashing when displayed on the client. + if (immediate) { + // An error may be reported when calling the get handler method, and try/catch is required. + try { + const methodInstance = getHandlerMethod$1(methodHandler, coreHookAssert(hookType)); + const alovaInstance = getContext(methodInstance); + const l1CacheResult = alovaInstance.l1Cache.get(buildNamespacedCacheKey(alovaInstance.id, getMethodInternalKey(methodInstance))); + // The cache is only checked synchronously, so it does not take effect on asynchronous l1Cache adapters. + // It is recommended not to set up the asynchronous l1Cache adapter on the client side + if (l1CacheResult && !instanceOf(l1CacheResult, PromiseCls)) { + const [data, expireTimestamp] = l1CacheResult; + // If there is no expiration time, it means that the data will never expire. Otherwise, you need to determine whether it has expired. + if (!expireTimestamp || expireTimestamp > getTime()) { + cachedResponse = data; + } + } + const forceRequestFinally = sloughConfig((_a = useHookConfig.force) !== null && _a !== void 0 ? _a : falseValue); + initialLoading = !!forceRequestFinally || !cachedResponse; + } + catch (_b) { } + } + const { create, effectRequest, ref, objectify, exposeProvider, transformState2Proxy } = statesHookHelper(alova.promiseStatesHook(), referingObject); + const progress = { + total: 0, + loaded: 0 + }; + // Put the externally incoming supervised states into the front states collection together + const { managedStates = {} } = useHookConfig; + const managedStatesProxy = mapObject(managedStates, (state, key) => transformState2Proxy(state, key)); + const data = create(cachedResponse !== null && cachedResponse !== void 0 ? cachedResponse : (isFn(initialData) ? initialData() : initialData), 'data'); + const loading = create(initialLoading, 'loading'); + const error = create(undefinedValue, 'error'); + const downloading = create({ ...progress }, 'downloading'); + const uploading = create({ ...progress }, 'uploading'); + const frontStates = objectify([data, loading, error, downloading, uploading]); + const eventManager = createEventManager(); + const hookInstance = refCurrent(ref(createHook(hookType, useHookConfig, eventManager, referingObject))); + /** + * ## react ##Every time the function is executed, the following items need to be reset + */ + hookInstance.fs = frontStates; + hookInstance.em = eventManager; + hookInstance.c = useHookConfig; + hookInstance.ms = managedStatesProxy; + const hasWatchingStates = watchingStates !== undefinedValue; + // Initialize request event + // Unified send request function + const handleRequest = (handler = methodHandler, sendCallingArgs) => useHookToSendRequest(hookInstance, handler, sendCallingArgs); + // only call once when multiple values changed at the same time + const onceRunner = refCurrent(ref(createSyncOnceRunner())); + // Call handleRequest in a way that catches the exception + // Catching exceptions prevents exceptions from being thrown out + const wrapEffectRequest = (ro = referingObject, handler) => { + onceRunner(() => { + promiseCatch(handleRequest(handler), error => { + // the error tracking indicates that the error need to throw. + if (!ro.bindError && !ro.trackedKeys.error) { + throw error; + } + }); + }); + }; + /** + * fix: #421 + * Use ref wraps to prevent react from creating new debounce function in every render + * Explicit passing is required because the context will change + */ + const debouncingSendHandler = ref(debounce((_, ro, handler) => wrapEffectRequest(ro, handler), (changedIndex) => isNumber(changedIndex) ? (isArray(debounceDelay) ? debounceDelay[changedIndex] : debounceDelay) : 0)); + // Do not send requests when rendering on the server side + if (!alova.globalConfigMap.ssr) { + effectRequest({ + handler: + // When `watchingStates` is an array, it indicates the watching states (including an empty array). When it is undefined, it indicates the non-watching state. + hasWatchingStates + ? (changedIndex) => debouncingSendHandler.current(changedIndex, referingObject, methodHandler) + : () => wrapEffectRequest(referingObject), + removeStates: () => forEach(hookInstance.rf, fn => fn()), + saveStates: states => forEach(hookInstance.sf, fn => fn(states)), + frontStates: { ...frontStates, ...managedStatesProxy }, + watchingStates, + immediate: immediate !== null && immediate !== void 0 ? immediate : trueValue + }); + } + return exposeProvider({ + ...objectify([data, loading, error, downloading, uploading]), + abort: () => hookInstance.m && hookInstance.m.abort(), + /** + * Manually initiate a request by executing this method + * @param sendCallingArgs Parameters passed in when calling the send function + * @param methodInstance method object + * @param isFetcher Whether to call isFetcher + * @returns Request promise + */ + send: (sendCallingArgs, methodInstance) => handleRequest(methodInstance, sendCallingArgs), + onSuccess(handler) { + eventManager.on(KEY_SUCCESS, handler); + }, + onError(handler) { + // will not throw error when bindError is true. + // it will reset in `exposeProvider` so that ignore the error binding in custom use hooks. + referingObject.bindError = trueValue; + eventManager.on(KEY_ERROR, handler); + }, + onComplete(handler) { + eventManager.on(KEY_COMPLETE, handler); + } + }); + } + + /** + * Fetch request data and cache request method object + */ + function useFetcher(config = {}) { + const props = createRequestState(EnumHookType.USE_FETCHER, noop, config); + const { send } = props; + deleteAttr(props, 'send'); + return objAssign(props, { + /** + * Fetch data fetch will definitely send a request, and if the currently requested data has a corresponding management state, this state will be updated. + * @param matcher Method object + */ + fetch: (matcher, ...args) => { + assertMethod(fetcherHookAssert, matcher); + return send(args, matcher); + } + }); + } + + function useRequest(handler, config = {}) { + const { immediate = trueValue, initialData } = config; + const props = createRequestState(EnumHookType.USE_REQUEST, handler, config, initialData, !!immediate); + const { send } = props; + return objAssign(props, { + send: (...args) => send(args) + }); + } + + function useWatcher(handler, watchingStates, config = {}) { + watcherHookAssert(watchingStates && len(watchingStates) > 0, 'expected at least one watching state'); + const { immediate, debounce = 0, initialData } = config; + const props = createRequestState(EnumHookType.USE_WATCHER, handler, config, initialData, !!immediate, // !!immediate means not send request immediately + watchingStates, debounce); + const { send } = props; + return objAssign(props, { + send: (...args) => send(args) + }); + } + + var createSnapshotMethodsManager = (handler) => { + let methodSnapshots = {}; + return { + snapshots: () => methodSnapshots, + save(methodInstance, force = falseValue) { + const key = getMethodInternalKey(methodInstance); + // Because it is impossible to locate the location of the total data in the cache + // Therefore, this field is maintained redundantly here. + if (!methodSnapshots[key] || force) { + methodSnapshots[key] = { + entity: methodInstance + }; + } + }, + get: (entityOrPage) => methodSnapshots[getMethodInternalKey(instanceOf(entityOrPage, (alova.Method)) ? entityOrPage : handler(entityOrPage))], + remove(key) { + if (key) { + delete methodSnapshots[key]; + } + else { + methodSnapshots = {}; + } + } + }; + }; + + const paginationAssert = createAssert('usePagination'); + const indexAssert = (index, rawData) => paginationAssert(isNumber(index) && index < len(rawData), 'index must be a number that less than list length'); + const parseSendArgs = (args) => [ + args[args.length - 2], // refreshPage + args[args.length - 1], // isRefresh + args.slice(0, args.length - 2) // send args + ]; + var usePagination = (handler, config = {}) => { + const { create, computed, ref, watch, exposeProvider, objectify, __referingObj: referingObject } = statesHookHelper(alova.promiseStatesHook()); + const { preloadPreviousPage = trueValue, preloadNextPage = trueValue, total: totalGetter = res => res.total, data: dataGetter = res => res.data, append = falseValue, initialPage = 1, initialPageSize = 10, watchingStates = [], initialData, immediate = trueValue, middleware, force = noop, ...others } = config; + const handlerRef = ref(handler); + const isReset = ref(falseValue); // Used to control whether to reset + // The number of requests during reset. In order to prevent repeated requests during reset, use this parameter to limit requests. + const page = create(initialPage, 'page'); + const pageSize = create(initialPageSize, 'pageSize'); + const data = create((initialData ? dataGetter(initialData) || [] : []), 'data'); + const total = create(initialData ? totalGetter(initialData) : undefinedValue, 'total'); + // Save snapshots of all method instances used by the current hook + const { snapshots: methodSnapshots, get: getSnapshotMethods, save: saveSnapshot, remove: removeSnapshot } = ref(createSnapshotMethodsManager(page => handlerRef.current(page, pageSize.v))).current; + const listDataGetter = (rawData) => dataGetter(rawData) || rawData; + // Initialize fetcher + const fetchStates = useFetcher({ + __referingObj: referingObject, + updateState: falseValue, + force: ({ args }) => args[len(args) - 1] + }); + const { loading, fetch, abort: abortFetch, onSuccess: onFetchSuccess } = fetchStates; + const fetchingRef = ref(loading); + const getHandlerMethod = (refreshPage = page.v, customArgs = []) => { + const handlerMethod = handler(refreshPage, pageSize.v, ...customArgs); + // Define unified additional names to facilitate management + saveSnapshot(handlerMethod); + return handlerMethod; + }; + // When monitoring status changes, reset page to 1 + watch(watchingStates, () => { + page.v = initialPage; + isReset.current = trueValue; + }); + // Compatible with react, store functions that require proxy here + // In this way, the latest operation function can be called in the proxy function and avoid the react closure trap. + const delegationActions = ref({}); + // Calculate data, total, is last page parameters + const pageCount = computed(() => { + const totalVal = total.v; + return totalVal !== undefinedValue ? Math.ceil(totalVal / pageSize.v) : undefinedValue; + }, [pageSize, total], 'pageCount'); + const createDelegationAction = (actionName) => (...args) => delegationActions.current[actionName](...args); + const states = useWatcher((...args) => { + const [refreshPage, , customArgs] = parseSendArgs(args); + return getHandlerMethod(refreshPage, customArgs); + }, [...watchingStates, page.e, pageSize.e], { + __referingObj: referingObject, + immediate, + initialData, + managedStates: objectify([data, page, pageSize, total], 's'), + middleware(ctx, next) { + if (!middleware) { + return next(); + } + return middleware({ + ...ctx, + delegatingActions: { + refresh: createDelegationAction('refresh'), + insert: createDelegationAction('insert'), + remove: createDelegationAction('remove'), + replace: createDelegationAction('replace'), + reload: createDelegationAction('reload'), + getState: (stateKey) => { + const states = { + page, + pageSize, + data, + pageCount, + total, + // eslint-disable-next-line @typescript-eslint/no-use-before-define + isLastPage + }; + return states[stateKey].v; + } + } + }, next); + }, + force: event => event.args[1] || (isFn(force) ? force(event) : force), + ...others + }); + const { send } = states; + const nestedData = states.__proxyState('data'); + // Determine whether data can be preloaded + const canPreload = async (payload) => { + const { rawData = nestedData.v, preloadPage, fetchMethod, forceRequest = falseValue, isNextPage = falseValue } = payload; + const pageCountVal = pageCount.v; + const exceedPageCount = pageCountVal + ? preloadPage > pageCountVal + : isNextPage // If it is judged to preload the next page of data and there is no page count, it is judged by whether the data volume of the last page reaches the page size. + ? len(listDataGetter(rawData)) < pageSize.v + : falseValue; + const isMatchPageScope = preloadPage > 0 && !exceedPageCount; + if (!isMatchPageScope) { + return falseValue; + } + const { e: expireMilliseconds } = getLocalCacheConfigParam(fetchMethod); + const hasCache = await alova.queryCache(fetchMethod); + // If the cache time is less than or equal to the current time, it means that the cache is not set and the data will no longer be pre-pulled at this time. + // Or there is already a cache and it is not pre-fetched. + return expireMilliseconds(MEMORY) <= getTime() ? falseValue : forceRequest || !hasCache; + }; + // Preload next page data + const fetchNextPage = async (rawData, force, customArgs = []) => { + const nextPage = page.v + 1; + const fetchMethod = getHandlerMethod(nextPage, customArgs); + if (preloadNextPage && + (await canPreload({ + rawData, + preloadPage: nextPage, + fetchMethod, + isNextPage: trueValue, + forceRequest: force + }))) { + promiseCatch(fetch(fetchMethod, ...customArgs, force), noop); + } + }; + // Preload previous page data + const fetchPreviousPage = async (rawData, customArgs = []) => { + const prevPage = page.v - 1; + const fetchMethod = getHandlerMethod(prevPage, customArgs); + if (preloadPreviousPage && + (await canPreload({ + rawData, + preloadPage: prevPage, + fetchMethod + }))) { + promiseCatch(fetch(fetchMethod, ...customArgs, undefinedValue), noop); + } + }; + // If the returned data is smaller than the page size, it is considered the last page. + const isLastPage = computed(() => { + const dataRaw = nestedData.v; + if (!dataRaw) { + return trueValue; + } + const statesDataVal = listDataGetter(dataRaw); + const pageVal = page.v; + const pageCountVal = pageCount.v; + const dataLen = isArray(statesDataVal) ? len(statesDataVal) : 0; + return pageCountVal ? pageVal >= pageCountVal : dataLen < pageSize.v; + }, [page, pageCount, nestedData, pageSize], 'isLastPage'); + // Update current page cache + const updateCurrentPageCache = async () => { + const snapshotItem = getSnapshotMethods(page.v); + if (snapshotItem) { + await alova.setCache(snapshotItem.entity, (rawData) => { + // When caching is turned off, raw data is undefined + if (rawData) { + const cachedListData = listDataGetter(rawData) || []; + splice(cachedListData, 0, len(cachedListData), ...data.v); + return rawData; + } + }); + } + }; + onFetchSuccess(({ method, data: rawData }) => { + // When fetch has not responded yet and the page is flipped to the page number corresponding to fetch, the list data needs to be updated manually. + const snapshotItem = getSnapshotMethods(page.v); + if (snapshotItem && getMethodInternalKey(snapshotItem.entity) === getMethodInternalKey(method)) { + // If data is appended, data is updated + const listData = listDataGetter(rawData); // Update data parameters + if (append) { + // The current page data needs to be replaced during pull-down loading. + const dataRaw = data.v; + const pageSizeVal = pageSize.v; + // When performing a removal operation, the number of replacements is less than pageSize, and dataRaw % pageSizeVal will be greater than 0. + // When adding a new operation, the number of replacements is equal to pageSize. At this time, dataRaw % pageSizeVal will be equal to 0. No replacement is needed at this time. + const replaceNumber = len(dataRaw) % pageSizeVal; + if (replaceNumber > 0) { + const rawData = [...data.v]; + splice(rawData, (page.v - 1) * pageSizeVal, replaceNumber, ...listData); + data.v = rawData; + } + } + else { + data.v = listData; + } + } + }); + const awaitResolve = ref(undefinedValue); + const awaitReject = ref(undefinedValue); + states + .onSuccess(({ data: rawData, args, method }) => { + const [refreshPage, isRefresh, customArgs] = parseSendArgs(args); + const { total: cachedTotal } = getSnapshotMethods(method) || {}; + const typedRawData = rawData; + total.v = cachedTotal !== undefinedValue ? cachedTotal : totalGetter(typedRawData); + if (!isRefresh) { + fetchPreviousPage(typedRawData, customArgs); + fetchNextPage(typedRawData, falseValue, customArgs); + } + const pageSizeVal = pageSize.v; + const listData = listDataGetter(typedRawData); // Get array + paginationAssert(isArray(listData), 'Got wrong array, did you return the correct array of list in `data` function'); + // If data is appended, data is updated + if (append) { + // If it is reset, clear the data first + if (isReset.current) { + data.v = []; + } + if (refreshPage === undefinedValue) { + data.v = [...data.v, ...listData]; + } + else if (refreshPage) { + const rawData = [...data.v]; + // If the page is refreshed, the data on that page is replaced. + splice(rawData, (refreshPage - 1) * pageSizeVal, pageSizeVal, ...listData); + data.v = rawData; + } + } + else { + data.v = listData; + } + }) + .onSuccess(({ data }) => { + var _a; + (_a = awaitResolve.current) === null || _a === void 0 ? void 0 : _a.call(awaitResolve, data); + }) + .onError(({ error }) => { + var _a; + (_a = awaitReject.current) === null || _a === void 0 ? void 0 : _a.call(awaitReject, error); + }) + .onComplete(() => { + // Whether the request is successful or not, it must be reset is reset + isReset.current = falseValue; + }); + // Get the location of a list item + const getItemIndex = (item) => { + const index = data.v.indexOf(item); + paginationAssert(index >= 0, 'item is not found in list'); + return index; + }; + const { addQueue: add2AsyncQueue, onComplete: onAsyncQueueRunComplete } = ref(createAsyncQueue()).current; + /** + * Refresh the specified page number data. This function will ignore the cache and force the request to be sent. + * If no page number is passed in, the current page will be refreshed. + * If a list item is passed in, the page where the list item is located will be refreshed, which is only valid in append mode. + * @param pageOrItemPage Refreshed page number or list item + */ + const refresh = async (pageOrItemPage = page.v) => { + let refreshPage = pageOrItemPage; + let awaitPromise = promiseResolve(); + if (append) { + if (!isNumber(pageOrItemPage)) { + const itemIndex = getItemIndex(pageOrItemPage); + refreshPage = Math.floor(itemIndex / pageSize.v) + 1; + } + paginationAssert(refreshPage <= page.v, "refresh page can't greater than page"); + // Update current page data + awaitPromise = send(refreshPage, trueValue); + } + else { + paginationAssert(isNumber(refreshPage), 'unable to calculate refresh page by item in pagination mode'); + // If the number of pages is equal, refresh the current page, otherwise fetch data + awaitPromise = + refreshPage === page.v + ? send(undefinedValue, trueValue) + : fetch(handler(refreshPage, pageSize.v), trueValue); + } + return awaitPromise; + }; + // Delete all related caches except the current page and next page of this usehook + const invalidatePaginationCache = async (all = falseValue) => { + const pageVal = page.v; + const snapshotObj = methodSnapshots(); + let snapshots = objectValues(snapshotObj); + if (all) { + removeSnapshot(); + } + else { + // Filter out data from the previous page, current page, and next page + const excludeSnapshotKeys = mapItem(filterItem([getSnapshotMethods(pageVal - 1), getSnapshotMethods(pageVal), getSnapshotMethods(pageVal + 1)], Boolean), ({ entity }) => getMethodInternalKey(entity)); + snapshots = mapItem(filterItem(objectKeys(snapshotObj), key => !includes(excludeSnapshotKeys, key)), key => { + const item = snapshotObj[key]; + delete snapshotObj[key]; + return item; + }); + } + await alova.invalidateCache(mapItem(snapshots, ({ entity }) => entity)); + }; + // The reason for taking it out separately is that + // No matter how many times insert, remove, or a combination of them is called synchronously, the reset operation only needs to be executed asynchronously once + const resetCache = async () => { + fetchingRef.current && abortFetch(); + // cache invalidation + await invalidatePaginationCache(); + // When the amount of data on the next page does not exceed the page size, the next page is forced to be requested. Because there is a request for sharing, the fetching needs to be performed asynchronously after interrupting the request. + const snapshotItem = getSnapshotMethods(page.v + 1); + if (snapshotItem) { + const cachedListData = listDataGetter((await alova.queryCache(snapshotItem.entity)) || {}) || []; + fetchNextPage(undefinedValue, len(cachedListData) < pageSize.v); + } + }; + // Unified update of total number of items + const updateTotal = (offset) => { + if (offset === 0) { + return; + } + // Update current page + const totalVal = total.v; + if (isNumber(totalVal)) { + const offsetedTotal = Math.max(totalVal + offset, 0); + total.v = offsetedTotal; + const pageVal = page.v; + // Update redundant total field + forEach([getSnapshotMethods(pageVal - 1), getSnapshotMethods(pageVal), getSnapshotMethods(pageVal + 1)], item => { + item && (item.total = offsetedTotal); + }); + } + }; + /** + * Insert a piece of data + * If no index is passed in, it will be inserted at the front by default. + * If a list item is passed in, it will be inserted after the list item. If the list item is not in the list data, an error will be thrown. + * @param item insert + * @param position Insert position (index) or list item + */ + const insert = (item, position = 0) => { + onAsyncQueueRunComplete(resetCache); // The cache needs to be reset at the end of execution + return add2AsyncQueue(async () => { + const index = isNumber(position) ? position : getItemIndex(position) + 1; + let popItem = undefinedValue; + const rawData = [...data.v]; + // Only when the number of items currently displayed is exactly a multiple of page size, you need to remove an item of data to ensure that the number of operating pages is page size. + if (len(rawData) % pageSize.v === 0) { + popItem = rawData.pop(); + } + // If the insertion position is empty, it will be inserted to the front by default. + splice(rawData, index, 0, item); + data.v = rawData; + updateTotal(1); + // The cache of the current page is updated synchronously + await updateCurrentPageCache(); + // If there is a pop item, put it at the head of the next page cache, consistent with the remove operation. + // In this way, the performance will be consistent when insert and remove are called synchronously. + if (popItem) { + const snapshotItem = getSnapshotMethods(page.v + 1); + if (snapshotItem) { + await alova.setCache(snapshotItem.entity, (rawData) => { + if (rawData) { + const cachedListData = listDataGetter(rawData) || []; + cachedListData.unshift(popItem); + cachedListData.pop(); + return rawData; + } + }); + } + } + }); + }; + /** + * Remove a piece of data + * If a list item is passed in, the list item will be removed. If the list item is not in the list data, an error will be thrown. + * @param position Removed index or list item + */ + const remove = (...positions) => { + onAsyncQueueRunComplete(resetCache); // The cache needs to be reset at the end of execution + return add2AsyncQueue(async () => { + const indexes = mapItem(positions, position => { + const index = isNumber(position) ? position : getItemIndex(position); + indexAssert(index, data.v); + return index; + }); + const pageVal = page.v; + const nextPage = pageVal + 1; + const snapshotItem = getSnapshotMethods(nextPage); + const fillingItems = []; // padding data item + if (snapshotItem) { + await alova.setCache(snapshotItem.entity, (rawData) => { + if (rawData) { + const cachedListData = listDataGetter(rawData); + // Start filling data from the head of the list on the next page + if (isArray(cachedListData)) { + pushItem(fillingItems, ...splice(cachedListData, 0, len(indexes))); + } + return rawData; + } + }); + } + const isLastPageVal = isLastPage.v; + const fillingItemsLen = len(fillingItems); + let isLastEmptyPageInNonAppendMode = false; + if (fillingItemsLen > 0 || isLastPageVal) { + // Delete data at the specified index + const newListData = filterItem(data.v, (_, index) => !includes(indexes, index)); + // In page turning mode, if it is the last page and all items have been deleted, then turn one page forward. + isLastEmptyPageInNonAppendMode = !append && isLastPageVal && len(newListData) <= 0; + if (!isLastEmptyPageInNonAppendMode && fillingItemsLen > 0) { + pushItem(newListData, ...fillingItems); + } + data.v = newListData; + } + else if (fillingItemsLen <= 0 && !isLastPageVal) { + // When the last page of data is removed, there is no need to refresh + refresh(pageVal); + } + updateTotal(-len(indexes)); + // The cache of the current page is updated synchronously + return updateCurrentPageCache().then(() => { + if (isLastEmptyPageInNonAppendMode) { + page.v = pageVal - 1; + } + }); + }); + }; + /** + * Replace a piece of data + * If the position passed in is a list item, this list item will be replaced. If the list item is not in the list data, an error will be thrown. + * @param item replacement + * @param position Replace position (index) or list item + */ + const replace = (item, position) => add2AsyncQueue(async () => { + paginationAssert(position !== undefinedValue, 'expect specify the replace position'); + const index = isNumber(position) ? position : getItemIndex(position); + indexAssert(index, data.v); + const rawData = [...data.v]; + splice(rawData, index, 1, item); + data.v = rawData; + // The cache of the current page is updated synchronously + await updateCurrentPageCache(); + }); + /** + * Reload the list starting from page ${initialPage} and clear the cache + */ + const reload = async () => { + await invalidatePaginationCache(trueValue); + isReset.current = trueValue; + page.v === initialPage ? promiseCatch(send(), noop) : (page.v = initialPage); + const { resolve, reject, promise } = usePromise(); + awaitResolve.current = resolve; + awaitReject.current = reject; + return promise; + }; + // Compatible with react, caches the latest operation function each time, avoiding closure traps + delegationActions.current = { + refresh, + insert, + remove, + replace, + reload + }; + /** @Returns */ + return exposeProvider({ + ...states, + ...objectify([data, page, pageCount, pageSize, total, isLastPage]), + send: (...args) => send(...args, undefinedValue, undefinedValue), + fetching: fetchStates.loading, + onFetchSuccess: fetchStates.onSuccess, + onFetchError: fetchStates.onError, + onFetchComplete: fetchStates.onComplete, + refresh, + insert, + remove, + replace, + reload + }); + }; + + /** + * Assert serialHandlers + * @param hookName hook name + * @param serialHandlers Serial request method acquisition function + */ + const assertSerialHandlers = (hookName, serialHandlers) => createAssert(hookName)(isArray(serialHandlers) && len(serialHandlers) > 0, 'please use an array to represent serial requests'); + /** + * Create serial request middleware + * @param serialHandlers Serial request method acquisition function + * @param hookMiddleware use hook middleware + * @returns Serial request middleware + */ + const serialMiddleware = (serialHandlers, hookMiddleware, serialRequestMethods = []) => { + // The first handler is passed to the use hook externally and does not need to be requested again. + serialHandlers.shift(); + return ((ctx, next) => { + hookMiddleware === null || hookMiddleware === void 0 ? void 0 : hookMiddleware(ctx, () => promiseResolve(undefinedValue)); + ctx.controlLoading(); + const loadingState = ctx.proxyStates.loading; + loadingState.v = trueValue; + let serialPromise = next(); + for (const handler of serialHandlers) { + serialPromise = promiseThen(serialPromise, value => { + const methodItem = handler(value, ...ctx.args); + pushItem(serialRequestMethods, methodItem); + return methodItem.send(); + }); + } + return serialPromise.finally(() => { + loadingState.v = falseValue; + }); + }); + }; + + /** + * Serial request hook, each serialHandlers will receive the result of the previous request + * Applicable scenario: Serial request for a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialRequest related data and operation functions + */ + var useSerialRequest = (serialHandlers, config = {}) => { + assertSerialHandlers('useSerialRequest', serialHandlers); + // eslint-disable-next-line + const { ref, __referingObj } = statesHookHelper(alova.promiseStatesHook()); + const methods = ref([]).current; + const exposures = useRequest(serialHandlers[0], { + ...config, + __referingObj, + middleware: serialMiddleware(serialHandlers, config.middleware, methods) + }); + // Decorate the error callback function and set event.method to the instance of the error + exposures.onError = decorateEvent(exposures.onError, (handler, event) => { + event.method = methods[len(methods) - 1]; + handler(event); + }); + return exposures; + }; + + /** + * Serial request hook, each serialHandlers will receive the result of the previous request + * Applicable scenario: After monitoring status changes, serially request a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialRequest related data and operation functions + */ + var useSerialWatcher = (serialHandlers, watchingStates, config = {}) => { + assertSerialHandlers('useSerialWatcher', serialHandlers); + // eslint-disable-next-line + const { ref, __referingObj } = statesHookHelper(alova.promiseStatesHook()); + const methods = ref([]).current; + const exposures = useWatcher(serialHandlers[0], watchingStates, { + ...config, + __referingObj, + middleware: serialMiddleware(serialHandlers, config.middleware, methods) + }); + // Decorate the error callback function and set event.method to the instance of the error + exposures.onError = decorateEvent(exposures.onError, (handler, event) => { + event.method = methods[len(methods) - 1]; + handler(event); + }); + return exposures; + }; + + const STR_VALUE_OF = 'valueOf'; + const DEFAULT_QUEUE_NAME = 'default'; + const BEHAVIOR_SILENT = 'silent'; + const BEHAVIOR_QUEUE = 'queue'; + const BEHAVIOR_STATIC = 'static'; + /** + * Global virtual data collection array + * It will only be an array when the method is created, and undefined at other times + * + * Explanation: The purpose of collecting virtual data is to determine whether virtual data is used in a method instance. + * Includes the following forms: + * useSQRequest((vDataId) => createMethod({ vDataId }) //Reference function parameters + * useSQRequest(() => createMethod({ vDataId }) //Directly reference scope parameters + * + * Or even: + * function createMethod(obj) { + * return alovaInst.Get('/list', { + * params: { status: obj.vDataId ? 1 : 0 } + * }) + * } + * useSQRequest(() => createMethod(obj) //Directly reference scope parameters + * + * Ways to use dummy data include: + * 1. Directly assign values as parameters + * 2. Use dummy data id + * 3. Indirect use of virtual data, such as + * vData ? 1 : 0 + * !!vData + * vData+1 + * etc. as calculation parameters. + */ + let vDataIdCollectBasket; + const setVDataIdCollectBasket = (value) => { + vDataIdCollectBasket = value; + }; + /** + * The dependent alova instance, its storage adapter, request adapter, etc. will be used to access the SilentMethod instance and send silent submissions + */ + let dependentAlovaInstance; + const setDependentAlova = (alovaInst) => { + dependentAlovaInstance = alovaInst; + }; + /** + * Set up a custom serializer + */ + let customSerializers = {}; + const setCustomSerializers = (serializers = {}) => { + customSerializers = serializers; + }; + /** + * silentFactory status + * 0 means not started + * 1 means in progress, changed after calling bootSilentFactory + * 2 indicates that the request failed, that is, when the maximum number of requests is reached according to the retry rules, or when the retry rules are not matched, the request is changed. + */ + let silentFactoryStatus = 0; + const setSilentFactoryStatus = (status) => { + silentFactoryStatus = status; + }; + /** + * The request waiting time in silentQueue, in milliseconds (ms) + * It indicates the waiting time of the silentMethod that is about to send the request + * If not set, or set to 0, the silentMethod request is triggered immediately + * + * Tips: + * 1. When set directly, it is effective for the default queue by default. + * 2. If you need to set other queue settings, you can specify them as objects, such as: + * [ + * Indicates waiting 5000ms for the queue setting request named customName + * { name: 'customName', wait: 5000 }, + * + * //Indicates that in all queues with the prefix prefix, the request setting with method instance name xxx is set to wait 5000ms + * { name: /^prefix/, wait: silentMethod => silentMethod.entity.config.name === 'xxx' ? 5000 : 0 }, + * ] + * + * >>> It only works if the request succeeds, if it fails it will use the retry policy parameters + */ + let queueRequestWaitSetting = []; + const setQueueRequestWaitSetting = (requestWaitSetting = 0) => { + queueRequestWaitSetting = isArray(requestWaitSetting) + ? requestWaitSetting + : [ + { + queue: DEFAULT_QUEUE_NAME, + wait: requestWaitSetting + } + ]; + }; + const BootEventKey = Symbol('GlobalSQBoot'); + const BeforeEventKey = Symbol('GlobalSQBefore'); + const SuccessEventKey = Symbol('GlobalSQSuccess'); + const ErrorEventKey = Symbol('GlobalSQError'); + const FailEventKey$1 = Symbol('GlobalSQFail'); + /** Global silent event management object */ + const globalSQEventManager = createEventManager(); + /** Silent assert */ + const silentAssert = createAssert('useSQRequest'); + + /** + * Update the status of the corresponding method + * @param method request method object + * @param handleUpdate update callback + * @returns Whether the update is successful or not. If the corresponding status is not found, the update will not be successful. + */ + async function updateState(matcher, handleUpdate) { + let updated = falseValue; + // Only process the first method instance that meets the conditions. If there is no instance that meets the conditions, it will not be processed. + if (matcher) { + const { update } = alova.promiseStatesHook(); + const methodKey = getMethodInternalKey(matcher); + const { id } = getContext(matcher); + const { s: frontStates, h: hookInstance } = getStateCache(id, methodKey); + const updateStateCollection = isFn(handleUpdate) + ? { data: handleUpdate } + : handleUpdate; + let updatedDataColumnData = undefinedValue; + if (frontStates) { + // Loop through the updated data and assign it to the supervised state + forEach(objectKeys(updateStateCollection), stateName => { + coreAssert(stateName in frontStates, `state named \`${stateName}\` is not found`); + const targetStateProxy = frontStates[stateName]; + let updatedData = updateStateCollection[stateName](targetStateProxy.v); + // shallow clone the updatedData so that can effect in react. + updatedData = isArray(updatedData) + ? [...updatedData] + : isObject(updatedData) + ? { ...updatedData } + : updatedData; + // Record the updated value of the data field, used to update cached data + if (stateName === 'data') { + updatedDataColumnData = updatedData; + } + // Update directly using update without checking referring object.tracked keys + update(updatedData, frontStates[stateName].s, stateName, hookInstance.ro); + }); + updated = trueValue; + } + // If data is updated, cache and persistent data need to be updated at the same time + if (updatedDataColumnData !== undefinedValue) { + alova.setCache(matcher, updatedDataColumnData); + } + } + return updated; + } + + var dateSerializer = { + forward: data => (instanceOf(data, Date) ? data.getTime() : undefinedValue), + backward: ts => newInstance(Date, ts) + }; + + var regexpSerializer = { + forward: data => (instanceOf(data, RegExp) ? data.source : undefined), + backward: source => newInstance(RegExp, source) + }; + + const createSerializerPerformer = (customSerializers = {}) => { + /** + * Merge built-in serializers and custom serializers + */ + const serializers = { + date: dateSerializer, + regexp: regexpSerializer, + ...customSerializers + }; + /** + * serialized data + */ + const serialize = (payload) => { + if (isObject(payload)) { + payload = walkObject(isArray(payload) ? [...payload] : { ...payload }, value => { + let finallyApplySerializerName = undefinedValue; + // Find a matching serializer and serialize the value. If not found, return the original value. + const serializedValue = objectKeys(serializers).reduce((currentValue, serializerName) => { + if (!finallyApplySerializerName) { + const serializedValueItem = serializers[serializerName].forward(currentValue); + if (serializedValueItem !== undefinedValue) { + finallyApplySerializerName = serializerName; + currentValue = serializedValueItem; + } + } + return currentValue; + }, value); + // You need to use the original value to judge, otherwise packaging classes such as new Number(1) will also be [object Object] + const toStringTag = ObjectCls.prototype.toString.call(value); + if (toStringTag === '[object Object]') { + value = { ...value }; + } + else if (isArray(value)) { + value = [...value]; + } + return finallyApplySerializerName !== undefinedValue ? [finallyApplySerializerName, serializedValue] : value; + }); + } + return payload; + }; + /** + * Deserialize data + */ + const deserialize = (payload) => isObject(payload) + ? walkObject(payload, value => { + if (isArray(value) && len(value) === 2) { + const foundSerializer = serializers[value[0]]; + value = foundSerializer ? foundSerializer.backward(value[1]) : value; + } + return value; + }, falseValue) + : payload; + return { + serialize, + deserialize + }; + }; + + const symbolVDataId = Symbol('vdid'); + const symbolOriginal = Symbol('original'); + const regVDataId = /\[vd:([0-9a-z]+)\]/; + + /** + * Unified vData collection function + * It will be called in the following 4 places + * 1. When accessing sub-properties + * 2. When participating in calculation and triggering [Symbol.toPrimitive] + * 3. When getting the id of vData + * 4. When getting its original value + * + * @param returnValue Return value, if it is a function then call it + * @returns collection function + */ + const vDataCollectUnified = (target) => { + const vDataId = target === null || target === void 0 ? void 0 : target[symbolVDataId]; + vDataId && vDataIdCollectBasket && (vDataIdCollectBasket[vDataId] = undefinedValue); + }; + // export const vDataGetter = (key: string) => vDataCollectGetter((thisObj: any) => thisObj.__proto__[key].call(thisObj)); + + /** + * Dummy data is stringified. If the parameter is not dummy data, the original data is returned. + * @param target dummy data + * @param returnOriginalIfNotVData If it is not virtual data, return the original value. + * @returns Virtual data id or original data + */ + const stringifyVData = (target, returnOriginalIfNotVData = trueValue) => { + vDataCollectUnified(target); + const vDataIdRaw = target === null || target === void 0 ? void 0 : target[symbolVDataId]; + const vDataId = vDataIdRaw ? `[vd:${vDataIdRaw}]` : undefinedValue; + return vDataId || (returnOriginalIfNotVData ? target : undefinedValue); + }; + /** + * Create a getter function for virtual data id collection + * @param valueReturnFn return value function + * @returns getter function + */ + function stringifyWithThis() { + return stringifyVData(this); + } + + /** + * Null wrapper class implementation + */ + const Null = function Null() { }; + Null.prototype = ObjectCls.create(nullValue, { + [STR_VALUE_OF]: valueObject(stringifyWithThis) + }); + + /** + * Undefined wrapper class implementation + */ + const Undefined = function Undefined() { }; + Undefined.prototype = ObjectCls.create(nullValue, { + [STR_VALUE_OF]: valueObject(stringifyWithThis) + }); + + /** + * Create dummy response data + * @returns Virtual response data proxy instance + */ + var createVirtualResponse = (structure, vDataId = uuid()) => { + const transform2VData = (value, vDataIdInner = uuid()) => { + if (value === nullValue) { + value = newInstance(Null); + } + else if (value === undefinedValue) { + value = newInstance(Undefined); + } + else { + const newValue = ObjectCls(value); + defineProperty(newValue, STR_VALUE_OF, stringifyWithThis); + defineProperty(newValue, symbolOriginal, value); + value = newValue; + } + defineProperty(value, symbolVDataId, vDataIdInner); + return value; + }; + const virtualResponse = transform2VData(structure, vDataId); + if (isPlainObject(virtualResponse) || isArray(virtualResponse)) { + walkObject(virtualResponse, value => transform2VData(value)); + } + return virtualResponse; + }; + + /** + * Get original value of variable with dummy data + * This function will also perform vData collection + * @param target target value + * @param deepDehydrate Whether the depth of dehydration value + * @returns target value with primitive type + */ + const dehydrateVDataUnified = (target, deepDehydrate = trueValue) => { + const dehydrateItem = (value) => { + vDataCollectUnified(value); + if (value === null || value === void 0 ? void 0 : value[symbolVDataId]) { + if (instanceOf(value, Undefined)) { + value = undefinedValue; + } + else if (instanceOf(value, Null)) { + value = nullValue; + } + else if (instanceOf(value, Number) || instanceOf(value, String) || instanceOf(value, Boolean)) { + value = value[symbolOriginal]; + } + } + return value; + }; + const newTarget = dehydrateItem(target); + // If it is an object or array, deep traversal is required to obtain the virtual data value. + if (deepDehydrate && (isObject(newTarget) || isArray(newTarget))) { + walkObject(newTarget, value => dehydrateItem(value)); + } + return newTarget; + }; + /** + * The version above where deepDehydrate is true + */ + var dehydrateVData = (target) => dehydrateVDataUnified(target); + + const vDataKey = '__$k'; + const vDataValueKey = '__$v'; + const getAlovaStorage = () => { + // Provide prompt when silent factory is not started + silentAssert(!!dependentAlovaInstance, 'alova instance is not found, Do you forget to set `alova` or call `bootSilentFactory`?'); + return dependentAlovaInstance.l2Cache; + }; + let serializerPerformer = undefinedValue; + const silentMethodIdQueueMapStorageKey = 'alova.SQ'; // Queue collection cache key composed of Silent method instance id + const silentMethodStorageKeyPrefix = 'alova.SM.'; // silentMethod instance cache key prefix + /** + * Persistence of data collections with dummy data and serializable data + * @param key persistence key + * @param payload Persistent data + */ + const storageSetItem = async (key, payload) => { + const storage = getAlovaStorage(); + if (isObject(payload)) { + payload = walkObject(isArray(payload) ? [...payload] : { ...payload }, (value, key, parent) => { + var _a; + if (key === vDataValueKey && parent[vDataKey]) { + return value; + } + // If a silent method instance is serialized, the alova instance is filtered out + if (key === 'context' && ((_a = value === null || value === void 0 ? void 0 : value.constructor) === null || _a === void 0 ? void 0 : _a.name) === 'Alova') { + return undefinedValue; + } + const vDataId = value === null || value === void 0 ? void 0 : value[symbolVDataId]; + let primitiveValue = dehydrateVDataUnified(value, falseValue); + // You need to use the original value to judge, otherwise packaging classes such as new Number(1) will also be [object Object] + const toStringTag = globalToString(primitiveValue); + if (toStringTag === '[object Object]') { + value = { ...value }; + primitiveValue = {}; + } + else if (isArray(value)) { + value = [...value]; + primitiveValue = []; + } + if (vDataId) { + const valueWithVData = { + [vDataKey]: vDataId, + // For objects and arrays, all their internal properties will be put to the outside through `...value`, so the internal ones do not need to be traversed and converted. + // Therefore, empty the array or object to avoid repeated conversions and contamination of the original object. + [vDataValueKey]: primitiveValue, + ...value + }; + // If it is a string type, there will be items like arrays such as 0, 1, and 2 as subscripts and values as characters, and they need to be filtered out. + if (instanceOf(value, String)) { + for (let i = 0; i < len(value); i += 1) { + valueWithVData === null || valueWithVData === void 0 ? true : delete valueWithVData[i]; + } + } + // If it is converted into virtual data, the converted value is assigned to it internally, and is uniformly processed by value in the following logic. + value = valueWithVData; + } + return value; + }); + } + serializerPerformer = serializerPerformer || createSerializerPerformer(customSerializers); + await storage.set(key, serializerPerformer.serialize(payload)); + }; + /** + * Take out the persistent data and convert the data into virtual data and serialized data + * @param key Key to persistent data + */ + const storageGetItem = async (key) => { + const storagedResponse = await getAlovaStorage().get(key); + serializerPerformer = serializerPerformer || createSerializerPerformer(customSerializers); + return isObject(storagedResponse) + ? walkObject(serializerPerformer.deserialize(storagedResponse), value => { + // Convert virtual data format back to virtual data instance + if (isObject(value) && (value === null || value === void 0 ? void 0 : value[vDataKey])) { + const vDataId = value[vDataKey]; + const vDataValue = createVirtualResponse(value[vDataValueKey], vDataId); + forEach(objectKeys(value), key => { + if (!includes([vDataKey, vDataValueKey], key)) { + vDataValue[key] = value[key]; + } + }); + value = vDataValue; + } + return value; + }, falseValue) + : storagedResponse; + }; + /** + * Remove persistent data + * @param key Key to persistent data + */ + const storageRemoveItem = async (key) => { + await getAlovaStorage().remove(key); + }; + + /** + * Serialize and save silentMethod instance + * @param silentMethodInstance silentMethod instance + */ + const persistSilentMethod = (silentMethodInstance) => storageSetItem(silentMethodStorageKeyPrefix + silentMethodInstance.id, silentMethodInstance); + /** + * Put the configuration information of silent request into the corresponding storage + * Logic: Construct a key and use this key to put the configuration information of the silent method into the corresponding storage, and then store the key in the unified management key storage. + * @param silentMethod SilentMethodInstance + * @param queue Operation queue name + */ + const push2PersistentSilentQueue = async (silentMethodInstance, queueName) => { + await persistSilentMethod(silentMethodInstance); + // Save the silent method instance id to queue storage + const silentMethodIdQueueMap = ((await storageGetItem(silentMethodIdQueueMapStorageKey)) || + {}); + const currentQueue = (silentMethodIdQueueMap[queueName] = silentMethodIdQueueMap[queueName] || []); + pushItem(currentQueue, silentMethodInstance.id); + await storageSetItem(silentMethodIdQueueMapStorageKey, silentMethodIdQueueMap); + }; + /** + * Remove or replace silentMethod instances in the cache + * @param queue Operation queue name + * @param targetSilentMethodId Target silentMethod instance id + * @param newSilentMethod The new silentMethod instance to replace. If not passed, it means deleted. + */ + const spliceStorageSilentMethod = async (queueName, targetSilentMethodId, newSilentMethod) => { + // Remove the silent method instance id from the queue + const silentMethodIdQueueMap = ((await storageGetItem(silentMethodIdQueueMapStorageKey)) || + {}); + const currentQueue = silentMethodIdQueueMap[queueName] || []; + const index = currentQueue.findIndex(id => id === targetSilentMethodId); + if (index >= 0) { + if (newSilentMethod) { + splice(currentQueue, index, 1, newSilentMethod.id); + await persistSilentMethod(newSilentMethod); + } + else { + splice(currentQueue, index, 1); + } + await storageRemoveItem(silentMethodStorageKeyPrefix + targetSilentMethodId); + // Delete this queue when it is empty + len(currentQueue) <= 0 && delete silentMethodIdQueueMap[queueName]; + if (len(objectKeys(silentMethodIdQueueMap)) > 0) { + await storageSetItem(silentMethodIdQueueMapStorageKey, silentMethodIdQueueMap); + } + else { + // Remove the queue collection when it is empty + await storageRemoveItem(silentMethodIdQueueMapStorageKey); + } + } + }; + + /** Silent method queue collection */ + let silentQueueMap = {}; + /** + * Merge queueMap into silentMethod queue collection + * @param queueMap silentMethod queue collection + */ + const merge2SilentQueueMap = (queueMap) => { + forEach(objectKeys(queueMap), targetQueueName => { + const currentQueue = (silentQueueMap[targetQueueName] = silentQueueMap[targetQueueName] || []); + pushItem(currentQueue, ...queueMap[targetQueueName]); + }); + }; + /** + * Deeply traverse the target data and replace dummy data with real data + * @param target target data + * @param vDataResponse Collection of dummy data and real data + * @returns Is there any replacement data? + */ + const deepReplaceVData = (target, vDataResponse) => { + // Search for a single value and replace a dummy data object or dummy data id with an actual value + const replaceVData = (value) => { + const vData = stringifyVData(value); + // If directly a dummy data object and in a vDataResponse, replace the Map with the value in the vDataResponse + // If it is a string, it may contain virtual data id and in vDataResponse, it also needs to be replaced with the actual value Map + // The virtual data not in this vDataResponse will remain unchanged. It may be the virtual data Map requested next time. + if (vData in vDataResponse) { + return vDataResponse[vData]; + } + if (isString(value)) { + return value.replace(newInstance(RegExpCls, regVDataId.source, 'g'), mat => mat in vDataResponse ? vDataResponse[mat] : mat); + } + return value; + }; + if (isObject(target) && !stringifyVData(target, falseValue)) { + walkObject(target, replaceVData); + } + else { + target = replaceVData(target); + } + return target; + }; + /** + * Update the method instance in the queue and replace the dummy data with actual data + * @param vDataResponse A collection of virtual IDs and corresponding real data + * @param targetQueue target queue + */ + const updateQueueMethodEntities = (vDataResponse, targetQueue) => PromiseCls.all(mapItem(targetQueue, async (silentMethodItem) => { + // Traverse the entity object deeply. If virtual data or virtual data ID is found, replace it with actual data. + deepReplaceVData(silentMethodItem.entity, vDataResponse); + // If the method instance is updated, re-persist this silent method instance + silentMethodItem.cache && (await persistSilentMethod(silentMethodItem)); + })); + /** + * Replace dummy data with response data + * @param response real response data + * @param virtualResponse dummy response data + * @returns The corresponding real data set composed of virtual data id + */ + const replaceVirtualResponseWithResponse = (virtualResponse, response) => { + let vDataResponse = {}; + const vDataId = stringifyVData(virtualResponse, falseValue); + vDataId && (vDataResponse[vDataId] = response); + if (isObject(virtualResponse)) { + for (const i in virtualResponse) { + vDataResponse = { + ...vDataResponse, + ...replaceVirtualResponseWithResponse(virtualResponse[i], response === null || response === void 0 ? void 0 : response[i]) + }; + } + } + return vDataResponse; + }; + /** + * Start the SilentMethod queue + * 1. Silent submission will be put into the queue and requests will be sent in order. Only after the previous request responds will it continue to send subsequent requests. + * 2. The number of retries is only triggered when there is no response. If the server responds incorrectly or is disconnected, it will not retry. + * 3. When the number of retries is reached and still fails, when nextRound (next round) is set, delay the time specified by nextRound and then request again, otherwise it will try again after refreshing. + * 4. If there is resolveHandler and rejectHandler, they will be called after the request is completed (whether successful or failed) to notify the corresponding request to continue responding. + * + * @param queue SilentMethodqueue + */ + const setSilentMethodActive = (silentMethodInstance, active) => { + if (active) { + silentMethodInstance.active = active; + } + else { + delete silentMethodInstance.active; + } + }; + const defaultBackoffDelay = 1000; + const bootSilentQueue = (queue, queueName) => { + /** + * The callback function is controlled by waiting parameters according to the request. If it is not set or is less than or equal to 0, it will be triggered immediately. + * @param queueName queue name + * @param callback callback function + */ + const emitWithRequestDelay = (queueName) => { + const nextSilentMethod = queue[0]; + if (nextSilentMethod) { + const targetSetting = queueRequestWaitSetting.find(({ queue }) => instanceOf(queue, RegExpCls) ? regexpTest(queue, queueName) : queue === queueName); + // eslint-disable-next-line @typescript-eslint/no-use-before-define + const callback = () => queue[0] && silentMethodRequest(queue[0]); + const delay = (targetSetting === null || targetSetting === void 0 ? void 0 : targetSetting.wait) ? sloughConfig(targetSetting.wait, [nextSilentMethod, queueName]) : 0; + delay && delay > 0 ? setTimeoutFn(callback, delay) : callback(); + } + }; + /** + * Run a single silentMethod instance + * @param silentMethodInstance silentMethod instance + * @param retryTimes Number of retries + */ + const silentMethodRequest = (silentMethodInstance, retryTimes = 0) => { + // Set the current silent method instance to active status + setSilentMethodActive(silentMethodInstance, trueValue); + const { cache, id, behavior, entity, retryError = /.*/, maxRetryTimes = 0, backoff = { delay: defaultBackoffDelay }, resolveHandler = noop, rejectHandler = noop, emitter: methodEmitter, handlerArgs = [], virtualResponse, force } = silentMethodInstance; + // Trigger pre-request event + globalSQEventManager.emit(BeforeEventKey, newInstance((GlobalSQEvent), behavior, entity, silentMethodInstance, queueName, retryTimes)); + promiseThen(entity.send(force), async (data) => { + // The request is successful, remove the successful silent method, and continue with the next request + shift(queue); + // If the request is successful, remove the successful silent method instance from storage and continue with the next request. + cache && (await spliceStorageSilentMethod(queueName, id)); + // If there is a resolve handler, call it to notify the outside + resolveHandler(data); + // Only when there is a virtualResponse, virtual data is traversed and replaced, and global events are triggered. + // Generally, it is silent behavior, but queue behavior is not required. + if (behavior === BEHAVIOR_SILENT) { + // Replace dummy data in subsequent method instances in the queue with real data + // Only after unlocking can you access the hierarchical structure of virtualResponse normally. + const vDataResponse = replaceVirtualResponseWithResponse(virtualResponse, data); + const { targetRefMethod, updateStates } = silentMethodInstance; // It is accurate to obtain it in real time + // If this silentMethod has targetRefMethod, call updateState again to update the data + // This is an implementation of delayed data updates + if (instanceOf(targetRefMethod, alova.Method) && updateStates && len(updateStates) > 0) { + const updateStateCollection = {}; + forEach(updateStates, stateName => { + // After the request is successful, replace the data with dummy data with real data + updateStateCollection[stateName] = dataRaw => deepReplaceVData(dataRaw, vDataResponse); + }); + const updated = updateState(targetRefMethod, updateStateCollection); + // If the status modification is unsuccessful, modify the cached data. + if (!updated) { + await alova.setCache(targetRefMethod, (dataRaw) => deepReplaceVData(dataRaw, vDataResponse)); + } + } + // Perform dummy data replacement on subsequent silent method instances of the current queue + await updateQueueMethodEntities(vDataResponse, queue); + // Trigger global success event + globalSQEventManager.emit(SuccessEventKey, newInstance((GlobalSQSuccessEvent), behavior, entity, silentMethodInstance, queueName, retryTimes, data, vDataResponse)); + } + // Set to inactive state + setSilentMethodActive(silentMethodInstance, falseValue); + // Continue to the next silent method processing + emitWithRequestDelay(queueName); + }, reason => { + if (behavior !== BEHAVIOR_SILENT) { + // When the behavior is not silent and the request fails, rejectHandler is triggered. + // and removed from the queue and will not be retried. + shift(queue); + rejectHandler(reason); + } + else { + // Each request error will trigger an error callback + const runGlobalErrorEvent = (retryDelay) => globalSQEventManager.emit(ErrorEventKey, newInstance((GlobalSQErrorEvent), behavior, entity, silentMethodInstance, queueName, retryTimes, reason, retryDelay)); + // In silent behavior mode, determine whether retry is needed + // Retry is only effective when the response error matches the retryError regular match + const { name: errorName = '', message: errorMsg = '' } = reason || {}; + let regRetryErrorName; + let regRetryErrorMsg; + if (instanceOf(retryError, RegExp)) { + regRetryErrorMsg = retryError; + } + else if (isObject(retryError)) { + regRetryErrorName = retryError.name; + regRetryErrorMsg = retryError.message; + } + const matchRetryError = (regRetryErrorName && regexpTest(regRetryErrorName, errorName)) || + (regRetryErrorMsg && regexpTest(regRetryErrorMsg, errorMsg)); + // If there are still retry times, try again + if (retryTimes < maxRetryTimes && matchRetryError) { + // The next retry times need to be used to calculate the delay time, so +1 is needed here. + const retryDelay = delayWithBackoff(backoff, retryTimes + 1); + runGlobalErrorEvent(retryDelay); + setTimeoutFn(() => { + retryTimes += 1; + silentMethodRequest(silentMethodInstance, retryTimes); + methodEmitter.emit('retry', newInstance((ScopedSQRetryEvent), behavior, entity, silentMethodInstance, handlerArgs, retryTimes, retryDelay)); + }, + // When there are still retry times, use timeout as the next request time. + retryDelay); + } + else { + setSilentFactoryStatus(2); + runGlobalErrorEvent(); + // When the number of failures is reached, or the error message does not match the retry, the failure callback is triggered. + methodEmitter.emit('fallback', newInstance((ScopedSQErrorEvent), behavior, entity, silentMethodInstance, handlerArgs, reason)); + globalSQEventManager.emit(FailEventKey$1, newInstance((GlobalSQFailEvent), behavior, entity, silentMethodInstance, queueName, retryTimes, reason)); + } + } + // Set to inactive state + setSilentMethodActive(silentMethodInstance, falseValue); + }); + }; + emitWithRequestDelay(queueName); + }; + /** + * Put a new silentMethod instance into the queue + * @param silentMethodInstance silentMethod instance + * @param cache Does silentMethod have cache? + * @param targetQueueName target queue name + * @param onBeforePush Events before silentMethod instance push + */ + const pushNewSilentMethod2Queue = async (silentMethodInstance, cache, targetQueueName = DEFAULT_QUEUE_NAME, onBeforePush = () => []) => { + silentMethodInstance.cache = cache; + const currentQueue = (silentQueueMap[targetQueueName] = + silentQueueMap[targetQueueName] || []); + const isNewQueue = len(currentQueue) <= 0; + const beforePushReturns = await Promise.all(onBeforePush()); + const isPush2Queue = !beforePushReturns.some(returns => returns === falseValue); + // Under silent behavior, if there is no fallback event callback bound, it will be persisted. + // If false is returned in onBeforePushQueue, it will no longer be placed in the queue. + if (isPush2Queue) { + cache && (await push2PersistentSilentQueue(silentMethodInstance, targetQueueName)); + pushItem(currentQueue, silentMethodInstance); + // If it is a new queue and the status is started, execute it + isNewQueue && silentFactoryStatus === 1 && bootSilentQueue(currentQueue, targetQueueName); + } + return isPush2Queue; + }; + + /** + * Locate the location of the silentMethod instance + * @param silentMethodInstance silentMethod instance + */ + const getBelongQueuePosition = (silentMethodInstance) => { + let queue = undefinedValue; + let queueName = ''; + let position = 0; + for (const queueNameLoop in silentQueueMap) { + position = silentQueueMap[queueNameLoop].indexOf(silentMethodInstance); + if (position >= 0) { + queue = silentQueueMap[queueNameLoop]; + queueName = queueNameLoop; + break; + } + } + return [queue, queueName, position]; + }; + /** + * silentMethod instance + * Requests that need to enter silentQueue will be packaged into silentMethod instances, which will carry various parameters of the request strategy. + */ + class SilentMethod { + constructor(entity, behavior, emitter, id = uuid(), force, retryError, maxRetryTimes, backoff, resolveHandler, rejectHandler, handlerArgs, vDatas) { + const thisObj = this; + thisObj.entity = entity; + thisObj.behavior = behavior; + thisObj.id = id; + thisObj.emitter = emitter; + thisObj.force = !!force; + thisObj.retryError = retryError; + thisObj.maxRetryTimes = maxRetryTimes; + thisObj.backoff = backoff; + thisObj.resolveHandler = resolveHandler; + thisObj.rejectHandler = rejectHandler; + thisObj.handlerArgs = handlerArgs; + thisObj.vDatas = vDatas; + } + /** + * Allow cache-time persistent updates to the current instance + */ + async save() { + this.cache && (await persistSilentMethod(this)); + } + /** + * Replace the current instance with a new silentMethod instance in the queue + * If there is a persistent cache, the cache will also be updated. + * @param newSilentMethod new silentMethod instance + */ + async replace(newSilentMethod) { + const targetSilentMethod = this; + silentAssert(newSilentMethod.cache === targetSilentMethod.cache, 'the cache of new silentMethod must equal with this silentMethod'); + const [queue, queueName, position] = getBelongQueuePosition(targetSilentMethod); + if (queue) { + splice(queue, position, 1, newSilentMethod); + targetSilentMethod.cache && (await spliceStorageSilentMethod(queueName, targetSilentMethod.id, newSilentMethod)); + } + } + /** + * Remove the current instance. If there is persistent data, it will also be removed synchronously. + */ + async remove() { + const targetSilentMethod = this; + const [queue, queueName, position] = getBelongQueuePosition(targetSilentMethod); + if (queue) { + splice(queue, position, 1); + targetSilentMethod.cache && (await spliceStorageSilentMethod(queueName, targetSilentMethod.id)); + } + } + /** + * Set the method instance corresponding to the delayed update status and the corresponding status name + * It will find the corresponding status data and update vData to the actual data after responding to this silentMethod + * + * @param method method instance + * @param updateStateName Updated status name, the default is data, you can also set multiple + */ + setUpdateState(method, updateStateName = 'data') { + if (method) { + this.targetRefMethod = method; + this.updateStates = isArray(updateStateName) ? updateStateName : [updateStateName]; + } + } + } + + /** + * Deserialize the silentMethod instance according to the name of the serializer. + * @param methodInstance Request method instance + * @returns Request method instance + */ + var convertPayload2SilentMethod = (payload) => { + const { id, behavior, entity, retryError, maxRetryTimes, backoff, resolveHandler, rejectHandler, handlerArgs, targetRefMethod, force } = payload; + // Method class instantiation + const deserializeMethod = (methodPayload) => { + const { type, url, config, data } = methodPayload; + return newInstance(alova.Method, type, dependentAlovaInstance, url, config, data); + }; + const silentMethodInstance = newInstance(SilentMethod, deserializeMethod(entity), behavior, createEventManager(), id, force, retryError, maxRetryTimes, backoff, resolveHandler, rejectHandler, handlerArgs); + silentMethodInstance.cache = trueValue; + // Target ref method deserialization + if (targetRefMethod) { + silentMethodInstance.targetRefMethod = deserializeMethod(targetRefMethod); + } + // Put extra content on the silent method instance + forEach(objectKeys(payload), key => { + if (!includes([ + 'id', + 'behavior', + 'emitter', + 'entity', + 'retryError', + 'maxRetryTimes', + 'backoff', + 'resolveHandler', + 'rejectHandler', + 'handlerArgs', + 'targetRefMethod', + 'force' + ], key)) { + silentMethodInstance[key] = payload[key]; + } + }); + return silentMethodInstance; + }; + + /** + * Load silent queue data from storage + * @returns All queue data + */ + var loadSilentQueueMapFromStorage = async () => { + const silentMethodIdQueueMap = ((await storageGetItem(silentMethodIdQueueMapStorageKey)) || + {}); + const silentQueueMap = {}; + const readingPromises = []; + forEach(objectKeys(silentMethodIdQueueMap), queueName => { + const currentQueue = (silentQueueMap[queueName] = silentQueueMap[queueName] || []); + pushItem(readingPromises, ...mapItem(silentMethodIdQueueMap[queueName], async (silentMethodId) => { + const serializedSilentMethodPayload = await storageGetItem(silentMethodStorageKeyPrefix + silentMethodId); + serializedSilentMethodPayload && + pushItem(currentQueue, convertPayload2SilentMethod(serializedSilentMethodPayload)); + })); + }); + await PromiseCls.all(readingPromises); + return silentQueueMap; + }; + + /** + * Bind silentSubmit startup event + * @param {SilentSubmitBootHandler} handler event callback function + * @returns unbind function + */ + const onSilentSubmitBoot = (handler) => globalSQEventManager.on(BootEventKey, handler); + /** + * Bind silentSubmit success event + * @param {SilentSubmitSuccessHandler} handler event callback function + * @returns unbind function + */ + const onSilentSubmitSuccess = (handler) => globalSQEventManager.on(SuccessEventKey, handler); + /** + * Bind silentSubmit error event + * Every time there is a request error, an error callback is triggered. + * @param {SilentSubmitErrorHandler} handler event callback function + * @returns unbind function + */ + const onSilentSubmitError = (handler) => globalSQEventManager.on(ErrorEventKey, handler); + /** + * Binding silentSubmit failure event + * The failure event will be triggered when the maximum number of requests is reached, or when the error message does not match + * @param {SilentSubmitFailHandler} handler event callback function + * @returns unbind function + */ + const onSilentSubmitFail = (handler) => globalSQEventManager.on(FailEventKey$1, handler); + /** + * Bind silentSubmit to initiate a pre-request event + * @param {BeforeSilentSubmitHandler} handler event callback function + * @returns unbind function + */ + const onBeforeSilentSubmit = (handler) => globalSQEventManager.on(BeforeEventKey, handler); + /** + * Start silent submission, which will load the silent method in the cache and start silent submission + * If no delay time is passed in, the sync starts immediately + * @param {SilentFactoryBootOptions} options Delay in milliseconds + */ + const bootSilentFactory = (options) => { + if (silentFactoryStatus === 0) { + const { alova, delay = 500 } = options; + setDependentAlova(alova); + setCustomSerializers(options.serializers); + setQueueRequestWaitSetting(options.requestWait); + setTimeoutFn(async () => { + // Delayed loading puts the page’s queue at the front + merge2SilentQueueMap(await loadSilentQueueMapFromStorage()); + // Loop start queue silent submission + // Multiple queues are executed in parallel + forEach(objectKeys(silentQueueMap), queueName => { + bootSilentQueue(silentQueueMap[queueName], queueName); + }); + setSilentFactoryStatus(1); // Set status to Started + globalSQEventManager.emit(BootEventKey, undefinedValue); + }, delay); + } + }; + + /** + * A global silentMethod instance that will have a value from before the first success event is triggered to after the last success event is triggered (synchronization period) + * In this way, the current silentMethod instance can be obtained in updateStateEffect in onSuccess. + */ + let currentSilentMethod = undefinedValue; + /** + * Create SilentQueue middleware function + * @param config Configuration object + * @returns middleware function + */ + var createSilentQueueMiddlewares = (handler, config) => { + const { behavior = 'queue', queue = DEFAULT_QUEUE_NAME, retryError, maxRetryTimes, backoff } = config || {}; + const eventEmitter = createEventManager(); + let handlerArgs; + let behaviorFinally; + let queueFinally = DEFAULT_QUEUE_NAME; + let forceRequest = falseValue; + let silentMethodInstance; + /** + * method instance creation function + * @param args Call the function passed in by send + * @returns method instance + */ + const createMethod = (...args) => { + silentAssert(isFn(handler), 'method handler must be a function. eg. useSQRequest(() => method)'); + setVDataIdCollectBasket({}); + handlerArgs = args; + return handler(...args); + }; + // Decorate success/error/complete event + const decorateRequestEvent = (requestExposure) => { + // Set event callback decorator + requestExposure.onSuccess = decorateEvent(requestExposure.onSuccess, (handler, event) => { + currentSilentMethod = silentMethodInstance; + handler(newInstance((ScopedSQSuccessEvent), behaviorFinally, event.method, silentMethodInstance, event.args, event.data)); + }); + requestExposure.onError = decorateEvent(requestExposure.onError, (handler, event) => { + handler(newInstance((ScopedSQErrorEvent), behaviorFinally, event.method, silentMethodInstance, event.args, event.error)); + }); + requestExposure.onComplete = decorateEvent(requestExposure.onComplete, (handler, event) => { + handler(newInstance((ScopedSQCompleteEvent), behaviorFinally, event.method, silentMethodInstance, event.args, event.status, event.data, event.error)); + }); + }; + /** + * middleware function + * @param context Request context, containing request-related values + * @param next continue executing function + * @returns Promise object + */ + const middleware = ({ method, args, cachedResponse, proxyStates, config }, next) => { + const { silentDefaultResponse, vDataCaptured, force = falseValue } = config; + // Because the behavior return value may change, it should be called for each request to re-obtain the return value. + const baseEvent = AlovaEventBase.spawn(method, args); + behaviorFinally = sloughConfig(behavior, [baseEvent]); + queueFinally = sloughConfig(queue, [baseEvent]); + forceRequest = sloughConfig(force, [baseEvent]); + // Empty temporary collection variables + // They need to be cleared before returning + const resetCollectBasket = () => { + setVDataIdCollectBasket((handlerArgs = undefinedValue)); + }; + // If v data captured is set, first determine whether the request-related data contains virtual data. + if (isFn(vDataCaptured)) { + let hasVData = vDataIdCollectBasket && len(objectKeys(vDataIdCollectBasket)) > 0; + if (!hasVData) { + const { url, data } = method; + const { params, headers } = getConfig(method); + walkObject({ url, params, data, headers }, value => { + if (!hasVData && (stringifyVData(value, falseValue) || regexpTest(regVDataId, value))) { + hasVData = trueValue; + } + return value; + }); + } + // If v data captured has return data, use it as the response data, otherwise continue the request + const customResponse = hasVData ? vDataCaptured(method) : undefinedValue; + if (customResponse !== undefinedValue) { + resetCollectBasket(); // Reset when captured by v data captured + return promiseResolve(customResponse); + } + } + if (behaviorFinally !== BEHAVIOR_STATIC) { + // Wait for the method in the queue to complete execution + const createSilentMethodPromise = () => { + const queueResolvePromise = newInstance(PromiseCls, (resolveHandler, rejectHandler) => { + silentMethodInstance = newInstance((SilentMethod), method, behaviorFinally, eventEmitter, undefinedValue, !!forceRequest, retryError, maxRetryTimes, backoff, resolveHandler, rejectHandler, handlerArgs, vDataIdCollectBasket && objectKeys(vDataIdCollectBasket)); + resetCollectBasket(); // Reset when Behavior is queue and silent + }); + // On before push and on pushed events are bound synchronously, so they need to be queued asynchronously to trigger the event normally. + promiseThen(promiseResolve(undefinedValue), async () => { + const createPushEvent = () => newInstance((ScopedSQEvent), behaviorFinally, method, silentMethodInstance, args); + // Put the silent method into the queue and persist it + const isPushed = await pushNewSilentMethod2Queue(silentMethodInstance, + // After the onFallback event is bound, even the silent behavior mode is no longer stored. + // onFallback will be called synchronously, so it needs to be determined asynchronously whether there are fallbackHandlers + len(eventEmitter.eventMap.fallback || []) <= 0 && behaviorFinally === BEHAVIOR_SILENT, queueFinally, + // Execute the callback before putting it into the queue. If false is returned, it will prevent putting it into the queue. + () => eventEmitter.emit('beforePushQueue', createPushEvent())); + // Only after putting it into the queue, the callback after putting it into the queue will be executed. + isPushed && eventEmitter.emit('pushedQueue', createPushEvent()); + }); + return queueResolvePromise; + }; + if (behaviorFinally === BEHAVIOR_QUEUE) { + // Forced request, or loading status needs to be updated when cache is hit + const needSendRequest = forceRequest || !cachedResponse; + if (needSendRequest) { + // Manually set to true + proxyStates.loading.v = trueValue; + } + // When using the cache, use the cache directly, otherwise enter the request queue + return needSendRequest ? createSilentMethodPromise() : promiseThen(promiseResolve(cachedResponse)); + } + const silentMethodPromise = createSilentMethodPromise(); + // Create virtual response data in silent mode. Virtual response data can generate arbitrary virtual data. + const virtualResponse = (silentMethodInstance.virtualResponse = createVirtualResponse(isFn(silentDefaultResponse) ? silentDefaultResponse() : undefinedValue)); + promiseThen(silentMethodPromise, realResponse => { + // Update after obtaining real data + proxyStates.data.v = realResponse; + }); + // In Silent mode, the virtual response value is returned immediately, and then updated when the real data is returned. + return promiseResolve(virtualResponse); + } + resetCollectBasket(); // Reset when Behavior is static + return next(); + }; + return { + c: createMethod, + m: middleware, + d: decorateRequestEvent, + // event binding function + b: { + /** + * Bind fallback event + * @param handler Fallback event callback + */ + onFallback: (handler) => { + eventEmitter.on('fallback', handler); + }, + /** + * Event before binding to queue + * @param handler Event callback before enqueuing + */ + onBeforePushQueue: (handler) => { + eventEmitter.on('beforePushQueue', handler); + }, + /** + * Event after binding to queue + * @param handler Event callback after being queued + */ + onPushedQueue: (handler) => { + eventEmitter.on('pushedQueue', handler); + }, + /** + * retry event + * @param handler Retry event callback + */ + onRetry: (handler) => { + eventEmitter.on('retry', handler); + } + } + }; + }; + + function useSQRequest(handler, config = {}) { + const { exposeProvider, __referingObj: referingObj } = statesHookHelper(alova.promiseStatesHook()); + const { middleware = noop } = config; + const { c: methodCreateHandler, m: silentMiddleware, b: binders, d: decorateEvent } = createSilentQueueMiddlewares(handler, config); + const states = useRequest(methodCreateHandler, { + ...config, + __referingObj: referingObj, + middleware: (ctx, next) => { + const silentMidPromise = silentMiddleware(ctx, next); + middleware(ctx, () => silentMidPromise); + return silentMidPromise; + } + }); + decorateEvent(states); + return exposeProvider({ + ...states, + ...binders + }); + } + + /** + * Determine whether two values are equal in a way that is compatible with virtual data + * @param prevValue Antecedent value + * @param nextValue consequent value + * @returns Are they equal? + */ + var equals = (prevValue, nextValue) => { + // If equal, return directly + if (prevValue === nextValue) { + return trueValue; + } + return stringifyVData(prevValue) === stringifyVData(nextValue); + }; + + /** + * Filter all silentMethod instances that meet the criteria by method name or regular expression + * @param methodNameMatcher method name matcher + * @param queueName Find the queue name, the default is default queue + * @param filterActive Whether to filter out active instances + * @returns array of silentMethod instances + */ + const filterSilentMethods = async (methodNameMatcher, queueName = DEFAULT_QUEUE_NAME, filterActive = falseValue) => { + const matchSilentMethods = (targetQueue = []) => targetQueue.filter(silentMethodItem => { + if (methodNameMatcher === undefinedValue) { + return trueValue; + } + const name = getConfig(silentMethodItem.entity).name || ''; + const retain = instanceOf(methodNameMatcher, RegExp) + ? regexpTest(methodNameMatcher, name) + : name === methodNameMatcher; + return retain && (filterActive ? silentMethodItem.active : trueValue); + }); + return [ + ...matchSilentMethods(silentQueueMap[queueName]), + // If the silent factory is not currently started, you also need to match the silent methods in the persistent storage. + ...(silentFactoryStatus === 0 ? matchSilentMethods((await loadSilentQueueMapFromStorage())[queueName]) : []) + ]; + }; + /** + * Find the first silentMethod instance that meets the condition by method name or regular expression + * @param methodNameMatcher method name matcher + * @param queueName Find the queue name, the default is default queue + * @param filterActive Whether to filter out active instances + * @returns silentMethod instance, undefined when not found + */ + const getSilentMethod = async (methodNameMatcher, queueName = DEFAULT_QUEUE_NAME, filterActive = falseValue) => (await filterSilentMethods(methodNameMatcher, queueName, filterActive))[0]; + + /** + * Determine whether the target data is virtual data + * @param target target data + * @returns Is it virtual data? + */ + var isVData = (target) => !!stringifyVData(target, falseValue) || regexpTest(regVDataId, target); + + /** + * Update the status of the corresponding method + * Unlike updateState, in addition to updating the state immediately, it will also update again after responding in silent mode in order to replace the virtual data with actual data. + * @param method request method object + * @param handleUpdate update callback + */ + const updateStateEffect = async (matcher, handleUpdate) => { + // Save the target method instance to the current silent method instance + if (currentSilentMethod) { + currentSilentMethod.setUpdateState(matcher, isFn(updateState) ? undefinedValue : objectKeys(updateState)); + await currentSilentMethod.save(); + } + return updateState(matcher, handleUpdate); + }; + + const useAutoRequest = (handler, config = {}) => { + let notifiable = trueValue; + const { enableFocus = trueValue, enableVisibility = trueValue, enableNetwork = trueValue, pollingTime = 0, throttle = 1000 } = config; + const { onMounted, onUnmounted, __referingObj: referingObject } = statesHookHelper(alova.promiseStatesHook()); + const states = useRequest(handler, { + ...config, + __referingObj: referingObject + }); + const notify = () => { + if (notifiable) { + states.send(); + if (throttle > 0) { + notifiable = falseValue; + setTimeout(() => { + notifiable = trueValue; + }, throttle); + } + } + }; + let offNetwork = noop; + let offFocus = noop; + let offVisiblity = noop; + let offPolling = noop; + onMounted(() => { + if (!alova.globalConfigMap.ssr) { + offNetwork = enableNetwork ? useAutoRequest.onNetwork(notify, config) : offNetwork; + offFocus = enableFocus ? useAutoRequest.onFocus(notify, config) : offFocus; + offVisiblity = enableVisibility ? useAutoRequest.onVisibility(notify, config) : offVisiblity; + offPolling = pollingTime > 0 ? useAutoRequest.onPolling(notify, config) : offPolling; + } + }); + onUnmounted(() => { + offNetwork(); + offFocus(); + offVisiblity(); + offPolling(); + }); + return states; + }; + const on = (type, handler) => { + window.addEventListener(type, handler); + return () => window.removeEventListener(type, handler); + }; + useAutoRequest.onNetwork = notify => on('online', notify); + useAutoRequest.onFocus = notify => on('focus', notify); + useAutoRequest.onVisibility = notify => { + const handle = () => document.visibilityState === 'visible' && notify(); + return on('visibilitychange', handle); + }; + useAutoRequest.onPolling = (notify, config) => { + const timer = setInterval(notify, config.pollingTime); + return () => clearInterval(timer); + }; + + const hookPrefix$1 = 'useCaptcha'; + const captchaAssert = createAssert(hookPrefix$1); + var useCaptcha = (handler, config = {}) => { + const { initialCountdown, middleware } = config; + captchaAssert(initialCountdown === undefinedValue || initialCountdown > 0, 'initialCountdown must be greater than 0'); + const { create, ref, objectify, exposeProvider, __referingObj: referingObject } = statesHookHelper(alova.promiseStatesHook()); + const countdown = create(0, 'countdown'); + const requestReturned = useRequest(handler, { + ...config, + __referingObj: referingObject, + immediate: falseValue, + managedStates: objectify([countdown], 's'), + // eslint-disable-next-line @typescript-eslint/no-use-before-define + middleware: middleware ? (ctx, next) => middleware({ ...ctx, send }, next) : undefinedValue + }); + const timer = ref(undefinedValue); + const send = (...args) => newInstance(PromiseCls, (resolve, reject) => { + if (countdown.v <= 0) { + requestReturned + .send(...args) + .then(result => { + countdown.v = config.initialCountdown || 60; + timer.current = setInterval(() => { + countdown.v -= 1; + if (countdown.v <= 0) { + clearInterval(timer.current); + } + }, 1000); + resolve(result); + }) + .catch(reason => reject(reason)); + } + else { + reject(newInstance(AlovaError, hookPrefix$1, 'the countdown is not over yet')); + } + }); + return exposeProvider({ + ...requestReturned, + send, + ...objectify([countdown]) + }); + }; + + const RestoreEventKey = Symbol('FormRestore'); + const getStoragedKey = (methodInstance, id) => `alova/form-${id || getMethodInternalKey(methodInstance)}`; + const sharedStates = {}; + const cloneFormData = (form) => { + const shallowClone = (value) => (isArray(value) ? [...value] : isPlainObject(value) ? { ...value } : value); + return walkObject(shallowClone(form), shallowClone); + }; + var useForm = (handler, config = {}) => { + const typedSharedStates = sharedStates; + const { id, initialForm, store, resetAfterSubmiting, immediate = falseValue, middleware } = config; + alova.promiseStatesHook(); + const { create, ref: useFlag$, onMounted, watch, objectify, exposeProvider, __referingObj: referingObject } = statesHookHelper(alova.promiseStatesHook()); + const isStoreObject = isPlainObject(store); + const enableStore = isStoreObject ? store.enable : store; + // If the id in config also has a corresponding shared state, it will also be returned. + // The reason for continuing the execution is to be compatible with the problem that the number of hook executions in react cannot be changed, otherwise it will throw "Rendered fewer hooks than expected. This may be caused by an accidental early return statement." + const sharedState = id ? typedSharedStates[id] : undefinedValue; + const form = create(cloneFormData(initialForm), 'form'); + const methodHandler = handler; + const eventManager = createEventManager(); + // Use computed properties to avoid calling methodHandler every time this use hook is executed. + const initialMethodInstance = useFlag$(sloughConfig(methodHandler, [form.v])); + const storageContext = getContext(initialMethodInstance.current).l2Cache; + const storagedKey = getStoragedKey(initialMethodInstance.current, id); + const reseting = useFlag$(falseValue); + const serializerPerformer = useFlag$(createSerializerPerformer(isStoreObject ? store.serializers : undefinedValue)); + // Whether the shared state created by the current hook is initiated. The hook that initiates the creation needs to return the latest state. Otherwise, because the hook is called in react, the latest state cannot be obtained from the hook initiated. + const isCreateShardState = useFlag$(false); + const originalHookProvider = useRequest((...args) => methodHandler(form.v, ...args), { + ...config, + __referingObj: referingObject, + // Middleware function, also supports subscriber middleware + middleware: middleware + ? (ctx, next) => middleware({ + ...ctx, + // eslint-disable-next-line + delegatingActions: { updateForm, reset } + }, next) + : undefinedValue, + // 1. When persistence is required, it will be triggered after data recovery + // 2. When there is a shared state, it means that it has been initialized before (regardless of whether there is an immediate request), and subsequent requests will no longer be automatically initiated. This is to be compatible with the issue of repeated requests when multiple forms initiate requests immediately. + immediate: enableStore || sharedState ? falseValue : immediate + }); + /** + * Reset form data + */ + const reset = () => { + reseting.current = trueValue; + const clonedFormData = cloneFormData(initialForm); + clonedFormData && (form.v = clonedFormData); + enableStore && storageContext.remove(storagedKey); + }; + /** + * Update form data + * @param newForm new form data + */ + const updateForm = (newForm) => { + form.v = { + ...form.v, + ...newForm + }; + }; + const hookProvider = exposeProvider({ + // The first parameter is fixed to form data + ...originalHookProvider, + ...objectify([form]), + updateForm, + reset, + // Persistent data recovery event binding + onRestore(handler) { + eventManager.on(RestoreEventKey, handler); + } + }); + // Only when there is an id, it is saved to sharedStates. + // In react, because a new form will be generated after updating the form, it needs to be resaved every time it is called. + if (id) { + // If there is no shared status yet, it means that the current hook is a created hook. + if (!sharedState) { + isCreateShardState.current = trueValue; + } + // Only the shared state of the created hook is saved + if (isCreateShardState.current) { + typedSharedStates[id] = { + hookProvider: hookProvider, + config + }; + } + } + const { send, onSuccess } = hookProvider; + onMounted(() => { + // Update data when persistence is required + if (enableStore && !sharedState) { + // Get storage and update data + // It needs to be called in onMounted, otherwise it will cause it to be called repeatedly in react. + const storagedForm = serializerPerformer.current.deserialize(storageContext.get(storagedKey)); + // When there is draft data, the data is restored asynchronously, otherwise the on restore event cannot be bound normally. + if (storagedForm) { + form.v = storagedForm; + // Trigger persistent data recovery event + eventManager.emit(RestoreEventKey, undefinedValue); + } + enableStore && immediate && send(...[]); + } + }); + // Monitor changes and store them synchronously. If it is triggered by reset, no further serialization is required. + watch([form], () => { + if (reseting.current || !enableStore) { + reseting.current = falseValue; + return; + } + storageContext.set(storagedKey, serializerPerformer.current.serialize(form.v)); + }); + // If data needs to be cleared after submission, call reset + onSuccess(() => { + resetAfterSubmiting && reset(); + }); + // If there is a saved sharedState, return it + // If it is the shared state created by the current hook, the latest one is returned instead of the cached one. + return sharedState && !isCreateShardState.current ? sharedState.hookProvider : hookProvider; + }; + + const RetryEventKey = Symbol('RetriableRetry'); + const FailEventKey = Symbol('RetriableFail'); + const hookPrefix = 'useRetriableRequest'; + const assert$2 = createAssert(hookPrefix); + var useRetriableRequest = (handler, config = {}) => { + const { retry = 3, backoff = { delay: 1000 }, middleware = noop } = config; + const { ref: useFlag$, exposeProvider, __referingObj: referingObject } = statesHookHelper(alova.promiseStatesHook()); + const eventManager = createEventManager(); + const retryTimes = useFlag$(0); + const stopManuallyError = useFlag$(undefinedValue); // Stop error object, has value when stop is triggered manually + const methodInstanceLastest = useFlag$(undefinedValue); + const argsLatest = useFlag$(undefinedValue); + const requesting = useFlag$(falseValue); // Is it being requested? + const retryTimer = useFlag$(undefinedValue); + const stopPromiseObj = useFlag$(usePromise()); + const emitOnFail = (method, args, error) => { + // On fail needs to be triggered asynchronously, and on error and on complete should be triggered first. + setTimeoutFn(() => { + eventManager.emit(FailEventKey, newInstance((RetriableFailEvent), AlovaEventBase.spawn(method, args), error, retryTimes.current)); + stopManuallyError.current = undefinedValue; + retryTimes.current = 0; // Reset the number of retries + }); + }; + const nestedHookProvider = useRequest(handler, { + ...config, + __referingObj: referingObject, + middleware(ctx, next) { + middleware({ + ...ctx, + delegatingActions: { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + stop + } + }, () => promiseResolve()); + const { proxyStates, args, send, method, controlLoading } = ctx; + controlLoading(); + const { loading } = proxyStates; + const setLoading = (value = falseValue) => { + loading.v = value; + }; + const resolveFail = (error) => { + setLoading(); + proxyStates.error.v = error; + clearTimeout(retryTimer.current); // Clear retry timer + emitOnFail(method, args, error); + }; + if (!loading.v) { + promiseCatch(stopPromiseObj.current.promise, error => { + resolveFail(error); + stopPromiseObj.current = usePromise(); + }); + } + setLoading(trueValue); + requesting.current = trueValue; + methodInstanceLastest.current = method; + argsLatest.current = args; + /** + * Consider this situation: user call stop() and send another request immediately, but now the previous request haven't finished. `next()` will raises the branch on completion. + * + * By using Promise.race(), we can cause the returned promise to be rejected immediately when call `stop()` + */ + return next() + .then(val => { + // set `loading` to false when request is successful + setLoading(); + return val; + }, + // Trigger retry mechanism when request fails + error => { + // There is no manual trigger to stop, and a retry is triggered when the number of retries does not reach the maximum. + if (!stopManuallyError.current && (isNumber(retry) ? retryTimes.current < retry : retry(error, ...args))) { + retryTimes.current += 1; + // Calculate retry delay time + const retryDelay = delayWithBackoff(backoff, retryTimes.current); + // Delay the corresponding time and try again + retryTimer.current = setTimeoutFn(() => { + // trigger retry event + eventManager.emit(RetryEventKey, newInstance((RetriableRetryEvent), AlovaEventBase.spawn(method, args), retryTimes.current, retryDelay)); + // If stopped manually, retry will no longer be triggered. + promiseCatch(send(...args), noop); // Captured errors will no longer be thrown out, otherwise errors will be thrown when retrying. + }, retryDelay); + } + else { + error = stopManuallyError.current || error; // If stop manually error has a value, it means that the stop is triggered through the stop function. + resolveFail(error); + } + // Return reject to execute the subsequent error process + return promiseReject(error); + }) + .finally(() => { + requesting.current = falseValue; + }); + } + }); + /** + * Stop retrying, only valid when called during retrying + * If the request is in progress, trigger an interrupt request and let the request error throw an error. Otherwise, manually modify the status and trigger onFail. + * The onFail event will be triggered immediately after stopping + */ + const stop = () => { + assert$2(nestedHookProvider.__proxyState('loading').v, 'there is no requests being retried'); + stopManuallyError.current = newInstance(AlovaError, hookPrefix, 'stop retry manually'); + if (requesting.current) { + nestedHookProvider.abort(); + } + else { + stopPromiseObj.current.reject(stopManuallyError.current); + } + }; + /** + * Retry event binding + * They will be triggered after the retry is initiated + * @param handler Retry event callback + */ + const onRetry = (handler) => { + eventManager.on(RetryEventKey, event => handler(event)); + }; + /** + * failed event binding + * They will be triggered when there are no more retries, such as when the maximum number of retries is reached, when the retry callback returns false, or when stop is manually called to stop retries. + * The onError event of alova will be triggered every time an error is requested. + * + * Note: If there are no retries, onError, onComplete and onFail will be triggered at the same time. + * + * @param handler Failure event callback + */ + const onFail = (handler) => { + eventManager.on(FailEventKey, event => handler(event)); + }; + return exposeProvider({ + ...nestedHookProvider, + stop, + onRetry, + onFail + }); + }; + + const SSEOpenEventKey = Symbol('SSEOpen'); + const SSEMessageEventKey = Symbol('SSEMessage'); + const SSEErrorEventKey = Symbol('SSEError'); + var SSEHookReadyState; + (function (SSEHookReadyState) { + SSEHookReadyState[SSEHookReadyState["CONNECTING"] = 0] = "CONNECTING"; + SSEHookReadyState[SSEHookReadyState["OPEN"] = 1] = "OPEN"; + SSEHookReadyState[SSEHookReadyState["CLOSED"] = 2] = "CLOSED"; + })(SSEHookReadyState || (SSEHookReadyState = {})); + const assert$1 = createAssert('useSSE'); + const MessageType = { + Open: 'open', + Error: 'error', + Message: 'message' + }; + var useSSE = (handler, config = {}) => { + const { initialData, withCredentials, interceptByGlobalResponded = trueValue, + /** abortLast = trueValue, */ + immediate = falseValue } = config; + // ! Temporarily does not support specifying abortLast + const abortLast = trueValue; + let { memorize } = alova.promiseStatesHook(); + memorize !== null && memorize !== void 0 ? memorize : (memorize = $self); + const { create, ref, onMounted, onUnmounted, objectify, exposeProvider } = statesHookHelper(alova.promiseStatesHook()); + const usingArgs = ref([]); + const eventSource = ref(undefinedValue); + const sendPromiseObject = ref(undefinedValue); + const data = create(initialData, 'data'); + const readyState = create(SSEHookReadyState.CLOSED, 'readyState'); + let methodInstance = getHandlerMethod(handler); + let responseUnified; + const eventManager = createEventManager(); + // UseCallback object that stores custom events, where key is eventName + const customEventMap = ref(new Map()); + const onOpen = (handler) => { + eventManager.on(SSEOpenEventKey, handler); + }; + const onMessage = (handler) => { + eventManager.on(SSEMessageEventKey, handler); + }; + const onError = (handler) => { + eventManager.on(SSEErrorEventKey, handler); + }; + const responseSuccessHandler = ref($self); + const responseErrorHandler = ref(throwFn); + const responseCompleteHandler = ref(noop); + /** + * Set up a response interceptor, which needs to be called after each send + */ + const setResponseHandler = (instance) => { + // responded removed since 3.0 + const { responded } = getOptions(instance); + responseUnified = responded; + if (isFn(responseUnified)) { + responseSuccessHandler.current = responseUnified; + } + else if (responseUnified && isPlainObject(responseUnified)) { + const { onSuccess: successHandler, onError: errorHandler, onComplete: completeHandler } = responseUnified; + responseSuccessHandler.current = isFn(successHandler) ? successHandler : responseSuccessHandler.current; + responseErrorHandler.current = isFn(errorHandler) ? errorHandler : responseErrorHandler.current; + responseCompleteHandler.current = isFn(completeHandler) ? completeHandler : responseCompleteHandler.current; + } + }; + /** + * Process response tasks and do not cache data on failure + * @param handlerReturns Data returned by the interceptor + * @returns Processed response + */ + const handleResponseTask = async (handlerReturns) => { + const { headers, transform: transformFn = $self } = getConfig(methodInstance); + const returnsData = await handlerReturns; + const transformedData = await transformFn(returnsData, (headers || {})); + data.v = transformedData; + // invalidate cache + alova.hitCacheBySource(methodInstance); + return transformedData; + }; + /** + * Create AlovaSSEHook event + * For specific data processing procedures, please refer to the following link + * @link https://alova.js.org/zh-CN/tutorial/combine-framework/response + */ + const createSSEEvent = async (eventFrom, dataOrError) => { + assert$1(!!eventSource.current, 'EventSource is not initialized'); + const es = eventSource.current; + const baseEvent = new AlovaSSEEvent(AlovaEventBase.spawn(methodInstance, usingArgs.current), es); + if (eventFrom === MessageType.Open) { + return Promise.resolve(baseEvent); + } + const globalSuccess = interceptByGlobalResponded ? responseSuccessHandler.current : $self; + const globalError = interceptByGlobalResponded ? responseErrorHandler.current : throwFn; + const globalFinally = interceptByGlobalResponded ? responseCompleteHandler.current : noop; + const p = promiseFinally(promiseThen(dataOrError, res => handleResponseTask(globalSuccess(res, methodInstance)), error => handleResponseTask(globalError(error, methodInstance))), + // Finally + () => { + globalFinally(methodInstance); + }); + // Regardless, the Promise object returned by the function must be fulfilled + return promiseThen(p, + // Get processed data (data after transform) + res => new AlovaSSEMessageEvent(baseEvent, res), + // There is an error + error => new AlovaSSEErrorEvent(baseEvent, error)); + }; + /** + * Select the required trigger function based on the event. If the event has no errors, the callback function passed in is triggered. + * @param callback Callback function triggered when there is no error + */ + const sendSSEEvent = (callback) => (event) => { + if (event.error === undefinedValue) { + return callback(event); + } + return eventManager.emit(SSEErrorEventKey, event); + }; + // * MARK: Event handling of EventSource + const onCustomEvent = (eventName, callbackHandler) => { + var _a; + const currentMap = customEventMap.current; + if (!currentMap.has(eventName)) { + const useCallbackObject = useCallback(callbacks => { + var _a; + if (callbacks.length === 0) { + (_a = eventSource.current) === null || _a === void 0 ? void 0 : _a.removeEventListener(eventName, useCallbackObject[1]); + customEventMap.current.delete(eventName); + } + }); + const trigger = useCallbackObject[1]; + currentMap.set(eventName, useCallbackObject); + (_a = eventSource.current) === null || _a === void 0 ? void 0 : _a.addEventListener(eventName, event => { + promiseThen(createSSEEvent(eventName, Promise.resolve(event.data)), sendSSEEvent(trigger)); + }); + } + const [onEvent] = currentMap.get(eventName); + return onEvent(callbackHandler); + }; + /** + * Cancel the registration of custom events in useCallback + */ + const offCustomEvent = () => { + customEventMap.current.forEach(([_1, _2, offTrigger]) => { + offTrigger(); + }); + }; + const esOpen = memorize(() => { + var _a; + // resolve the promise returned when using send() + readyState.v = SSEHookReadyState.OPEN; + promiseThen(createSSEEvent(MessageType.Open, Promise.resolve()), event => eventManager.emit(SSEOpenEventKey, event)); + // ! Must be resolved after calling onOpen + (_a = sendPromiseObject.current) === null || _a === void 0 ? void 0 : _a.resolve(); + }); + const esError = memorize((event) => { + var _a, _b; + readyState.v = SSEHookReadyState.CLOSED; + promiseThen(createSSEEvent(MessageType.Error, Promise.reject((_a = event === null || event === void 0 ? void 0 : event.message) !== null && _a !== void 0 ? _a : 'SSE Error')), sendSSEEvent(event => eventManager.emit(SSEMessageEventKey, event))); + (_b = sendPromiseObject.current) === null || _b === void 0 ? void 0 : _b.resolve(); + }); + const esMessage = memorize((event) => { + promiseThen(createSSEEvent(MessageType.Message, Promise.resolve(event.data)), sendSSEEvent(event => eventManager.emit(SSEMessageEventKey, event))); + }); + /** + * Close the registration of the current eventSource + */ + const close = () => { + const es = eventSource.current; + if (!es) { + return; + } + if (sendPromiseObject.current) { + // If the promise is still there when close + sendPromiseObject.current.resolve(); + } + // * MARK: Unbinding event handling + es.close(); + es.removeEventListener(MessageType.Open, esOpen); + es.removeEventListener(MessageType.Error, esError); + es.removeEventListener(MessageType.Message, esMessage); + readyState.v = SSEHookReadyState.CLOSED; + // After eventSource is closed, unregister all custom events + // Otherwise it may cause memory leaks + customEventMap.current.forEach(([_, eventTrigger], eventName) => { + es.removeEventListener(eventName, eventTrigger); + }); + }; + /** + * Send request and initialize eventSource + */ + const connect = (...args) => { + let es = eventSource.current; + let promiseObj = sendPromiseObject.current; + if (es && abortLast) { + // When abortLast === true, close the previous connection and re-establish it + close(); + } + // Set the promise object used by the send function + if (!promiseObj) { + promiseObj = sendPromiseObject.current = usePromise(); + // Clear the promise object after open + promiseObj && + promiseObj.promise.finally(() => { + promiseObj = undefinedValue; + }); + } + usingArgs.current = args; + methodInstance = getHandlerMethod(handler, args); + // Set up response interceptor + setResponseHandler(methodInstance); + const { params } = getConfig(methodInstance); + const { baseURL, url } = methodInstance; + const fullURL = buildCompletedURL(baseURL, url, params); + // Establish connection + es = new EventSource(fullURL, { withCredentials }); + eventSource.current = es; + readyState.v = SSEHookReadyState.CONNECTING; + // * MARK: Register to handle events + // Register to handle event open error message + es.addEventListener(MessageType.Open, esOpen); + es.addEventListener(MessageType.Error, esError); + es.addEventListener(MessageType.Message, esMessage); + // and custom events + // If the on listener is used before connect (send), there will already be events in customEventMap. + customEventMap.current.forEach(([_, eventTrigger], eventName) => { + es === null || es === void 0 ? void 0 : es.addEventListener(eventName, event => { + promiseThen(createSSEEvent(eventName, Promise.resolve(event.data)), sendSSEEvent(eventTrigger)); + }); + }); + return promiseObj.promise; + }; + onUnmounted(() => { + close(); + // The above use of eventSource.removeEventListener just disconnects eventSource and trigger. + // Here is the cancellation of the event registration in the useCallback object + eventManager.off(SSEOpenEventKey); + eventManager.off(SSEMessageEventKey); + eventManager.off(SSEErrorEventKey); + offCustomEvent(); + }); + // * MARK: initialization action + onMounted(() => { + var _a; + if (immediate) { + connect(...[]); + (_a = sendPromiseObject.current) === null || _a === void 0 ? void 0 : _a.promise.catch(() => { }); + } + }); + return exposeProvider({ + send: connect, + close, + on: onCustomEvent, + onMessage, + onError, + onOpen, + eventSource, + ...objectify([readyState, data]) + }); + }; + + let currentHookIndex = 0; + // (id, (hookIndex, Actions)) + const actionsMap = {}; + const isFrontMiddlewareContext = (context) => !!context.send; + const assert = createAssert('subscriber'); + /** + * Operation function delegation middleware + * After using this middleware, you can call the delegated function through accessAction. + * Can delegate multiple identical IDs + * In order to eliminate the hierarchical restrictions of components + * @param id Client ID + * @returns alova middleware function + */ + const actionDelegationMiddleware = (id) => { + const { ref, onUnmounted } = statesHookHelper(alova.promiseStatesHook()); + const hookIndex = ref(currentHookIndex + 1); + if (hookIndex.current > currentHookIndex) { + currentHookIndex += 1; + } + onUnmounted(() => { + var _a; + if ((_a = actionsMap[id]) === null || _a === void 0 ? void 0 : _a[hookIndex.current]) { + // delete action on unmount + delete actionsMap[id][hookIndex.current]; + } + }); + return (context, next) => { + // The middleware will be called repeatedly. If you have already subscribed, you do not need to subscribe again. + const { abort, proxyStates, delegatingActions = {} } = context; + const update = (newStates) => { + for (const key in newStates) { + proxyStates[key] && (proxyStates[key].v = newStates[key]); + } + }; + // Those with the same ID will be saved together in the form of an array + const hooks = (actionsMap[id] = actionsMap[id] || []); + const handler = isFrontMiddlewareContext(context) + ? { + ...delegatingActions, + send: context.send, + abort, + update + } + : { + ...delegatingActions, + fetch: context.fetch, + abort, + update + }; + hooks[hookIndex.current] = handler; + return next(); + }; + }; + /** + * Access the operation function, if there are multiple matches, onMatch will be called with this + * @param id Delegator id, or regular expression + * @param onMatch matching subscribers + * @param silent Default is false. If true, no error will be reported if there is no match + */ + const accessAction = (id, onMatch, silent = false) => { + const matched = []; + if (typeof id === 'symbol' || isString(id) || isNumber(id)) { + actionsMap[id] && pushItem(matched, ...objectValues(actionsMap[id])); + } + else if (instanceOf(id, RegExp)) { + forEach(filterItem(objectKeys(actionsMap), idItem => id.test(idItem)), idItem => { + pushItem(matched, ...objectValues(actionsMap[idItem])); + }); + } + // its opposite expression is too obscure + if (matched.length === 0 && !silent) { + assert(false, `no handler can be matched by using \`${id.toString()}\``); + } + forEach(filterItem(matched, $self), onMatch); + }; + + exports.accessAction = accessAction; + exports.actionDelegationMiddleware = actionDelegationMiddleware; + exports.bootSilentFactory = bootSilentFactory; + exports.createClientTokenAuthentication = createClientTokenAuthentication; + exports.createServerTokenAuthentication = createServerTokenAuthentication; + exports.dehydrateVData = dehydrateVData; + exports.equals = equals; + exports.filterSilentMethods = filterSilentMethods; + exports.getSilentMethod = getSilentMethod; + exports.isVData = isVData; + exports.onBeforeSilentSubmit = onBeforeSilentSubmit; + exports.onSilentSubmitBoot = onSilentSubmitBoot; + exports.onSilentSubmitError = onSilentSubmitError; + exports.onSilentSubmitFail = onSilentSubmitFail; + exports.onSilentSubmitSuccess = onSilentSubmitSuccess; + exports.silentQueueMap = silentQueueMap; + exports.statesHookHelper = statesHookHelper; + exports.stringifyVData = stringifyVData; + exports.updateState = updateState; + exports.updateStateEffect = updateStateEffect; + exports.useAutoRequest = useAutoRequest; + exports.useCaptcha = useCaptcha; + exports.useFetcher = useFetcher; + exports.useForm = useForm; + exports.usePagination = usePagination; + exports.useRequest = useRequest; + exports.useRetriableRequest = useRetriableRequest; + exports.useSQRequest = useSQRequest; + exports.useSSE = useSSE; + exports.useSerialRequest = useSerialRequest; + exports.useSerialWatcher = useSerialWatcher; + exports.useWatcher = useWatcher; + +})); diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.umd.min.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.umd.min.js new file mode 100644 index 0000000..e527b4c --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/clienthook/index.umd.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("alova")):"function"==typeof define&&define.amd?define(["exports","alova"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).AlovaClientHook={},e.alova)}(this,(function(e,t){"use strict";const r="undefined",n=Promise,o=e=>n.resolve(e),s=Object,a=RegExp,i=void 0,c=null,u=!0,l=!1,d=(e,t,r)=>e.then(t,r),f=(e,t)=>e.catch(t),m=(e,t=0)=>setTimeout(e,t),h=e=>s.keys(e),v=e=>s.values(e),p=(e,t)=>e.forEach(t),g=(e,...t)=>e.push(...t),y=(e,t)=>e.map(t),S=(e,t)=>e.filter(t),w=e=>e.shift(),b=(e,t,r=0,...n)=>e.splice(t,r,...n),E=e=>e.length,x=e=>Array.isArray(e),R=(e,t)=>delete e[t],_=e=>typeof e,k=(e,t)=>e.test(`${t}`),C=(e,t)=>e.includes(t),M=(e,t=l)=>({value:e,writable:t}),T=(e,t,r,n=l)=>s.defineProperty(e,t,n?r:M(r,l));typeof window===r&&typeof process!==r&&process.cwd;const j="memory",P=()=>{},O=e=>e,H=e=>"function"===_(e),q=e=>"number"===_(e)&&!Number.isNaN(e),D=e=>"string"===_(e),F=e=>e!==c&&"object"===_(e),L=e=>s.prototype.toString.call(e),U=e=>"[object Object]"===L(e),A=(e,t)=>e instanceof t,Q=e=>e?e.getTime():Date.now(),$=e=>e.context,N=e=>e.config,z=()=>{const e=(new Date).getTime();return Math.floor(Math.random()*e).toString(36)},W=e=>e.key,G=(e,t,r=[])=>{const n=H(e)?e(...r):e;return t(!!n.key,"hook handler must be a method instance or a function that returns method instance"),n},B=(e,...t)=>s.assign(e,...t),K=(e,...t)=>{const r={};for(const n in e)t.includes(n)||(r[n]=e[n]);return r};function I(){let e,t;return{promise:new Promise(((r,n)=>{e=r,t=n})),resolve:e,reject:t}}const V=e=>{const{cacheFor:t}=N(e);let r=j,n=()=>0,o=l,s=i;const a=H(t);if(!a){let a=t;if(U(t)){const{mode:e=j,expire:n,tag:c}=t||{};r=e,o="restore"===e,s=c?c.toString():i,a=n}n=t=>{return r=H(a)?a({method:e,mode:t}):a,q(r)?Q()+r:Q(r||i);var r}}return{f:t,c:a,e:n,m:r,s:o,t:s}},J=(e,...t)=>new e(...t),X=(e,t=[])=>H(e)?e(...t):e,Y=(e=l)=>{const t=[];let r=i,o=!1;return{addQueue:s=>J(n,((n,a)=>{g(t,(()=>d(s(),n,(t=>{e?n(i):a(t)})))),o||(async()=>{for(o=!0;E(t)>0;){const e=w(t);e&&await e()}r&&r(),o=!1})()})),onComplete:e=>{r=e}}},Z=(e,t,r=u,n,o)=>{const s=()=>{o&&n&&(e=t(e,n,o))!==o[n]&&(o[n]=e)};if(r&&s(),F(e))for(const n in e)A(e,String)||Z(e[n],t,r,n,e);return!r&&s(),e},ee=(e,t)=>{let{startQuiver:r,endQuiver:n}=e;const{delay:o,multiplier:s=1}=e;let a=(o||0)*s**(t-1);return(r||n)&&(r=r||0,n=n||1,a+=a*r+Math.random()*a*(n-r),a=Math.floor(a)),a};class te extends Error{constructor(e,t,r){super(t+(r?`\n\nFor detailed: https://alova.js.org/error#${r}`:"")),this.name=`[alova${e?`/${e}`:""}]`}}const re=(e="")=>(t,r,n)=>{if(!t)throw J(te,e,r,n)},ne=()=>{const e={};return{eventMap:e,on(t,r){const n=e[t]=e[t]||[];return g(n,r),()=>{e[t]=S(n,(e=>e!==r))}},off(t,r){const n=e[t];if(n)if(r){const e=n.indexOf(r);e>-1&&n.splice(e,1)}else delete e[t]},emit(t,r){const n=e[t]||[];return y(n,(e=>e(r)))}}},oe=(e,t)=>{const r=ne(),n=z(),o=e((e=>r.emit(n,e)));return e=>(r.on(n,(r=>{t(e,r)})),o)};class se{constructor(e,t,r,n){this.s=e,this.k=t,this.$dhy=r,this.$exp=n}get v(){return this.$dhy(this.s)}get e(){return this.$exp(this.s)}}class ae extends se{constructor(e,t,r,n,o){super(e,t,r,n),this.$upd=o}set v(e){this.$upd(this.s,e)}get v(){return super.v}}const ie={authRole:null},ce={authRole:"login"},ue={authRole:"logout"},le={authRole:"refreshToken"},de=({meta:e},t)=>{if(U(e))for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)){const n=t[r];if(A(n,RegExp)?n.test(e[r]):e[r]===n)return u}return l},fe=(e,t)=>J(n,(r=>{g(t,{method:e,resolve:r})})),me=(e,t,r,n)=>{if(de(e,(null==t?void 0:t.metaMatches)||r)){return(H(t)?t:U(t)&&H(t.handler)?t.handler:P)(n,e)}},he=async(e,t,r,o,s,a)=>{const c=E(o)>=2;let d=null==s?void 0:s.isExpired(...o);if(A(d,n)&&(d=await d),d)try{let n=u;if(c&&a&&(n=l,await fe(e,t)),n&&(r(u),await(null==s?void 0:s.handler(...o)),r(l),p(t,(({resolve:e})=>e()))),c){const{config:t}=e,r=t.transform;t.transform=i;const n=await e;return t.transform=r,n}}finally{r(l),b(t,0,E(t))}},ve=e=>{let t=i,r=i,n=i;if(H(e))t=e;else if(U(e)){const{onSuccess:o,onError:s,onComplete:a}=e;t=H(o)?o:t,r=H(s)?s:r,n=H(a)?a:n}return{onSuccess:t,onError:r,onComplete:n}},pe=e=>{throw e};const ge=(e,t)=>{let r=c;return function(...n){const o=e.bind(this,...n),s=q(t)?t:t(...n);r&&(e=>{clearTimeout(e)})(r),s>0?r=m(o,s):o()}},ye=(e,r=[])=>{const n=H(e)?e(...r):e;return re("scene")(A(n,t.Method),"hook handler must be a method instance or a function that returns method instance"),n};var Se;function we(e,t={trackedKeys:{},bindError:l}){const r=t=>e.ref?e.ref(t):{current:t};t=r(t).current;const n=r=>(e.export||O)(r,t),o=t=>{if(!H(e.memorize))return t;const r=e.memorize(t);return r.memorized=!0,r},{dehydrate:a}=e,i=(r,n,o)=>r!==a(n,o,t)&&t.trackedKeys[o]&&e.update(r,n,o,t),c=e=>y(e,(e=>A(e,se)?e.e:e)),d=[],f={};return{create:(r,o)=>(g(d,o),J(ae,e.create(r,o,t),o,(e=>a(e,o,t)),n,((e,t)=>i(t,e,o)))),computed:(r,o,s)=>(p(o,(e=>{e.k&&(f[e.k]=!0)})),J(se,e.computed(r,c(o),s,t),s,(e=>a(e,s,t)),n)),effectRequest:r=>e.effectRequest(r,t),ref:r,watch:(r,n)=>e.watch(c(r),n,t),onMounted:r=>e.onMounted(r,t),onUnmounted:r=>e.onUnmounted(r,t),memorize:o,__referingObj:t,exposeProvider:e=>{const r={},n={};for(const a in e){const i=e[a];if(H(i)&&!t.trackedKeys[a])r[a]=a.startsWith("on")?(...e)=>(i(...e),v):i.memorized?i:o(i);else{const e=A(i,se);e&&(n[a]=i.s),s.defineProperty(r,a,{get:()=>(t.trackedKeys[a]=u,e?i.e:i),set:P,enumerable:u,configurable:u})}}const{update:a,__proxyState:c}=r;t.trackedKeys={...f},t.bindError=l;const m={__referingObj:t,update:o((e=>{h(e).forEach((t=>{C(d,t)?i(e[t],n[t],t):t in r&&H(a)&&a({[t]:e[t]})}))})),__proxyState:o((r=>C(d,r)&&A(e[r],se)?(t.trackedKeys[r]=u,e[r]):c(r)))},v=B(r,m);return v},objectify:(e,t)=>e.reduce(((e,r)=>(e[r.k]=t?r[t]:r,e)),{}),transformState2Proxy:(e,r)=>J(ae,e,r,(e=>a(e,r,t)),n,((e,t)=>i(t,e,r)))}}!function(e){e[e.USE_REQUEST=1]="USE_REQUEST",e[e.USE_WATCHER=2]="USE_WATCHER",e[e.USE_FETCHER=3]="USE_FETCHER"}(Se||(Se={}));const be=re(""),Ee=re("useRequest"),xe=re("useWatcher"),Re=re("useFetcher"),_e=e=>({[Se.USE_REQUEST]:Ee,[Se.USE_WATCHER]:xe,[Se.USE_FETCHER]:Re}[e]),ke=(e,r)=>e(A(r,t.Method),"expected a method instance."),Ce="success",Me="error",Te="complete";class je{constructor(e,t){this.method=e,this.args=t}clone(){return{...this}}static spawn(e,t){return new je(e,t)}}class Pe extends je{constructor(e,t,r){super(e.method,e.args),this.data=t,this.fromCache=r}}class Oe extends je{constructor(e,t){super(e.method,e.args),this.error=t}}class He extends je{constructor(e,t,r,n,o){super(e.method,e.args),this.status=t,this.data=r,this.fromCache="error"!==t&&n,this.error=o}}class qe extends je{constructor(e,t){super(e.method,e.args),this.eventSource=t}}class De extends qe{constructor(e,t){super(e,e.eventSource),this.error=t}}class Fe extends qe{constructor(e,t){super(e,e.eventSource),this.data=t}}class Le{constructor(e,t,r){this.behavior=e,this.method=t,this.silentMethod=r}}class Ue extends Le{constructor(e,t,r,n,o){super(e,t,r),this.queueName=n,this.retryTimes=o}}class Ae extends Ue{constructor(e,t,r,n,o,s,a){super(e,t,r,n,o),this.data=s,this.vDataResponse=a}}class Qe extends Ue{constructor(e,t,r,n,o,s,a){super(e,t,r,n,o),this.error=s,this.retryDelay=a}}class $e extends Ue{constructor(e,t,r,n,o,s){super(e,t,r,n,o),this.error=s}}class Ne extends Le{constructor(e,t,r,n){super(e,t,r),this.args=n}}class ze extends Ne{constructor(e,t,r,n,o){super(e,t,r,n),this.data=o}}class We extends Ne{constructor(e,t,r,n,o){super(e,t,r,n),this.error=o}}class Ge extends Ne{constructor(e,t,r,n,o,s){super(e,t,r,n),this.retryTimes=o,this.retryDelay=s}}class Be extends Ne{constructor(e,t,r,n,o,s,a){super(e,t,r,n),this.status=o,this.data=s,this.error=a}}class Ke extends je{constructor(e,t,r){super(e.method,e.args),this.retryTimes=t,this.retryDelay=r}}class Ie extends Oe{constructor(e,t,r){super(e,t),this.retryTimes=r}}const Ve=(e,t)=>t(),Je={},Xe=(e,t)=>(Je[e]||{})[t]||{};function Ye(e,r,n=[]){const s=_e(e.ht);let a=G(r,s,n);const{fs:c,ht:f,c:m,ms:h}=e,{loading:v,data:p,error:y}=c,S=f===Se.USE_FETCHER,{force:w=l,middleware:b=Ve}=m,E=$(a),{id:x}=E,_=W(a),{abortLast:k=u}=m,C=!e.m;return e.m=a,(async()=>{let E=P,M=P,T=l,j=o(i),O=P,H=P;const q=await t.queryCache(a);let D=()=>!!q,F=l;S||(M=t=>((e,t,r,n)=>{(Je[e]=Je[e]||{})[t]={s:r,h:n}})(x,_,t,e),M({...c,...h}),E=()=>((e,t)=>{const r=Je[e];r&&R(r,t)})(x,_));const L=t=>{T=u;const{force:r=w,method:o=a}=t||{},s=X(r,[J(je,a,n)]),i=e=>({loaded:t,total:r})=>{c[e].v={loaded:t,total:r}};a=o,g(e.sf,M),g(e.rf,E),F||(v.v=!!s||!q);const{downloading:d,uploading:f}=e.ro.trackedKeys;return O=d?a.onDownload(i("downloading")):O,H=f?a.onUpload(i("uploading")):H,j=a.send(s),D=()=>a.fromCache||l,j},U={method:a,cachedResponse:q,config:m,abort:()=>a.abort()},A=()=>f!==Se.USE_WATCHER||!k||e.m===a,Q=(e=u)=>{e&&C&&(v.v=l),F=e},$=b(S?{...U,args:n,fetch:(t,...r)=>(ke(s,t),Ye(e,t,r)),proxyStates:K(c,"data"),controlLoading:Q}:{...U,args:n,send:(...t)=>Ye(e,r,t),proxyStates:c,controlLoading:Q},L);let N=i;const z=je.spawn(a,n);try{const t=await $,r=t=>{if(S){if(e.c.updateState!==l){const e=Xe(x,_).s;e&&(e.data.v=t)}}else A()&&(p.v=t);return A()&&(y.v=i,!F&&(v.v=l),e.em.emit(Ce,J(Pe,z,t,D())),e.em.emit(Te,J(He,z,Ce,t,D(),i))),t};N=t!==i?r(t):T?await d(j,r,(()=>r(i))):i,!T&&!F&&(v.v=l)}catch(t){throw A()&&(y.v=t,!F&&(v.v=l),e.em.emit(Me,J(Oe,z,t)),e.em.emit(Te,J(He,z,Me,i,D(),t))),t}return O(),H(),N})()}const Ze=e=>e.current;function et(e,r,o,s,a=l,c,d=0){var h;o={...o};const{__referingObj:v={trackedKeys:{},bindError:l}}=o;let g=!!a,y=i;if(a)try{const t=G(r,_e(e)),s=$(t),a=s.l1Cache.get((S=s.id,w=W(t),"$a."+S+w));if(a&&!A(a,n)){const[e,t]=a;(!t||t>Q())&&(y=e)}g=!!X(null!==(h=o.force)&&void 0!==h?h:l)||!y}catch(e){}var S,w;const{create:b,effectRequest:E,ref:R,objectify:_,exposeProvider:k,transformState2Proxy:C}=we(t.promiseStatesHook(),v),M={total:0,loaded:0},{managedStates:T={}}=o,j=((e,t)=>{const r={};for(const n in e)r[n]=t(e[n],n,e);return r})(T,((e,t)=>C(e,t))),P=b(null!=y?y:H(s)?s():s,"data"),O=b(g,"loading"),D=b(i,"error"),F=b({...M},"downloading"),L=b({...M},"uploading"),U=_([P,O,D,F,L]),N=ne(),z=Ze(R(((e,t,r,n)=>({m:i,sf:[],rf:[],fs:{},em:r,ht:e,c:t,ro:n,ms:{}}))(e,o,N,v)));z.fs=U,z.em=N,z.c=o,z.ms=j;const B=c!==i,K=(e=r,t)=>Ye(z,e,t),I=Ze(R(((e=0)=>{let t=i;return r=>{t&&clearTimeout(t),t=m(r,e)}})())),V=(e=v,t)=>{I((()=>{f(K(t),(t=>{if(!e.bindError&&!e.trackedKeys.error)throw t}))}))},J=R(ge(((e,t,r)=>V(t,r)),(e=>q(e)?x(d)?d[e]:d:0)));return t.globalConfigMap.ssr||E({handler:B?e=>J.current(e,v,r):()=>V(v),removeStates:()=>p(z.rf,(e=>e())),saveStates:e=>p(z.sf,(t=>t(e))),frontStates:{...U,...j},watchingStates:c,immediate:null!=a?a:u}),k({..._([P,O,D,F,L]),abort:()=>z.m&&z.m.abort(),send:(e,t)=>K(t,e),onSuccess(e){N.on(Ce,e)},onError(e){v.bindError=u,N.on(Me,e)},onComplete(e){N.on(Te,e)}})}function tt(e={}){const t=et(Se.USE_FETCHER,P,e),{send:r}=t;return R(t,"send"),B(t,{fetch:(e,...t)=>(ke(Re,e),r(t,e))})}function rt(e,t={}){const{immediate:r=u,initialData:n}=t,o=et(Se.USE_REQUEST,e,t,n,!!r),{send:s}=o;return B(o,{send:(...e)=>s(e)})}function nt(e,t,r={}){xe(t&&E(t)>0,"expected at least one watching state");const{immediate:n,debounce:o=0,initialData:s}=r,a=et(Se.USE_WATCHER,e,r,s,!!n,t,o),{send:i}=a;return B(a,{send:(...e)=>i(e)})}const ot=re("usePagination"),st=(e,t)=>ot(q(e)&&e[e[e.length-2],e[e.length-1],e.slice(0,e.length-2)];const it=(e,t)=>re(e)(x(t)&&E(t)>0,"please use an array to represent serial requests"),ct=(e,t,r=[])=>(e.shift(),(n,s)=>{null==t||t(n,(()=>o(i))),n.controlLoading();const a=n.proxyStates.loading;a.v=u;let c=s();for(const t of e)c=d(c,(e=>{const o=t(e,...n.args);return g(r,o),o.send()}));return c.finally((()=>{a.v=l}))});const ut="valueOf",lt="default",dt="silent";let ft;const mt=e=>{ft=e};let ht;let vt={};let pt=0;const gt=e=>{pt=e};let yt=[];const St=Symbol("GlobalSQBoot"),wt=Symbol("GlobalSQBefore"),bt=Symbol("GlobalSQSuccess"),Et=Symbol("GlobalSQError"),xt=Symbol("GlobalSQFail"),Rt=ne(),_t=re("useSQRequest");async function kt(e,r){let n=l;if(e){const{update:o}=t.promiseStatesHook(),s=W(e),{id:a}=$(e),{s:c,h:l}=Xe(a,s),d=H(r)?{data:r}:r;let f=i;c&&(p(h(d),(e=>{be(e in c,`state named \`${e}\` is not found`);const t=c[e];let r=d[e](t.v);r=x(r)?[...r]:F(r)?{...r}:r,"data"===e&&(f=r),o(r,c[e].s,e,l.ro)})),n=u),f!==i&&t.setCache(e,f)}return n}var Ct={forward:e=>A(e,Date)?e.getTime():i,backward:e=>J(Date,e)},Mt={forward:e=>A(e,RegExp)?e.source:void 0,backward:e=>J(RegExp,e)};const Tt=(e={})=>{const t={date:Ct,regexp:Mt,...e};return{serialize:e=>(F(e)&&(e=Z(x(e)?[...e]:{...e},(e=>{let r=i;const n=h(t).reduce(((e,n)=>{if(!r){const o=t[n].forward(e);o!==i&&(r=n,e=o)}return e}),e);return"[object Object]"===s.prototype.toString.call(e)?e={...e}:x(e)&&(e=[...e]),r!==i?[r,n]:e}))),e),deserialize:e=>F(e)?Z(e,(e=>{if(x(e)&&2===E(e)){const r=t[e[0]];e=r?r.backward(e[1]):e}return e}),l):e}},jt=Symbol("vdid"),Pt=Symbol("original"),Ot=/\[vd:([0-9a-z]+)\]/,Ht=e=>{const t=null==e?void 0:e[jt];t&&ft&&(ft[t]=i)},qt=(e,t=u)=>{Ht(e);const r=null==e?void 0:e[jt];return(r?`[vd:${r}]`:i)||(t?e:i)};function Dt(){return qt(this)}const Ft=function(){};Ft.prototype=s.create(c,{[ut]:M(Dt)});const Lt=function(){};Lt.prototype=s.create(c,{[ut]:M(Dt)});var Ut=(e,t=z())=>{const r=(e,t=z())=>{if(e===c)e=J(Ft);else if(e===i)e=J(Lt);else{const t=s(e);T(t,ut,Dt),T(t,Pt,e),e=t}return T(e,jt,t),e},n=r(e,t);return(U(n)||x(n))&&Z(n,(e=>r(e))),n};const At=(e,t=u)=>{const r=e=>(Ht(e),(null==e?void 0:e[jt])&&(A(e,Lt)?e=i:A(e,Ft)?e=c:(A(e,Number)||A(e,String)||A(e,Boolean))&&(e=e[Pt])),e),n=r(e);return t&&(F(n)||x(n))&&Z(n,(e=>r(e))),n};const Qt="__$k",$t="__$v",Nt=()=>(_t(!!ht,"alova instance is not found, Do you forget to set `alova` or call `bootSilentFactory`?"),ht.l2Cache);let zt=i;const Wt="alova.SQ",Gt="alova.SM.",Bt=async(e,t)=>{const r=Nt();F(t)&&(t=Z(x(t)?[...t]:{...t},((e,t,r)=>{var n;if(t===$t&&r[Qt])return e;if("context"===t&&"Alova"===(null===(n=null==e?void 0:e.constructor)||void 0===n?void 0:n.name))return i;const o=null==e?void 0:e[jt];let s=At(e,l);if("[object Object]"===L(s)?(e={...e},s={}):x(e)&&(e=[...e],s=[]),o){const t={[Qt]:o,[$t]:s,...e};if(A(e,String))for(let r=0;r{const t=await Nt().get(e);return zt=zt||Tt(vt),F(t)?Z(zt.deserialize(t),(e=>{if(F(e)&&(null==e?void 0:e[Qt])){const t=e[Qt],r=Ut(e[$t],t);p(h(e),(t=>{C([Qt,$t],t)||(r[t]=e[t])})),e=r}return e}),l):t},It=async e=>{await Nt().remove(e)},Vt=e=>Bt(Gt+e.id,e),Jt=async(e,t,r)=>{const n=await Kt(Wt)||{},o=n[e]||[],s=o.findIndex((e=>e===t));s>=0&&(r?(b(o,s,1,r.id),await Vt(r)):b(o,s,1),await It(Gt+t),E(o)<=0&&delete n[e],E(h(n))>0?await Bt(Wt,n):await It(Wt))};let Xt={};const Yt=(e,t)=>{const r=e=>{const r=qt(e);return r in t?t[r]:D(e)?e.replace(J(a,Ot.source,"g"),(e=>e in t?t[e]:e)):e};return F(e)&&!qt(e,l)?Z(e,r):e=r(e),e},Zt=(e,t)=>{let r={};const n=qt(e,l);if(n&&(r[n]=t),F(e))for(const n in e)r={...r,...Zt(e[n],null==t?void 0:t[n])};return r},er=(e,t)=>{t?e.active=t:delete e.active},tr=1e3,rr=(e,r)=>{const o=t=>{const r=e[0];if(r){const n=yt.find((({queue:e})=>A(e,a)?k(e,t):e===t)),o=()=>e[0]&&s(e[0]),i=(null==n?void 0:n.wait)?X(n.wait,[r,t]):0;i&&i>0?m(o,i):o()}},s=(a,i=0)=>{er(a,u);const{cache:c,id:f,behavior:h,entity:v,retryError:g=/.*/,maxRetryTimes:S=0,backoff:b={delay:tr},resolveHandler:x=P,rejectHandler:R=P,emitter:_,handlerArgs:C=[],virtualResponse:M,force:T}=a;Rt.emit(wt,J(Ue,h,v,a,r,i)),d(v.send(T),(async s=>{if(w(e),c&&await Jt(r,f),x(s),h===dt){const o=Zt(M,s),{targetRefMethod:c,updateStates:u}=a;if(A(c,t.Method)&&u&&E(u)>0){const e={};p(u,(t=>{e[t]=e=>Yt(e,o)}));kt(c,e)||await t.setCache(c,(e=>Yt(e,o)))}await((e,t)=>n.all(y(t,(async t=>{Yt(t.entity,e),t.cache&&await Vt(t)}))))(o,e),Rt.emit(bt,J(Ae,h,v,a,r,i,s,o))}er(a,l),o(r)}),(t=>{if(h!==dt)w(e),R(t);else{const e=e=>Rt.emit(Et,J(Qe,h,v,a,r,i,t,e)),{name:n="",message:o=""}=t||{};let c,u;A(g,RegExp)?u=g:F(g)&&(c=g.name,u=g.message);const l=c&&k(c,n)||u&&k(u,o);if(i{s(a,i+=1),_.emit("retry",J(Ge,h,v,a,C,i,t))}),t)}else gt(2),e(),_.emit("fallback",J(We,h,v,a,C,t)),Rt.emit(xt,J($e,h,v,a,r,i,t))}er(a,l)}))};o(r)},nr=async(e,t,r=lt,n=()=>[])=>{e.cache=t;const o=Xt[r]=Xt[r]||[],s=E(o)<=0,a=!(await Promise.all(n())).some((e=>e===l));return a&&(t&&await(async(e,t)=>{await Vt(e);const r=await Kt(Wt)||{},n=r[t]=r[t]||[];g(n,e.id),await Bt(Wt,r)})(e,r),g(o,e),s&&1===pt&&rr(o,r)),a},or=e=>{let t=i,r="",n=0;for(const o in Xt)if(n=Xt[o].indexOf(e),n>=0){t=Xt[o],r=o;break}return[t,r,n]};class sr{constructor(e,t,r,n=z(),o,s,a,i,c,u,l,d){const f=this;f.entity=e,f.behavior=t,f.id=n,f.emitter=r,f.force=!!o,f.retryError=s,f.maxRetryTimes=a,f.backoff=i,f.resolveHandler=c,f.rejectHandler=u,f.handlerArgs=l,f.vDatas=d}async save(){this.cache&&await Vt(this)}async replace(e){const t=this;_t(e.cache===t.cache,"the cache of new silentMethod must equal with this silentMethod");const[r,n,o]=or(t);r&&(b(r,o,1,e),t.cache&&await Jt(n,t.id,e))}async remove(){const e=this,[t,r,n]=or(e);t&&(b(t,n,1),e.cache&&await Jt(r,e.id))}setUpdateState(e,t="data"){e&&(this.targetRefMethod=e,this.updateStates=x(t)?t:[t])}}var ar=async()=>{const e=await Kt(Wt)||{},r={},o=[];return p(h(e),(n=>{const s=r[n]=r[n]||[];g(o,...y(e[n],(async e=>{const r=await Kt(Gt+e);r&&g(s,(e=>{const{id:r,behavior:n,entity:o,retryError:s,maxRetryTimes:a,backoff:i,resolveHandler:c,rejectHandler:l,handlerArgs:d,targetRefMethod:f,force:m}=e,v=e=>{const{type:r,url:n,config:o,data:s}=e;return J(t.Method,r,ht,n,o,s)},g=J(sr,v(o),n,ne(),r,m,s,a,i,c,l,d);return g.cache=u,f&&(g.targetRefMethod=v(f)),p(h(e),(t=>{C(["id","behavior","emitter","entity","retryError","maxRetryTimes","backoff","resolveHandler","rejectHandler","handlerArgs","targetRefMethod","force"],t)||(g[t]=e[t])})),g})(r))})))})),await n.all(o),r};let ir=i;var cr=(e,t)=>{const{behavior:r="queue",queue:s=lt,retryError:a,maxRetryTimes:c,backoff:f}=t||{},m=ne();let v,p,g,y=lt,S=l;return{c:(...t)=>(_t(H(e),"method handler must be a function. eg. useSQRequest(() => method)"),mt({}),v=t,e(...t)),m:({method:e,args:t,cachedResponse:w,proxyStates:b,config:x},R)=>{const{silentDefaultResponse:_,vDataCaptured:C,force:M=l}=x,T=je.spawn(e,t);p=X(r,[T]),y=X(s,[T]),S=X(M,[T]);const j=()=>{mt(v=i)};if(H(C)){let t=ft&&E(h(ft))>0;if(!t){const{url:r,data:n}=e,{params:o,headers:s}=N(e);Z({url:r,params:o,data:n,headers:s},(e=>(t||!qt(e,l)&&!k(Ot,e)||(t=u),e)))}const r=t?C(e):i;if(r!==i)return j(),o(r)}if("static"!==p){const r=()=>{const r=J(n,((t,r)=>{g=J(sr,e,p,m,i,!!S,a,c,f,t,r,v,ft&&h(ft)),j()}));return d(o(i),(async()=>{const r=()=>J(Ne,p,e,g,t);await nr(g,E(m.eventMap.fallback||[])<=0&&p===dt,y,(()=>m.emit("beforePushQueue",r())))&&m.emit("pushedQueue",r())})),r};if("queue"===p){const e=S||!w;return e&&(b.loading.v=u),e?r():d(o(w))}const s=r(),l=g.virtualResponse=Ut(H(_)?_():i);return d(s,(e=>{b.data.v=e})),o(l)}return j(),R()},d:e=>{e.onSuccess=oe(e.onSuccess,((e,t)=>{ir=g,e(J(ze,p,t.method,g,t.args,t.data))})),e.onError=oe(e.onError,((e,t)=>{e(J(We,p,t.method,g,t.args,t.error))})),e.onComplete=oe(e.onComplete,((e,t)=>{e(J(Be,p,t.method,g,t.args,t.status,t.data,t.error))}))},b:{onFallback:e=>{m.on("fallback",e)},onBeforePushQueue:e=>{m.on("beforePushQueue",e)},onPushedQueue:e=>{m.on("pushedQueue",e)},onRetry:e=>{m.on("retry",e)}}}};const ur=async(e,t=lt,r=l)=>{const n=(t=[])=>t.filter((t=>{if(e===i)return u;const n=N(t.entity).name||"";return(A(e,RegExp)?k(e,n):n===e)&&(r?t.active:u)}));return[...n(Xt[t]),...0===pt?n((await ar())[t]):[]]};const lr=(e,r={})=>{let n=u;const{enableFocus:o=u,enableVisibility:s=u,enableNetwork:a=u,pollingTime:i=0,throttle:c=1e3}=r,{onMounted:d,onUnmounted:f,__referingObj:m}=we(t.promiseStatesHook()),h=rt(e,{...r,__referingObj:m}),v=()=>{n&&(h.send(),c>0&&(n=l,setTimeout((()=>{n=u}),c)))};let p=P,g=P,y=P,S=P;return d((()=>{t.globalConfigMap.ssr||(p=a?lr.onNetwork(v,r):p,g=o?lr.onFocus(v,r):g,y=s?lr.onVisibility(v,r):y,S=i>0?lr.onPolling(v,r):S)})),f((()=>{p(),g(),y(),S()})),h},dr=(e,t)=>(window.addEventListener(e,t),()=>window.removeEventListener(e,t));lr.onNetwork=e=>dr("online",e),lr.onFocus=e=>dr("focus",e),lr.onVisibility=e=>dr("visibilitychange",(()=>"visible"===document.visibilityState&&e())),lr.onPolling=(e,t)=>{const r=setInterval(e,t.pollingTime);return()=>clearInterval(r)};const fr="useCaptcha",mr=re(fr);const hr=Symbol("FormRestore"),vr={},pr=e=>{const t=e=>x(e)?[...e]:U(e)?{...e}:e;return Z(t(e),t)};const gr=Symbol("RetriableRetry"),yr=Symbol("RetriableFail"),Sr="useRetriableRequest",wr=re(Sr);const br=Symbol("SSEOpen"),Er=Symbol("SSEMessage"),xr=Symbol("SSEError");var Rr;!function(e){e[e.CONNECTING=0]="CONNECTING",e[e.OPEN=1]="OPEN",e[e.CLOSED=2]="CLOSED"}(Rr||(Rr={}));const _r=re("useSSE"),kr="open",Cr="error",Mr="message";let Tr=0;const jr={},Pr=re("subscriber");e.accessAction=(e,t,r=!1)=>{const n=[];"symbol"==typeof e||D(e)||q(e)?jr[e]&&g(n,...v(jr[e])):A(e,RegExp)&&p(S(h(jr),(t=>e.test(t))),(e=>{g(n,...v(jr[e]))})),0!==n.length||r||Pr(!1,`no handler can be matched by using \`${e.toString()}\``),p(S(n,O),t)},e.actionDelegationMiddleware=e=>{const{ref:r,onUnmounted:n}=we(t.promiseStatesHook()),o=r(Tr+1);return o.current>Tr&&(Tr+=1),n((()=>{var t;(null===(t=jr[e])||void 0===t?void 0:t[o.current])&&delete jr[e][o.current]})),(t,r)=>{const{abort:n,proxyStates:s,delegatingActions:a={}}=t,i=e=>{for(const t in e)s[t]&&(s[t].v=e[t])},c=jr[e]=jr[e]||[],u=(e=>!!e.send)(t)?{...a,send:t.send,abort:n,update:i}:{...a,fetch:t.fetch,abort:n,update:i};return c[o.current]=u,r()}},e.bootSilentFactory=e=>{if(0===pt){const{alova:t,delay:r=500}=e;ht=t,((e={})=>{vt=e})(e.serializers),((e=0)=>{yt=x(e)?e:[{queue:lt,wait:e}]})(e.requestWait),m((async()=>{var e;e=await ar(),p(h(e),(t=>{const r=Xt[t]=Xt[t]||[];g(r,...e[t])})),p(h(Xt),(e=>{rr(Xt[e],e)})),gt(1),Rt.emit(St,i)}),r)}},e.createClientTokenAuthentication=({visitorMeta:e,login:t,logout:r,refreshToken:n,assignToken:o=P})=>{let s=l;const a=[];return{waitingList:a,onAuthRequired:r=>async i=>{const c=de(i,e||ie),u=de(i,(null==t?void 0:t.metaMatches)||ce);return c||u||de(i,(null==n?void 0:n.metaMatches)||le)||(s&&await fe(i,a),await he(i,a,(e=>{s=e}),[i],n)),c||u||await o(i),null==r?void 0:r(i)},onResponseRefreshToken:e=>{const n=ve(e);return{...n,onSuccess:async(e,o)=>(await me(o,t,ce,e),await me(o,r,ue,e),(n.onSuccess||O)(e,o))}}}},e.createServerTokenAuthentication=({visitorMeta:e,login:t,logout:r,refreshTokenOnSuccess:n,refreshTokenOnError:o,assignToken:s=P})=>{let a=l;const i=[];return{waitingList:i,onAuthRequired:r=>async c=>{const u=de(c,e||ie),l=de(c,(null==t?void 0:t.metaMatches)||ce);return u||l||de(c,(null==n?void 0:n.metaMatches)||le)||de(c,(null==o?void 0:o.metaMatches)||le)||a&&await fe(c,i),u||l||await s(c),null==r?void 0:r(c)},onResponseRefreshToken:s=>{const c=ve(s);return{...c,onSuccess:async(o,s)=>{if(!de(s,e||ie)&&!de(s,(null==t?void 0:t.metaMatches)||ce)&&!de(s,(null==n?void 0:n.metaMatches)||le)){const e=await he(s,i,(e=>{a=e}),[o,s],n,a);if(e)return e}return await me(s,t,ce,o),await me(s,r,ue,o),(c.onSuccess||O)(o,s)},onError:async(r,n)=>{if(!de(n,e||ie)&&!de(n,(null==t?void 0:t.metaMatches)||ce)&&!de(n,(null==o?void 0:o.metaMatches)||le)){const e=await he(n,i,(e=>{a=e}),[r,n],o,a);if(e)return e}return(c.onError||P)(r,n)}}}}},e.dehydrateVData=e=>At(e),e.equals=(e,t)=>e===t?u:qt(e)===qt(t),e.filterSilentMethods=ur,e.getSilentMethod=async(e,t=lt,r=l)=>(await ur(e,t,r))[0],e.isVData=e=>!!qt(e,l)||k(Ot,e),e.onBeforeSilentSubmit=e=>Rt.on(wt,e),e.onSilentSubmitBoot=e=>Rt.on(St,e),e.onSilentSubmitError=e=>Rt.on(Et,e),e.onSilentSubmitFail=e=>Rt.on(xt,e),e.onSilentSubmitSuccess=e=>Rt.on(bt,e),e.silentQueueMap=Xt,e.statesHookHelper=we,e.stringifyVData=qt,e.updateState=kt,e.updateStateEffect=async(e,t)=>(ir&&(ir.setUpdateState(e,H(kt)?i:h(kt)),await ir.save()),kt(e,t)),e.useAutoRequest=lr,e.useCaptcha=(e,r={})=>{const{initialCountdown:o,middleware:s}=r;mr(o===i||o>0,"initialCountdown must be greater than 0");const{create:a,ref:c,objectify:u,exposeProvider:d,__referingObj:f}=we(t.promiseStatesHook()),m=a(0,"countdown"),h=rt(e,{...r,__referingObj:f,immediate:l,managedStates:u([m],"s"),middleware:s?(e,t)=>s({...e,send:p},t):i}),v=c(i),p=(...e)=>J(n,((t,n)=>{m.v<=0?h.send(...e).then((e=>{m.v=r.initialCountdown||60,v.current=setInterval((()=>{m.v-=1,m.v<=0&&clearInterval(v.current)}),1e3),t(e)})).catch((e=>n(e))):n(J(te,fr,"the countdown is not over yet"))}));return d({...h,send:p,...u([m])})},e.useFetcher=tt,e.useForm=(e,r={})=>{const n=vr,{id:o,initialForm:s,store:a,resetAfterSubmiting:c,immediate:d=l,middleware:f}=r;t.promiseStatesHook();const{create:m,ref:h,onMounted:v,watch:p,objectify:g,exposeProvider:y,__referingObj:S}=we(t.promiseStatesHook()),w=U(a),b=w?a.enable:a,E=o?n[o]:i,x=m(pr(s),"form"),R=e,_=ne(),k=h(X(R,[x.v])),C=$(k.current).l2Cache,M=((e,t)=>`alova/form-${t||W(e)}`)(k.current,o),T=h(l),j=h(Tt(w?a.serializers:i)),P=h(!1),O=rt(((...e)=>R(x.v,...e)),{...r,__referingObj:S,middleware:f?(e,t)=>f({...e,delegatingActions:{updateForm:q,reset:H}},t):i,immediate:b||E?l:d}),H=()=>{T.current=u;const e=pr(s);e&&(x.v=e),b&&C.remove(M)},q=e=>{x.v={...x.v,...e}},D=y({...O,...g([x]),updateForm:q,reset:H,onRestore(e){_.on(hr,e)}});o&&(E||(P.current=u),P.current&&(n[o]={hookProvider:D,config:r}));const{send:F,onSuccess:L}=D;return v((()=>{if(b&&!E){const e=j.current.deserialize(C.get(M));e&&(x.v=e,_.emit(hr,i)),b&&d&&F()}})),p([x],(()=>{!T.current&&b?C.set(M,j.current.serialize(x.v)):T.current=l})),L((()=>{c&&H()})),E&&!P.current?E.hookProvider:D},e.usePagination=(e,r={})=>{const{create:n,computed:s,ref:a,watch:c,exposeProvider:d,objectify:m,__referingObj:w}=we(t.promiseStatesHook()),{preloadPreviousPage:R=u,preloadNextPage:_=u,total:k=e=>e.total,data:M=e=>e.data,append:T=l,initialPage:O=1,initialPageSize:D=10,watchingStates:F=[],initialData:L,immediate:U=u,middleware:$,force:N=P,...z}=r,G=a(e),B=a(l),K=n(O,"page"),J=n(D,"pageSize"),X=n(L&&M(L)||[],"data"),Z=n(L?k(L):i,"total"),{snapshots:ee,get:te,save:re,remove:ne}=a((e=>{let r={};return{snapshots:()=>r,save(e,t=l){const n=W(e);r[n]&&!t||(r[n]={entity:e})},get:n=>r[W(A(n,t.Method)?n:e(n))],remove(e){e?delete r[e]:r={}}}})((e=>G.current(e,J.v)))).current,oe=e=>M(e)||e,se=tt({__referingObj:w,updateState:l,force:({args:e})=>e[E(e)-1]}),{loading:ae,fetch:ie,abort:ce,onSuccess:ue}=se,le=a(ae),de=(t=K.v,r=[])=>{const n=e(t,J.v,...r);return re(n),n};c(F,(()=>{K.v=O,B.current=u}));const fe=a({}),me=s((()=>{const e=Z.v;return e!==i?Math.ceil(e/J.v):i}),[J,Z],"pageCount"),he=e=>(...t)=>fe.current[e](...t),ve=nt(((...e)=>{const[t,,r]=at(e);return de(t,r)}),[...F,K.e,J.e],{__referingObj:w,immediate:U,initialData:L,managedStates:m([X,K,J,Z],"s"),middleware:(e,t)=>$?$({...e,delegatingActions:{refresh:he("refresh"),insert:he("insert"),remove:he("remove"),replace:he("replace"),reload:he("reload"),getState:e=>({page:K,pageSize:J,data:X,pageCount:me,total:Z,isLastPage:be}[e].v)}},t):t(),force:e=>e.args[1]||(H(N)?N(e):N),...z}),{send:pe}=ve,ge=ve.__proxyState("data"),ye=async e=>{const{rawData:r=ge.v,preloadPage:n,fetchMethod:o,forceRequest:s=l,isNextPage:a=l}=e,i=me.v,c=i?n>i:a?E(oe(r))0&&!c))return l;const{e:u}=V(o),d=await t.queryCache(o);return u(j)<=Q()?l:s||!d},Se=async(e,t,r=[])=>{const n=K.v+1,o=de(n,r);_&&await ye({rawData:e,preloadPage:n,fetchMethod:o,isNextPage:u,forceRequest:t})&&f(ie(o,...r,t),P)},be=s((()=>{const e=ge.v;if(!e)return u;const t=oe(e),r=K.v,n=me.v,o=x(t)?E(t):0;return n?r>=n:o{const e=te(K.v);e&&await t.setCache(e.entity,(e=>{if(e){const t=oe(e)||[];return b(t,0,E(t),...X.v),e}}))};ue((({method:e,data:t})=>{const r=te(K.v);if(r&&W(r.entity)===W(e)){const e=oe(t);if(T){const t=X.v,r=J.v,n=E(t)%r;if(n>0){const t=[...X.v];b(t,(K.v-1)*r,n,...e),X.v=t}}else X.v=e}}));const xe=a(i),Re=a(i);ve.onSuccess((({data:e,args:t,method:r})=>{const[n,o,s]=at(t),{total:a}=te(r)||{},c=e;Z.v=a!==i?a:k(c),o||((async(e,t=[])=>{const r=K.v-1,n=de(r,t);R&&await ye({rawData:e,preloadPage:r,fetchMethod:n})&&f(ie(n,...t,i),P)})(c,s),Se(c,l,s));const u=J.v,d=oe(c);if(ot(x(d),"Got wrong array, did you return the correct array of list in `data` function"),T){if(B.current&&(X.v=[]),n===i)X.v=[...X.v,...d];else if(n){const e=[...X.v];b(e,(n-1)*u,u,...d),X.v=e}}else X.v=d})).onSuccess((({data:e})=>{var t;null===(t=xe.current)||void 0===t||t.call(xe,e)})).onError((({error:e})=>{var t;null===(t=Re.current)||void 0===t||t.call(Re,e)})).onComplete((()=>{B.current=l}));const _e=e=>{const t=X.v.indexOf(e);return ot(t>=0,"item is not found in list"),t},{addQueue:ke,onComplete:Ce}=a(Y()).current,Me=async(t=K.v)=>{let r=t,n=o();if(T){if(!q(t)){const e=_e(t);r=Math.floor(e/J.v)+1}ot(r<=K.v,"refresh page can't greater than page"),n=pe(r,u)}else ot(q(r),"unable to calculate refresh page by item in pagination mode"),n=r===K.v?pe(i,u):ie(e(r,J.v),u);return n},Te=async(e=l)=>{const r=K.v,n=ee();let o=v(n);if(e)ne();else{const e=y(S([te(r-1),te(r),te(r+1)],Boolean),(({entity:e})=>W(e)));o=y(S(h(n),(t=>!C(e,t))),(e=>{const t=n[e];return delete n[e],t}))}await t.invalidateCache(y(o,(({entity:e})=>e)))},je=async()=>{le.current&&ce(),await Te();const e=te(K.v+1);if(e){const r=oe(await t.queryCache(e.entity)||{})||[];Se(i,E(r){if(0===e)return;const t=Z.v;if(q(t)){const r=Math.max(t+e,0);Z.v=r;const n=K.v;p([te(n-1),te(n),te(n+1)],(e=>{e&&(e.total=r)}))}},Oe=(e,r=0)=>(Ce(je),ke((async()=>{const n=q(r)?r:_e(r)+1;let o=i;const s=[...X.v];if(E(s)%J.v==0&&(o=s.pop()),b(s,n,0,e),X.v=s,Pe(1),await Ee(),o){const e=te(K.v+1);e&&await t.setCache(e.entity,(e=>{if(e){const t=oe(e)||[];return t.unshift(o),t.pop(),e}}))}}))),He=(...e)=>(Ce(je),ke((async()=>{const r=y(e,(e=>{const t=q(e)?e:_e(e);return st(t,X.v),t})),n=K.v,o=te(n+1),s=[];o&&await t.setCache(o.entity,(e=>{if(e){const t=oe(e);return x(t)&&g(s,...b(t,0,E(r))),e}}));const a=be.v,i=E(s);let c=!1;if(i>0||a){const e=S(X.v,((e,t)=>!C(r,t)));c=!T&&a&&E(e)<=0,!c&&i>0&&g(e,...s),X.v=e}else i<=0&&!a&&Me(n);return Pe(-E(r)),Ee().then((()=>{c&&(K.v=n-1)}))}))),qe=(e,t)=>ke((async()=>{ot(t!==i,"expect specify the replace position");const r=q(t)?t:_e(t);st(r,X.v);const n=[...X.v];b(n,r,1,e),X.v=n,await Ee()})),De=async()=>{await Te(u),B.current=u,K.v===O?f(pe(),P):K.v=O;const{resolve:e,reject:t,promise:r}=I();return xe.current=e,Re.current=t,r};return fe.current={refresh:Me,insert:Oe,remove:He,replace:qe,reload:De},d({...ve,...m([X,K,me,J,Z,be]),send:(...e)=>pe(...e,i,i),fetching:se.loading,onFetchSuccess:se.onSuccess,onFetchError:se.onError,onFetchComplete:se.onComplete,refresh:Me,insert:Oe,remove:He,replace:qe,reload:De})},e.useRequest=rt,e.useRetriableRequest=(e,r={})=>{const{retry:s=3,backoff:a={delay:1e3},middleware:c=P}=r,{ref:d,exposeProvider:h,__referingObj:v}=we(t.promiseStatesHook()),p=ne(),g=d(0),y=d(i),S=d(i),w=d(i),b=d(l),E=d(i),x=d(I()),R=rt(e,{...r,__referingObj:v,middleware(e,t){c({...e,delegatingActions:{stop:_}},(()=>o()));const{proxyStates:r,args:d,send:h,method:v,controlLoading:R}=e;R();const{loading:k}=r,C=(e=l)=>{k.v=e},M=e=>{C(),r.error.v=e,clearTimeout(E.current),((e,t,r)=>{m((()=>{p.emit(yr,J(Ie,je.spawn(e,t),r,g.current)),y.current=i,g.current=0}))})(v,d,e)};return k.v||f(x.current.promise,(e=>{M(e),x.current=I()})),C(u),b.current=u,S.current=v,w.current=d,t().then((e=>(C(),e)),(e=>{if(!y.current&&(q(s)?g.current{p.emit(gr,J(Ke,je.spawn(v,d),g.current,e)),f(h(...d),P)}),e)}else e=y.current||e,M(e);return t=e,n.reject(t);var t})).finally((()=>{b.current=l}))}}),_=()=>{wr(R.__proxyState("loading").v,"there is no requests being retried"),y.current=J(te,Sr,"stop retry manually"),b.current?R.abort():x.current.reject(y.current)};return h({...R,stop:_,onRetry:e=>{p.on(gr,(t=>e(t)))},onFail:e=>{p.on(yr,(t=>e(t)))}})},e.useSQRequest=function(e,r={}){const{exposeProvider:n,__referingObj:o}=we(t.promiseStatesHook()),{middleware:s=P}=r,{c:a,m:i,b:c,d:u}=cr(e,r),l=rt(a,{...r,__referingObj:o,middleware:(e,t)=>{const r=i(e,t);return s(e,(()=>r)),r}});return u(l),n({...l,...c})},e.useSSE=(e,r={})=>{const{initialData:n,withCredentials:o,interceptByGlobalResponded:s=u,immediate:a=l}=r,c=u;let{memorize:f}=t.promiseStatesHook();null!=f||(f=O);const{create:m,ref:v,onMounted:g,onUnmounted:w,objectify:b,exposeProvider:E}=we(t.promiseStatesHook()),x=v([]),R=v(i),_=v(i),k=m(n,"data"),C=m(Rr.CLOSED,"readyState");let M,T=ye(e);const j=ne(),q=v(new Map),D=v(O),F=v(pe),L=v(P),A=e=>{const{responded:t}=(e=>$(e).options)(e);if(M=t,H(M))D.current=M;else if(M&&U(M)){const{onSuccess:e,onError:t,onComplete:r}=M;D.current=H(e)?e:D.current,F.current=H(t)?t:F.current,L.current=H(r)?r:L.current}},Q=async e=>{const{headers:r,transform:n=O}=N(T),o=await e,s=await n(o,r||{});return k.v=s,t.hitCacheBySource(T),s},z=async(e,t)=>{_r(!!R.current,"EventSource is not initialized");const r=R.current,n=new qe(je.spawn(T,x.current),r);if(e===kr)return Promise.resolve(n);const o=s?D.current:O,a=s?F.current:pe,i=s?L.current:P,c=(u=d(t,(e=>Q(o(e,T))),(e=>Q(a(e,T)))),l=()=>{i(T)},u.finally(l));var u,l;return d(c,(e=>new Fe(n,e)),(e=>new De(n,e)))},W=e=>t=>t.error===i?e(t):j.emit(xr,t),G=f((()=>{var e;C.v=Rr.OPEN,d(z(kr,Promise.resolve()),(e=>j.emit(br,e))),null===(e=_.current)||void 0===e||e.resolve()})),B=f((e=>{var t,r;C.v=Rr.CLOSED,d(z(Cr,Promise.reject(null!==(t=null==e?void 0:e.message)&&void 0!==t?t:"SSE Error")),W((e=>j.emit(Er,e)))),null===(r=_.current)||void 0===r||r.resolve()})),K=f((e=>{d(z(Mr,Promise.resolve(e.data)),W((e=>j.emit(Er,e))))})),V=()=>{const e=R.current;e&&(_.current&&_.current.resolve(),e.close(),e.removeEventListener(kr,G),e.removeEventListener(Cr,B),e.removeEventListener(Mr,K),C.v=Rr.CLOSED,q.current.forEach((([t,r],n)=>{e.removeEventListener(n,r)})))},J=(...t)=>{let r=R.current,n=_.current;r&&c&&V(),n||(n=_.current=I(),n&&n.promise.finally((()=>{n=i}))),x.current=t,T=ye(e,t),A(T);const{params:s}=N(T),{baseURL:a,url:u}=T,l=((e,t,r)=>{e=e.endsWith("/")?e.slice(0,-1):e,""!==t&&(t=t.match(/^(\/|https?:\/\/)/)?t:`/${t}`);const n=e+t,o=y(S(h(r),(e=>r[e]!==i)),(e=>`${e}=${r[e]}`)).join("&");return o?+n.includes("?")?`${n}&${o}`:`${n}?${o}`:n})(a,u,s);return r=new EventSource(l,{withCredentials:o}),R.current=r,C.v=Rr.CONNECTING,r.addEventListener(kr,G),r.addEventListener(Cr,B),r.addEventListener(Mr,K),q.current.forEach((([e,t],n)=>{null==r||r.addEventListener(n,(e=>{d(z(n,Promise.resolve(e.data)),W(t))}))})),n.promise};return w((()=>{V(),j.off(br),j.off(Er),j.off(xr),q.current.forEach((([e,t,r])=>{r()}))})),g((()=>{var e;a&&(J(),null===(e=_.current)||void 0===e||e.promise.catch((()=>{})))})),E({send:J,close:V,on:(e,t)=>{var r;const n=q.current;if(!n.has(e)){const t=function(e=P){let t=[];return[r=>(t.includes(r)||(t.push(r),e(t)),()=>{t=S(t,(e=>e!==r)),e(t)}),(...e)=>{if(t.length>0)return p(t,(t=>t(...e)))},()=>{t=[],e(t)}]}((r=>{var n;0===r.length&&(null===(n=R.current)||void 0===n||n.removeEventListener(e,t[1]),q.current.delete(e))})),o=t[1];n.set(e,t),null===(r=R.current)||void 0===r||r.addEventListener(e,(t=>{d(z(e,Promise.resolve(t.data)),W(o))}))}const[o]=n.get(e);return o(t)},onMessage:e=>{j.on(Er,e)},onError:e=>{j.on(xr,e)},onOpen:e=>{j.on(br,e)},eventSource:R,...b([C,k])})},e.useSerialRequest=(e,r={})=>{it("useSerialRequest",e);const{ref:n,__referingObj:o}=we(t.promiseStatesHook()),s=n([]).current,a=rt(e[0],{...r,__referingObj:o,middleware:ct(e,r.middleware,s)});return a.onError=oe(a.onError,((e,t)=>{t.method=s[E(s)-1],e(t)})),a},e.useSerialWatcher=(e,r,n={})=>{it("useSerialWatcher",e);const{ref:o,__referingObj:s}=we(t.promiseStatesHook()),a=o([]).current,i=nt(e[0],r,{...n,__referingObj:s,middleware:ct(e,n.middleware,a)});return i.onError=oe(i.onError,((e,t)=>{t.method=a[E(a)-1],e(t)})),i},e.useWatcher=nt})); diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/serverhook/index.common.cjs b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/serverhook/index.common.cjs new file mode 100644 index 0000000..67491ce --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/serverhook/index.common.cjs @@ -0,0 +1,865 @@ +/** + * @alova/server 1.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +'use strict'; + +var shared = require('@alova/shared'); +var alova = require('alova'); +var rateLimiterFlexible = require('rate-limiter-flexible'); + +class HookedMethod extends alova.Method { + constructor(entity, requestHandler) { + super(entity.type, entity.context, entity.url, { ...entity.config }); + this.handler = requestHandler; + shared.objAssign(this, { + config: { ...entity.config }, + uhs: entity.uhs, + dhs: entity.dhs + }); + } + send(forceRequest) { + return this.handler(forceRequest); + } +} + +const createServerHook = (hookHandler) => hookHandler; + +function getDefaultExportFromCjs (x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; +} + +var RateLimiterAbstract_1 = class RateLimiterAbstract { + /** + * + * @param opts Object Defaults { + * points: 4, // Number of points + * duration: 1, // Per seconds + * blockDuration: 0, // Block if consumed more than points in current duration for blockDuration seconds + * execEvenly: false, // Execute allowed actions evenly over duration + * execEvenlyMinDelayMs: duration * 1000 / points, // ms, works with execEvenly=true option + * keyPrefix: 'rlflx', + * } + */ + constructor(opts = {}) { + this.points = opts.points; + this.duration = opts.duration; + this.blockDuration = opts.blockDuration; + this.execEvenly = opts.execEvenly; + this.execEvenlyMinDelayMs = opts.execEvenlyMinDelayMs; + this.keyPrefix = opts.keyPrefix; + } + + get points() { + return this._points; + } + + set points(value) { + this._points = value >= 0 ? value : 4; + } + + get duration() { + return this._duration; + } + + set duration(value) { + this._duration = typeof value === 'undefined' ? 1 : value; + } + + get msDuration() { + return this.duration * 1000; + } + + get blockDuration() { + return this._blockDuration; + } + + set blockDuration(value) { + this._blockDuration = typeof value === 'undefined' ? 0 : value; + } + + get msBlockDuration() { + return this.blockDuration * 1000; + } + + get execEvenly() { + return this._execEvenly; + } + + set execEvenly(value) { + this._execEvenly = typeof value === 'undefined' ? false : Boolean(value); + } + + get execEvenlyMinDelayMs() { + return this._execEvenlyMinDelayMs; + } + + set execEvenlyMinDelayMs(value) { + this._execEvenlyMinDelayMs = typeof value === 'undefined' ? Math.ceil(this.msDuration / this.points) : value; + } + + get keyPrefix() { + return this._keyPrefix; + } + + set keyPrefix(value) { + if (typeof value === 'undefined') { + value = 'rlflx'; + } + if (typeof value !== 'string') { + throw new Error('keyPrefix must be string'); + } + this._keyPrefix = value; + } + + _getKeySecDuration(options = {}) { + return options && options.customDuration >= 0 + ? options.customDuration + : this.duration; + } + + getKey(key) { + return this.keyPrefix.length > 0 ? `${this.keyPrefix}:${key}` : key; + } + + parseKey(rlKey) { + return rlKey.substring(this.keyPrefix.length); + } + + consume() { + throw new Error("You have to implement the method 'consume'!"); + } + + penalty() { + throw new Error("You have to implement the method 'penalty'!"); + } + + reward() { + throw new Error("You have to implement the method 'reward'!"); + } + + get() { + throw new Error("You have to implement the method 'get'!"); + } + + set() { + throw new Error("You have to implement the method 'set'!"); + } + + block() { + throw new Error("You have to implement the method 'block'!"); + } + + delete() { + throw new Error("You have to implement the method 'delete'!"); + } +}; + +var BlockedKeys_1$1 = class BlockedKeys { + constructor() { + this._keys = {}; // {'key': 1526279430331} + this._addedKeysAmount = 0; + } + + collectExpired() { + const now = Date.now(); + + Object.keys(this._keys).forEach((key) => { + if (this._keys[key] <= now) { + delete this._keys[key]; + } + }); + + this._addedKeysAmount = Object.keys(this._keys).length; + } + + /** + * Add new blocked key + * + * @param key String + * @param sec Number + */ + add(key, sec) { + this.addMs(key, sec * 1000); + } + + /** + * Add new blocked key for ms + * + * @param key String + * @param ms Number + */ + addMs(key, ms) { + this._keys[key] = Date.now() + ms; + this._addedKeysAmount++; + if (this._addedKeysAmount > 999) { + this.collectExpired(); + } + } + + /** + * 0 means not blocked + * + * @param key + * @returns {number} + */ + msBeforeExpire(key) { + const expire = this._keys[key]; + + if (expire && expire >= Date.now()) { + this.collectExpired(); + const now = Date.now(); + return expire >= now ? expire - now : 0; + } + + return 0; + } + + /** + * If key is not given, delete all data in memory + * + * @param {string|undefined} key + */ + delete(key) { + if (key) { + delete this._keys[key]; + } else { + Object.keys(this._keys).forEach((key) => { + delete this._keys[key]; + }); + } + } +}; + +const BlockedKeys$1 = BlockedKeys_1$1; + +var BlockedKeys_1 = BlockedKeys$1; + +var RateLimiterRes_1 = class RateLimiterRes { + constructor(remainingPoints, msBeforeNext, consumedPoints, isFirstInDuration) { + this.remainingPoints = typeof remainingPoints === 'undefined' ? 0 : remainingPoints; // Remaining points in current duration + this.msBeforeNext = typeof msBeforeNext === 'undefined' ? 0 : msBeforeNext; // Milliseconds before next action + this.consumedPoints = typeof consumedPoints === 'undefined' ? 0 : consumedPoints; // Consumed points in current duration + this.isFirstInDuration = typeof isFirstInDuration === 'undefined' ? false : isFirstInDuration; + } + + get msBeforeNext() { + return this._msBeforeNext; + } + + set msBeforeNext(ms) { + this._msBeforeNext = ms; + return this; + } + + get remainingPoints() { + return this._remainingPoints; + } + + set remainingPoints(p) { + this._remainingPoints = p; + return this; + } + + get consumedPoints() { + return this._consumedPoints; + } + + set consumedPoints(p) { + this._consumedPoints = p; + return this; + } + + get isFirstInDuration() { + return this._isFirstInDuration; + } + + set isFirstInDuration(value) { + this._isFirstInDuration = Boolean(value); + } + + _getDecoratedProperties() { + return { + remainingPoints: this.remainingPoints, + msBeforeNext: this.msBeforeNext, + consumedPoints: this.consumedPoints, + isFirstInDuration: this.isFirstInDuration, + }; + } + + [Symbol.for("nodejs.util.inspect.custom")]() { + return this._getDecoratedProperties(); + } + + toString() { + return JSON.stringify(this._getDecoratedProperties()); + } + + toJSON() { + return this._getDecoratedProperties(); + } +}; + +const RateLimiterAbstract = RateLimiterAbstract_1; +const BlockedKeys = BlockedKeys_1; +const RateLimiterRes = RateLimiterRes_1; + +var RateLimiterStoreAbstract_1 = class RateLimiterStoreAbstract extends RateLimiterAbstract { + /** + * + * @param opts Object Defaults { + * ... see other in RateLimiterAbstract + * + * inMemoryBlockOnConsumed: 40, // Number of points when key is blocked + * inMemoryBlockDuration: 10, // Block duration in seconds + * insuranceLimiter: RateLimiterAbstract + * } + */ + constructor(opts = {}) { + super(opts); + + this.inMemoryBlockOnConsumed = opts.inMemoryBlockOnConsumed; + this.inMemoryBlockDuration = opts.inMemoryBlockDuration; + this.insuranceLimiter = opts.insuranceLimiter; + this._inMemoryBlockedKeys = new BlockedKeys(); + } + + get client() { + return this._client; + } + + set client(value) { + if (typeof value === 'undefined') { + throw new Error('storeClient is not set'); + } + this._client = value; + } + + /** + * Have to be launched after consume + * It blocks key and execute evenly depending on result from store + * + * It uses _getRateLimiterRes function to prepare RateLimiterRes from store result + * + * @param resolve + * @param reject + * @param rlKey + * @param changedPoints + * @param storeResult + * @param {Object} options + * @private + */ + _afterConsume(resolve, reject, rlKey, changedPoints, storeResult, options = {}) { + const res = this._getRateLimiterRes(rlKey, changedPoints, storeResult); + + if (this.inMemoryBlockOnConsumed > 0 && !(this.inMemoryBlockDuration > 0) + && res.consumedPoints >= this.inMemoryBlockOnConsumed + ) { + this._inMemoryBlockedKeys.addMs(rlKey, res.msBeforeNext); + if (res.consumedPoints > this.points) { + return reject(res); + } else { + return resolve(res) + } + } else if (res.consumedPoints > this.points) { + let blockPromise = Promise.resolve(); + // Block only first time when consumed more than points + if (this.blockDuration > 0 && res.consumedPoints <= (this.points + changedPoints)) { + res.msBeforeNext = this.msBlockDuration; + blockPromise = this._block(rlKey, res.consumedPoints, this.msBlockDuration, options); + } + + if (this.inMemoryBlockOnConsumed > 0 && res.consumedPoints >= this.inMemoryBlockOnConsumed) { + // Block key for this.inMemoryBlockDuration seconds + this._inMemoryBlockedKeys.add(rlKey, this.inMemoryBlockDuration); + res.msBeforeNext = this.msInMemoryBlockDuration; + } + + blockPromise + .then(() => { + reject(res); + }) + .catch((err) => { + reject(err); + }); + } else if (this.execEvenly && res.msBeforeNext > 0 && !res.isFirstInDuration) { + let delay = Math.ceil(res.msBeforeNext / (res.remainingPoints + 2)); + if (delay < this.execEvenlyMinDelayMs) { + delay = res.consumedPoints * this.execEvenlyMinDelayMs; + } + + setTimeout(resolve, delay, res); + } else { + resolve(res); + } + } + + _handleError(err, funcName, resolve, reject, key, data = false, options = {}) { + if (!(this.insuranceLimiter instanceof RateLimiterAbstract)) { + reject(err); + } else { + this.insuranceLimiter[funcName](key, data, options) + .then((res) => { + resolve(res); + }) + .catch((res) => { + reject(res); + }); + } + } + + getInMemoryBlockMsBeforeExpire(rlKey) { + if (this.inMemoryBlockOnConsumed > 0) { + return this._inMemoryBlockedKeys.msBeforeExpire(rlKey); + } + + return 0; + } + + get inMemoryBlockOnConsumed() { + return this._inMemoryBlockOnConsumed; + } + + set inMemoryBlockOnConsumed(value) { + this._inMemoryBlockOnConsumed = value ? parseInt(value) : 0; + if (this.inMemoryBlockOnConsumed > 0 && this.points > this.inMemoryBlockOnConsumed) { + throw new Error('inMemoryBlockOnConsumed option must be greater or equal "points" option'); + } + } + + get inMemoryBlockDuration() { + return this._inMemoryBlockDuration; + } + + set inMemoryBlockDuration(value) { + this._inMemoryBlockDuration = value ? parseInt(value) : 0; + if (this.inMemoryBlockDuration > 0 && this.inMemoryBlockOnConsumed === 0) { + throw new Error('inMemoryBlockOnConsumed option must be set up'); + } + } + + get msInMemoryBlockDuration() { + return this._inMemoryBlockDuration * 1000; + } + + get insuranceLimiter() { + return this._insuranceLimiter; + } + + set insuranceLimiter(value) { + if (typeof value !== 'undefined' && !(value instanceof RateLimiterAbstract)) { + throw new Error('insuranceLimiter must be instance of RateLimiterAbstract'); + } + this._insuranceLimiter = value; + if (this._insuranceLimiter) { + this._insuranceLimiter.blockDuration = this.blockDuration; + this._insuranceLimiter.execEvenly = this.execEvenly; + } + } + + /** + * Block any key for secDuration seconds + * + * @param key + * @param secDuration + * @param {Object} options + * + * @return Promise + */ + block(key, secDuration, options = {}) { + const msDuration = secDuration * 1000; + return this._block(this.getKey(key), this.points + 1, msDuration, options); + } + + /** + * Set points by key for any duration + * + * @param key + * @param points + * @param secDuration + * @param {Object} options + * + * @return Promise + */ + set(key, points, secDuration, options = {}) { + const msDuration = (secDuration >= 0 ? secDuration : this.duration) * 1000; + return this._block(this.getKey(key), points, msDuration, options); + } + + /** + * + * @param key + * @param pointsToConsume + * @param {Object} options + * @returns Promise + */ + consume(key, pointsToConsume = 1, options = {}) { + return new Promise((resolve, reject) => { + const rlKey = this.getKey(key); + + const inMemoryBlockMsBeforeExpire = this.getInMemoryBlockMsBeforeExpire(rlKey); + if (inMemoryBlockMsBeforeExpire > 0) { + return reject(new RateLimiterRes(0, inMemoryBlockMsBeforeExpire)); + } + + this._upsert(rlKey, pointsToConsume, this._getKeySecDuration(options) * 1000, false, options) + .then((res) => { + this._afterConsume(resolve, reject, rlKey, pointsToConsume, res); + }) + .catch((err) => { + this._handleError(err, 'consume', resolve, reject, key, pointsToConsume, options); + }); + }); + } + + /** + * + * @param key + * @param points + * @param {Object} options + * @returns Promise + */ + penalty(key, points = 1, options = {}) { + const rlKey = this.getKey(key); + return new Promise((resolve, reject) => { + this._upsert(rlKey, points, this._getKeySecDuration(options) * 1000, false, options) + .then((res) => { + resolve(this._getRateLimiterRes(rlKey, points, res)); + }) + .catch((err) => { + this._handleError(err, 'penalty', resolve, reject, key, points, options); + }); + }); + } + + /** + * + * @param key + * @param points + * @param {Object} options + * @returns Promise + */ + reward(key, points = 1, options = {}) { + const rlKey = this.getKey(key); + return new Promise((resolve, reject) => { + this._upsert(rlKey, -points, this._getKeySecDuration(options) * 1000, false, options) + .then((res) => { + resolve(this._getRateLimiterRes(rlKey, -points, res)); + }) + .catch((err) => { + this._handleError(err, 'reward', resolve, reject, key, points, options); + }); + }); + } + + /** + * + * @param key + * @param {Object} options + * @returns Promise|null + */ + get(key, options = {}) { + const rlKey = this.getKey(key); + return new Promise((resolve, reject) => { + this._get(rlKey, options) + .then((res) => { + if (res === null || typeof res === 'undefined') { + resolve(null); + } else { + resolve(this._getRateLimiterRes(rlKey, 0, res)); + } + }) + .catch((err) => { + this._handleError(err, 'get', resolve, reject, key, options); + }); + }); + } + + /** + * + * @param key + * @param {Object} options + * @returns Promise + */ + delete(key, options = {}) { + const rlKey = this.getKey(key); + return new Promise((resolve, reject) => { + this._delete(rlKey, options) + .then((res) => { + this._inMemoryBlockedKeys.delete(rlKey); + resolve(res); + }) + .catch((err) => { + this._handleError(err, 'delete', resolve, reject, key, options); + }); + }); + } + + /** + * Cleanup keys no-matter expired or not. + */ + deleteInMemoryBlockedAll() { + this._inMemoryBlockedKeys.delete(); + } + + /** + * Get RateLimiterRes object filled depending on storeResult, which specific for exact store + * + * @param rlKey + * @param changedPoints + * @param storeResult + * @private + */ + _getRateLimiterRes(rlKey, changedPoints, storeResult) { // eslint-disable-line no-unused-vars + throw new Error("You have to implement the method '_getRateLimiterRes'!"); + } + + /** + * Block key for this.msBlockDuration milliseconds + * Usually, it just prolongs lifetime of key + * + * @param rlKey + * @param initPoints + * @param msDuration + * @param {Object} options + * + * @return Promise + */ + _block(rlKey, initPoints, msDuration, options = {}) { + return new Promise((resolve, reject) => { + this._upsert(rlKey, initPoints, msDuration, true, options) + .then(() => { + resolve(new RateLimiterRes(0, msDuration > 0 ? msDuration : -1, initPoints)); + }) + .catch((err) => { + this._handleError(err, 'block', resolve, reject, this.parseKey(rlKey), msDuration / 1000, options); + }); + }); + } + + /** + * Have to be implemented in every limiter + * Resolve with raw result from Store OR null if rlKey is not set + * or Reject with error + * + * @param rlKey + * @param {Object} options + * @private + * + * @return Promise + */ + _get(rlKey, options = {}) { // eslint-disable-line no-unused-vars + throw new Error("You have to implement the method '_get'!"); + } + + /** + * Have to be implemented + * Resolve with true OR false if rlKey doesn't exist + * or Reject with error + * + * @param rlKey + * @param {Object} options + * @private + * + * @return Promise + */ + _delete(rlKey, options = {}) { // eslint-disable-line no-unused-vars + throw new Error("You have to implement the method '_delete'!"); + } + + /** + * Have to be implemented + * Resolve with object used for {@link _getRateLimiterRes} to generate {@link RateLimiterRes} + * + * @param {string} rlKey + * @param {number} points + * @param {number} msDuration + * @param {boolean} forceExpire + * @param {Object} options + * @abstract + * + * @return Promise + */ + _upsert(rlKey, points, msDuration, forceExpire = false, options = {}) { + throw new Error("You have to implement the method '_upsert'!"); + } +}; + +var RateLimiterStoreAbstract = /*@__PURE__*/getDefaultExportFromCjs(RateLimiterStoreAbstract_1); + +const assert = shared.createAssert('RateLimit'); +class RateLimiterStore extends RateLimiterStoreAbstract { + constructor(storage, options) { + super(options); + this.storage = storage; + } + /** + * parses raw data from store to RateLimiterRes object. + */ + _getRateLimiterRes(key, changedPoints, result) { + const [consumed = 0, expireTime = 0] = result !== null && result !== void 0 ? result : []; + const msBeforeNext = expireTime > 0 ? Math.max(expireTime - Date.now(), 0) : -1; + const isFirstInDuration = !consumed || changedPoints === consumed; + const currentConsumedPoints = isFirstInDuration ? changedPoints : consumed; + const res = new rateLimiterFlexible.RateLimiterRes(Math.max(0, this.points - currentConsumedPoints), msBeforeNext, isFirstInDuration ? changedPoints : consumed, isFirstInDuration); + return res; + } + async _upsert(key, points, msDuration, forceExpire = false) { + var _a; + key = key.toString(); + const isNeverExpired = msDuration <= 0; + const expireTime = isNeverExpired ? -1 : Date.now() + msDuration; + const newRecord = [points, expireTime]; + if (!forceExpire) { + const [oldPoints = 0, oldExpireTime = 0] = ((_a = (await this.storage.get(key))) !== null && _a !== void 0 ? _a : []); + // if haven't expired yet + if (isNeverExpired || (!isNeverExpired && oldExpireTime > Date.now())) { + newRecord[0] += oldPoints; + } + if (!isNeverExpired && oldExpireTime > Date.now()) { + newRecord[1] = oldExpireTime; + } + } + await this.storage.set(key.toString(), newRecord); + // need to return the record after upsert + return newRecord; + } + /** + * returns raw data by key or null if there is no key or expired. + */ + async _get(key) { + return Promise.resolve(this.storage.get(key.toString())).then(res => { + if (!res) { + return null; + } + const [, expireTime] = res; + // if have expire time and it has expired + if (expireTime > 0 && expireTime <= Date.now()) { + return null; + } + return res; + }); + } + /** + * returns true on deleted, false if key is not found. + */ + async _delete(key) { + try { + await this.storage.remove(key.toString()); + } + catch (_a) { + return false; + } + return true; + } +} +/** + * The method instance modified by rateLimit, its extension method corresponds to the method of creating an instance in rate-limit-flexible, and the key is the key specified by calling rateLimit. + * AlovaServerHook can currently only return unextended method types. It has not been changed to customizable returned extended method types. + */ +class LimitedMethod extends HookedMethod { + constructor(method, limiterKey, limiter) { + super(method, force => this.consume().then(() => method.send(force))); + this.limiter = limiter; + this.keyGetter = shared.isFn(limiterKey) ? () => limiterKey(method) : () => limiterKey; + } + getLimiterKey() { + return this.keyGetter(); + } + /** + * Get RateLimiterRes or null. + */ + get(options) { + return this.limiter.get(this.getLimiterKey(), options); + } + /** + * Set points by key. + */ + set(points, msDuration) { + return this.limiter.set(this.getLimiterKey(), points, msDuration / 1000); + } + /** + * @param points default is 1 + */ + consume(points) { + return this.limiter.consume(this.getLimiterKey(), points); + } + /** + * Increase number of consumed points in current duration. + * @param points penalty points + */ + penalty(points) { + return this.limiter.penalty(this.getLimiterKey(), points); + } + /** + * Decrease number of consumed points in current duration. + * @param points reward points + */ + reward(points) { + return this.limiter.reward(this.getLimiterKey(), points); + } + /** + * Block key for ms. + */ + block(msDuration) { + return this.limiter.block(this.getLimiterKey(), msDuration / 1000); + } + /** + * Reset consumed points. + */ + delete() { + return this.limiter.delete(this.getLimiterKey()); + } +} +function createRateLimiter(options = {}) { + const { points = 4, duration = 4 * 1000, keyPrefix, execEvenly, execEvenlyMinDelayMs, blockDuration } = options; + const limitedMethodWrapper = createServerHook((method, handlerOptions = {}) => { + var _a; + const { key = shared.uuid() } = handlerOptions; + const storage = (_a = options.storage) !== null && _a !== void 0 ? _a : shared.getOptions(method).l2Cache; + assert(!!storage, 'storage is not define'); + const limiter = new RateLimiterStore(storage, { + points, + duration: Math.floor(duration / 1000), + keyPrefix, + execEvenly, + execEvenlyMinDelayMs, + blockDuration: blockDuration ? Math.floor(blockDuration / 1000) : blockDuration, + storeClient: {} + }); + return new LimitedMethod(method, key, limiter); + }); + return limitedMethodWrapper; +} + +const retry = createServerHook((method, options = {}) => { + const { retry = 3, backoff = { delay: 1000 } } = options; + let retryTimes = 0; + return new HookedMethod(method, forceRequest => new Promise((resolve, reject) => { + const sendRequest = () => { + method + .send(forceRequest) + .then(resolve) + .catch(error => { + // when not reach retry times or return true from retry function, it will retry again. + if (shared.isNumber(retry) ? retryTimes < retry : retry(error)) { + retryTimes += 1; + // calculate retry delay time with pram `backoff` and current retry times. + const retryDelay = shared.delayWithBackoff(backoff, retryTimes); + setTimeout(sendRequest, retryDelay); + } + else { + reject(error); + } + }); + }; + sendRequest(); + })); +}); + +exports.HookedMethod = HookedMethod; +exports.createRateLimiter = createRateLimiter; +exports.retry = retry; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/serverhook/index.esm.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/serverhook/index.esm.js new file mode 100644 index 0000000..1cd3fdc --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/serverhook/index.esm.js @@ -0,0 +1,861 @@ +/** + * @alova/server 1.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +import { objAssign, createAssert, uuid, getOptions, isFn, isNumber, delayWithBackoff } from '@alova/shared'; +import { Method } from 'alova'; +import { RateLimiterRes as RateLimiterRes$1 } from 'rate-limiter-flexible'; + +class HookedMethod extends Method { + constructor(entity, requestHandler) { + super(entity.type, entity.context, entity.url, { ...entity.config }); + this.handler = requestHandler; + objAssign(this, { + config: { ...entity.config }, + uhs: entity.uhs, + dhs: entity.dhs + }); + } + send(forceRequest) { + return this.handler(forceRequest); + } +} + +const createServerHook = (hookHandler) => hookHandler; + +function getDefaultExportFromCjs (x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; +} + +var RateLimiterAbstract_1 = class RateLimiterAbstract { + /** + * + * @param opts Object Defaults { + * points: 4, // Number of points + * duration: 1, // Per seconds + * blockDuration: 0, // Block if consumed more than points in current duration for blockDuration seconds + * execEvenly: false, // Execute allowed actions evenly over duration + * execEvenlyMinDelayMs: duration * 1000 / points, // ms, works with execEvenly=true option + * keyPrefix: 'rlflx', + * } + */ + constructor(opts = {}) { + this.points = opts.points; + this.duration = opts.duration; + this.blockDuration = opts.blockDuration; + this.execEvenly = opts.execEvenly; + this.execEvenlyMinDelayMs = opts.execEvenlyMinDelayMs; + this.keyPrefix = opts.keyPrefix; + } + + get points() { + return this._points; + } + + set points(value) { + this._points = value >= 0 ? value : 4; + } + + get duration() { + return this._duration; + } + + set duration(value) { + this._duration = typeof value === 'undefined' ? 1 : value; + } + + get msDuration() { + return this.duration * 1000; + } + + get blockDuration() { + return this._blockDuration; + } + + set blockDuration(value) { + this._blockDuration = typeof value === 'undefined' ? 0 : value; + } + + get msBlockDuration() { + return this.blockDuration * 1000; + } + + get execEvenly() { + return this._execEvenly; + } + + set execEvenly(value) { + this._execEvenly = typeof value === 'undefined' ? false : Boolean(value); + } + + get execEvenlyMinDelayMs() { + return this._execEvenlyMinDelayMs; + } + + set execEvenlyMinDelayMs(value) { + this._execEvenlyMinDelayMs = typeof value === 'undefined' ? Math.ceil(this.msDuration / this.points) : value; + } + + get keyPrefix() { + return this._keyPrefix; + } + + set keyPrefix(value) { + if (typeof value === 'undefined') { + value = 'rlflx'; + } + if (typeof value !== 'string') { + throw new Error('keyPrefix must be string'); + } + this._keyPrefix = value; + } + + _getKeySecDuration(options = {}) { + return options && options.customDuration >= 0 + ? options.customDuration + : this.duration; + } + + getKey(key) { + return this.keyPrefix.length > 0 ? `${this.keyPrefix}:${key}` : key; + } + + parseKey(rlKey) { + return rlKey.substring(this.keyPrefix.length); + } + + consume() { + throw new Error("You have to implement the method 'consume'!"); + } + + penalty() { + throw new Error("You have to implement the method 'penalty'!"); + } + + reward() { + throw new Error("You have to implement the method 'reward'!"); + } + + get() { + throw new Error("You have to implement the method 'get'!"); + } + + set() { + throw new Error("You have to implement the method 'set'!"); + } + + block() { + throw new Error("You have to implement the method 'block'!"); + } + + delete() { + throw new Error("You have to implement the method 'delete'!"); + } +}; + +var BlockedKeys_1$1 = class BlockedKeys { + constructor() { + this._keys = {}; // {'key': 1526279430331} + this._addedKeysAmount = 0; + } + + collectExpired() { + const now = Date.now(); + + Object.keys(this._keys).forEach((key) => { + if (this._keys[key] <= now) { + delete this._keys[key]; + } + }); + + this._addedKeysAmount = Object.keys(this._keys).length; + } + + /** + * Add new blocked key + * + * @param key String + * @param sec Number + */ + add(key, sec) { + this.addMs(key, sec * 1000); + } + + /** + * Add new blocked key for ms + * + * @param key String + * @param ms Number + */ + addMs(key, ms) { + this._keys[key] = Date.now() + ms; + this._addedKeysAmount++; + if (this._addedKeysAmount > 999) { + this.collectExpired(); + } + } + + /** + * 0 means not blocked + * + * @param key + * @returns {number} + */ + msBeforeExpire(key) { + const expire = this._keys[key]; + + if (expire && expire >= Date.now()) { + this.collectExpired(); + const now = Date.now(); + return expire >= now ? expire - now : 0; + } + + return 0; + } + + /** + * If key is not given, delete all data in memory + * + * @param {string|undefined} key + */ + delete(key) { + if (key) { + delete this._keys[key]; + } else { + Object.keys(this._keys).forEach((key) => { + delete this._keys[key]; + }); + } + } +}; + +const BlockedKeys$1 = BlockedKeys_1$1; + +var BlockedKeys_1 = BlockedKeys$1; + +var RateLimiterRes_1 = class RateLimiterRes { + constructor(remainingPoints, msBeforeNext, consumedPoints, isFirstInDuration) { + this.remainingPoints = typeof remainingPoints === 'undefined' ? 0 : remainingPoints; // Remaining points in current duration + this.msBeforeNext = typeof msBeforeNext === 'undefined' ? 0 : msBeforeNext; // Milliseconds before next action + this.consumedPoints = typeof consumedPoints === 'undefined' ? 0 : consumedPoints; // Consumed points in current duration + this.isFirstInDuration = typeof isFirstInDuration === 'undefined' ? false : isFirstInDuration; + } + + get msBeforeNext() { + return this._msBeforeNext; + } + + set msBeforeNext(ms) { + this._msBeforeNext = ms; + return this; + } + + get remainingPoints() { + return this._remainingPoints; + } + + set remainingPoints(p) { + this._remainingPoints = p; + return this; + } + + get consumedPoints() { + return this._consumedPoints; + } + + set consumedPoints(p) { + this._consumedPoints = p; + return this; + } + + get isFirstInDuration() { + return this._isFirstInDuration; + } + + set isFirstInDuration(value) { + this._isFirstInDuration = Boolean(value); + } + + _getDecoratedProperties() { + return { + remainingPoints: this.remainingPoints, + msBeforeNext: this.msBeforeNext, + consumedPoints: this.consumedPoints, + isFirstInDuration: this.isFirstInDuration, + }; + } + + [Symbol.for("nodejs.util.inspect.custom")]() { + return this._getDecoratedProperties(); + } + + toString() { + return JSON.stringify(this._getDecoratedProperties()); + } + + toJSON() { + return this._getDecoratedProperties(); + } +}; + +const RateLimiterAbstract = RateLimiterAbstract_1; +const BlockedKeys = BlockedKeys_1; +const RateLimiterRes = RateLimiterRes_1; + +var RateLimiterStoreAbstract_1 = class RateLimiterStoreAbstract extends RateLimiterAbstract { + /** + * + * @param opts Object Defaults { + * ... see other in RateLimiterAbstract + * + * inMemoryBlockOnConsumed: 40, // Number of points when key is blocked + * inMemoryBlockDuration: 10, // Block duration in seconds + * insuranceLimiter: RateLimiterAbstract + * } + */ + constructor(opts = {}) { + super(opts); + + this.inMemoryBlockOnConsumed = opts.inMemoryBlockOnConsumed; + this.inMemoryBlockDuration = opts.inMemoryBlockDuration; + this.insuranceLimiter = opts.insuranceLimiter; + this._inMemoryBlockedKeys = new BlockedKeys(); + } + + get client() { + return this._client; + } + + set client(value) { + if (typeof value === 'undefined') { + throw new Error('storeClient is not set'); + } + this._client = value; + } + + /** + * Have to be launched after consume + * It blocks key and execute evenly depending on result from store + * + * It uses _getRateLimiterRes function to prepare RateLimiterRes from store result + * + * @param resolve + * @param reject + * @param rlKey + * @param changedPoints + * @param storeResult + * @param {Object} options + * @private + */ + _afterConsume(resolve, reject, rlKey, changedPoints, storeResult, options = {}) { + const res = this._getRateLimiterRes(rlKey, changedPoints, storeResult); + + if (this.inMemoryBlockOnConsumed > 0 && !(this.inMemoryBlockDuration > 0) + && res.consumedPoints >= this.inMemoryBlockOnConsumed + ) { + this._inMemoryBlockedKeys.addMs(rlKey, res.msBeforeNext); + if (res.consumedPoints > this.points) { + return reject(res); + } else { + return resolve(res) + } + } else if (res.consumedPoints > this.points) { + let blockPromise = Promise.resolve(); + // Block only first time when consumed more than points + if (this.blockDuration > 0 && res.consumedPoints <= (this.points + changedPoints)) { + res.msBeforeNext = this.msBlockDuration; + blockPromise = this._block(rlKey, res.consumedPoints, this.msBlockDuration, options); + } + + if (this.inMemoryBlockOnConsumed > 0 && res.consumedPoints >= this.inMemoryBlockOnConsumed) { + // Block key for this.inMemoryBlockDuration seconds + this._inMemoryBlockedKeys.add(rlKey, this.inMemoryBlockDuration); + res.msBeforeNext = this.msInMemoryBlockDuration; + } + + blockPromise + .then(() => { + reject(res); + }) + .catch((err) => { + reject(err); + }); + } else if (this.execEvenly && res.msBeforeNext > 0 && !res.isFirstInDuration) { + let delay = Math.ceil(res.msBeforeNext / (res.remainingPoints + 2)); + if (delay < this.execEvenlyMinDelayMs) { + delay = res.consumedPoints * this.execEvenlyMinDelayMs; + } + + setTimeout(resolve, delay, res); + } else { + resolve(res); + } + } + + _handleError(err, funcName, resolve, reject, key, data = false, options = {}) { + if (!(this.insuranceLimiter instanceof RateLimiterAbstract)) { + reject(err); + } else { + this.insuranceLimiter[funcName](key, data, options) + .then((res) => { + resolve(res); + }) + .catch((res) => { + reject(res); + }); + } + } + + getInMemoryBlockMsBeforeExpire(rlKey) { + if (this.inMemoryBlockOnConsumed > 0) { + return this._inMemoryBlockedKeys.msBeforeExpire(rlKey); + } + + return 0; + } + + get inMemoryBlockOnConsumed() { + return this._inMemoryBlockOnConsumed; + } + + set inMemoryBlockOnConsumed(value) { + this._inMemoryBlockOnConsumed = value ? parseInt(value) : 0; + if (this.inMemoryBlockOnConsumed > 0 && this.points > this.inMemoryBlockOnConsumed) { + throw new Error('inMemoryBlockOnConsumed option must be greater or equal "points" option'); + } + } + + get inMemoryBlockDuration() { + return this._inMemoryBlockDuration; + } + + set inMemoryBlockDuration(value) { + this._inMemoryBlockDuration = value ? parseInt(value) : 0; + if (this.inMemoryBlockDuration > 0 && this.inMemoryBlockOnConsumed === 0) { + throw new Error('inMemoryBlockOnConsumed option must be set up'); + } + } + + get msInMemoryBlockDuration() { + return this._inMemoryBlockDuration * 1000; + } + + get insuranceLimiter() { + return this._insuranceLimiter; + } + + set insuranceLimiter(value) { + if (typeof value !== 'undefined' && !(value instanceof RateLimiterAbstract)) { + throw new Error('insuranceLimiter must be instance of RateLimiterAbstract'); + } + this._insuranceLimiter = value; + if (this._insuranceLimiter) { + this._insuranceLimiter.blockDuration = this.blockDuration; + this._insuranceLimiter.execEvenly = this.execEvenly; + } + } + + /** + * Block any key for secDuration seconds + * + * @param key + * @param secDuration + * @param {Object} options + * + * @return Promise + */ + block(key, secDuration, options = {}) { + const msDuration = secDuration * 1000; + return this._block(this.getKey(key), this.points + 1, msDuration, options); + } + + /** + * Set points by key for any duration + * + * @param key + * @param points + * @param secDuration + * @param {Object} options + * + * @return Promise + */ + set(key, points, secDuration, options = {}) { + const msDuration = (secDuration >= 0 ? secDuration : this.duration) * 1000; + return this._block(this.getKey(key), points, msDuration, options); + } + + /** + * + * @param key + * @param pointsToConsume + * @param {Object} options + * @returns Promise + */ + consume(key, pointsToConsume = 1, options = {}) { + return new Promise((resolve, reject) => { + const rlKey = this.getKey(key); + + const inMemoryBlockMsBeforeExpire = this.getInMemoryBlockMsBeforeExpire(rlKey); + if (inMemoryBlockMsBeforeExpire > 0) { + return reject(new RateLimiterRes(0, inMemoryBlockMsBeforeExpire)); + } + + this._upsert(rlKey, pointsToConsume, this._getKeySecDuration(options) * 1000, false, options) + .then((res) => { + this._afterConsume(resolve, reject, rlKey, pointsToConsume, res); + }) + .catch((err) => { + this._handleError(err, 'consume', resolve, reject, key, pointsToConsume, options); + }); + }); + } + + /** + * + * @param key + * @param points + * @param {Object} options + * @returns Promise + */ + penalty(key, points = 1, options = {}) { + const rlKey = this.getKey(key); + return new Promise((resolve, reject) => { + this._upsert(rlKey, points, this._getKeySecDuration(options) * 1000, false, options) + .then((res) => { + resolve(this._getRateLimiterRes(rlKey, points, res)); + }) + .catch((err) => { + this._handleError(err, 'penalty', resolve, reject, key, points, options); + }); + }); + } + + /** + * + * @param key + * @param points + * @param {Object} options + * @returns Promise + */ + reward(key, points = 1, options = {}) { + const rlKey = this.getKey(key); + return new Promise((resolve, reject) => { + this._upsert(rlKey, -points, this._getKeySecDuration(options) * 1000, false, options) + .then((res) => { + resolve(this._getRateLimiterRes(rlKey, -points, res)); + }) + .catch((err) => { + this._handleError(err, 'reward', resolve, reject, key, points, options); + }); + }); + } + + /** + * + * @param key + * @param {Object} options + * @returns Promise|null + */ + get(key, options = {}) { + const rlKey = this.getKey(key); + return new Promise((resolve, reject) => { + this._get(rlKey, options) + .then((res) => { + if (res === null || typeof res === 'undefined') { + resolve(null); + } else { + resolve(this._getRateLimiterRes(rlKey, 0, res)); + } + }) + .catch((err) => { + this._handleError(err, 'get', resolve, reject, key, options); + }); + }); + } + + /** + * + * @param key + * @param {Object} options + * @returns Promise + */ + delete(key, options = {}) { + const rlKey = this.getKey(key); + return new Promise((resolve, reject) => { + this._delete(rlKey, options) + .then((res) => { + this._inMemoryBlockedKeys.delete(rlKey); + resolve(res); + }) + .catch((err) => { + this._handleError(err, 'delete', resolve, reject, key, options); + }); + }); + } + + /** + * Cleanup keys no-matter expired or not. + */ + deleteInMemoryBlockedAll() { + this._inMemoryBlockedKeys.delete(); + } + + /** + * Get RateLimiterRes object filled depending on storeResult, which specific for exact store + * + * @param rlKey + * @param changedPoints + * @param storeResult + * @private + */ + _getRateLimiterRes(rlKey, changedPoints, storeResult) { // eslint-disable-line no-unused-vars + throw new Error("You have to implement the method '_getRateLimiterRes'!"); + } + + /** + * Block key for this.msBlockDuration milliseconds + * Usually, it just prolongs lifetime of key + * + * @param rlKey + * @param initPoints + * @param msDuration + * @param {Object} options + * + * @return Promise + */ + _block(rlKey, initPoints, msDuration, options = {}) { + return new Promise((resolve, reject) => { + this._upsert(rlKey, initPoints, msDuration, true, options) + .then(() => { + resolve(new RateLimiterRes(0, msDuration > 0 ? msDuration : -1, initPoints)); + }) + .catch((err) => { + this._handleError(err, 'block', resolve, reject, this.parseKey(rlKey), msDuration / 1000, options); + }); + }); + } + + /** + * Have to be implemented in every limiter + * Resolve with raw result from Store OR null if rlKey is not set + * or Reject with error + * + * @param rlKey + * @param {Object} options + * @private + * + * @return Promise + */ + _get(rlKey, options = {}) { // eslint-disable-line no-unused-vars + throw new Error("You have to implement the method '_get'!"); + } + + /** + * Have to be implemented + * Resolve with true OR false if rlKey doesn't exist + * or Reject with error + * + * @param rlKey + * @param {Object} options + * @private + * + * @return Promise + */ + _delete(rlKey, options = {}) { // eslint-disable-line no-unused-vars + throw new Error("You have to implement the method '_delete'!"); + } + + /** + * Have to be implemented + * Resolve with object used for {@link _getRateLimiterRes} to generate {@link RateLimiterRes} + * + * @param {string} rlKey + * @param {number} points + * @param {number} msDuration + * @param {boolean} forceExpire + * @param {Object} options + * @abstract + * + * @return Promise + */ + _upsert(rlKey, points, msDuration, forceExpire = false, options = {}) { + throw new Error("You have to implement the method '_upsert'!"); + } +}; + +var RateLimiterStoreAbstract = /*@__PURE__*/getDefaultExportFromCjs(RateLimiterStoreAbstract_1); + +const assert = createAssert('RateLimit'); +class RateLimiterStore extends RateLimiterStoreAbstract { + constructor(storage, options) { + super(options); + this.storage = storage; + } + /** + * parses raw data from store to RateLimiterRes object. + */ + _getRateLimiterRes(key, changedPoints, result) { + const [consumed = 0, expireTime = 0] = result !== null && result !== void 0 ? result : []; + const msBeforeNext = expireTime > 0 ? Math.max(expireTime - Date.now(), 0) : -1; + const isFirstInDuration = !consumed || changedPoints === consumed; + const currentConsumedPoints = isFirstInDuration ? changedPoints : consumed; + const res = new RateLimiterRes$1(Math.max(0, this.points - currentConsumedPoints), msBeforeNext, isFirstInDuration ? changedPoints : consumed, isFirstInDuration); + return res; + } + async _upsert(key, points, msDuration, forceExpire = false) { + var _a; + key = key.toString(); + const isNeverExpired = msDuration <= 0; + const expireTime = isNeverExpired ? -1 : Date.now() + msDuration; + const newRecord = [points, expireTime]; + if (!forceExpire) { + const [oldPoints = 0, oldExpireTime = 0] = ((_a = (await this.storage.get(key))) !== null && _a !== void 0 ? _a : []); + // if haven't expired yet + if (isNeverExpired || (!isNeverExpired && oldExpireTime > Date.now())) { + newRecord[0] += oldPoints; + } + if (!isNeverExpired && oldExpireTime > Date.now()) { + newRecord[1] = oldExpireTime; + } + } + await this.storage.set(key.toString(), newRecord); + // need to return the record after upsert + return newRecord; + } + /** + * returns raw data by key or null if there is no key or expired. + */ + async _get(key) { + return Promise.resolve(this.storage.get(key.toString())).then(res => { + if (!res) { + return null; + } + const [, expireTime] = res; + // if have expire time and it has expired + if (expireTime > 0 && expireTime <= Date.now()) { + return null; + } + return res; + }); + } + /** + * returns true on deleted, false if key is not found. + */ + async _delete(key) { + try { + await this.storage.remove(key.toString()); + } + catch (_a) { + return false; + } + return true; + } +} +/** + * The method instance modified by rateLimit, its extension method corresponds to the method of creating an instance in rate-limit-flexible, and the key is the key specified by calling rateLimit. + * AlovaServerHook can currently only return unextended method types. It has not been changed to customizable returned extended method types. + */ +class LimitedMethod extends HookedMethod { + constructor(method, limiterKey, limiter) { + super(method, force => this.consume().then(() => method.send(force))); + this.limiter = limiter; + this.keyGetter = isFn(limiterKey) ? () => limiterKey(method) : () => limiterKey; + } + getLimiterKey() { + return this.keyGetter(); + } + /** + * Get RateLimiterRes or null. + */ + get(options) { + return this.limiter.get(this.getLimiterKey(), options); + } + /** + * Set points by key. + */ + set(points, msDuration) { + return this.limiter.set(this.getLimiterKey(), points, msDuration / 1000); + } + /** + * @param points default is 1 + */ + consume(points) { + return this.limiter.consume(this.getLimiterKey(), points); + } + /** + * Increase number of consumed points in current duration. + * @param points penalty points + */ + penalty(points) { + return this.limiter.penalty(this.getLimiterKey(), points); + } + /** + * Decrease number of consumed points in current duration. + * @param points reward points + */ + reward(points) { + return this.limiter.reward(this.getLimiterKey(), points); + } + /** + * Block key for ms. + */ + block(msDuration) { + return this.limiter.block(this.getLimiterKey(), msDuration / 1000); + } + /** + * Reset consumed points. + */ + delete() { + return this.limiter.delete(this.getLimiterKey()); + } +} +function createRateLimiter(options = {}) { + const { points = 4, duration = 4 * 1000, keyPrefix, execEvenly, execEvenlyMinDelayMs, blockDuration } = options; + const limitedMethodWrapper = createServerHook((method, handlerOptions = {}) => { + var _a; + const { key = uuid() } = handlerOptions; + const storage = (_a = options.storage) !== null && _a !== void 0 ? _a : getOptions(method).l2Cache; + assert(!!storage, 'storage is not define'); + const limiter = new RateLimiterStore(storage, { + points, + duration: Math.floor(duration / 1000), + keyPrefix, + execEvenly, + execEvenlyMinDelayMs, + blockDuration: blockDuration ? Math.floor(blockDuration / 1000) : blockDuration, + storeClient: {} + }); + return new LimitedMethod(method, key, limiter); + }); + return limitedMethodWrapper; +} + +const retry = createServerHook((method, options = {}) => { + const { retry = 3, backoff = { delay: 1000 } } = options; + let retryTimes = 0; + return new HookedMethod(method, forceRequest => new Promise((resolve, reject) => { + const sendRequest = () => { + method + .send(forceRequest) + .then(resolve) + .catch(error => { + // when not reach retry times or return true from retry function, it will retry again. + if (isNumber(retry) ? retryTimes < retry : retry(error)) { + retryTimes += 1; + // calculate retry delay time with pram `backoff` and current retry times. + const retryDelay = delayWithBackoff(backoff, retryTimes); + setTimeout(sendRequest, retryDelay); + } + else { + reject(error); + } + }); + }; + sendRequest(); + })); +}); + +export { HookedMethod, createRateLimiter, retry }; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.common.cjs b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.common.cjs new file mode 100644 index 0000000..5325a58 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.common.cjs @@ -0,0 +1,86 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +'use strict'; + +var shared = require('@alova/shared'); +var react$1 = require('react'); + +const stateToData = (reactState) => (2 in reactState ? reactState[2] : reactState[0]); +const refCurrent = (ref) => ref.current; +const setRef = (ref, newVal) => { + ref.current = newVal; +}; +// the react predefined hooks +var react = { + name: 'React', + create: initialValue => react$1.useState(initialValue), + export: stateToData, + dehydrate: stateToData, + update: (newVal, state) => { + // update value synchronously so that we can access the new value synchronously. + state[2] = newVal; + state[1](newVal); + }, + memorize: fn => { + // use `useCallback` to ensure the same reference, and refer the newest function with `useRef` + const fnRef = react$1.useRef(shared.noop); + setRef(fnRef, fn); + return react$1.useCallback((...args) => refCurrent(fnRef)(...args), []); + }, + ref: initialValue => { + const refObj = react$1.useRef(initialValue); + refCurrent(refObj) === shared.undefinedValue && setRef(refObj, initialValue); + return refObj; + }, + effectRequest({ handler, removeStates, saveStates, immediate, frontStates, watchingStates = [] }) { + // `handler` is called when some states change are detected + const oldStates = react$1.useRef(watchingStates); + react$1.useEffect(() => { + const oldStatesValue = refCurrent(oldStates); + // compare the old and new value, and get the index of changed state + let changedIndex = shared.undefinedValue; + for (const index in watchingStates) { + if (!Object.is(oldStatesValue[index], watchingStates[index])) { + changedIndex = Number(index); + break; + } + } + setRef(oldStates, watchingStates); + if (immediate || shared.isNumber(changedIndex)) { + handler(changedIndex); + } + // remove states when component is unmounted + return removeStates; + }, watchingStates); + // Because react will call usehook again every time it refreshes, the state cache will be invalidated every time + // Therefore, the managed state needs to be updated every time + const needSave = react$1.useRef(false); + react$1.useEffect(() => { + refCurrent(needSave) ? saveStates(frontStates) : setRef(needSave, shared.trueValue); + }); + }, + computed: (getter, depList) => { + const memo = react$1.useMemo(getter, depList); + return [memo, shared.noop]; + }, + watch: (states, callback) => { + // When there is a monitoring state, the state changes and then triggers + const needEmit = react$1.useRef(shared.falseValue); + react$1.useEffect(() => { + needEmit.current ? callback() : (needEmit.current = true); + }, states); + }, + onMounted: callback => { + react$1.useEffect(callback, []); + }, + onUnmounted: callback => { + react$1.useEffect(() => callback, []); + } +}; + +module.exports = react; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.esm.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.esm.js new file mode 100644 index 0000000..1a3115d --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.esm.js @@ -0,0 +1,84 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +import { noop, undefinedValue, isNumber, falseValue, trueValue } from '@alova/shared'; +import { useState, useRef, useCallback, useEffect, useMemo } from 'react'; + +const stateToData = (reactState) => (2 in reactState ? reactState[2] : reactState[0]); +const refCurrent = (ref) => ref.current; +const setRef = (ref, newVal) => { + ref.current = newVal; +}; +// the react predefined hooks +var react = { + name: 'React', + create: initialValue => useState(initialValue), + export: stateToData, + dehydrate: stateToData, + update: (newVal, state) => { + // update value synchronously so that we can access the new value synchronously. + state[2] = newVal; + state[1](newVal); + }, + memorize: fn => { + // use `useCallback` to ensure the same reference, and refer the newest function with `useRef` + const fnRef = useRef(noop); + setRef(fnRef, fn); + return useCallback((...args) => refCurrent(fnRef)(...args), []); + }, + ref: initialValue => { + const refObj = useRef(initialValue); + refCurrent(refObj) === undefinedValue && setRef(refObj, initialValue); + return refObj; + }, + effectRequest({ handler, removeStates, saveStates, immediate, frontStates, watchingStates = [] }) { + // `handler` is called when some states change are detected + const oldStates = useRef(watchingStates); + useEffect(() => { + const oldStatesValue = refCurrent(oldStates); + // compare the old and new value, and get the index of changed state + let changedIndex = undefinedValue; + for (const index in watchingStates) { + if (!Object.is(oldStatesValue[index], watchingStates[index])) { + changedIndex = Number(index); + break; + } + } + setRef(oldStates, watchingStates); + if (immediate || isNumber(changedIndex)) { + handler(changedIndex); + } + // remove states when component is unmounted + return removeStates; + }, watchingStates); + // Because react will call usehook again every time it refreshes, the state cache will be invalidated every time + // Therefore, the managed state needs to be updated every time + const needSave = useRef(false); + useEffect(() => { + refCurrent(needSave) ? saveStates(frontStates) : setRef(needSave, trueValue); + }); + }, + computed: (getter, depList) => { + const memo = useMemo(getter, depList); + return [memo, noop]; + }, + watch: (states, callback) => { + // When there is a monitoring state, the state changes and then triggers + const needEmit = useRef(falseValue); + useEffect(() => { + needEmit.current ? callback() : (needEmit.current = true); + }, states); + }, + onMounted: callback => { + useEffect(callback, []); + }, + onUnmounted: callback => { + useEffect(() => callback, []); + } +}; + +export { react as default }; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.umd.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.umd.js new file mode 100644 index 0000000..d25aada --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.umd.js @@ -0,0 +1,117 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('react')) : + typeof define === 'function' && define.amd ? define(['react'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.reactHook = factory(global.React)); +})(this, (function (react$1) { 'use strict'; + + /** + * @alova/shared 1.1.2 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) + */ + + const undefStr = 'undefined'; + const undefinedValue = undefined; + const trueValue = true; + const falseValue = false; + const typeOf = (arg) => typeof arg; + // Whether it is running on the server side, node and bun are judged by process, and deno is judged by Deno. + // Some frameworks (such as Alipay and uniapp) will inject the process object as a global variable. + // Therefore, the process.cwd function unique to the server is used as the basis for judgment. + typeof window === undefStr && + (typeof process !== undefStr ? typeof process.cwd === 'function' : typeof Deno !== undefStr); + + /** + * Empty function for compatibility processing + */ + const noop = () => { }; + /** + * Determine whether the parameter is a number any parameter + * @returns Whether the parameter is a number + */ + const isNumber = (arg) => typeOf(arg) === 'number' && !Number.isNaN(arg); + + const stateToData = (reactState) => (2 in reactState ? reactState[2] : reactState[0]); + const refCurrent = (ref) => ref.current; + const setRef = (ref, newVal) => { + ref.current = newVal; + }; + // the react predefined hooks + var react = { + name: 'React', + create: initialValue => react$1.useState(initialValue), + export: stateToData, + dehydrate: stateToData, + update: (newVal, state) => { + // update value synchronously so that we can access the new value synchronously. + state[2] = newVal; + state[1](newVal); + }, + memorize: fn => { + // use `useCallback` to ensure the same reference, and refer the newest function with `useRef` + const fnRef = react$1.useRef(noop); + setRef(fnRef, fn); + return react$1.useCallback((...args) => refCurrent(fnRef)(...args), []); + }, + ref: initialValue => { + const refObj = react$1.useRef(initialValue); + refCurrent(refObj) === undefinedValue && setRef(refObj, initialValue); + return refObj; + }, + effectRequest({ handler, removeStates, saveStates, immediate, frontStates, watchingStates = [] }) { + // `handler` is called when some states change are detected + const oldStates = react$1.useRef(watchingStates); + react$1.useEffect(() => { + const oldStatesValue = refCurrent(oldStates); + // compare the old and new value, and get the index of changed state + let changedIndex = undefinedValue; + for (const index in watchingStates) { + if (!Object.is(oldStatesValue[index], watchingStates[index])) { + changedIndex = Number(index); + break; + } + } + setRef(oldStates, watchingStates); + if (immediate || isNumber(changedIndex)) { + handler(changedIndex); + } + // remove states when component is unmounted + return removeStates; + }, watchingStates); + // Because react will call usehook again every time it refreshes, the state cache will be invalidated every time + // Therefore, the managed state needs to be updated every time + const needSave = react$1.useRef(false); + react$1.useEffect(() => { + refCurrent(needSave) ? saveStates(frontStates) : setRef(needSave, trueValue); + }); + }, + computed: (getter, depList) => { + const memo = react$1.useMemo(getter, depList); + return [memo, noop]; + }, + watch: (states, callback) => { + // When there is a monitoring state, the state changes and then triggers + const needEmit = react$1.useRef(falseValue); + react$1.useEffect(() => { + needEmit.current ? callback() : (needEmit.current = true); + }, states); + }, + onMounted: callback => { + react$1.useEffect(callback, []); + }, + onUnmounted: callback => { + react$1.useEffect(() => callback, []); + } + }; + + return react; + +})); diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.umd.min.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.umd.min.js new file mode 100644 index 0000000..d05463c --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/react.umd.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("react")):"function"==typeof define&&define.amd?define(["react"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).reactHook=t(e.React)}(this,(function(e){"use strict";const t="undefined",n=void 0;typeof window===t&&typeof process!==t&&process.cwd;const o=()=>{},s=e=>2 in e?e[2]:e[0],r=e=>e.current,u=(e,t)=>{e.current=t};return{name:"React",create:t=>e.useState(t),export:s,dehydrate:s,update:(e,t)=>{t[2]=e,t[1](e)},memorize:t=>{const n=e.useRef(o);return u(n,t),e.useCallback(((...e)=>r(n)(...e)),[])},ref:t=>{const o=e.useRef(t);return r(o)===n&&u(o,t),o},effectRequest({handler:t,removeStates:o,saveStates:s,immediate:f,frontStates:c,watchingStates:a=[]}){const i=e.useRef(a);e.useEffect((()=>{const e=r(i);let s=n;for(const t in a)if(!Object.is(e[t],a[t])){s=Number(t);break}var c;return u(i,a),!f&&("number"!==(e=>typeof e)(c=s)||Number.isNaN(c))||t(s),o}),a);const d=e.useRef(!1);e.useEffect((()=>{r(d)?s(c):u(d,true)}))},computed:(t,n)=>[e.useMemo(t,n),o],watch:(t,n)=>{const o=e.useRef(false);e.useEffect((()=>{o.current?n():o.current=!0}),t)},onMounted:t=>{e.useEffect(t,[])},onUnmounted:t=>{e.useEffect((()=>t),[])}}})); diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.common.cjs b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.common.cjs new file mode 100644 index 0000000..9f28937 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.common.cjs @@ -0,0 +1,48 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +'use strict'; + +var shared = require('@alova/shared'); +var solidJs = require('solid-js'); + +// solid hooks predefined +var solid = { + name: 'Solid', + create: data => solidJs.createSignal(data), + export: state => state[0], + dehydrate: state => state[0](), + update: (newVal, state) => { + state[1](newVal); + }, + effectRequest: ({ handler, removeStates, immediate, watchingStates = [] }) => { + // remove states when component unmounted + solidJs.onCleanup(removeStates); + immediate && handler(); + shared.forEach(watchingStates, (state, i) => { + solidJs.createEffect(solidJs.on(state, () => { + handler(i); + }, { defer: true })); + }); + }, + computed: getter => [solidJs.createMemo(getter), shared.noop], + watch: (states, callback) => { + const curStates = Array.isArray(states) ? states : [states]; + const syncRunner = shared.createSyncOnceRunner(); + solidJs.createEffect(solidJs.on(curStates.map(state => state), () => syncRunner(() => { + callback(); + }), { defer: true })); + }, + onMounted: callback => { + solidJs.onMount(callback); + }, + onUnmounted: callback => { + solidJs.onCleanup(callback); + } +}; + +module.exports = solid; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.esm.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.esm.js new file mode 100644 index 0000000..da88a31 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.esm.js @@ -0,0 +1,46 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +import { forEach, noop, createSyncOnceRunner } from '@alova/shared'; +import { createSignal, onCleanup, createEffect, on, createMemo, onMount } from 'solid-js'; + +// solid hooks predefined +var solid = { + name: 'Solid', + create: data => createSignal(data), + export: state => state[0], + dehydrate: state => state[0](), + update: (newVal, state) => { + state[1](newVal); + }, + effectRequest: ({ handler, removeStates, immediate, watchingStates = [] }) => { + // remove states when component unmounted + onCleanup(removeStates); + immediate && handler(); + forEach(watchingStates, (state, i) => { + createEffect(on(state, () => { + handler(i); + }, { defer: true })); + }); + }, + computed: getter => [createMemo(getter), noop], + watch: (states, callback) => { + const curStates = Array.isArray(states) ? states : [states]; + const syncRunner = createSyncOnceRunner(); + createEffect(on(curStates.map(state => state), () => syncRunner(() => { + callback(); + }), { defer: true })); + }, + onMounted: callback => { + onMount(callback); + }, + onUnmounted: callback => { + onCleanup(callback); + } +}; + +export { solid as default }; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.umd.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.umd.js new file mode 100644 index 0000000..e9088f3 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.umd.js @@ -0,0 +1,51 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@alova/shared'), require('solid-js')) : + typeof define === 'function' && define.amd ? define(['@alova/shared', 'solid-js'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.solidHook = factory(global.shared, global.Solid)); +})(this, (function (shared, solidJs) { 'use strict'; + + // solid hooks predefined + var solid = { + name: 'Solid', + create: data => solidJs.createSignal(data), + export: state => state[0], + dehydrate: state => state[0](), + update: (newVal, state) => { + state[1](newVal); + }, + effectRequest: ({ handler, removeStates, immediate, watchingStates = [] }) => { + // remove states when component unmounted + solidJs.onCleanup(removeStates); + immediate && handler(); + shared.forEach(watchingStates, (state, i) => { + solidJs.createEffect(solidJs.on(state, () => { + handler(i); + }, { defer: true })); + }); + }, + computed: getter => [solidJs.createMemo(getter), shared.noop], + watch: (states, callback) => { + const curStates = Array.isArray(states) ? states : [states]; + const syncRunner = shared.createSyncOnceRunner(); + solidJs.createEffect(solidJs.on(curStates.map(state => state), () => syncRunner(() => { + callback(); + }), { defer: true })); + }, + onMounted: callback => { + solidJs.onMount(callback); + }, + onUnmounted: callback => { + solidJs.onCleanup(callback); + } + }; + + return solid; + +})); diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.umd.min.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.umd.min.js new file mode 100644 index 0000000..de14769 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/solid.umd.min.js @@ -0,0 +1 @@ +!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o(require("@alova/shared"),require("solid-js")):"function"==typeof define&&define.amd?define(["@alova/shared","solid-js"],o):(e="undefined"!=typeof globalThis?globalThis:e||self).solidHook=o(e.shared,e.Solid)}(this,(function(e,o){"use strict";return{name:"Solid",create:e=>o.createSignal(e),export:e=>e[0],dehydrate:e=>e[0](),update:(e,o)=>{o[1](e)},effectRequest:({handler:t,removeStates:n,immediate:a,watchingStates:r=[]})=>{o.onCleanup(n),a&&t(),e.forEach(r,((e,n)=>{o.createEffect(o.on(e,(()=>{t(n)}),{defer:!0}))}))},computed:t=>[o.createMemo(t),e.noop],watch:(t,n)=>{const a=Array.isArray(t)?t:[t],r=e.createSyncOnceRunner();o.createEffect(o.on(a.map((e=>e)),(()=>r((()=>{n()}))),{defer:!0}))},onMounted:e=>{o.onMount(e)},onUnmounted:e=>{o.onCleanup(e)}}})); diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/svelte.common.cjs b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/svelte.common.cjs new file mode 100644 index 0000000..0b517d1 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/svelte.common.cjs @@ -0,0 +1,63 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +'use strict'; + +var shared = require('@alova/shared'); +var svelte$1 = require('svelte'); +var store = require('svelte/store'); + +// the svelte predefined hooks +var svelte = { + name: 'Svelte', + create: data => store.writable(data), + dehydrate: state => { + let raw; + // The function will be executed once when subscribing, and the unsubscribe function will be called immediately after the value is obtained + state.subscribe(value => { + raw = value; + })(); + return raw; + }, + update: (newVal, state) => { + state.set(newVal); + }, + effectRequest({ handler, removeStates, immediate, watchingStates }) { + // Remove the corresponding state when the component is unmounted + svelte$1.onDestroy(removeStates); + svelte$1.onMount(() => { + immediate && handler(); + }); + shared.forEach(watchingStates || [], (state, i) => { + let needEmit = shared.falseValue; + state.subscribe(() => { + // Svelte's `writable` will trigger once by default, so when immediate is false, you need to filter out the first trigger call + needEmit ? handler(i) : (needEmit = shared.trueValue); + }); + }); + }, + computed: (getter, depList) => store.derived(depList, getter), + watch: (states, callback) => { + let needEmit = shared.falseValue; + const syncRunner = shared.createSyncOnceRunner(); + states.forEach(state => { + state.subscribe(() => { + syncRunner(() => { + needEmit ? callback() : (needEmit = shared.trueValue); + }); + }); + }); + }, + onMounted: callback => { + svelte$1.onMount(callback); + }, + onUnmounted: callback => { + svelte$1.onDestroy(callback); + } +}; + +module.exports = svelte; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/svelte.esm.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/svelte.esm.js new file mode 100644 index 0000000..ecb350c --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/svelte.esm.js @@ -0,0 +1,61 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +import { forEach, trueValue, createSyncOnceRunner, falseValue } from '@alova/shared'; +import { onDestroy, onMount } from 'svelte'; +import { writable, derived } from 'svelte/store'; + +// the svelte predefined hooks +var svelte = { + name: 'Svelte', + create: data => writable(data), + dehydrate: state => { + let raw; + // The function will be executed once when subscribing, and the unsubscribe function will be called immediately after the value is obtained + state.subscribe(value => { + raw = value; + })(); + return raw; + }, + update: (newVal, state) => { + state.set(newVal); + }, + effectRequest({ handler, removeStates, immediate, watchingStates }) { + // Remove the corresponding state when the component is unmounted + onDestroy(removeStates); + onMount(() => { + immediate && handler(); + }); + forEach(watchingStates || [], (state, i) => { + let needEmit = falseValue; + state.subscribe(() => { + // Svelte's `writable` will trigger once by default, so when immediate is false, you need to filter out the first trigger call + needEmit ? handler(i) : (needEmit = trueValue); + }); + }); + }, + computed: (getter, depList) => derived(depList, getter), + watch: (states, callback) => { + let needEmit = falseValue; + const syncRunner = createSyncOnceRunner(); + states.forEach(state => { + state.subscribe(() => { + syncRunner(() => { + needEmit ? callback() : (needEmit = trueValue); + }); + }); + }); + }, + onMounted: callback => { + onMount(callback); + }, + onUnmounted: callback => { + onDestroy(callback); + } +}; + +export { svelte as default }; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.common.cjs b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.common.cjs new file mode 100644 index 0000000..be7308f --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.common.cjs @@ -0,0 +1,47 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +'use strict'; + +var shared = require('@alova/shared'); +var vueDemi$1 = require('vue-demi'); + +// Vue’s predefined hooks +var vueDemi = { + name: 'VueDemi', + create: data => vueDemi$1.ref(data), + dehydrate: state => state.value, + update: (newVal, state) => { + state.value = newVal; + }, + effectRequest({ handler, removeStates, immediate, watchingStates }) { + // When used inside a component, the corresponding state is removed when the component is unloaded. + if (vueDemi$1.getCurrentInstance()) { + vueDemi$1.onUnmounted(removeStates); + } + immediate && handler(); + shared.forEach(watchingStates || [], (state, i) => { + vueDemi$1.watch(state, () => { + handler(i); + }, { deep: shared.trueValue }); + }); + }, + computed: getter => vueDemi$1.computed(getter), + watch: (states, callback) => { + vueDemi$1.watch(states, callback, { + deep: shared.trueValue + }); + }, + onMounted: callback => { + vueDemi$1.onMounted(callback); + }, + onUnmounted: callback => { + vueDemi$1.onUnmounted(callback); + } +}; + +module.exports = vueDemi; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.esm.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.esm.js new file mode 100644 index 0000000..2fa9609 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.esm.js @@ -0,0 +1,45 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +import { forEach, trueValue } from '@alova/shared'; +import { ref, getCurrentInstance, onUnmounted, watch, computed, onMounted } from 'vue-demi'; + +// Vue’s predefined hooks +var vueDemi = { + name: 'VueDemi', + create: data => ref(data), + dehydrate: state => state.value, + update: (newVal, state) => { + state.value = newVal; + }, + effectRequest({ handler, removeStates, immediate, watchingStates }) { + // When used inside a component, the corresponding state is removed when the component is unloaded. + if (getCurrentInstance()) { + onUnmounted(removeStates); + } + immediate && handler(); + forEach(watchingStates || [], (state, i) => { + watch(state, () => { + handler(i); + }, { deep: trueValue }); + }); + }, + computed: getter => computed(getter), + watch: (states, callback) => { + watch(states, callback, { + deep: trueValue + }); + }, + onMounted: callback => { + onMounted(callback); + }, + onUnmounted: callback => { + onUnmounted(callback); + } +}; + +export { vueDemi as default }; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.umd.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.umd.js new file mode 100644 index 0000000..9395a2c --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.umd.js @@ -0,0 +1,66 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('vue-demi')) : + typeof define === 'function' && define.amd ? define(['vue-demi'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.vueHook = factory(global.Vue)); +})(this, (function (vueDemi$1) { 'use strict'; + + /** + * @alova/shared 1.1.2 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) + */ + + const undefStr = 'undefined'; + const trueValue = true; + const forEach = (ary, fn) => ary.forEach(fn); + // Whether it is running on the server side, node and bun are judged by process, and deno is judged by Deno. + // Some frameworks (such as Alipay and uniapp) will inject the process object as a global variable. + // Therefore, the process.cwd function unique to the server is used as the basis for judgment. + typeof window === undefStr && + (typeof process !== undefStr ? typeof process.cwd === 'function' : typeof Deno !== undefStr); + + // Vue’s predefined hooks + var vueDemi = { + name: 'VueDemi', + create: data => vueDemi$1.ref(data), + dehydrate: state => state.value, + update: (newVal, state) => { + state.value = newVal; + }, + effectRequest({ handler, removeStates, immediate, watchingStates }) { + // When used inside a component, the corresponding state is removed when the component is unloaded. + if (vueDemi$1.getCurrentInstance()) { + vueDemi$1.onUnmounted(removeStates); + } + immediate && handler(); + forEach(watchingStates || [], (state, i) => { + vueDemi$1.watch(state, () => { + handler(i); + }, { deep: trueValue }); + }); + }, + computed: getter => vueDemi$1.computed(getter), + watch: (states, callback) => { + vueDemi$1.watch(states, callback, { + deep: trueValue + }); + }, + onMounted: callback => { + vueDemi$1.onMounted(callback); + }, + onUnmounted: callback => { + vueDemi$1.onUnmounted(callback); + } + }; + + return vueDemi; + +})); diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.umd.min.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.umd.min.js new file mode 100644 index 0000000..1334642 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue-demi.umd.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("vue-demi")):"function"==typeof define&&define.amd?define(["vue-demi"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).vueHook=t(e.Vue)}(this,(function(e){"use strict";const t="undefined",n=!0;return typeof window===t&&typeof process!==t&&process.cwd,{name:"VueDemi",create:t=>e.ref(t),dehydrate:e=>e.value,update:(e,t)=>{t.value=e},effectRequest({handler:t,removeStates:o,immediate:d,watchingStates:u}){var i;e.getCurrentInstance()&&e.onUnmounted(o),d&&t(),i=(o,d)=>{e.watch(o,(()=>{t(d)}),{deep:n})},(u||[]).forEach(i)},computed:t=>e.computed(t),watch:(t,o)=>{e.watch(t,o,{deep:n})},onMounted:t=>{e.onMounted(t)},onUnmounted:t=>{e.onUnmounted(t)}}})); diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.common.cjs b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.common.cjs new file mode 100644 index 0000000..2b0b24b --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.common.cjs @@ -0,0 +1,52 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +'use strict'; + +var shared = require('@alova/shared'); +var vue$1 = require('vue'); + +// the vue's predefined hooks +var vue = { + name: 'Vue', + create: data => vue$1.ref(data), + dehydrate: state => state.value, + update: (newVal, state) => { + state.value = newVal; + }, + effectRequest({ handler, removeStates, immediate, watchingStates }) { + // if call in component, remove current hook states when unmounting component + if (vue$1.getCurrentInstance()) { + vue$1.onUnmounted(removeStates); + } + immediate && handler(); + shared.forEach(watchingStates || [], (state, i) => { + vue$1.watch(state, () => { + handler(i); + }, { deep: shared.trueValue }); + }); + }, + computed: getter => vue$1.computed(getter), + watch: (states, callback) => { + vue$1.watch(states, callback, { + deep: shared.trueValue + }); + }, + onMounted: callback => { + if (vue$1.getCurrentInstance()) { + vue$1.onMounted(callback); + } + else { + shared.setTimeoutFn(callback, 10); + } + }, + onUnmounted: callback => { + vue$1.getCurrentInstance() && vue$1.onUnmounted(callback); + } +}; + +module.exports = vue; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.esm.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.esm.js new file mode 100644 index 0000000..e4b830b --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.esm.js @@ -0,0 +1,50 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +import { forEach, trueValue, setTimeoutFn } from '@alova/shared'; +import { ref, getCurrentInstance, onUnmounted, watch, computed, onMounted } from 'vue'; + +// the vue's predefined hooks +var vue = { + name: 'Vue', + create: data => ref(data), + dehydrate: state => state.value, + update: (newVal, state) => { + state.value = newVal; + }, + effectRequest({ handler, removeStates, immediate, watchingStates }) { + // if call in component, remove current hook states when unmounting component + if (getCurrentInstance()) { + onUnmounted(removeStates); + } + immediate && handler(); + forEach(watchingStates || [], (state, i) => { + watch(state, () => { + handler(i); + }, { deep: trueValue }); + }); + }, + computed: getter => computed(getter), + watch: (states, callback) => { + watch(states, callback, { + deep: trueValue + }); + }, + onMounted: callback => { + if (getCurrentInstance()) { + onMounted(callback); + } + else { + setTimeoutFn(callback, 10); + } + }, + onUnmounted: callback => { + getCurrentInstance() && onUnmounted(callback); + } +}; + +export { vue as default }; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.umd.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.umd.js new file mode 100644 index 0000000..a734d4c --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.umd.js @@ -0,0 +1,72 @@ +/** + * @alova/client 2.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('vue')) : + typeof define === 'function' && define.amd ? define(['vue'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.vueHook = factory(global.Vue)); +})(this, (function (vue$1) { 'use strict'; + + /** + * @alova/shared 1.1.2 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott Hu. All Rights Reserved + * Licensed under MIT (https://github.com/alovajs/alova/blob/main/LICENSE) + */ + + const undefStr = 'undefined'; + const trueValue = true; + const setTimeoutFn = (fn, delay = 0) => setTimeout(fn, delay); + const forEach = (ary, fn) => ary.forEach(fn); + // Whether it is running on the server side, node and bun are judged by process, and deno is judged by Deno. + // Some frameworks (such as Alipay and uniapp) will inject the process object as a global variable. + // Therefore, the process.cwd function unique to the server is used as the basis for judgment. + typeof window === undefStr && + (typeof process !== undefStr ? typeof process.cwd === 'function' : typeof Deno !== undefStr); + + // the vue's predefined hooks + var vue = { + name: 'Vue', + create: data => vue$1.ref(data), + dehydrate: state => state.value, + update: (newVal, state) => { + state.value = newVal; + }, + effectRequest({ handler, removeStates, immediate, watchingStates }) { + // if call in component, remove current hook states when unmounting component + if (vue$1.getCurrentInstance()) { + vue$1.onUnmounted(removeStates); + } + immediate && handler(); + forEach(watchingStates || [], (state, i) => { + vue$1.watch(state, () => { + handler(i); + }, { deep: trueValue }); + }); + }, + computed: getter => vue$1.computed(getter), + watch: (states, callback) => { + vue$1.watch(states, callback, { + deep: trueValue + }); + }, + onMounted: callback => { + if (vue$1.getCurrentInstance()) { + vue$1.onMounted(callback); + } + else { + setTimeoutFn(callback, 10); + } + }, + onUnmounted: callback => { + vue$1.getCurrentInstance() && vue$1.onUnmounted(callback); + } + }; + + return vue; + +})); diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.umd.min.js b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.umd.min.js new file mode 100644 index 0000000..35bc0c2 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/dist/stateshook/vue.umd.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("vue")):"function"==typeof define&&define.amd?define(["vue"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).vueHook=t(e.Vue)}(this,(function(e){"use strict";const t="undefined",n=!0;return typeof window===t&&typeof process!==t&&process.cwd,{name:"Vue",create:t=>e.ref(t),dehydrate:e=>e.value,update:(e,t)=>{t.value=e},effectRequest({handler:t,removeStates:o,immediate:u,watchingStates:d}){var a;e.getCurrentInstance()&&e.onUnmounted(o),u&&t(),a=(o,u)=>{e.watch(o,(()=>{t(u)}),{deep:n})},(d||[]).forEach(a)},computed:t=>e.computed(t),watch:(t,o)=>{e.watch(t,o,{deep:n})},onMounted:t=>{e.getCurrentInstance()?e.onMounted(t):((e,t=0)=>{setTimeout(e,t)})(t,10)},onUnmounted:t=>{e.getCurrentInstance()&&e.onUnmounted(t)}}})); diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/package.json b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/package.json new file mode 100644 index 0000000..f74491e --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/package.json @@ -0,0 +1,153 @@ +{ + "name": "alova", + "version": "3.2.10", + "description": "Request strategy library for MVVM libraries such as Vue.js, React.js and Svelte.js", + "main": "dist/alova.common.cjs", + "module": "dist/alova.esm.js", + "types": "typings/index.d.ts", + "type": "module", + "sideEffects": false, + "homepage": "https://alova.js.org", + "keywords": [ + "react", + "hooks", + "xmlhttprequest", + "vuejs", + "typescript", + "vue", + "reactjs", + "svelte", + "axios", + "request", + "fetch-api", + "vue3", + "react-hooks", + "superagent", + "alova" + ], + "jsdelivr": "dist/alova.umd.min.js", + "unpkg": "dist/alova.umd.min.js", + "author": "Scott Hu", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/alovajs/alova.git" + }, + "bugs": { + "url": "https://github.com/alovajs/alova/issues" + }, + "files": [ + "dist", + "typings" + ], + "engines": { + "node": ">= 18.0.0" + }, + "exports": { + ".": { + "types": "./typings/index.d.ts", + "require": "./dist/alova.common.cjs", + "default": "./dist/alova.esm.js" + }, + "./client": { + "types": "./typings/clienthook/index.d.ts", + "require": "./dist/clienthook/index.common.cjs", + "default": "./dist/clienthook/index.esm.js" + }, + "./server": { + "types": "./typings/serverhook.d.ts", + "require": "./dist/serverhook/index.common.cjs", + "default": "./dist/serverhook/index.esm.js" + }, + "./fetch": { + "types": { + "require": "./typings/fetch.d.cts", + "default": "./typings/fetch.d.ts" + }, + "require": "./dist/adapter/fetch.common.cjs", + "default": "./dist/adapter/fetch.esm.js" + }, + "./vue": { + "types": "./typings/stateshook/vue.d.ts", + "require": "./dist/stateshook/vue.common.cjs", + "default": "./dist/stateshook/vue.esm.js" + }, + "./vue-demi": { + "types": "./typings/stateshook/vue-demi.d.ts", + "require": "./dist/stateshook/vue-demi.common.cjs", + "default": "./dist/stateshook/vue-demi.esm.js" + }, + "./react": { + "types": "./typings/stateshook/react.d.ts", + "require": "./dist/stateshook/react.common.cjs", + "default": "./dist/stateshook/react.esm.js" + }, + "./svelte": { + "types": "./typings/stateshook/svelte.d.ts", + "require": "./dist/stateshook/svelte.common.cjs", + "default": "./dist/stateshook/svelte.esm.js" + }, + "./solid": { + "types": "./typings/stateshook/solid.d.ts", + "require": "./dist/stateshook/solid.common.cjs", + "default": "./dist/stateshook/solid.esm.js" + } + }, + "typesVersions": { + "*": { + "client": [ + "typings/clienthook/index.d.ts" + ], + "server": [ + "typings/serverhook.d.ts" + ], + "fetch": [ + "typings/fetch.d.ts" + ], + "vue": [ + "typings/stateshook/vue.d.ts" + ], + "vue-demi": [ + "typings/stateshook/vue-demi.d.ts" + ], + "react": [ + "typings/stateshook/react.d.ts" + ], + "svelte": [ + "typings/stateshook/svelte.d.ts" + ], + "solid": [ + "typings/stateshook/solid.d.ts" + ] + } + }, + "dependencies": { + "rate-limiter-flexible": "^5.0.3", + "@alova/shared": "1.1.2" + }, + "devDependencies": { + "@alova/scripts": "1.1.1" + }, + "config": { + "commitizen": { + "path": "./node_modules/cz-conventional-changelog" + } + }, + "scripts": { + "clean": "rimraf ./dist", + "test": "vitest run", + "test:coverage": "vitest run --coverage", + "release": "semantic-release", + "lint": "eslint --ext .ts,.js src", + "lint:fix": "pnpm lint --fix", + "build:core": "alova-scripts build core", + "build:fetch": "alova-scripts build fetch", + "build:client": "pnpm --filter=@alova/client run build", + "build:server": "pnpm --filter=@alova/server run build", + "build": "pnpm clean && alova-scripts build && pnpm build:client && pnpm build:server", + "coveralls": "pnpm test:coverage && coveralls < coverage/lcov.info", + "changelog": "conventional-changelog -p angular -u -i CHANGELOG.md -s -r 0", + "commit": "git-cz && git push", + "format": "prettier . --write" + } +} \ No newline at end of file diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/additional.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/additional.d.ts new file mode 100644 index 0000000..3ef8b28 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/additional.d.ts @@ -0,0 +1,5 @@ +declare module 'rate-limiter-flexible/lib/RateLimiterStoreAbstract.js' { + import { RateLimiterStoreAbstract } from 'rate-limiter-flexible'; + + export default RateLimiterStoreAbstract; +} diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/general.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/general.d.ts new file mode 100644 index 0000000..0915b17 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/general.d.ts @@ -0,0 +1,282 @@ +import type { EventManager, FrameworkReadableState, FrameworkState, IsUnknown } from '@alova/shared'; +import { + AlovaGenerics, + FetchRequestState, + FrontRequestState, + MergedStatesMap, + Method, + Progress, + ReferingObject, + StatesExport +} from 'alova'; +import { ReactHookExportType } from '../stateshook/react'; +import { SolidHookExportType } from '../stateshook/solid'; +import { SvelteHookExportType } from '../stateshook/svelte'; +import { VueHookExportType } from '../stateshook/vue'; +import { VueDemiHookExportType } from '../stateshook/vue-demi'; + +export interface StateMap { + Vue: VueHookExportType; + Solid: SolidHookExportType; + React: ReactHookExportType; + Svelte: SvelteHookExportType; + VueDemi: VueDemiHookExportType; +} +/** + * alova base event + */ +export interface AlovaEvent { + /** + * params from send function + */ + args: [...Args, ...any[]]; + /** + * current method instance + */ + method: Method; +} +/** + * success event object + */ +export interface AlovaSuccessEvent extends AlovaEvent { + /** Whether data from cache */ + fromCache: boolean; + data: AG['Responded']; +} +/** error event object */ +export interface AlovaErrorEvent extends AlovaEvent { + error: any; +} +/** completion event object */ +export interface AlovaCompleteEvent extends AlovaEvent { + /** response status */ + status: 'success' | 'error'; + /** Whether the data from the cache, when the status is error, from cache is always false */ + fromCache: boolean; + data?: AG['Responded']; + error?: any; +} + +/** + * Define the type in a way that supports React and Vue. Other types will be needed later and then change on this basis. + * Use the characteristics of different libraries as parent classes for judgment + */ +export type ExportedState> = SE['name'] extends keyof StateMap + ? StateMap[SE['name']]['StateExport'] + : Responded; +export type ExportedComputed> = SE['name'] extends keyof StateMap + ? StateMap[SE['name']]['ComputedExport'] + : Responded; + +export type StateUpdater, SE extends StatesExport> = (newStates: { + [K in keyof ExportedStates]?: ExportedStates[K] extends ExportedState | ExportedComputed + ? R + : ExportedStates[K]; +}) => void; + +export type AlovaMethodHandler = ( + ...args: Args +) => Method; +export type SuccessHandler = (event: AlovaSuccessEvent) => void; +export type ErrorHandler = (event: AlovaErrorEvent) => void; +export type CompleteHandler = ( + event: AlovaCompleteEvent +) => void; + +/** common hook configuration */ +export interface UseHookConfig { + /** + * force request + * @default false + */ + force?: boolean | ((event: AlovaEvent) => boolean); + + /** + * refering object that sharing some value with this object. + */ + __referingObj?: ReferingObject; + + /** + * other attributes + */ + [attr: string]: any; +} + +export interface AlovaMiddlewareContext { + /** current method instance */ + method: Method; + + /** + * cache data, only has value when hit cache + */ + cachedResponse: AG['Responded'] | undefined; + + /** the config of current use hook */ + config: any; + + /** abort request */ + abort: UseHookExposure['abort']; +} + +/** next function of middleware */ +export interface MiddlewareNextGuardConfig { + force?: UseHookConfig['force']; + method?: Method; +} + +/** + * context parameters of useRequest and useWatcher middleware + */ +export interface AlovaFrontMiddlewareContext + extends AlovaMiddlewareContext { + /** handler to send request */ + send: SendHandler; + + /** args response processing callback parameters, which are passed in by send of use hooks */ + args: [...Args, ...any[]]; + + /** state proxies set */ + proxyStates: FrontRequestState< + FrameworkState, + FrameworkState, + FrameworkState, + FrameworkState, + FrameworkState + >; + + /** + * custom control the state `loading` and doesn't toggle `loading` internally any more. + * call it with param `false` to cancel controlling. + * @JOU-amjs + * @param control whether to control loading, default is `true` + */ + controlLoading: (control?: boolean) => void; + + /** + * pass custom data + */ + [attr: string]: any; +} + +/** + * alova useRequest/useWatcher middleware + */ +export interface AlovaFrontMiddleware { + (context: AlovaFrontMiddlewareContext, next: AlovaGuardNext): any; +} + +/** + * the context param of middleware in useFetcher + */ +export interface AlovaFetcherMiddlewareContext + extends AlovaMiddlewareContext { + /** fetch data */ + fetch(method: Method, ...args: [...Args, ...any[]]): Promise; + + /** args response processing callback parameters, which are passed in by useFetcher’s fetch */ + args: [...Args, ...any[]]; + + /** state proxies set */ + proxyStates: FetchRequestState< + FrameworkState, + FrameworkState, + FrameworkState, + FrameworkState + >; + + /** + * custom control the state `loading` and doesn't toggle `loading` internally any more. + * call it with param `false` to cancel controlling. + * @JOU-amjs + * @param control whether to control loading, default is `true` + */ + controlLoading: (control?: boolean) => void; + + /** + * pass custom data + */ + [attr: string]: any; +} + +/** + * alova useFetcher middleware + */ +export interface AlovaFetcherMiddleware { + (context: AlovaFetcherMiddlewareContext, next: AlovaGuardNext): any; +} + +export type ProxyStateGetter> = ( + key: K +) => HookExportedStates[K] extends ExportedState + ? FrameworkState + : HookExportedStates[K] extends ExportedComputed + ? FrameworkReadableState + : never; + +export interface AlovaGuardNext { + (guardNextConfig?: MiddlewareNextGuardConfig): Promise; +} + +export type SendHandler = (...args: [...Args, ...any[]]) => Promise; +export interface UseHookExportedState + extends FrontRequestState< + ExportedState, + ExportedState, + ExportedState, + ExportedState, + ExportedState + > {} +export interface UseHookExposure< + AG extends AlovaGenerics = AlovaGenerics, + Args extends any[] = any[], + SelfType = unknown +> extends UseHookExportedState { + abort: () => void; + update: StateUpdater, AG['StatesExport']>; + send: SendHandler; + onSuccess(handler: SuccessHandler): IsUnknown; + onError(handler: ErrorHandler): IsUnknown; + onComplete(handler: CompleteHandler): IsUnknown; + __proxyState: ProxyStateGetter>; + __referingObj: ReferingObject; +} + +type EnumHookType = 1 | 2 | 3; +export interface Hook { + /** The method instance of the last request */ + m?: Method; + + /** Save states fns */ + sf: ((frontStates: MergedStatesMap) => void)[]; + + /** Remove states fns */ + rf: (() => void)[]; + + /** Front states */ + fs: FrontRequestState< + FrameworkState, + FrameworkState, + FrameworkState, + FrameworkState, + FrameworkState + >; + + /** event manager */ + em: EventManager<{ + success: AlovaSuccessEvent; + error: AlovaErrorEvent; + complete: AlovaCompleteEvent; + }>; + + /** hookType, useRequest=1, useWatcher=2, useFetcher=3 */ + ht: EnumHookType; + + /** hook config */ + c: UseHookConfig; + + /** refering object */ + ro: ReferingObject; + + /** managed states */ + ms: MergedStatesMap; +} diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/helper.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/helper.d.ts new file mode 100644 index 0000000..add05de --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/helper.d.ts @@ -0,0 +1,86 @@ +import { FrameworkReadableState, FrameworkState, GeneralFn, GeneralState } from '@alova/shared'; +import type { AlovaGenerics, EffectRequestParams, ReferingObject, StatesExport, StatesHook } from 'alova'; +import { ExportedComputed, ExportedState } from './general'; + +type ActualStateTranslator> = + StateProxy extends FrameworkState + ? ExportedState + : ExportedComputed; +type CompletedExposingProvider> = { + [K in keyof O]: O[K] extends FrameworkReadableState + ? ActualStateTranslator + : K extends `on${infer eventUnused}` + ? (...args: Parameters) => CompletedExposingProvider + : O[K]; +}; + +/** + * create simple and unified, framework-independent states creators and handlers. + * @param statesHook states hook from `promiseStatesHook` function of alova + * @param referingObject refering object exported from `promiseStatesHook` function + * @returns simple and unified states creators and handlers + */ +// eslint-disable-next-line +export declare function statesHookHelper( + statesHook: StatesHook>, + referingObject?: ReferingObject +): { + create: (initialValue: Data, key: Key) => FrameworkState; + computed: ( + getter: () => Data, + depList: (GeneralState | FrameworkReadableState)[], + key: Key + ) => FrameworkReadableState; + effectRequest: (effectRequestParams: EffectRequestParams) => void; + ref: (initialValue: Data) => { + current: Data; + }; + memorize: (fn: Callback) => Callback; + watch: (source: (GeneralState | FrameworkReadableState)[], callback: () => void) => void; + onMounted: (callback: () => void) => void; + onUnmounted: (callback: () => void) => void; + /** + * refering object that sharing some value with this object. + */ + __referingObj: ReferingObject; + /** + * expose provider for specified use hook. + * @param object object that contains state proxy, framework state, operating function and event binder. + * @returns provider component. + */ + exposeProvider: >( + object: O + ) => CompletedExposingProvider< + AG, + O & { + __referingObj: ReferingObject; + update: (newStates: { [K in keyof O]?: any }) => void; + __proxyState: (key: K) => any; + } + >; + /** + * transform state proxies to object. + * @param states proxy array of framework states + * @param filterKey filter key of state proxy + * @returns an object that contains the states of target form + */ + objectify: [], Key extends 's' | 'v' | 'e' | undefined = undefined>( + states: S, + filterKey?: Key + ) => { + [K in S[number]['k']]: Key extends undefined + ? Extract< + S[number], + { + k: K; + } + > + : Extract< + S[number], + { + k: K; + } + >[NonNullable]; + }; + transformState2Proxy: (state: GeneralState, key: Key) => FrameworkState; +}; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/actionDelegationMiddleware.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/actionDelegationMiddleware.d.ts new file mode 100644 index 0000000..b032273 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/actionDelegationMiddleware.d.ts @@ -0,0 +1,36 @@ +import { AlovaGenerics } from 'alova'; +import { AlovaFetcherMiddlewareContext, AlovaFrontMiddlewareContext, AlovaGuardNext } from '../general'; + +export interface Actions { + [x: string]: (...args: any[]) => any; +} + +/** + * Operation function delegation middleware + * After using this middleware, you can call the delegated function through accessAction. + * Can delegate multiple identical IDs + * In order to eliminate the hierarchical restrictions of components + * @param id Client ID + * @returns alova middleware function + */ +export declare function actionDelegationMiddleware< + AG extends AlovaGenerics = AlovaGenerics, + Args extends any[] = any[] +>( + id: string | number | symbol +): ( + context: (AlovaFrontMiddlewareContext | AlovaFetcherMiddlewareContext) & { + delegatingActions?: Actions; + }, + next: AlovaGuardNext +) => Promise; + +/** + * Access the operation function, if there are multiple matches, onMatch will be called with this + * @param id Delegator id, or regular expression + * @param onMatch matching subscribers + */ +export declare function accessAction( + id: string | number | symbol | RegExp, + onMatch: (matchedSubscriber: Record, index: number) => void +): void; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/tokenAuthentication.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/tokenAuthentication.d.ts new file mode 100644 index 0000000..07d124b --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/tokenAuthentication.d.ts @@ -0,0 +1,205 @@ +import { AlovaGenerics, AlovaOptions, AlovaRequestAdapter, Method, StatesHook } from 'alova'; +import adapterFetch from 'alova/fetch'; + +/** + * Unifiedly obtain the type of AlovaRequestAdapter + */ +export type AlovaRequestAdapterUnified< + RA extends + | AlovaRequestAdapter + | ((...args: any[]) => AlovaRequestAdapter) = AlovaRequestAdapter +> = RA extends AlovaRequestAdapter ? RA : ReturnType; + +// transform types StateHook and AlovaRequestAdapter to an AlovaGenerics +export type StateHookAdapter2AG, RA extends AlovaRequestAdapter> = + Parameters[1] extends Method> + ? AlovaGenerics ? SE : unknown> + : never; + +export type AlovaResponded, RA extends AlovaRequestAdapter> = NonNullable< + AlovaOptions>['responded'] +>; + +export type MetaMatches = Record; +export type ResponseInterceptHandler, RESULT = Promise> = ( + response: ReturnType['response']> extends Promise ? RE : never, + method: Parameters[1] +) => RESULT; +export type ResponseErrorInterceptHandler, RESULT = Promise> = ( + error: any, + method: Parameters[1] +) => RESULT; +export type ResponseAuthorizationInterceptor> = + | ResponseInterceptHandler> + | { + metaMatches?: MetaMatches; + handler: ResponseInterceptHandler>; + }; + +export type RequestHandler, RESULT = Promise> = ( + method: Parameters[1] +) => RESULT; + +export interface TokenAuthenticationOptions> { + /** + * Ignore intercepted methods + */ + visitorMeta?: MetaMatches; + /** + * Login request interceptor + */ + login?: ResponseAuthorizationInterceptor; + + /** + * Logout request interceptor + */ + logout?: ResponseAuthorizationInterceptor; + /** + * Assign token callback function, requests for login ID and visitor ID will not trigger this function + * @param method method instance + */ + assignToken?: (method: Method) => void | Promise; +} +export interface ClientTokenAuthenticationOptions> + extends TokenAuthenticationOptions { + /** + * Determine whether the token has expired in the interceptor before the request, and refresh the token + */ + refreshToken?: { + /** + * Determine whether the token has expired + */ + isExpired: RequestHandler>; + /** + * Refresh token + */ + handler: RequestHandler; + /** + * Customize the method meta that matches the refresh token + */ + metaMatches?: MetaMatches; + }; +} + +export type AlovaBeforeRequest, RA extends AlovaRequestAdapter> = ( + method: Method> +) => void | Promise; + +type BeforeRequestType, RA extends AlovaRequestAdapter> = ( + originalBeforeRequest?: AlovaBeforeRequest +) => AlovaBeforeRequest; +type ResponseType, RA extends AlovaRequestAdapter> = ( + originalResponded?: AlovaResponded +) => AlovaResponded; + +export interface TokenAuthenticationResult, RA extends AlovaRequestAdapter> { + onAuthRequired: BeforeRequestType; + onResponseRefreshToken: ResponseType; + waitingList: { + method: Method>; + resolve: () => void; + }[]; +} + +export interface ServerTokenAuthenticationOptions> + extends TokenAuthenticationOptions { + /** + * Determine whether the token has expired in the request success interceptor and refresh the token + */ + refreshTokenOnSuccess?: { + /** + * Determine whether the token has expired + */ + isExpired: ResponseInterceptHandler>; + /** + * Refresh token + */ + handler: ResponseInterceptHandler; + /** + * Customize the method meta that matches the refresh token + */ + metaMatches?: MetaMatches; + }; + + /** + * Determine whether the token has expired in the request failure interceptor and refresh the token + */ + refreshTokenOnError?: { + /** + * Determine whether the token has expired + */ + isExpired: ResponseErrorInterceptHandler>; + /** + * Refresh token + */ + handler: ResponseErrorInterceptHandler; + /** + * Customize the method meta that matches the refresh token + */ + metaMatches?: MetaMatches; + }; +} + +/** + * Create a client-side token authentication interceptor + * @example + * ```js + * const { onAuthRequired, onResponseRefreshToken } = createClientTokenAuthentication(\/* ... *\/); + * const alova = createAlova({ + * // ... + * beforeRequest: onAuthRequired(method => { + * // ... + * }), + * responded: onResponseRefreshToken({ + * onSuccess(response, method) { + * // ... + * }, + * onError(error, method) { + * // ... + * }, + * }) + * }); + * ``` + * @param options Configuration parameters + * @returns token authentication interceptor function + */ +export declare function createClientTokenAuthentication< + SH extends StatesHook, + RA extends + | AlovaRequestAdapter + | ((...args: any[]) => AlovaRequestAdapter) = typeof adapterFetch +>( + options: ClientTokenAuthenticationOptions> +): TokenAuthenticationResult>; + +/** + * Create a server-side token authentication interceptor + * @example + * ```js + * const { onAuthRequired, onResponseRefreshToken } = createServerTokenAuthentication(\/* ... *\/); + * const alova = createAlova({ + * // ... + * beforeRequest: onAuthRequired(method => { + * // ... + * }), + * responded: onResponseRefreshToken({ + * onSuccess(response, method) { + * // ... + * }, + * onError(error, method) { + * // ... + * }, + * }) + * }); + * ``` + * @param options Configuration parameters + * @returns token authentication interceptor function + */ +export declare function createServerTokenAuthentication< + SH extends StatesHook, + RA extends + | AlovaRequestAdapter + | ((...args: any[]) => AlovaRequestAdapter) = typeof adapterFetch +>( + options: ServerTokenAuthenticationOptions> +): TokenAuthenticationResult>; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/updateState.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/updateState.d.ts new file mode 100644 index 0000000..c82535f --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/updateState.d.ts @@ -0,0 +1,25 @@ +import { AlovaGenerics, Method } from 'alova'; + +export type UpdateStateCollection = { + [key: string | number | symbol]: (data: any) => any; +} & { + data?: (data: Responded) => any; +}; +/** + * cross components to update states by specifing method instance. + * @example + * ```js + * updateState(methodInstance, newData); + * updateState(methodInstance, oldData => { + * oldData.name = 'new name'; + * return oldData; + * }); + * ``` + * @param matcher method instance + * @param handleUpdate new data or update function that returns new data + * @returns is updated + */ +export declare function updateState( + matcher: Method>, + handleUpdate: UpdateStateCollection['data'] | UpdateStateCollection +): Promise; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useAutoRequest.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useAutoRequest.d.ts new file mode 100644 index 0000000..2c193e6 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useAutoRequest.d.ts @@ -0,0 +1,71 @@ +import { AlovaGenerics, Method } from 'alova'; +import { AlovaMethodHandler, UseHookExposure } from '../general'; +import { RequestHookConfig } from './useRequest'; + +/** + * useAutoRequest configuration + */ +export type AutoRequestHookConfig = { + /** + * Polling event, unit is `ms`, 0 means not enabled + * @default 0 + */ + pollingTime?: number; + /** + * Browser display hide or tab switch + * @default true + */ + enableVisibility?: boolean; + /** + * Browser spotlight + * @default true + */ + enableFocus?: boolean; + /** + * Enable network reconnection + * @default true + */ + enableNetwork?: boolean; + /** + * Throttle time, unit ms, means that only one request will be sent if triggered multiple times within the throttling time. + * @default 1000 + */ + throttle?: number; +} & RequestHookConfig; + +export type NotifyHandler = () => void; +export type UnbindHandler = () => void; + +/** + * Under certain conditions, data can be automatically re-pulled to refresh the page. Usage scenarios include: + * 1. Pull the latest data when the browser tab is switched + * 2. Pull the latest data when the browser is focused + * 3. Pull the latest data when the network is reconnected + * 4. Polling request + * One or more of the above trigger conditions can be configured at the same time, and the throttling time can also be configured to prevent multiple requests from being triggered in a short period of time. For example, only one trigger is allowed within 1 second. + * @param handler method instance or get function + * @param config Configuration parameters + * @return useAutoRequest related data and operation functions + */ +export declare function useAutoRequest( + handler: Method | AlovaMethodHandler, + config?: AutoRequestHookConfig +): UseHookExposure; +export declare namespace useAutoRequest { + function onNetwork( + notify: NotifyHandler, + config: AutoRequestHookConfig + ): UnbindHandler; + function onPolling( + notify: NotifyHandler, + config: AutoRequestHookConfig + ): UnbindHandler; + function onVisibility( + notify: NotifyHandler, + config: AutoRequestHookConfig + ): UnbindHandler; + function onFocus( + notify: NotifyHandler, + config: AutoRequestHookConfig + ): UnbindHandler; +} diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useCaptcha.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useCaptcha.d.ts new file mode 100644 index 0000000..892cba2 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useCaptcha.d.ts @@ -0,0 +1,36 @@ +import { AlovaGenerics, Method } from 'alova'; +import { AlovaMethodHandler, ExportedState, UseHookExposure } from '../general'; +import { RequestHookConfig } from './useRequest'; + +/** + * useCaptcha configuration + */ +export type CaptchaHookConfig = { + /** + * Initial countdown, when the verification code is sent successfully, the countdown will start with this data + * @default 60 + */ + initialCountdown?: number; +} & RequestHookConfig; + +/** + * useCaptcha return value + */ +export interface CaptchaExposure + extends UseHookExposure> { + /** + * The current countdown is -1 every second. When the countdown reaches 0, the verification code can be sent again. + */ + countdown: ExportedState; +} + +/** + * Request hook for verification code sending scenario + * @param handler method instance or get function + * @param Configuration parameters + * @return useCaptcha related data and operation functions + */ +export declare function useCaptcha( + handler: Method | AlovaMethodHandler, + config?: CaptchaHookConfig +): CaptchaExposure; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useFetcher.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useFetcher.d.ts new file mode 100644 index 0000000..2eb3d3c --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useFetcher.d.ts @@ -0,0 +1,73 @@ +import { + Alova, + AlovaGenerics, + FetchRequestState, + Method, + Progress, + ReferingObject, + StatesExport, + StatesHook +} from 'alova'; +import { + AlovaFetcherMiddleware, + ExportedState, + ProxyStateGetter, + StateUpdater, + UseHookConfig, + UseHookExportedState, + UseHookExposure +} from '../general'; + +/** + * specify the alova type + * so that it can return the right states + */ +export type FetcherType> = { + StatesExport: NonNullable extends StatesHook ? SE : any; +}; + +/** useFetcher config export type */ +export interface FetcherHookConfig extends UseHookConfig { + /** + * middleware + */ + middleware?: AlovaFetcherMiddleware; + /** + * whether to update the corresponding states of fetching method instance + */ + updateState?: boolean; +} + +export interface UseFetchExportedState + extends FetchRequestState< + ExportedState, + ExportedState, + ExportedState, + ExportedState + > {} +export interface UseFetchHookExposure extends UseFetchExportedState { + fetch(matcher: Method>, ...args: any[]): Promise; + update: StateUpdater, SE>; + abort: UseHookExposure['abort']; + onSuccess: UseHookExposure['onSuccess']; + onError: UseHookExposure['onError']; + onComplete: UseHookExposure['onComplete']; + __proxyState: ProxyStateGetter>; + __referingObj: ReferingObject; +} + +/** + * prefetch data + * @example + * ```js + * const { loading, error, fetch } = useFetcher(); + * const handleFetch = () => { + * fetch(alova.Get('/api/profile')); + * }; + * ``` + * @param config config + * @returns reactive request data、operate function and event binding function + */ +export declare function useFetcher>( + config?: FetcherHookConfig +): UseFetchHookExposure; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useForm.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useForm.d.ts new file mode 100644 index 0000000..82fe563 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useForm.d.ts @@ -0,0 +1,108 @@ +import { AlovaGenerics, Method } from 'alova'; +import { ExportedState, UseHookExposure } from '../general'; +import { RequestHookConfig } from './useRequest'; +import { DataSerializer } from './useSQRequest'; + +/** + * useForm's handler function type + */ +export type FormHookHandler = ( + form: F, + ...args: Args +) => Method; + +/** + * useForm configuration + */ +export interface StoreDetailConfig { + /** + * Whether to enable persistent data + */ + enable: boolean; + + /** + * Serializer collection, used to customize certain data that cannot be converted directly when converted to serialization + * The key of the collection is serialized as its name. When deserializing, the value of the corresponding name will be passed into the backward function. + * Therefore, when serializing in forward, it is necessary to determine whether it is the specified data and return the converted data, otherwise it will return undefined or not return + * In backward, it can be identified by name, so you only need to deserialize it directly. + * Built-in serializer: + * 1. Date serializer is used to convert dates + * 2. The regexp serializer is used to convert regular expressions + * + * >>> You can override the built-in serializer by setting a serializer with the same name + */ + serializers?: Record; +} +export type FormHookConfig = { + /** + * Initial form data + */ + initialForm?: FormData; + + /** + * form id, data data with the same id is the same reference, and can be used to share the same form data in multi-page forms. + * Single-page forms do not need to specify an id + */ + id?: string | number; + + /** + * Whether to persist data. If set to true, uncommitted data will be persisted in real time. + * @default false + */ + store?: boolean | StoreDetailConfig; + + /** + * Reset data after submission + * @default false + */ + resetAfterSubmiting?: boolean; +} & RequestHookConfig; + +export type RestoreHandler = () => void; +/** + * useForm return value + */ +export interface FormExposure + extends UseHookExposure> { + /** + * form data + */ + form: ExportedState; + + /** + * Persistent data recovery event binding, triggered after data recovery + */ + onRestore(handler: RestoreHandler): this; + + /** + * Update form data, which can be passed in + * @param newForm new form data + */ + updateForm(newForm: Partial | ((oldForm: F) => F)): void; + + /** + * Reset to initialization data, clear if there is persistent data + */ + reset(): void; +} + +/** + * useForm + * Form submission hook, draft function, and data synchronization function for multi-page forms + * + * Applicable scenarios: + * 1. Single form/multiple form submission, draft data persistence, data update and reset + * 2. Conditional search input items can persist search conditions and send form data immediately + * + * @param handler method gets the function, you only need to pass the id when getting the synchronized data + * @param config Configuration parameters + * @return useForm related data and operation functions + */ +export declare function useForm< + AG extends AlovaGenerics, + FormData extends Record, + Args extends any[] = any[] +>( + handler: FormHookHandler, + config?: FormHookConfig +): FormExposure; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/usePagination.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/usePagination.d.ts new file mode 100644 index 0000000..235161a --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/usePagination.d.ts @@ -0,0 +1,134 @@ +import type { IsUnknown } from '@alova/shared'; +import { AlovaGenerics, Method } from 'alova'; +import { + CompleteHandler, + ErrorHandler, + ExportedComputed, + ExportedState, + StateUpdater, + SuccessHandler, + UseHookExposure +} from '../general'; +import { WatcherHookConfig } from './useWatcher'; + +/** + * @description usePagination related + */ +export type ArgGetter = (data: R) => LD | undefined; +export interface PaginationHookConfig extends WatcherHookConfig { + /** + * Whether to preload the previous page + * @default true + */ + preloadPreviousPage?: boolean; + /** + * Whether to preload the next page + * @default true + */ + preloadNextPage?: boolean; + /** + * Specify the total amount of data + * @default response => response.total + */ + total?: ArgGetter; + /** + * Specify paginated array data + * @default response => response.data + */ + data?: ArgGetter; + /** + * Whether to enable append mode + * @default false + */ + append?: boolean; + /** + * Initial page number + * @default 1 + */ + initialPage?: number; + /** + * Initial number of data items per page + * @default 10 + */ + initialPageSize?: number; + /** + * State monitoring triggers requests, implemented using useWatcher + * @default [page, pageSize] + */ + watchingStates?: AG['StatesExport']['Watched'][]; +} +export interface UsePaginationExposure + extends Omit>, 'update'> { + page: ExportedState; + pageSize: ExportedState; + data: ExportedState< + IsUnknown< + ListData[number], + AG['Responded'] extends { + data: any; + } + ? AG['Responded']['data'] + : ListData, + ListData + >, + AG['StatesExport'] + >; + pageCount: ExportedComputed; + total: ExportedComputed; + isLastPage: ExportedComputed; + fetching: ExportedState; + onFetchSuccess(handler: SuccessHandler): UsePaginationExposure; + onFetchError(handler: ErrorHandler): UsePaginationExposure; + onFetchComplete(handler: CompleteHandler): UsePaginationExposure; + update: StateUpdater, AG['StatesExport']>; + + /** + * Refresh the specified page number data. This function will ignore the cache and force the request to be sent. + * If no page number is passed in, the current page will be refreshed. + * If a list item is passed in, the page where the list item is located will be refreshed, which is only valid in append mode. + * @param pageOrItemPage Refreshed page number or list item + */ + refresh(pageOrItemPage?: number | ListData[number]): Promise; + + /** + * Insert a piece of data + * If no index is passed in, it will be inserted at the front by default. + * If a list item is passed in, it will be inserted after the list item. If the list item is not in the list data, an error will be thrown. + * @param item insert + * @param position Insert position (index) or list item + */ + insert(item: ListData extends any[] ? ListData[number] : any, position?: number | ListData[number]): Promise; + + /** + * Remove a piece of data + * If a list item is passed in, the list item will be removed. If the list item is not in the list data, an error will be thrown. + * @param position Removed index or list item + */ + remove(...positions: (number | ListData[number])[]): Promise; + + /** + * Replace a piece of data + * If the position passed in is a list item, this list item will be replaced. If the list item is not in the list data, an error will be thrown. + * @param item replacement + * @param position Replace position (index) or list item + */ + replace(item: ListData extends any[] ? ListData[number] : any, position: number | ListData[number]): void; + + /** + * Reload the list starting from the first page and clear the cache + */ + reload(): Promise; +} + +/** + * anova paging hook + * Automatic management of paging related status, preloading of previous and next pages, automatic maintenance of data addition/editing/removal + * + * @param handler methodCreate function + * @param config pagination hook configuration + * @returns {UsePaginationExposure} + */ +export declare function usePagination( + handler: (page: number, pageSize: number, ...args: Args) => Method, + config?: PaginationHookConfig +): UsePaginationExposure; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useRequest.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useRequest.d.ts new file mode 100644 index 0000000..4fe9a9f --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useRequest.d.ts @@ -0,0 +1,36 @@ +import { AlovaGenerics, Method } from 'alova'; +import { AlovaFrontMiddleware, AlovaMethodHandler, UseHookConfig, UseHookExposure } from '../general'; + +/** Both use request and use watcher have types */ +type InitialDataType = number | string | boolean | object; +export interface FrontRequestHookConfig extends UseHookConfig { + /** Whether to initiate a request immediately */ + immediate?: boolean; + + /** set initial data for request state */ + initialData?: InitialDataType | (() => InitialDataType); + + /** Additional regulatory status, which can be updated via update state */ + managedStates?: Record; + + /** Middleware */ + middleware?: AlovaFrontMiddleware; +} + +/** useRequest config export type */ +export type RequestHookConfig = FrontRequestHookConfig; + +/** + * Automatically manage response status hooks + * @example + * ```js + * const { loading, data, error, send, onSuccess } = useRequest(alova.Get('/api/user')) + * ``` + * @param methodHandler method instance or get function + * @param config Configuration items + * @returns Responsive request data, operation functions and event binding functions + */ +export declare function useRequest( + methodHandler: Method | AlovaMethodHandler, + config?: RequestHookConfig +): UseHookExposure; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useRetriable.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useRetriable.d.ts new file mode 100644 index 0000000..49d1361 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useRetriable.d.ts @@ -0,0 +1,90 @@ +import type { BackoffPolicy } from '@alova/shared'; +import { AlovaGenerics, Method } from 'alova'; +import { AlovaErrorEvent, AlovaEvent, AlovaMethodHandler, UseHookExposure } from '../general'; +import { RequestHookConfig } from './useRequest'; + +/** + * useRetriableRequest配置 + */ +export type RetriableHookConfig = { + /** + * The maximum number of retries can also be set as a function that returns a boolean value to dynamically determine whether to continue retrying. + * @default 3 + */ + retry?: number | ((error: Error, ...args: [...Args, ...any[]]) => boolean); + + /** + * avoidance strategy + */ + backoff?: BackoffPolicy; +} & RequestHookConfig; + +/** + * useRetriableRequest onRetry callback event instance + */ +export interface RetriableRetryEvent extends AlovaEvent { + /** + * Current number of retries + */ + retryTimes: number; + + /** + * Delay time for this retry + */ + retryDelay: number; +} +/** + * useRetriableRequest onFail callback event instance + */ +export interface RetriableFailEvent extends AlovaErrorEvent { + /** + * Number of retries on failure + */ + retryTimes: number; +} +/** + * useRetriableRequest return value + */ +export interface RetriableExposure + extends UseHookExposure> { + /** + * Stop retrying, the call is only valid during the retry period + * The onFail event will be triggered immediately after stopping + * + */ + stop(): void; + + /** + * Retry event binding + * They will be triggered after the retry is initiated + * @param handler Retry event callback + */ + onRetry(handler: (event: RetriableRetryEvent) => void): this; + + /** + * failed event binding + * They will be triggered when there are no more retries, such as when the maximum number of retries is reached, when the retry callback returns false, or when stop is manually called to stop retries. + * The onError event of alova will be triggered every time an error is requested. + * + * Note: If there are no retries, onError, onComplete and onFail will be triggered at the same time. + * + * @param handler Failure event callback + */ + onFail(handler: (event: RetriableFailEvent) => void): this; +} + +/** + * useRetriableRequest + * Request hook with retry function + * Applicable scenarios: + * 1. Retry if the request fails, or retry with custom rules + * 2. Manual stop/start retry + * + * @param handler method instance or get function + * @param config Configuration parameters + * @return useRetriableRequest related data and operation functions + */ +export declare function useRetriableRequest( + handler: Method | AlovaMethodHandler, + config?: RetriableHookConfig +): RetriableExposure; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSQRequest.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSQRequest.d.ts new file mode 100644 index 0000000..a38e688 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSQRequest.d.ts @@ -0,0 +1,497 @@ +import type { EventManager } from '@alova/shared'; +import { Alova, AlovaGenerics, Method } from 'alova'; +import { AlovaCompleteEvent, AlovaEvent, AlovaMethodHandler, UseHookExposure } from '../general'; +import { updateState } from './updateState'; +import { RequestHookConfig } from './useRequest'; + +// ========================= +/** Silently commit events */ +// event: +// Globally: +// [GlobalSQEvent] Request events: behavior, silentMethod instance, method instance, retryTimes +// [GlobalSQSuccessEvent] Success events: collection of behavior, silentMethod instance, method instance, retryTimes, response data, virtual data and actual values +// [GlobalSQErrorEvent] Error events: behavior, silentMethod instance, method instance, retryTimes, error object, [?] next retry interval +// [GlobalSQFailEvent] Failure event: behavior, silentMethod instance, method instance, retryTimes, error object + +// Local: +// [ScopedSQSuccessEvent] Success events: behavior, silentMethod instance, method instance, retryTimes, send parameter, response data +// [ScopedSQErrorEvent] Failure events: behavior, silentMethod instance, method instance, retryTimes, send parameter, error object +// [ScopedSQErrorEvent] Fallback events: behavior, silentMethod instance, method instance, retryTimes, send parameter, error object +// [ScopedSQSuccessEvent | ScopedSQErrorEvent] Completion event: behavior, silentMethod instance, method instance, retryTimes, send parameter, [?] error object +// [ScopedSQEvent] Before entering the queue: behavior, silentMethod instance, method instance, send parameter +// [ScopedSQEvent] After entering the queue: behavior, silentMethod instance, method instance, send parameter +/** SQ top level events */ +export interface SQEvent { + /** + * Request behavior corresponding to the event + */ + behavior: SQHookBehavior; + /** + * the current method instance + */ + method: Method; + /** + * The current silentMethod instance has no value when the behavior is static + */ + silentMethod?: SilentMethod; +} +/** Sq global events */ +export interface GlobalSQEvent extends SQEvent { + /** + * Number of retries, no value in beforePush and pushed events + */ + retryTimes: number; + + /** + * The queue name where silentMethod is located + */ + queueName: string; +} +/** Sq global success event */ +export interface GlobalSQSuccessEvent extends GlobalSQEvent { + /** + * response data + */ + data: any; + /** + * A collection of dummy data and actual values + * It only contains the actual values of the dummy data you have used. + */ + vDataResponse: Record; +} +/** Sq global failure event */ +export interface GlobalSQErrorEvent extends GlobalSQEvent { + /** + * Error thrown on failure + */ + error: any; + + /** + * Next retry interval (milliseconds) + */ + retryDelay?: number; +} +/** Sq global failure event */ +export interface GlobalSQFailEvent extends GlobalSQEvent { + /** Error thrown on failure */ + error: any; +} + +/** Sq local event */ +export interface ScopedSQEvent extends SQEvent { + /** + * The parameters passed in when triggering the request through send + */ + args: [...Args, ...any[]]; +} +/** partial success event */ +export interface ScopedSQSuccessEvent + extends ScopedSQEvent { + /** + * response data + */ + data: AG['Responded']; +} +/** local failure event */ +export interface ScopedSQErrorEvent + extends ScopedSQEvent { + /** + * Error thrown on failure + */ + error: any; +} +/** local failure event */ +export interface ScopedSQRetryEvent + extends ScopedSQEvent { + /** + * Number of retries + */ + retryTimes: number; + /** + * Retry interval (milliseconds) + */ + retryDelay: number; +} +/** partial completion event */ +export interface ScopedSQCompleteEvent + extends ScopedSQEvent { + /** + * response status + */ + status: AlovaCompleteEvent['status']; + /** + * response data + */ + data?: AG['Responded']; + /** + * Error thrown on failure + */ + error?: any; +} + +export interface RetryErrorDetailed { + name?: RegExp; + message?: RegExp; +} + +export interface BackoffPolicy { + /** + * Delay time for requesting again, in milliseconds + * @default 1000 + */ + delay?: number; + /** + * Specify the delay multiplier. For example, if the multiplier is set to 1.5 and the delay is 2 seconds, the first retry will be 2 seconds, the second retry will be 3 seconds, and the third retry will be 4.5 seconds. + * @default 1 + */ + multiplier?: number; + + /** + * Jitter starting percentage value for delayed requests, ranging from 0-1 + * When only startQuiver is set, endQuiver defaults to 1 + * For example, set to 0.5, it will add 50% to 100% random time to the current delay time + * If endQuiver has a value, the delay time will be increased by a random value in the range of startQuiver and endQuiver + */ + startQuiver?: number; + + /** + * Jitter end percentage value for delayed requests, ranging from 0-1 + * When only endQuiver is set, startQuiver defaults to 0 + * For example, set to 0.5, it will add a random time of 0% to 50% to the current delay time + * If startQuiver has a value, the delay time will be increased by a random value in the range of startQuiver and endQuiver + */ + endQuiver?: number; +} + +export type ScopedSQEvents = { + fallback: ScopedSQEvent; + retry: ScopedSQRetryEvent; + beforePushQueue: ScopedSQEvent; + pushedQueue: ScopedSQEvent; +}; + +/** + * silentMethod instance + * Requests that need to enter silentQueue will be packaged into silentMethod instances, which will carry various parameters of the request strategy. + */ +export interface SilentMethod { + /** + * silentMethod instance id + */ + readonly id: string; + /** + * The behavior of the instance, queue or silent + */ + readonly behavior: SQHookBehavior; + /** + * method instance + */ + readonly entity: Method; + + /** + * Whether it is a persistent instance + */ + cache: boolean; + + /** + * Retry error rules + * Retries only when the error matches the following expression + * When the value is a regular expression, it will match the message of the error object + * When the value is an object, it can be set to match the name or message of the error object. If both are set, it will be matched in the form of or + * + * When not set, all errors will be retried by default. + */ + readonly retryError?: RegExp | RetryErrorDetailed; + /** + * Number of retries + */ + readonly maxRetryTimes?: number; + /** + * avoidance strategy + */ + readonly backoff?: BackoffPolicy; + + /** + * Fallback event callback, this callback will be called when the number of retries reaches the upper limit but still fails. + */ + readonly emitter: EventManager>; + + /** + * Promise's resolve function, the call will pass the corresponding promise object + */ + readonly resolveHandler?: Parameters>['0']>['0']; + + /** + * Promise's reject function, calling the corresponding promise object will fail + */ + readonly rejectHandler?: Parameters>['0']>['1']; + + /** + * methodHandler call parameters + * If there is dummy data, it will be replaced by actual data after the request is responded to. + */ + readonly handlerArgs?: any[]; + + /** + * The virtual data id used when creating the method + */ + readonly vDatas?: string[]; + + /** + * Virtual response data is saved here through delayUpdateState + */ + virtualResponse?: any; + + /** + * Which states are updated by calling updateStateEffect + */ + updateStates?: string[]; + + /** + * Submitting status update data silently + * When the data is submitted silently, we also need to manually update the submitted data to other states to achieve the purpose of immediately displaying the submitted information. + * In order to make the updated data available after reloading the page, we can use this field to save and persist it with the silentMethod. + * You can obtain this data again wherever you need to use it and display it on the interface. + * + * Note: Generally speaking, you can save persistent data with any attribute name, but an error will be reported in typescript, so reviewData is specified for you as the saving attribute of silent submission status data. + */ + reviewData?: any; + + /** + * Additional persistent data during silent commit + * When the data is actually submitted after silent submission, we may need to access this new data + * When the submitted data does not meet the data required for interface rendering, we can save the additional data to the extraData field when submitting to ensure that it can be obtained next time + * + * Note: Generally speaking, you can save persistent data with any attribute name, but an error will be reported in typescript, so extraData is specified for you as the field for the above function. + */ + extraData?: any; + + /** + * The method instance pointed to by the status update + * The target method instance that will update the state when calling updateStateEffect is stored here. + * The purpose is to allow the submitted data to still find the status that needs to be updated after refreshing the page. + */ + targetRefMethod?: Method; + + /** Is it currently being requested? */ + active?: boolean; + + /** Whether to force the request */ + force: boolean; + + /** + * Allow cache-time persistent updates to the current instance + */ + save(): Promise; + + /** + * Replace the current instance with a new silentMethod instance in the queue + * If there is a persistent cache, the cache will also be updated. + * @param newSilentMethod new silentMethod instance + */ + replace(newSilentMethod: SilentMethod): Promise; + + /** + * Remove the current instance, it will be removed synchronously in the persistent storage + */ + remove(): Promise; + + /** + * Set the method instance corresponding to the delayed update status and the corresponding status name + * It will find the corresponding status data and update vData to the actual data after responding to this silentMethod + * + * @param matcher method instance matcher + * @param updateStateName Updated status name, the default is data, you can also set multiple + */ + setUpdateState(matcher: Method, updateStateName?: string | string[]): void; +} + +// Silent queue hooks related +export type SQHookBehavior = 'static' | 'queue' | 'silent'; +export interface SQHookConfig { + /** + * Hook behavior, optional values are silent, queue, static, default is queue + * Can be set to an optional value, or a callback function that returns an optional value + * silent: Submit silently, the method instance will enter the queue and be persisted, and then trigger onSuccess immediately + * queue: Queue request, the method instance will enter the queue but will not be persisted, onSuccess and onError are triggered normally + * static: static request, the same as ordinary useRequest + * + * Scenario 1. Manual switch + * Scenario 2. When the network status is not good, fall back to static and determine the network status by yourself. + */ + behavior?: SQHookBehavior | ((event: AlovaEvent) => SQHookBehavior); + + /** Retry error rules + * Retry only when the error matches the following expression + * When the value is a regular expression, it will match the message of the error object + * When the value is an object, it can be set to match the name or message of the error object. If both are set, it will be matched in the form of or + */ + retryError?: NonNullable; + + /** Maximum number of retries */ + maxRetryTimes?: NonNullable; + + /** avoidance strategy */ + backoff?: NonNullable; + + /** + * Queue name. If not passed, the default queue will be selected. + * If you need to dynamically allocate the queue for each request, you can set it to a function and return the queue name. + */ + queue?: string | ((event: AlovaEvent) => string); + + /** Default response data when submitting silently */ + silentDefaultResponse?: () => any; + + /** + * It will be called when capturing with dummy data in method + * When this capture callback returns data, this data will be processed as response data instead of sending a request. + * @param {Method} method method instance + * @returns {R} Data in the same format as the response data + */ + vDataCaptured?: (method: Method) => AG['Responded'] | undefined | void; +} + +export type SQRequestHookConfig = SQHookConfig & + RequestHookConfig; +export type FallbackHandler = ( + event: ScopedSQEvent +) => void; +export type RetryHandler = ( + event: ScopedSQRetryEvent +) => void; +export type BeforePushQueueHandler = ( + event: ScopedSQEvent +) => void | boolean | Promise; +export type PushedQueueHandler = ( + event: ScopedSQEvent +) => void; +export type SQHookExposure = Omit< + UseHookExposure, + 'onSuccess' | 'onError' | 'onComplete' +> & { + /** + * Fallback event binding function, which will be triggered in the following situations: + * 1. After retrying the specified number of times without response and stopping continuing the request + * 2. After stopping the request due to network disconnection or corresponding error on the server side + * + * After binding this event, request persistence will be invalid, which means that silently submitted items will be lost on refresh + * It only works under silent behavior + * + * Compare with onComplete event: + * 1. Only triggered when the number of retries is reached and the failure still occurs. + * 2. Triggered before onComplete + */ + onFallback(handler: FallbackHandler): SQHookExposure; + + /** Called before entering the queue, you can filter duplicate silent methods in the queue. It is invalid under static behavior. */ + onBeforePushQueue(handler: BeforePushQueueHandler): SQHookExposure; + + /** Called after being queued, invalid under static behavior */ + onPushedQueue(handler: PushedQueueHandler): SQHookExposure; + + /** Retry event binding */ + onRetry(handler: RetryHandler): SQHookExposure; + + /** @override Rewrite alova's on success event */ + onSuccess(handler: (event: ScopedSQSuccessEvent) => void): SQHookExposure; + + /** @override Rewrite alova's on error event */ + onError(handler: (event: ScopedSQErrorEvent) => void): SQHookExposure; + + /** @override Override alova's on complete event */ + onComplete(handler: (event: ScopedSQCompleteEvent) => void): SQHookExposure; +}; + +export interface DataSerializer { + forward(data: any): any | undefined | void; + backward(data: any): any | undefined | void; +} + +export interface QueueRequestWaitSetting { + queue: string | RegExp; + wait: number | ((silentMethod: SilentMethod, queueName: string) => number | undefined); +} +/** Silent factory startup options */ +export interface SilentFactoryBootOptions { + /** + * alova instance that silentMethod depends on + * The storage adapter, request adapter, etc. of the alova instance will be used to access the SilentMethod instance and send silent commits + */ + alova: Alova; + + /** Delay in milliseconds, default delay is 2000ms when not transmitting */ + delay?: number; + + /** + * Serializer collection, used to customize certain data that cannot be converted directly when converted to serialization + * The key of the collection is serialized as its name. When deserializing, the value of the corresponding name will be passed into the backward function. + * Therefore, when serializing in forward, it is necessary to determine whether it is the specified data and return the converted data, otherwise it will return undefined or not return + * In backward, it can be identified by name, so you only need to deserialize it directly. + * Built-in serializer: + * 1. Date serializer is used to convert dates + * 2. The regexp serializer is used to convert regular expressions + * + * >>> You can override the built-in serializer by setting a serializer with the same name + */ + serializers?: Record; + + /** + * The request waiting time in silentQueue, in milliseconds (ms) + * It indicates the waiting time of the silentMethod that is about to send the request + * If not set, or set to 0, the silentMethod request is triggered immediately + * + * Tips: + * 1. When set directly, it is effective for the default queue by default. + * 2. If you need to set other queue settings, you can specify them as objects, such as: + * [ + * Indicates waiting 5000ms for the queue setting request named customName + * { queue: 'customName', wait: 5000 }, + * + * //Indicates that in all queues with the prefix prefix, the request setting with method instance name xxx is set to wait 5000ms + * { queue: /^prefix/, wait: silentMethod => silentMethod.entity.config.name === 'xxx' ? 5000 : 0 }, + * ] + * + * >>> It only works if the request succeeds, if it fails it will use the retry policy parameters + */ + requestWait?: QueueRequestWaitSetting[] | QueueRequestWaitSetting['wait']; +} + +export type SilentSubmitBootHandler = () => void; +export type BeforeSilentSubmitHandler = (event: GlobalSQEvent) => void; +export type SilentSubmitSuccessHandler = (event: GlobalSQSuccessEvent) => void; +export type SilentSubmitErrorHandler = (event: GlobalSQErrorEvent) => void; +export type SilentSubmitFailHandler = (event: GlobalSQFailEvent) => void; +export type OffEventCallback = () => void; +export type SilentQueueMap = Record[]>; + +/** + * request hook with silentQueue + * silentQueue is the core component to implement silent submission, which will be used to store silentMethod instances, and they will send submissions serially in order + */ +export declare function useSQRequest( + handler: AlovaMethodHandler, + config?: SQRequestHookConfig +): SQHookExposure; +export declare function bootSilentFactory(options: SilentFactoryBootOptions): void; +export declare function onSilentSubmitBoot(handler: SilentSubmitBootHandler): OffEventCallback; +export declare function onSilentSubmitSuccess(handler: SilentSubmitSuccessHandler): OffEventCallback; +export declare function onSilentSubmitError(handler: SilentSubmitErrorHandler): OffEventCallback; +export declare function onSilentSubmitFail(handler: SilentSubmitFailHandler): OffEventCallback; +export declare function onBeforeSilentSubmit(handler: BeforeSilentSubmitHandler): OffEventCallback; +export declare function dehydrateVData(target: T): T; +export declare function stringifyVData(target: any, returnOriginalIfNotVData?: boolean): any; +export declare function isVData(target: any): boolean; +export declare function equals(prevValue: any, nextValue: any): boolean; +export declare function filterSilentMethods( + methodNameMatcher?: string | number | RegExp, + queueName?: string, + filterActive?: boolean +): Promise; +export declare function getSilentMethod( + methodNameMatcher?: string | number | RegExp, + queueName?: string, + filterActive?: boolean +): Promise; +export declare const updateStateEffect: typeof updateState; +export declare const silentQueueMap: SilentQueueMap; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSSE.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSSE.d.ts new file mode 100644 index 0000000..eb72eb5 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSSE.d.ts @@ -0,0 +1,122 @@ +import { AlovaGenerics, Method } from 'alova'; +import { AlovaEvent, AlovaMethodHandler, ExportedState } from '../general'; + +type SSEHookReadyState = 0 | 1 | 2; + +export interface AlovaSSEEvent extends AlovaEvent { + method: Method; + eventSource: EventSource; // Event source instance +} +export interface AlovaSSEErrorEvent + extends AlovaSSEEvent { + error: Error; // error object +} +export interface AlovaSSEMessageEvent + extends AlovaSSEEvent { + data: Data; // Data converted by the interceptor for each response +} +export type SSEOnOpenTrigger = ( + event: AlovaSSEEvent +) => void; +export type SSEOnMessageTrigger = ( + event: AlovaSSEMessageEvent +) => void; +export type SSEOnErrorTrigger = ( + event: AlovaSSEErrorEvent +) => void; +export type SSEOn = ( + eventName: string, + handler: (event: AlovaSSEMessageEvent) => void +) => () => void; + +/** + * useSSE() configuration item + */ +export interface SSEHookConfig { + /** + * Will be passed to new EventSource + */ + withCredentials?: boolean; + + /** + * Whether to pass the responded interception of the alova instance + * @default true + */ + interceptByGlobalResponded?: boolean; + + /** + * initial data + */ + initialData?: any; + + /** + * Whether to initiate a request immediately + * @default false + */ + immediate?: boolean; + + /** + * Whether to interrupt the previous request and trigger this request + * @default true + * TODO does not currently support specifying + */ + abortLast?: true; +} + +/** + * useSSE() return type + */ +export interface SSEExposure { + readyState: ExportedState; + data: ExportedState; + eventSource: ExportedState; + /** + * Make the request manually. This method is automatically triggered when using `immediate: true` + * @param args Request parameters will be passed to method + */ + send(...args: [...Args, ...any[]]): Promise; + /** + * close connection + */ + close(): void; + /** + * Register the callback function of EventSource open + * @param callback callback function + * @returns Unregister function + */ + onOpen(callback: SSEOnOpenTrigger): this; + + /** + * Register the callback function for EventSource message + * @param callback callback function + * @returns Unregister function + */ + onMessage(callback: SSEOnMessageTrigger): this; + + /** + * Register the callback function for EventSource error + * @param callback callback function + * @returns Unregister function + */ + onError(callback: SSEOnErrorTrigger): this; + + /** + * @param eventName Event name, default exists `open` | `error` | `message` + * @param handler event handler + */ + on: SSEOn; +} + +/** + * useSSE + * Send requests using Server-sent events + * + * + * @param handler methodget function + * @param config Configuration parameters + * @return useSSE related data and operation functions + */ +export declare function useSSE( + handler: Method | AlovaMethodHandler, + config?: SSEHookConfig +): SSEExposure; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSerialRequest.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSerialRequest.d.ts new file mode 100644 index 0000000..88fa37b --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSerialRequest.d.ts @@ -0,0 +1,168 @@ +import { AlovaGenerics, Method } from 'alova'; +import { AlovaMethodHandler, UseHookExposure } from '../general'; +import { RequestHookConfig } from './useRequest'; + +/** + * useSerialRequest + * Serial request hook, the handlers will receive the result of the previous request + * Applicable scenario: Serial request for a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialRequest related data and operation functions + */ +export declare function useSerialRequest( + serialHandlers: [Method | AlovaMethodHandler, ...AlovaMethodHandler[]], + config?: RequestHookConfig +): UseHookExposure; + +/** + * useSerialRequest(overload) + * Serial request hook, the handlers will receive the result of the previous request + * Applicable scenario: Serial request for a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialRequest related data and operation functions + */ +export declare function useSerialRequest< + AG extends AlovaGenerics, + AG2 extends AlovaGenerics, + Args extends any[] = any[] +>( + serialHandlers: [Method | AlovaMethodHandler, AlovaMethodHandler, ...AlovaMethodHandler[]], + config?: RequestHookConfig +): UseHookExposure; + +/** + * useSerialRequest(overload) + * Serial request hook, the handlers will receive the result of the previous request + * Applicable scenario: Serial request for a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialRequest related data and operation functions + */ +export declare function useSerialRequest< + AG extends AlovaGenerics, + AG2 extends AlovaGenerics, + AG3 extends AlovaGenerics, + Args extends any[] = any[] +>( + serialHandlers: [ + Method | AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + ...AlovaMethodHandler[] + ], + config?: RequestHookConfig +): UseHookExposure; + +/** + * useSerialRequest(overload) + * Serial request hook, the handlers will receive the result of the previous request + * Applicable scenario: Serial request for a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialRequest related data and operation functions + */ +export declare function useSerialRequest< + AG extends AlovaGenerics, + AG2 extends AlovaGenerics, + AG3 extends AlovaGenerics, + AG4 extends AlovaGenerics, + Args extends any[] = any[] +>( + serialHandlers: [ + Method | AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + ...AlovaMethodHandler[] + ], + config?: RequestHookConfig +): UseHookExposure; + +/** + * useSerialRequest(overload) + * Serial request hook, the handlers will receive the result of the previous request + * Applicable scenario: Serial request for a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialRequest related data and operation functions + */ +export declare function useSerialRequest< + AG extends AlovaGenerics, + AG2 extends AlovaGenerics, + AG3 extends AlovaGenerics, + AG4 extends AlovaGenerics, + AG5 extends AlovaGenerics, + Args extends any[] = any[] +>( + serialHandlers: [ + Method | AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + ...AlovaMethodHandler[] + ], + config?: RequestHookConfig +): UseHookExposure; + +/** + * useSerialRequest(overload) + * Serial request hook, the handlers will receive the result of the previous request + * Applicable scenario: Serial request for a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialRequest related data and operation functions + */ +export declare function useSerialRequest< + AG extends AlovaGenerics, + AG2 extends AlovaGenerics, + AG3 extends AlovaGenerics, + AG4 extends AlovaGenerics, + AG5 extends AlovaGenerics, + AG6 extends AlovaGenerics, + Args extends any[] = any[] +>( + serialHandlers: [ + Method | AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + ...AlovaMethodHandler[] + ], + config?: RequestHookConfig +): UseHookExposure; + +/** + * useSerialRequest(overload) + * Serial request hook, the handlers will receive the result of the previous request + * Applicable scenario: Serial request for a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialRequest related data and operation functions + */ +export declare function useSerialRequest< + AG extends AlovaGenerics, + AG2 extends AlovaGenerics, + AG3 extends AlovaGenerics, + AG4 extends AlovaGenerics, + AG5 extends AlovaGenerics, + AG6 extends AlovaGenerics, + AG7 extends AlovaGenerics, + Args extends any[] = any[] +>( + serialHandlers: [ + Method | AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + ...AlovaMethodHandler[] + ], + config?: RequestHookConfig +): UseHookExposure; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSerialWatcher.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSerialWatcher.d.ts new file mode 100644 index 0000000..e4ebfc2 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useSerialWatcher.d.ts @@ -0,0 +1,175 @@ +import { AlovaGenerics, Method } from 'alova'; +import { AlovaMethodHandler, UseHookExposure } from '../general'; +import { WatcherHookConfig } from './useWatcher'; + +/** + * useSerialWatcher + * Serial request hook, the handlers will receive the result of the previous request + * Applicable scenario: After monitoring status changes, serially request a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialWatcher related data and operation functions + */ +export declare function useSerialWatcher( + serialHandlers: [Method | AlovaMethodHandler, ...AlovaMethodHandler[]], + watchingStates: AG['StatesExport']['Watched'][], + config?: WatcherHookConfig +): UseHookExposure; + +/** + * useSerialWatcher(overload) + * Serial request hook, the handlers will receive the result of the previous request + * Applicable scenario: After monitoring status changes, serially request a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialWatcher related data and operation functions + */ +export declare function useSerialWatcher< + AG extends AlovaGenerics, + AG2 extends AlovaGenerics, + Args extends any[] = any[] +>( + serialHandlers: [Method | AlovaMethodHandler, AlovaMethodHandler, ...AlovaMethodHandler[]], + watchingStates: AG['StatesExport']['Watched'][], + config?: WatcherHookConfig +): UseHookExposure; + +/** + * useSerialWatcher(overload) + * Serial request hook, the handlers will receive the result of the previous request + * Applicable scenario: After monitoring status changes, serially request a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialWatcher related data and operation functions + */ +export declare function useSerialWatcher< + AG extends AlovaGenerics, + AG2 extends AlovaGenerics, + AG3 extends AlovaGenerics, + Args extends any[] = any[] +>( + serialHandlers: [ + Method | AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + ...AlovaMethodHandler[] + ], + watchingStates: AG['StatesExport']['Watched'][], + config?: WatcherHookConfig +): UseHookExposure; + +/** + * useSerialWatcher(overload) + * Serial request hook, the handlers will receive the result of the previous request + * Applicable scenario: After monitoring status changes, serially request a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialWatcher related data and operation functions + */ +export declare function useSerialWatcher< + AG extends AlovaGenerics, + AG2 extends AlovaGenerics, + AG3 extends AlovaGenerics, + AG4 extends AlovaGenerics, + Args extends any[] = any[] +>( + serialHandlers: [ + Method | AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + ...AlovaMethodHandler[] + ], + watchingStates: AG['StatesExport']['Watched'][], + config?: WatcherHookConfig +): UseHookExposure; + +/** + * useSerialWatcher(overload) + * Serial request hook, the handlers will receive the result of the previous request + * Applicable scenario: After monitoring status changes, serially request a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialWatcher related data and operation functions + */ +export declare function useSerialWatcher< + AG extends AlovaGenerics, + AG2 extends AlovaGenerics, + AG3 extends AlovaGenerics, + AG4 extends AlovaGenerics, + AG5 extends AlovaGenerics, + Args extends any[] = any[] +>( + serialHandlers: [ + Method | AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + ...AlovaMethodHandler[] + ], + watchingStates: AG['StatesExport']['Watched'][], + config?: WatcherHookConfig +): UseHookExposure; + +/** + * useSerialWatcher(overload) + * Serial request hook, the handlers will receive the result of the previous request + * Applicable scenario: After monitoring status changes, serially request a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialWatcher related data and operation functions + */ +export declare function useSerialWatcher< + AG extends AlovaGenerics, + AG2 extends AlovaGenerics, + AG3 extends AlovaGenerics, + AG4 extends AlovaGenerics, + AG5 extends AlovaGenerics, + AG6 extends AlovaGenerics, + Args extends any[] = any[] +>( + serialHandlers: [ + Method | AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + ...AlovaMethodHandler[] + ], + watchingStates: AG['StatesExport']['Watched'][], + config?: WatcherHookConfig +): UseHookExposure; + +/** + * useSerialWatcher(overload) + * Serial request hook, the handlers will receive the result of the previous request + * Applicable scenario: After monitoring status changes, serially request a set of interfaces + * @param serialHandlers Serial request callback array + * @param config Configuration parameters + * @return useSerialWatcher related data and operation functions + */ +export declare function useSerialWatcher< + AG extends AlovaGenerics, + AG2 extends AlovaGenerics, + AG3 extends AlovaGenerics, + AG4 extends AlovaGenerics, + AG5 extends AlovaGenerics, + AG6 extends AlovaGenerics, + AG7 extends AlovaGenerics, + Args extends any[] = any[] +>( + serialHandlers: [ + Method | AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + AlovaMethodHandler, + ...AlovaMethodHandler[] + ], + watchingStates: AG['StatesExport']['Watched'][], + config?: WatcherHookConfig +): UseHookExposure; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useWatcher.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useWatcher.d.ts new file mode 100644 index 0000000..658c092 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/hooks/useWatcher.d.ts @@ -0,0 +1,28 @@ +import { AlovaGenerics, Method } from 'alova'; +import { AlovaMethodHandler, UseHookExposure } from '../general'; +import { FrontRequestHookConfig } from './useRequest'; + +/** useWatcher config export type */ +export interface WatcherHookConfig + extends FrontRequestHookConfig { + /** Request anti-shake time (milliseconds). When passing in the array, you can set the anti-shake time individually in the order of watching states. */ + debounce?: number | number[]; + abortLast?: boolean; +} + +/** + * Request after monitoring specific status value changes + * @example + * ```js + * const { data, loading, error, send, onSuccess } = useWatcher(() => alova.Get('/api/user-list'), [keywords]) + * ``` + * @param methodHandler method instance or get function + * @param watchingStates Listening status array + * @param config Configuration items + * @returns Responsive request data, operation functions and event binding functions + */ +export declare function useWatcher( + methodHandler: Method | AlovaMethodHandler, + watchingStates: AG['StatesExport']['Watched'][], + config?: WatcherHookConfig +): UseHookExposure; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/index.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/index.d.ts new file mode 100644 index 0000000..d7e0035 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/clienthook/index.d.ts @@ -0,0 +1,17 @@ +export * from './general'; +export * from './helper'; +export * from './hooks/actionDelegationMiddleware'; +export * from './hooks/tokenAuthentication'; +export * from './hooks/updateState'; +export * from './hooks/useAutoRequest'; +export * from './hooks/useCaptcha'; +export * from './hooks/useFetcher'; +export * from './hooks/useForm'; +export * from './hooks/usePagination'; +export * from './hooks/useRequest'; +export * from './hooks/useRetriable'; +export * from './hooks/useSerialRequest'; +export * from './hooks/useSerialWatcher'; +export * from './hooks/useSQRequest'; +export * from './hooks/useSSE'; +export * from './hooks/useWatcher'; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/fetch.d.cts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/fetch.d.cts new file mode 100644 index 0000000..3af37ea --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/fetch.d.cts @@ -0,0 +1,13 @@ +import { AlovaRequestAdapter } from '.'; + +declare namespace FetchTypes { + type FetchRequestInit = Omit; + + /** + * fetch request adapter + */ + type FetchRequestAdapter = AlovaRequestAdapter; +} + +declare function adapterFetch(): FetchTypes.FetchRequestAdapter; +export = FetchTypes; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/fetch.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/fetch.d.ts new file mode 100644 index 0000000..8cadc1d --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/fetch.d.ts @@ -0,0 +1,11 @@ +import { AlovaRequestAdapter } from '.'; + +export type FetchRequestInit = Omit; + +/** + * fetch request adapter + */ +export type FetchRequestAdapter = AlovaRequestAdapter; + +declare function adapterFetch(): FetchRequestAdapter; +export default adapterFetch; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/index.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/index.d.ts new file mode 100644 index 0000000..4081d0d --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/index.d.ts @@ -0,0 +1,802 @@ +import { EventManager, FrameworkState } from '@alova/shared'; + +export interface AlovaGenerics< + R = any, + T = any, + RC = any, + RE = any, + RH = any, + L1 extends AlovaGlobalCacheAdapter = any, + L2 extends AlovaGlobalCacheAdapter = any, + SE extends StatesExport = any +> { + Responded: R; + Transformed: T; + RequestConfig: RC; + Response: RE; + ResponseHeader: RH; + L1Cache: L1; + L2Cache: L2; + StatesExport: SE; +} + +type Arg = Record; +export type RequestBody = Arg | string | FormData | Blob | ArrayBuffer | URLSearchParams | ReadableStream; + +/** + * Request elements, information necessary to send a request + */ +export interface RequestElements { + readonly url: string; + readonly type: MethodType; + readonly headers: Arg; + readonly data?: RequestBody; +} +export type ProgressUpdater = (loaded: number, total: number) => void; +export type AlovaRequestAdapter = ( + elements: RequestElements, + method: Method> +) => { + response: () => Promise; + headers: () => Promise; + onDownload?: (handler: ProgressUpdater) => void; + onUpload?: (handler: ProgressUpdater) => void; + abort: () => void; +}; + +export type MethodType = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'OPTIONS' | 'PATCH'; + +/** + * provide user to custom some types + * 1. meta: custom metadata type. + * 2. statesHook: custom the global states hook type. + */ +export interface AlovaCustomTypes { + [customKey: string]: any; +} + +export interface AlovaGlobalCacheAdapter { + /** + * save or update cache + * @param key key + * @param value value + */ + set(key: string, value: any): void | Promise; + + /** + * get value by key + * @param key key + */ + get(key: string): T | undefined | Promise; + + /** + * remove item + * @param key key + */ + remove(key: string): void | Promise; + + /** + * clear all cache. + */ + clear(): void | Promise; +} + +interface CacheEvent { + type: 'set' | 'get' | 'remove' | 'clear'; + key: string; + value?: any; + container: Record; +} +export interface AlovaDefaultCacheAdapter extends AlovaGlobalCacheAdapter { + /** + * the events related to cache action emitter. + */ + readonly emitter: EventManager<{ success: CacheEvent; fail: Omit }>; +} + +/** + * Request cache settings + * expire: expiration time + * 1. When set to a number: if it is greater than 0, the cached data will be returned first, the expiration time unit is milliseconds, if it is less than or equal to 0, it will not be cached, and Infinity will never expire; + * 2. When set to a Date object, it means + * mode: cache mode, optional values are memory, restore + */ +export type CacheExpire = number | Date | null; +export type CacheMode = 'memory' | 'restore'; +export type CacheExpireGetter = (event: { + method: Method; + mode: CacheMode; +}) => CacheExpire; +export type DetailCacheConfig = { + expire: CacheExpire | CacheExpireGetter; + mode?: CacheMode; + + /** Persistent cache tags, the original persistent data will be invalid after the tag is changed. */ + tag?: string | number; +}; +export type CacheConfig = CacheExpire | DetailCacheConfig; +export type CacheController = () => Responded | undefined | Promise; +export interface MethodRequestConfig { + /** + * url parameters + */ + params: Arg; + + /** + * Request header + */ + headers: Arg; +} +export type AlovaMethodConfig = { + /** + * The name of the method object. The corresponding method object can be obtained by name or wildcard in the updateState, invalidateCache, setCache, and fetch functions. + */ + name?: string | number; + + /** + * current outage time + */ + timeout?: number; + + /** + * The response data will not be requested again within the cache time. Get requests are cached for 5 minutes (300000 milliseconds) by default, and other requests are not cached by default. + */ + cacheFor?: CacheConfig> | CacheController; + + /** + * Hit the source method instance. When the source method instance request is successful, the cache of the current method instance will be invalidated. + * As an automatic invalidation function, you only need to set the hit source instead of manually calling invalidateCache to invalidate the cache. + * At the same time, this function is more concise than the invalidateCache method in complex invalidation relationships. + * The value of this field can be set to the method instance, the name of other method instances, name regular matching, or their array + */ + hitSource?: string | RegExp | Method | (string | RegExp | Method)[]; + + /** + * Response data conversion. The converted data will be converted into data state. If there is no converted data, the response data will be used directly as data state. + */ + transform?: (data: Transformed, headers: AG['ResponseHeader']) => Responded | Promise; + + /** + * Request level sharing request switch + * After the sharing request is enabled, the same request will be shared when the same request is initiated at the same time. + * When set here, it will overwrite the global settings. + */ + shareRequest?: boolean; + + /** + * method metadata + */ + meta?: AlovaCustomTypes['meta']; +} & AG['RequestConfig']; +export type AlovaMethodCreateConfig = Partial & + AlovaMethodConfig; + +export type RespondedHandler = (response: AG['Response'], methodInstance: Method) => any; +export type ResponseErrorHandler = ( + error: any, + methodInstance: Method +) => void | Promise; +export type ResponseCompleteHandler = (methodInstance: Method) => any; +export type RespondedHandlerRecord = { + /** + * Global request success hook function + * If an error is thrown in global onSuccess, the global onError will not be triggered, but the onError of the requested location will be triggered. + */ + onSuccess?: RespondedHandler; + + /** + * Global request error hook function. Request error refers to a network request failure. Error codes such as 404 and 500 returned by the server will not enter this hook function. + * When the global onError is specified to capture the error, if no error is thrown, the onSuccess of the requested location will be triggered. + */ + onError?: ResponseErrorHandler; + + /** + * Request completion hook function + * This hook function will be triggered if the request is successful, the cache match is successful, or the request fails. + */ + onComplete?: ResponseCompleteHandler; +}; + +export interface FetchRequestState { + loading: L; + error: E; + downloading: D; + uploading: U; +} +export interface FrontRequestState extends FetchRequestState { + data: R; +} + +export type MergedStatesMap = Record>; +export interface EffectRequestParams { + handler: (...args: any[]) => void; + removeStates: () => void; + saveStates: (frontStates: MergedStatesMap) => void; + frontStates: MergedStatesMap; + watchingStates?: E[]; + immediate: boolean; +} + +export interface ReferingObject { + /** + * the map of tracked state keys + */ + trackedKeys: Record; + /** + * has been bound error event + */ + bindError: boolean; + [key: string]: any; +} +export type StatesExportHelper> = I; + +export interface StatesExport { + name: string; + State: T; + Computed: T; + Watched: T; + StateExport: T; + ComputedExport: T; +} + +export interface StatesHook> { + name: SE['name']; + /** + * Create status + * @param initialValue initial data + * @returns status value + */ + create: (initialValue: any, key: string, referingObject: ReferingObject) => SE['State']; + + /** + * create computed state + * @param initialValue initial data + * @param key attribute name + * @param referingObject refering object + */ + computed: ( + getter: () => any, + deps: (SE['StateExport'] | SE['ComputedExport'])[], + key: string, + referingObject: ReferingObject + ) => SE['Computed']; + + /** + * Values exported for use by developers + * @param state status value + * @param referingObject referring object + * @returns exported value + */ + export?: (state: SE['State'], referingObject: ReferingObject) => SE['StateExport'] | SE['ComputedExport']; + + /** Convert state to normal data */ + dehydrate: (state: SE['State'], key: string, referingObject: ReferingObject) => any; + + /** + * Update status value + * @param newVal new data collection + * @param state original state value + * @param key attribute name + * @param @param referingObject referring object + */ + update: (newVal: any, state: SE['State'], key: string, referingObject: ReferingObject) => void; + + /** + * Controls the function that executes the request. This function will be executed once when useRequest and useWatcher are called. + * Execute once in the fetch function in useFetcher + * When watchingStates is an empty array, execute the handleRequest function once + * When watchingStates is a non-empty array, it is called when the state changes. When immediate is true, it needs to be called immediately. + * Hook is an instance of use hook. Each time use hook is called, a hook instance will be generated. + * It can be executed directly in vue, but in react it needs to be executed in useEffect + * The removeStates function is a function that clears the current state and should be called when the component is unloaded. + */ + effectRequest: (effectParams: EffectRequestParams, referingObject: ReferingObject) => void; + + /** + * Packaging use hooks operation functions such as send and abort + * This is mainly used to optimize the problem that new functions will be generated every time rendering in react to optimize performance. + * @param fn use hook operation function + * @returns Wrapped operation function + */ + memorize?: any>(fn: Callback) => Callback; + + /** + * Create reference object + * @param initialValue initial value + * @returns a reference object containing the initial value + */ + ref?: (initialValue: D) => { current: D }; + + /** + * watch states + * @param source watching source + * @param callback callback when states changes + * @param referingObject refering object + */ + watch: (source: SE['Watched'][], callback: () => void, referingObject: ReferingObject) => void; + + /** + * bind mounted callback. + * @param callback callback on component mounted + * @param referingObject refering object + */ + onMounted: (callback: () => void, referingObject: ReferingObject) => void; + + /** + * bind unmounted callback. + * @param callback callback on component unmounted + * @param referingObject refering object + */ + onUnmounted: (callback: () => void, referingObject: ReferingObject) => void; +} + +export type GlobalCacheConfig = Partial>> | null; +export type CacheLoggerHandler = ( + response: any, + methodInstance: Method, + cacheMode: CacheMode, + tag: DetailCacheConfig['tag'] +) => void | Promise; +/** + * Generic type explanation: + * State: The type of state group created by the create function + * Computed: The computed property value created by the computed function + * Watched: listener type + * Export: The type of status group returned by the export function + * RequestConfig: the request configuration type of requestAdapter, automatically inferred + * Response: response configuration type of type requestAdapter, automatically inferred + * ResponseHeader: response header type of requestAdapter, automatically inferred + */ +export interface AlovaOptions { + /** + * custom alova id + * + * **Recommend to custom it in multiple server scenarios**from 0 in creating order + */ + id?: number | string; + + /** + * base url + */ + baseURL?: string; + + /** + * State hook function, used to define and update the state of the specified MVVM library + */ + statesHook?: StatesHook; + + /** + * request adapter. + * all request of alova will be sent by it. + */ + requestAdapter: AlovaRequestAdapter; + + /** + * global timeout. unit is millisecond. + */ + timeout?: number; + + /** + * Global request local cache settings + * expire: Expiration time. If it is greater than 0, the cached data will be returned first. The expiration time unit is milliseconds. If it is less than or equal to 0, it will not be cached. Infinity will never expire. + * mode: cache mode, optional values are memory, restore + * Get requests are cached for 5 minutes (300000 milliseconds) by default, and other requests are not cached by default. + * @default { GET: 300000 } + */ + cacheFor?: GlobalCacheConfig; + + /** + * memory mode cache adapter. it will be used when caching data with memory mode. + * it's an js's object default. + * you can set your own adapter with sync/async function of set/get/remove. + * see [https://alova.js.org/tutorial/custom/custom-storage-adapter] + */ + l1Cache?: AG['L1Cache']; + + /** + * restore mode cache adapter. it will be used when persist data. + * default behavior: + * -browser/deno: localStorage. + * -nodejs/bun: no adapter.(you can use @alova/cache-file). + * see [https://alova.js.org/tutorial/custom/custom-storage-adapter] + */ + l2Cache?: AG['L2Cache']; + + /** + * global before request hook + */ + beforeRequest?: (method: Method) => void | Promise; + + /** + * A global response hook, which can be passed or set as an object with onSuccess, onError, and onComplete, to represent the request success and request error hooks. + * If an error is thrown in global onSuccess, the global onError will not be triggered, but the onError of the requested location will be triggered. + * When the global onError is specified to capture the error, if no error is thrown, the onSuccess of the requested location will be triggered. + * @version 2.1.0 + */ + responded?: RespondedHandler | RespondedHandlerRecord; + + /** + * Global sharing request switch + * After the sharing request is enabled, the same request will be shared when the same request is initiated at the same time. + * @default true + */ + shareRequest?: boolean; + + /** + * Cache log printing + * When the response cache is hit, matching cache information will be printed on the console by default to remind developers + * When set to false or null, the log will not be printed. + * When set as a custom function, it will custom take over the task of cache matching. + * @version 2.8.0 + * @default true + */ + cacheLogger?: boolean | null | CacheLoggerHandler; + + /** + * limitation of method snapshots. + * it indicates not save snapshot when value is set to 0, and the method matcher will not work. + * @default 1000 + */ + snapshots?: number; +} + +/** progress information */ +export type Progress = { + total: number; + loaded: number; +}; +export type ProgressHandler = (progress: Progress) => void; + +export interface AbortFunction { + (): void; + a: () => void; +} + +/** + * Request method type + */ +export declare class Method extends Promise { + constructor( + type: MethodType, + context: Alova, + url: string, + config?: AlovaMethodCreateConfig, + data?: RequestBody + ); + + /** + * baseURL of alova instance + */ + baseURL: string; + + /** + * Request url + */ + url: string; + + /** + * Request type + */ + type: MethodType; + + /** + * method configuration + */ + config: MethodRequestConfig & AlovaMethodConfig; + + /** + * Request body + */ + data?: RequestBody; + + /** + * Cache hit source + */ + hitSource?: (string | RegExp)[]; + + /** + * alova example + */ + context: Alova; + + /** + * storage key + */ + key: string; + + /** + * download event + * @version 2.17.0 + */ + dhs: ProgressHandler[]; + + /** + * Upload event + * @version 2.17.0 + */ + uhs: ProgressHandler[]; + + /** + * Whether this response data comes from cache + * @version 2.17.0 + */ + fromCache: boolean | undefined; + + /** + * Used to pass additional information in global request and response hook functions + * Any field can be used in js projects + */ + meta?: AlovaCustomTypes['meta']; + + /** + * Request a Promise instance + */ + promise?: Promise; + + /** + * Use this method instance to send the request directly + * @param forceRequest mandatory request + * @returns Request a Promise instance + */ + send(forceRequest?: boolean): Promise; + + /** + * Set name + * @param name name + */ + setName(name: string | number): void; + + /** + * Generate the key of the current method + */ + generateKey(): string; + + /** + * Interrupt requests sent directly by this method instance + */ + abort: AbortFunction; + + /** + * Bind download progress callback function + * @param progressHandler Download progress callback function + * @version 2.17.0 + * @return unbind function + */ + onDownload(progressHandler: ProgressHandler): () => void; + + /** + * Bind upload progress callback function + * @param progressHandler Upload progress callback function + * @version 2.17.0 + * @return unbind function + */ + onUpload(progressHandler: ProgressHandler): () => void; +} + +export class MethodSnapshotContainer { + records: Record>>; + + capacity: number; + + occupy: number; + + save(methodInstance: Method): void; + + /** + * get method snapshots by matcher + * the method snapshots means the method instance that has been requested + * @version 3.0.0 + * @param {MethodFilter} matcher method matcher + * @param {boolean} matchAll is match all, default is true + * @returns {Method[] | Method} method list when `matchAll` is true, otherwise return method instance or undefined + */ + match( + matcher: MethodFilter, + matchAll?: M + ): M extends true ? Method[] : Method | undefined; +} + +export type RespondedAlovaGenerics = Omit< + AG, + 'Responded' | 'Transformed' +> & { + Responded: Responded; + Transformed: Transformed; +}; + +export interface Alova { + id: string; + options: AlovaOptions; + l1Cache: AG['L1Cache']; + l2Cache: AG['L2Cache']; + snapshots: MethodSnapshotContainer; + Get( + url: string, + config?: AlovaMethodCreateConfig + ): Method>; + Post( + url: string, + data?: RequestBody, + config?: AlovaMethodCreateConfig + ): Method>; + Put( + url: string, + data?: RequestBody, + config?: AlovaMethodCreateConfig + ): Method>; + Delete( + url: string, + data?: RequestBody, + config?: AlovaMethodCreateConfig + ): Method>; + Head( + url: string, + config?: AlovaMethodCreateConfig + ): Method>; + Options( + url: string, + config?: AlovaMethodCreateConfig + ): Method>; + Patch( + url: string, + data?: RequestBody, + config?: AlovaMethodCreateConfig + ): Method>; +} + +export interface MethodFilterHandler { + (method: Method, index: number, methods: Method[]): boolean; +} + +export type MethodDetaiedFilter = { + name?: string | RegExp; + filter?: MethodFilterHandler; +}; +export type MethodFilter = string | RegExp | MethodDetaiedFilter; + +/** + * alova global configurations. + */ +export interface AlovaGlobalConfig { + /** + * switch of auto hit cache. + * here is three options: + * -global: invalidate cache cross alova instances. + * -self: only invalidate cache from the same alova instance. + * -close: don't auto invalidate cache any more. + * @default 'global' + */ + autoHitCache?: 'global' | 'self' | 'close'; + /** + * whether the app is running in the server + * If not set or set to `undefined`, alova determines whether it is now running in the server + * @default undefined + */ + ssr?: boolean | undefined; +} + +// ************ exports *************** +/** + * create an alova instance. + * @param options global options + * @returns alova instance + */ +export declare function createAlova< + RequestConfig, + Response, + ResponseHeader, + L1Cache extends AlovaGlobalCacheAdapter = AlovaDefaultCacheAdapter, + L2Cache extends AlovaGlobalCacheAdapter = AlovaDefaultCacheAdapter, + SE extends StatesExport = StatesExport +>( + options: AlovaOptions> +): Alova>; + +/** + * invalidate cache + * @example + * ```js + * // invalidate cache with specific method instance. + * invalidateCache(alova.Get('/api/profile')); + * + * // match method snapshots then invalidate them. + * const methods = alova.snapshots.match('method-name'); + * invalidateCache(methods); + * + * // invalidate all cache. + * invalidateCache(); + * ``` + * @param matcher Array of method instances or method matcher parameters + */ +export declare function invalidateCache(matcher?: Method | Method[]): Promise; + +export interface UpdateOptions { + onMatch?: (method: Method) => void; +} + +export interface CacheSetOptions { + /** + * cache policy. + * -l1: only set l1 cache. + * -l2: only set l2 cache. + * -all: set l1 cache and set l2 cache(method cache mode need to be 'restore'). + * @default 'all' + */ + policy?: 'l1' | 'l2' | 'all'; +} +/** + * set cache manually + * @example + * ```js + * // set static cache + * setCache(methodInstance, newData); + * + * // set cache dynamically + * setCache(methodInstance, oldData => { + * if (oldData.name === 'new name') { + * // it indicates that the cache is not updated when returning undefined + * return; + * } + * old.name = 'new name'; + * return oldData; + * }); + * + * // get methods from snapshots + * const methods = alova.snapshots.match('method-name'); + * setCache(methods, newData); + * ``` + * @param matcher method instance(s) + */ +export declare function setCache( + matcher: Method | Method[], + dataOrUpdater: AG['Responded'] | ((oldCache: AG['Responded']) => AG['Responded'] | undefined | void), + options?: CacheSetOptions +): Promise; + +export interface CacheQueryOptions { + /** + * cache policy. + * -l1: only query l1 cache. + * -l2: only query l2 cache. + * -all: query l1 cache first and query l2 cache if l1 cache not found(method cache mode need to be 'restore'). + * @default 'all' + */ + policy?: 'l1' | 'l2' | 'all'; +} +/** + * query cache data + * @example + * ```js + * const cache = queryCache(alova.Get('/api/profile')); + * ``` + * @param matcher method instance + * @returns cache data, return undefined if not found + */ +export declare function queryCache( + matcher: Method, + options?: CacheQueryOptions +): Promise; + +/** + * hit(invalidate) target caches by source method + * this is the implementation of auto invalidate cache + * @param sourceMethod source method instance + * @example + * ```js + * await hitCacheBySource(alova.Get('/api/profile')); + * ``` + */ +export declare function hitCacheBySource(sourceMethod: Method): Promise; + +export declare const globalConfigMap: Required; + +/** + * Set global configuration configuration + */ +export declare function globalConfig(config: AlovaGlobalConfig): void; + +/** + * get the unified statesHook, and it will throw error if not set. + * @returns the unified statesHook + */ +export declare function promiseStatesHook>(): StatesHook; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/serverhook.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/serverhook.d.ts new file mode 100644 index 0000000..ec3fb40 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/serverhook.d.ts @@ -0,0 +1,136 @@ +/** + * @alova/server 1.0.0 (https://alova.js.org) + * Document https://alova.js.org + * Copyright 2025 Scott hu. All Rights Reserved + * Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE) +*/ + +import { AlovaGenerics, Method, AlovaGlobalCacheAdapter } from 'alova'; +import { RateLimiterRes, IRateLimiterStoreOptions } from 'rate-limiter-flexible'; +import RateLimiterStoreAbstract from 'rate-limiter-flexible/lib/RateLimiterStoreAbstract.js'; +import { BackoffPolicy } from '@alova/shared'; + +type RequestHandler = (forceRequest?: boolean) => Promise; +declare class HookedMethod extends Method { + private handler; + constructor(entity: Method, requestHandler: RequestHandler); + send(forceRequest?: boolean): Promise; +} + +type StoreResult = [points: number, expireTime: number]; +interface LimitHandlerOptions { + /** storage key */ + key?: string | ((method: Method) => string); +} +/** + * Rate limit, there can only be a maximum of [points] requests within [duration] seconds + * + * Usage scenarios: + * 1. Request restrictions. For example, when node acts as an intermediate layer to request downstream services, under an API with serious resource consumption, it is restricted through IP to avoid consuming downstream server resources. + * 2. Prevent password brute force cracking. When the downstream server throws login errors multiple times in a row, restrict it by IP or user name. + * 3. As a sending limit for sendCaptcha, it prevents users from frequently sending verification codes. + */ +interface RateLimitOptions { + /** + * The maximum quantity that can be consumed within the duration + * @default 4 + */ + points?: number; + /** + * Points reset time, unit ms + * @default 4000 + */ + duration?: number; + /** + * Namespace, prevents conflicts when multiple limiters use the same storage medium + */ + keyPrefix?: string; + /** + * The following two parameters are consumption interval control + * */ + execEvenly?: boolean; + execEvenlyMinDelayMs?: number; + /** + * After reaching the rate limit, [blockDuration]ms will be extended. For example, if the password is incorrect 5 times within 1 hour, it will be locked for 24 hours. This 24 hours is this parameter. + */ + blockDuration?: number; + /** + * Custom storage adapter, defaults to methodObj.context.l2Cache if not set + */ + storage?: AlovaGlobalCacheAdapter; +} +declare class RateLimiterStore extends RateLimiterStoreAbstract { + protected storage: AlovaGlobalCacheAdapter; + constructor(storage: AlovaGlobalCacheAdapter, options: IRateLimiterStoreOptions); + /** + * parses raw data from store to RateLimiterRes object. + */ + _getRateLimiterRes(key: string | number, changedPoints: number, result: StoreResult): RateLimiterRes; + _upsert(key: string | number, points: number, msDuration: number, forceExpire?: boolean): Promise; + /** + * returns raw data by key or null if there is no key or expired. + */ + _get(key: string | number): Promise<{} | null>; + /** + * returns true on deleted, false if key is not found. + */ + _delete(key: string | number): Promise; +} +/** + * The method instance modified by rateLimit, its extension method corresponds to the method of creating an instance in rate-limit-flexible, and the key is the key specified by calling rateLimit. + * AlovaServerHook can currently only return unextended method types. It has not been changed to customizable returned extended method types. + */ +declare class LimitedMethod extends HookedMethod { + protected limiter: RateLimiterStore; + private keyGetter; + constructor(method: Method, limiterKey: string | ((method: Method) => string), limiter: RateLimiterStore); + private getLimiterKey; + /** + * Get RateLimiterRes or null. + */ + get(options?: { + [key: string]: any; + }): Promise; + /** + * Set points by key. + */ + set(points: number, msDuration: number): Promise; + /** + * @param points default is 1 + */ + consume(points?: number): Promise; + /** + * Increase number of consumed points in current duration. + * @param points penalty points + */ + penalty(points: number): Promise; + /** + * Decrease number of consumed points in current duration. + * @param points reward points + */ + reward(points: number): Promise; + /** + * Block key for ms. + */ + block(msDuration: number): Promise; + /** + * Reset consumed points. + */ + delete(): Promise; +} +declare function createRateLimiter(options?: RateLimitOptions): (method: Method, handlerOptions?: LimitHandlerOptions) => LimitedMethod; + +interface RetryOptions { + /** + * The maximum number of retries. it can also be set as a function that returns a boolean to dynamically determine whether to continue retry. + * @default 3 + */ + retry?: number | ((error: Error) => boolean); + /** + * backoff policy + */ + backoff?: BackoffPolicy; +} +declare const retry: (method: Method, options?: RetryOptions) => HookedMethod; + +export { HookedMethod, createRateLimiter, retry }; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/react.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/react.d.ts new file mode 100644 index 0000000..b4c3d94 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/react.d.ts @@ -0,0 +1,17 @@ +import { StatesExportHelper, StatesHook } from 'alova'; +import { Dispatch, SetStateAction } from 'react'; + +export type ReactHookExportType = StatesExportHelper<{ + name: 'React'; + State: ReactState; + Computed: any[]; + Watched: T; + StateExport: T; + ComputedExport: T; +}>; + +export type ReactState = [D, Dispatch>, D?]; +export type ReactHookType = StatesHook>; +declare const reactHook: ReactHookType; + +export default reactHook; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/solid.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/solid.d.ts new file mode 100644 index 0000000..42250ef --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/solid.d.ts @@ -0,0 +1,20 @@ +import { StatesExportHelper, StatesHook } from 'alova'; +import { Accessor, Setter } from 'solid-js'; + +// define SolidHooks export type +export type SolidHookExportType = StatesExportHelper<{ + name: 'Solid'; + State: SolidState; + Computed: SolidState; + Watched: Accessor; + StateExport: Accessor; + ComputedExport: Accessor; +}>; + +// solid state type +export type SolidState = [Accessor, Setter]; +// solid hook type +export type SolidHookType = StatesHook>; + +declare const solidHook: SolidHookType; +export default solidHook; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/svelte.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/svelte.d.ts new file mode 100644 index 0000000..3391e1c --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/svelte.d.ts @@ -0,0 +1,16 @@ +import { StatesExportHelper, StatesHook } from 'alova'; +import { Readable, Writable } from 'svelte/store'; + +export type SvelteHookExportType = StatesExportHelper<{ + name: 'Svelte'; + State: Writable; + Computed: Readable; + Watched: Writable; + StateExport: Writable; + ComputedExport: Readable; +}>; + +export type SvelteHookType = StatesHook>; +declare const svelteHook: SvelteHookType; + +export default svelteHook; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/vue-demi.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/vue-demi.d.ts new file mode 100644 index 0000000..07e0c12 --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/vue-demi.d.ts @@ -0,0 +1,16 @@ +import { StatesExportHelper, StatesHook } from 'alova'; +import { ComputedRef, Ref, WatchSource } from 'vue-demi'; + +export type VueDemiHookExportType = StatesExportHelper<{ + name: 'VueDemi'; + State: Ref; + Computed: ComputedRef; + Watched: WatchSource | object; + StateExport: Ref; + ComputedExport: ComputedRef; +}>; + +export type VueHookType = StatesHook>; +declare const vueHook: VueHookType; + +export default vueHook; diff --git a/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/vue.d.ts b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/vue.d.ts new file mode 100644 index 0000000..97db0be --- /dev/null +++ b/node_modules/.pnpm/alova@3.2.10/node_modules/alova/typings/stateshook/vue.d.ts @@ -0,0 +1,16 @@ +import { StatesExportHelper, StatesHook } from 'alova'; +import { ComputedRef, Ref, WatchSource } from 'vue'; + +export type VueHookExportType = StatesExportHelper<{ + name: 'Vue'; + State: Ref; + Computed: ComputedRef; + Watched: WatchSource | object; + StateExport: Ref; + ComputedExport: ComputedRef; +}>; + +export type VueHookType = StatesHook>; +declare const vueHook: VueHookType; + +export default vueHook; diff --git a/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/LICENSE.md b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/LICENSE.md new file mode 100644 index 0000000..2027e8d --- /dev/null +++ b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Evan Wallace + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/README.md b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/README.md new file mode 100644 index 0000000..93863d1 --- /dev/null +++ b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/README.md @@ -0,0 +1,3 @@ +# esbuild + +This is a JavaScript bundler and minifier. See https://github.com/evanw/esbuild and the [JavaScript API documentation](https://esbuild.github.io/api/) for details. diff --git a/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/bin/esbuild b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/bin/esbuild new file mode 100644 index 0000000..971ac09 --- /dev/null +++ b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/bin/esbuild @@ -0,0 +1,220 @@ +#!/usr/bin/env node +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// lib/npm/node-platform.ts +var fs = require("fs"); +var os = require("os"); +var path = require("path"); +var ESBUILD_BINARY_PATH = process.env.ESBUILD_BINARY_PATH || ESBUILD_BINARY_PATH; +var isValidBinaryPath = (x) => !!x && x !== "/usr/bin/esbuild"; +var packageDarwin_arm64 = "@esbuild/darwin-arm64"; +var packageDarwin_x64 = "@esbuild/darwin-x64"; +var knownWindowsPackages = { + "win32 arm64 LE": "@esbuild/win32-arm64", + "win32 ia32 LE": "@esbuild/win32-ia32", + "win32 x64 LE": "@esbuild/win32-x64" +}; +var knownUnixlikePackages = { + "aix ppc64 BE": "@esbuild/aix-ppc64", + "android arm64 LE": "@esbuild/android-arm64", + "darwin arm64 LE": "@esbuild/darwin-arm64", + "darwin x64 LE": "@esbuild/darwin-x64", + "freebsd arm64 LE": "@esbuild/freebsd-arm64", + "freebsd x64 LE": "@esbuild/freebsd-x64", + "linux arm LE": "@esbuild/linux-arm", + "linux arm64 LE": "@esbuild/linux-arm64", + "linux ia32 LE": "@esbuild/linux-ia32", + "linux mips64el LE": "@esbuild/linux-mips64el", + "linux ppc64 LE": "@esbuild/linux-ppc64", + "linux riscv64 LE": "@esbuild/linux-riscv64", + "linux s390x BE": "@esbuild/linux-s390x", + "linux x64 LE": "@esbuild/linux-x64", + "linux loong64 LE": "@esbuild/linux-loong64", + "netbsd x64 LE": "@esbuild/netbsd-x64", + "openbsd x64 LE": "@esbuild/openbsd-x64", + "sunos x64 LE": "@esbuild/sunos-x64" +}; +var knownWebAssemblyFallbackPackages = { + "android arm LE": "@esbuild/android-arm", + "android x64 LE": "@esbuild/android-x64" +}; +function pkgAndSubpathForCurrentPlatform() { + let pkg; + let subpath; + let isWASM2 = false; + let platformKey = `${process.platform} ${os.arch()} ${os.endianness()}`; + if (platformKey in knownWindowsPackages) { + pkg = knownWindowsPackages[platformKey]; + subpath = "esbuild.exe"; + } else if (platformKey in knownUnixlikePackages) { + pkg = knownUnixlikePackages[platformKey]; + subpath = "bin/esbuild"; + } else if (platformKey in knownWebAssemblyFallbackPackages) { + pkg = knownWebAssemblyFallbackPackages[platformKey]; + subpath = "bin/esbuild"; + isWASM2 = true; + } else { + throw new Error(`Unsupported platform: ${platformKey}`); + } + return { pkg, subpath, isWASM: isWASM2 }; +} +function pkgForSomeOtherPlatform() { + const libMainJS = require.resolve("esbuild"); + const nodeModulesDirectory = path.dirname(path.dirname(path.dirname(libMainJS))); + if (path.basename(nodeModulesDirectory) === "node_modules") { + for (const unixKey in knownUnixlikePackages) { + try { + const pkg = knownUnixlikePackages[unixKey]; + if (fs.existsSync(path.join(nodeModulesDirectory, pkg))) return pkg; + } catch { + } + } + for (const windowsKey in knownWindowsPackages) { + try { + const pkg = knownWindowsPackages[windowsKey]; + if (fs.existsSync(path.join(nodeModulesDirectory, pkg))) return pkg; + } catch { + } + } + } + return null; +} +function downloadedBinPath(pkg, subpath) { + const esbuildLibDir = path.dirname(require.resolve("esbuild")); + return path.join(esbuildLibDir, `downloaded-${pkg.replace("/", "-")}-${path.basename(subpath)}`); +} +function generateBinPath() { + if (isValidBinaryPath(ESBUILD_BINARY_PATH)) { + if (!fs.existsSync(ESBUILD_BINARY_PATH)) { + console.warn(`[esbuild] Ignoring bad configuration: ESBUILD_BINARY_PATH=${ESBUILD_BINARY_PATH}`); + } else { + return { binPath: ESBUILD_BINARY_PATH, isWASM: false }; + } + } + const { pkg, subpath, isWASM: isWASM2 } = pkgAndSubpathForCurrentPlatform(); + let binPath2; + try { + binPath2 = require.resolve(`${pkg}/${subpath}`); + } catch (e) { + binPath2 = downloadedBinPath(pkg, subpath); + if (!fs.existsSync(binPath2)) { + try { + require.resolve(pkg); + } catch { + const otherPkg = pkgForSomeOtherPlatform(); + if (otherPkg) { + let suggestions = ` +Specifically the "${otherPkg}" package is present but this platform +needs the "${pkg}" package instead. People often get into this +situation by installing esbuild on Windows or macOS and copying "node_modules" +into a Docker image that runs Linux, or by copying "node_modules" between +Windows and WSL environments. + +If you are installing with npm, you can try not copying the "node_modules" +directory when you copy the files over, and running "npm ci" or "npm install" +on the destination platform after the copy. Or you could consider using yarn +instead of npm which has built-in support for installing a package on multiple +platforms simultaneously. + +If you are installing with yarn, you can try listing both this platform and the +other platform in your ".yarnrc.yml" file using the "supportedArchitectures" +feature: https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures +Keep in mind that this means multiple copies of esbuild will be present. +`; + if (pkg === packageDarwin_x64 && otherPkg === packageDarwin_arm64 || pkg === packageDarwin_arm64 && otherPkg === packageDarwin_x64) { + suggestions = ` +Specifically the "${otherPkg}" package is present but this platform +needs the "${pkg}" package instead. People often get into this +situation by installing esbuild with npm running inside of Rosetta 2 and then +trying to use it with node running outside of Rosetta 2, or vice versa (Rosetta +2 is Apple's on-the-fly x86_64-to-arm64 translation service). + +If you are installing with npm, you can try ensuring that both npm and node are +not running under Rosetta 2 and then reinstalling esbuild. This likely involves +changing how you installed npm and/or node. For example, installing node with +the universal installer here should work: https://nodejs.org/en/download/. Or +you could consider using yarn instead of npm which has built-in support for +installing a package on multiple platforms simultaneously. + +If you are installing with yarn, you can try listing both "arm64" and "x64" +in your ".yarnrc.yml" file using the "supportedArchitectures" feature: +https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures +Keep in mind that this means multiple copies of esbuild will be present. +`; + } + throw new Error(` +You installed esbuild for another platform than the one you're currently using. +This won't work because esbuild is written with native code and needs to +install a platform-specific binary executable. +${suggestions} +Another alternative is to use the "esbuild-wasm" package instead, which works +the same way on all platforms. But it comes with a heavy performance cost and +can sometimes be 10x slower than the "esbuild" package, so you may also not +want to do that. +`); + } + throw new Error(`The package "${pkg}" could not be found, and is needed by esbuild. + +If you are installing esbuild with npm, make sure that you don't specify the +"--no-optional" or "--omit=optional" flags. The "optionalDependencies" feature +of "package.json" is used by esbuild to install the correct binary executable +for your current platform.`); + } + throw e; + } + } + if (/\.zip\//.test(binPath2)) { + let pnpapi; + try { + pnpapi = require("pnpapi"); + } catch (e) { + } + if (pnpapi) { + const root = pnpapi.getPackageInformation(pnpapi.topLevel).packageLocation; + const binTargetPath = path.join( + root, + "node_modules", + ".cache", + "esbuild", + `pnpapi-${pkg.replace("/", "-")}-${"0.21.5"}-${path.basename(subpath)}` + ); + if (!fs.existsSync(binTargetPath)) { + fs.mkdirSync(path.dirname(binTargetPath), { recursive: true }); + fs.copyFileSync(binPath2, binTargetPath); + fs.chmodSync(binTargetPath, 493); + } + return { binPath: binTargetPath, isWASM: isWASM2 }; + } + } + return { binPath: binPath2, isWASM: isWASM2 }; +} + +// lib/npm/node-shim.ts +var { binPath, isWASM } = generateBinPath(); +if (isWASM) { + require("child_process").execFileSync("node", [binPath].concat(process.argv.slice(2)), { stdio: "inherit" }); +} else { + require("child_process").execFileSync(binPath, process.argv.slice(2), { stdio: "inherit" }); +} diff --git a/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/install.js b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/install.js new file mode 100644 index 0000000..d97764e --- /dev/null +++ b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/install.js @@ -0,0 +1,285 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// lib/npm/node-platform.ts +var fs = require("fs"); +var os = require("os"); +var path = require("path"); +var ESBUILD_BINARY_PATH = process.env.ESBUILD_BINARY_PATH || ESBUILD_BINARY_PATH; +var isValidBinaryPath = (x) => !!x && x !== "/usr/bin/esbuild"; +var knownWindowsPackages = { + "win32 arm64 LE": "@esbuild/win32-arm64", + "win32 ia32 LE": "@esbuild/win32-ia32", + "win32 x64 LE": "@esbuild/win32-x64" +}; +var knownUnixlikePackages = { + "aix ppc64 BE": "@esbuild/aix-ppc64", + "android arm64 LE": "@esbuild/android-arm64", + "darwin arm64 LE": "@esbuild/darwin-arm64", + "darwin x64 LE": "@esbuild/darwin-x64", + "freebsd arm64 LE": "@esbuild/freebsd-arm64", + "freebsd x64 LE": "@esbuild/freebsd-x64", + "linux arm LE": "@esbuild/linux-arm", + "linux arm64 LE": "@esbuild/linux-arm64", + "linux ia32 LE": "@esbuild/linux-ia32", + "linux mips64el LE": "@esbuild/linux-mips64el", + "linux ppc64 LE": "@esbuild/linux-ppc64", + "linux riscv64 LE": "@esbuild/linux-riscv64", + "linux s390x BE": "@esbuild/linux-s390x", + "linux x64 LE": "@esbuild/linux-x64", + "linux loong64 LE": "@esbuild/linux-loong64", + "netbsd x64 LE": "@esbuild/netbsd-x64", + "openbsd x64 LE": "@esbuild/openbsd-x64", + "sunos x64 LE": "@esbuild/sunos-x64" +}; +var knownWebAssemblyFallbackPackages = { + "android arm LE": "@esbuild/android-arm", + "android x64 LE": "@esbuild/android-x64" +}; +function pkgAndSubpathForCurrentPlatform() { + let pkg; + let subpath; + let isWASM = false; + let platformKey = `${process.platform} ${os.arch()} ${os.endianness()}`; + if (platformKey in knownWindowsPackages) { + pkg = knownWindowsPackages[platformKey]; + subpath = "esbuild.exe"; + } else if (platformKey in knownUnixlikePackages) { + pkg = knownUnixlikePackages[platformKey]; + subpath = "bin/esbuild"; + } else if (platformKey in knownWebAssemblyFallbackPackages) { + pkg = knownWebAssemblyFallbackPackages[platformKey]; + subpath = "bin/esbuild"; + isWASM = true; + } else { + throw new Error(`Unsupported platform: ${platformKey}`); + } + return { pkg, subpath, isWASM }; +} +function downloadedBinPath(pkg, subpath) { + const esbuildLibDir = path.dirname(require.resolve("esbuild")); + return path.join(esbuildLibDir, `downloaded-${pkg.replace("/", "-")}-${path.basename(subpath)}`); +} + +// lib/npm/node-install.ts +var fs2 = require("fs"); +var os2 = require("os"); +var path2 = require("path"); +var zlib = require("zlib"); +var https = require("https"); +var child_process = require("child_process"); +var versionFromPackageJSON = require(path2.join(__dirname, "package.json")).version; +var toPath = path2.join(__dirname, "bin", "esbuild"); +var isToPathJS = true; +function validateBinaryVersion(...command) { + command.push("--version"); + let stdout; + try { + stdout = child_process.execFileSync(command.shift(), command, { + // Without this, this install script strangely crashes with the error + // "EACCES: permission denied, write" but only on Ubuntu Linux when node is + // installed from the Snap Store. This is not a problem when you download + // the official version of node. The problem appears to be that stderr + // (i.e. file descriptor 2) isn't writable? + // + // More info: + // - https://snapcraft.io/ (what the Snap Store is) + // - https://nodejs.org/dist/ (download the official version of node) + // - https://github.com/evanw/esbuild/issues/1711#issuecomment-1027554035 + // + stdio: "pipe" + }).toString().trim(); + } catch (err) { + if (os2.platform() === "darwin" && /_SecTrustEvaluateWithError/.test(err + "")) { + let os3 = "this version of macOS"; + try { + os3 = "macOS " + child_process.execFileSync("sw_vers", ["-productVersion"]).toString().trim(); + } catch { + } + throw new Error(`The "esbuild" package cannot be installed because ${os3} is too outdated. + +The Go compiler (which esbuild relies on) no longer supports ${os3}, +which means the "esbuild" binary executable can't be run. You can either: + + * Update your version of macOS to one that the Go compiler supports + * Use the "esbuild-wasm" package instead of the "esbuild" package + * Build esbuild yourself using an older version of the Go compiler +`); + } + throw err; + } + if (stdout !== versionFromPackageJSON) { + throw new Error(`Expected ${JSON.stringify(versionFromPackageJSON)} but got ${JSON.stringify(stdout)}`); + } +} +function isYarn() { + const { npm_config_user_agent } = process.env; + if (npm_config_user_agent) { + return /\byarn\//.test(npm_config_user_agent); + } + return false; +} +function fetch(url) { + return new Promise((resolve, reject) => { + https.get(url, (res) => { + if ((res.statusCode === 301 || res.statusCode === 302) && res.headers.location) + return fetch(res.headers.location).then(resolve, reject); + if (res.statusCode !== 200) + return reject(new Error(`Server responded with ${res.statusCode}`)); + let chunks = []; + res.on("data", (chunk) => chunks.push(chunk)); + res.on("end", () => resolve(Buffer.concat(chunks))); + }).on("error", reject); + }); +} +function extractFileFromTarGzip(buffer, subpath) { + try { + buffer = zlib.unzipSync(buffer); + } catch (err) { + throw new Error(`Invalid gzip data in archive: ${err && err.message || err}`); + } + let str = (i, n) => String.fromCharCode(...buffer.subarray(i, i + n)).replace(/\0.*$/, ""); + let offset = 0; + subpath = `package/${subpath}`; + while (offset < buffer.length) { + let name = str(offset, 100); + let size = parseInt(str(offset + 124, 12), 8); + offset += 512; + if (!isNaN(size)) { + if (name === subpath) return buffer.subarray(offset, offset + size); + offset += size + 511 & ~511; + } + } + throw new Error(`Could not find ${JSON.stringify(subpath)} in archive`); +} +function installUsingNPM(pkg, subpath, binPath) { + const env = { ...process.env, npm_config_global: void 0 }; + const esbuildLibDir = path2.dirname(require.resolve("esbuild")); + const installDir = path2.join(esbuildLibDir, "npm-install"); + fs2.mkdirSync(installDir); + try { + fs2.writeFileSync(path2.join(installDir, "package.json"), "{}"); + child_process.execSync( + `npm install --loglevel=error --prefer-offline --no-audit --progress=false ${pkg}@${versionFromPackageJSON}`, + { cwd: installDir, stdio: "pipe", env } + ); + const installedBinPath = path2.join(installDir, "node_modules", pkg, subpath); + fs2.renameSync(installedBinPath, binPath); + } finally { + try { + removeRecursive(installDir); + } catch { + } + } +} +function removeRecursive(dir) { + for (const entry of fs2.readdirSync(dir)) { + const entryPath = path2.join(dir, entry); + let stats; + try { + stats = fs2.lstatSync(entryPath); + } catch { + continue; + } + if (stats.isDirectory()) removeRecursive(entryPath); + else fs2.unlinkSync(entryPath); + } + fs2.rmdirSync(dir); +} +function applyManualBinaryPathOverride(overridePath) { + const pathString = JSON.stringify(overridePath); + fs2.writeFileSync(toPath, `#!/usr/bin/env node +require('child_process').execFileSync(${pathString}, process.argv.slice(2), { stdio: 'inherit' }); +`); + const libMain = path2.join(__dirname, "lib", "main.js"); + const code = fs2.readFileSync(libMain, "utf8"); + fs2.writeFileSync(libMain, `var ESBUILD_BINARY_PATH = ${pathString}; +${code}`); +} +function maybeOptimizePackage(binPath) { + if (os2.platform() !== "win32" && !isYarn()) { + const tempPath = path2.join(__dirname, "bin-esbuild"); + try { + fs2.linkSync(binPath, tempPath); + fs2.renameSync(tempPath, toPath); + isToPathJS = false; + fs2.unlinkSync(tempPath); + } catch { + } + } +} +async function downloadDirectlyFromNPM(pkg, subpath, binPath) { + const url = `https://registry.npmjs.org/${pkg}/-/${pkg.replace("@esbuild/", "")}-${versionFromPackageJSON}.tgz`; + console.error(`[esbuild] Trying to download ${JSON.stringify(url)}`); + try { + fs2.writeFileSync(binPath, extractFileFromTarGzip(await fetch(url), subpath)); + fs2.chmodSync(binPath, 493); + } catch (e) { + console.error(`[esbuild] Failed to download ${JSON.stringify(url)}: ${e && e.message || e}`); + throw e; + } +} +async function checkAndPreparePackage() { + if (isValidBinaryPath(ESBUILD_BINARY_PATH)) { + if (!fs2.existsSync(ESBUILD_BINARY_PATH)) { + console.warn(`[esbuild] Ignoring bad configuration: ESBUILD_BINARY_PATH=${ESBUILD_BINARY_PATH}`); + } else { + applyManualBinaryPathOverride(ESBUILD_BINARY_PATH); + return; + } + } + const { pkg, subpath } = pkgAndSubpathForCurrentPlatform(); + let binPath; + try { + binPath = require.resolve(`${pkg}/${subpath}`); + } catch (e) { + console.error(`[esbuild] Failed to find package "${pkg}" on the file system + +This can happen if you use the "--no-optional" flag. The "optionalDependencies" +package.json feature is used by esbuild to install the correct binary executable +for your current platform. This install script will now attempt to work around +this. If that fails, you need to remove the "--no-optional" flag to use esbuild. +`); + binPath = downloadedBinPath(pkg, subpath); + try { + console.error(`[esbuild] Trying to install package "${pkg}" using npm`); + installUsingNPM(pkg, subpath, binPath); + } catch (e2) { + console.error(`[esbuild] Failed to install package "${pkg}" using npm: ${e2 && e2.message || e2}`); + try { + await downloadDirectlyFromNPM(pkg, subpath, binPath); + } catch (e3) { + throw new Error(`Failed to install package "${pkg}"`); + } + } + } + maybeOptimizePackage(binPath); +} +checkAndPreparePackage().then(() => { + if (isToPathJS) { + validateBinaryVersion(process.execPath, toPath); + } else { + validateBinaryVersion(toPath); + } +}); diff --git a/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/lib/main.d.ts b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/lib/main.d.ts new file mode 100644 index 0000000..d5c6ac9 --- /dev/null +++ b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/lib/main.d.ts @@ -0,0 +1,705 @@ +export type Platform = 'browser' | 'node' | 'neutral' +export type Format = 'iife' | 'cjs' | 'esm' +export type Loader = 'base64' | 'binary' | 'copy' | 'css' | 'dataurl' | 'default' | 'empty' | 'file' | 'js' | 'json' | 'jsx' | 'local-css' | 'text' | 'ts' | 'tsx' +export type LogLevel = 'verbose' | 'debug' | 'info' | 'warning' | 'error' | 'silent' +export type Charset = 'ascii' | 'utf8' +export type Drop = 'console' | 'debugger' + +interface CommonOptions { + /** Documentation: https://esbuild.github.io/api/#sourcemap */ + sourcemap?: boolean | 'linked' | 'inline' | 'external' | 'both' + /** Documentation: https://esbuild.github.io/api/#legal-comments */ + legalComments?: 'none' | 'inline' | 'eof' | 'linked' | 'external' + /** Documentation: https://esbuild.github.io/api/#source-root */ + sourceRoot?: string + /** Documentation: https://esbuild.github.io/api/#sources-content */ + sourcesContent?: boolean + + /** Documentation: https://esbuild.github.io/api/#format */ + format?: Format + /** Documentation: https://esbuild.github.io/api/#global-name */ + globalName?: string + /** Documentation: https://esbuild.github.io/api/#target */ + target?: string | string[] + /** Documentation: https://esbuild.github.io/api/#supported */ + supported?: Record + /** Documentation: https://esbuild.github.io/api/#platform */ + platform?: Platform + + /** Documentation: https://esbuild.github.io/api/#mangle-props */ + mangleProps?: RegExp + /** Documentation: https://esbuild.github.io/api/#mangle-props */ + reserveProps?: RegExp + /** Documentation: https://esbuild.github.io/api/#mangle-props */ + mangleQuoted?: boolean + /** Documentation: https://esbuild.github.io/api/#mangle-props */ + mangleCache?: Record + /** Documentation: https://esbuild.github.io/api/#drop */ + drop?: Drop[] + /** Documentation: https://esbuild.github.io/api/#drop-labels */ + dropLabels?: string[] + /** Documentation: https://esbuild.github.io/api/#minify */ + minify?: boolean + /** Documentation: https://esbuild.github.io/api/#minify */ + minifyWhitespace?: boolean + /** Documentation: https://esbuild.github.io/api/#minify */ + minifyIdentifiers?: boolean + /** Documentation: https://esbuild.github.io/api/#minify */ + minifySyntax?: boolean + /** Documentation: https://esbuild.github.io/api/#line-limit */ + lineLimit?: number + /** Documentation: https://esbuild.github.io/api/#charset */ + charset?: Charset + /** Documentation: https://esbuild.github.io/api/#tree-shaking */ + treeShaking?: boolean + /** Documentation: https://esbuild.github.io/api/#ignore-annotations */ + ignoreAnnotations?: boolean + + /** Documentation: https://esbuild.github.io/api/#jsx */ + jsx?: 'transform' | 'preserve' | 'automatic' + /** Documentation: https://esbuild.github.io/api/#jsx-factory */ + jsxFactory?: string + /** Documentation: https://esbuild.github.io/api/#jsx-fragment */ + jsxFragment?: string + /** Documentation: https://esbuild.github.io/api/#jsx-import-source */ + jsxImportSource?: string + /** Documentation: https://esbuild.github.io/api/#jsx-development */ + jsxDev?: boolean + /** Documentation: https://esbuild.github.io/api/#jsx-side-effects */ + jsxSideEffects?: boolean + + /** Documentation: https://esbuild.github.io/api/#define */ + define?: { [key: string]: string } + /** Documentation: https://esbuild.github.io/api/#pure */ + pure?: string[] + /** Documentation: https://esbuild.github.io/api/#keep-names */ + keepNames?: boolean + + /** Documentation: https://esbuild.github.io/api/#color */ + color?: boolean + /** Documentation: https://esbuild.github.io/api/#log-level */ + logLevel?: LogLevel + /** Documentation: https://esbuild.github.io/api/#log-limit */ + logLimit?: number + /** Documentation: https://esbuild.github.io/api/#log-override */ + logOverride?: Record + + /** Documentation: https://esbuild.github.io/api/#tsconfig-raw */ + tsconfigRaw?: string | TsconfigRaw +} + +export interface TsconfigRaw { + compilerOptions?: { + alwaysStrict?: boolean + baseUrl?: string + experimentalDecorators?: boolean + importsNotUsedAsValues?: 'remove' | 'preserve' | 'error' + jsx?: 'preserve' | 'react-native' | 'react' | 'react-jsx' | 'react-jsxdev' + jsxFactory?: string + jsxFragmentFactory?: string + jsxImportSource?: string + paths?: Record + preserveValueImports?: boolean + strict?: boolean + target?: string + useDefineForClassFields?: boolean + verbatimModuleSyntax?: boolean + } +} + +export interface BuildOptions extends CommonOptions { + /** Documentation: https://esbuild.github.io/api/#bundle */ + bundle?: boolean + /** Documentation: https://esbuild.github.io/api/#splitting */ + splitting?: boolean + /** Documentation: https://esbuild.github.io/api/#preserve-symlinks */ + preserveSymlinks?: boolean + /** Documentation: https://esbuild.github.io/api/#outfile */ + outfile?: string + /** Documentation: https://esbuild.github.io/api/#metafile */ + metafile?: boolean + /** Documentation: https://esbuild.github.io/api/#outdir */ + outdir?: string + /** Documentation: https://esbuild.github.io/api/#outbase */ + outbase?: string + /** Documentation: https://esbuild.github.io/api/#external */ + external?: string[] + /** Documentation: https://esbuild.github.io/api/#packages */ + packages?: 'external' + /** Documentation: https://esbuild.github.io/api/#alias */ + alias?: Record + /** Documentation: https://esbuild.github.io/api/#loader */ + loader?: { [ext: string]: Loader } + /** Documentation: https://esbuild.github.io/api/#resolve-extensions */ + resolveExtensions?: string[] + /** Documentation: https://esbuild.github.io/api/#main-fields */ + mainFields?: string[] + /** Documentation: https://esbuild.github.io/api/#conditions */ + conditions?: string[] + /** Documentation: https://esbuild.github.io/api/#write */ + write?: boolean + /** Documentation: https://esbuild.github.io/api/#allow-overwrite */ + allowOverwrite?: boolean + /** Documentation: https://esbuild.github.io/api/#tsconfig */ + tsconfig?: string + /** Documentation: https://esbuild.github.io/api/#out-extension */ + outExtension?: { [ext: string]: string } + /** Documentation: https://esbuild.github.io/api/#public-path */ + publicPath?: string + /** Documentation: https://esbuild.github.io/api/#entry-names */ + entryNames?: string + /** Documentation: https://esbuild.github.io/api/#chunk-names */ + chunkNames?: string + /** Documentation: https://esbuild.github.io/api/#asset-names */ + assetNames?: string + /** Documentation: https://esbuild.github.io/api/#inject */ + inject?: string[] + /** Documentation: https://esbuild.github.io/api/#banner */ + banner?: { [type: string]: string } + /** Documentation: https://esbuild.github.io/api/#footer */ + footer?: { [type: string]: string } + /** Documentation: https://esbuild.github.io/api/#entry-points */ + entryPoints?: string[] | Record | { in: string, out: string }[] + /** Documentation: https://esbuild.github.io/api/#stdin */ + stdin?: StdinOptions + /** Documentation: https://esbuild.github.io/plugins/ */ + plugins?: Plugin[] + /** Documentation: https://esbuild.github.io/api/#working-directory */ + absWorkingDir?: string + /** Documentation: https://esbuild.github.io/api/#node-paths */ + nodePaths?: string[]; // The "NODE_PATH" variable from Node.js +} + +export interface StdinOptions { + contents: string | Uint8Array + resolveDir?: string + sourcefile?: string + loader?: Loader +} + +export interface Message { + id: string + pluginName: string + text: string + location: Location | null + notes: Note[] + + /** + * Optional user-specified data that is passed through unmodified. You can + * use this to stash the original error, for example. + */ + detail: any +} + +export interface Note { + text: string + location: Location | null +} + +export interface Location { + file: string + namespace: string + /** 1-based */ + line: number + /** 0-based, in bytes */ + column: number + /** in bytes */ + length: number + lineText: string + suggestion: string +} + +export interface OutputFile { + path: string + contents: Uint8Array + hash: string + /** "contents" as text (changes automatically with "contents") */ + readonly text: string +} + +export interface BuildResult { + errors: Message[] + warnings: Message[] + /** Only when "write: false" */ + outputFiles: OutputFile[] | (ProvidedOptions['write'] extends false ? never : undefined) + /** Only when "metafile: true" */ + metafile: Metafile | (ProvidedOptions['metafile'] extends true ? never : undefined) + /** Only when "mangleCache" is present */ + mangleCache: Record | (ProvidedOptions['mangleCache'] extends Object ? never : undefined) +} + +export interface BuildFailure extends Error { + errors: Message[] + warnings: Message[] +} + +/** Documentation: https://esbuild.github.io/api/#serve-arguments */ +export interface ServeOptions { + port?: number + host?: string + servedir?: string + keyfile?: string + certfile?: string + fallback?: string + onRequest?: (args: ServeOnRequestArgs) => void +} + +export interface ServeOnRequestArgs { + remoteAddress: string + method: string + path: string + status: number + /** The time to generate the response, not to send it */ + timeInMS: number +} + +/** Documentation: https://esbuild.github.io/api/#serve-return-values */ +export interface ServeResult { + port: number + host: string +} + +export interface TransformOptions extends CommonOptions { + /** Documentation: https://esbuild.github.io/api/#sourcefile */ + sourcefile?: string + /** Documentation: https://esbuild.github.io/api/#loader */ + loader?: Loader + /** Documentation: https://esbuild.github.io/api/#banner */ + banner?: string + /** Documentation: https://esbuild.github.io/api/#footer */ + footer?: string +} + +export interface TransformResult { + code: string + map: string + warnings: Message[] + /** Only when "mangleCache" is present */ + mangleCache: Record | (ProvidedOptions['mangleCache'] extends Object ? never : undefined) + /** Only when "legalComments" is "external" */ + legalComments: string | (ProvidedOptions['legalComments'] extends 'external' ? never : undefined) +} + +export interface TransformFailure extends Error { + errors: Message[] + warnings: Message[] +} + +export interface Plugin { + name: string + setup: (build: PluginBuild) => (void | Promise) +} + +export interface PluginBuild { + /** Documentation: https://esbuild.github.io/plugins/#build-options */ + initialOptions: BuildOptions + + /** Documentation: https://esbuild.github.io/plugins/#resolve */ + resolve(path: string, options?: ResolveOptions): Promise + + /** Documentation: https://esbuild.github.io/plugins/#on-start */ + onStart(callback: () => + (OnStartResult | null | void | Promise)): void + + /** Documentation: https://esbuild.github.io/plugins/#on-end */ + onEnd(callback: (result: BuildResult) => + (OnEndResult | null | void | Promise)): void + + /** Documentation: https://esbuild.github.io/plugins/#on-resolve */ + onResolve(options: OnResolveOptions, callback: (args: OnResolveArgs) => + (OnResolveResult | null | undefined | Promise)): void + + /** Documentation: https://esbuild.github.io/plugins/#on-load */ + onLoad(options: OnLoadOptions, callback: (args: OnLoadArgs) => + (OnLoadResult | null | undefined | Promise)): void + + /** Documentation: https://esbuild.github.io/plugins/#on-dispose */ + onDispose(callback: () => void): void + + // This is a full copy of the esbuild library in case you need it + esbuild: { + context: typeof context, + build: typeof build, + buildSync: typeof buildSync, + transform: typeof transform, + transformSync: typeof transformSync, + formatMessages: typeof formatMessages, + formatMessagesSync: typeof formatMessagesSync, + analyzeMetafile: typeof analyzeMetafile, + analyzeMetafileSync: typeof analyzeMetafileSync, + initialize: typeof initialize, + version: typeof version, + } +} + +/** Documentation: https://esbuild.github.io/plugins/#resolve-options */ +export interface ResolveOptions { + pluginName?: string + importer?: string + namespace?: string + resolveDir?: string + kind?: ImportKind + pluginData?: any + with?: Record +} + +/** Documentation: https://esbuild.github.io/plugins/#resolve-results */ +export interface ResolveResult { + errors: Message[] + warnings: Message[] + + path: string + external: boolean + sideEffects: boolean + namespace: string + suffix: string + pluginData: any +} + +export interface OnStartResult { + errors?: PartialMessage[] + warnings?: PartialMessage[] +} + +export interface OnEndResult { + errors?: PartialMessage[] + warnings?: PartialMessage[] +} + +/** Documentation: https://esbuild.github.io/plugins/#on-resolve-options */ +export interface OnResolveOptions { + filter: RegExp + namespace?: string +} + +/** Documentation: https://esbuild.github.io/plugins/#on-resolve-arguments */ +export interface OnResolveArgs { + path: string + importer: string + namespace: string + resolveDir: string + kind: ImportKind + pluginData: any + with: Record +} + +export type ImportKind = + | 'entry-point' + + // JS + | 'import-statement' + | 'require-call' + | 'dynamic-import' + | 'require-resolve' + + // CSS + | 'import-rule' + | 'composes-from' + | 'url-token' + +/** Documentation: https://esbuild.github.io/plugins/#on-resolve-results */ +export interface OnResolveResult { + pluginName?: string + + errors?: PartialMessage[] + warnings?: PartialMessage[] + + path?: string + external?: boolean + sideEffects?: boolean + namespace?: string + suffix?: string + pluginData?: any + + watchFiles?: string[] + watchDirs?: string[] +} + +/** Documentation: https://esbuild.github.io/plugins/#on-load-options */ +export interface OnLoadOptions { + filter: RegExp + namespace?: string +} + +/** Documentation: https://esbuild.github.io/plugins/#on-load-arguments */ +export interface OnLoadArgs { + path: string + namespace: string + suffix: string + pluginData: any + with: Record +} + +/** Documentation: https://esbuild.github.io/plugins/#on-load-results */ +export interface OnLoadResult { + pluginName?: string + + errors?: PartialMessage[] + warnings?: PartialMessage[] + + contents?: string | Uint8Array + resolveDir?: string + loader?: Loader + pluginData?: any + + watchFiles?: string[] + watchDirs?: string[] +} + +export interface PartialMessage { + id?: string + pluginName?: string + text?: string + location?: Partial | null + notes?: PartialNote[] + detail?: any +} + +export interface PartialNote { + text?: string + location?: Partial | null +} + +/** Documentation: https://esbuild.github.io/api/#metafile */ +export interface Metafile { + inputs: { + [path: string]: { + bytes: number + imports: { + path: string + kind: ImportKind + external?: boolean + original?: string + with?: Record + }[] + format?: 'cjs' | 'esm' + with?: Record + } + } + outputs: { + [path: string]: { + bytes: number + inputs: { + [path: string]: { + bytesInOutput: number + } + } + imports: { + path: string + kind: ImportKind | 'file-loader' + external?: boolean + }[] + exports: string[] + entryPoint?: string + cssBundle?: string + } + } +} + +export interface FormatMessagesOptions { + kind: 'error' | 'warning' + color?: boolean + terminalWidth?: number +} + +export interface AnalyzeMetafileOptions { + color?: boolean + verbose?: boolean +} + +export interface WatchOptions { +} + +export interface BuildContext { + /** Documentation: https://esbuild.github.io/api/#rebuild */ + rebuild(): Promise> + + /** Documentation: https://esbuild.github.io/api/#watch */ + watch(options?: WatchOptions): Promise + + /** Documentation: https://esbuild.github.io/api/#serve */ + serve(options?: ServeOptions): Promise + + cancel(): Promise + dispose(): Promise +} + +// This is a TypeScript type-level function which replaces any keys in "In" +// that aren't in "Out" with "never". We use this to reject properties with +// typos in object literals. See: https://stackoverflow.com/questions/49580725 +type SameShape = In & { [Key in Exclude]: never } + +/** + * This function invokes the "esbuild" command-line tool for you. It returns a + * promise that either resolves with a "BuildResult" object or rejects with a + * "BuildFailure" object. + * + * - Works in node: yes + * - Works in browser: yes + * + * Documentation: https://esbuild.github.io/api/#build + */ +export declare function build(options: SameShape): Promise> + +/** + * This is the advanced long-running form of "build" that supports additional + * features such as watch mode and a local development server. + * + * - Works in node: yes + * - Works in browser: no + * + * Documentation: https://esbuild.github.io/api/#build + */ +export declare function context(options: SameShape): Promise> + +/** + * This function transforms a single JavaScript file. It can be used to minify + * JavaScript, convert TypeScript/JSX to JavaScript, or convert newer JavaScript + * to older JavaScript. It returns a promise that is either resolved with a + * "TransformResult" object or rejected with a "TransformFailure" object. + * + * - Works in node: yes + * - Works in browser: yes + * + * Documentation: https://esbuild.github.io/api/#transform + */ +export declare function transform(input: string | Uint8Array, options?: SameShape): Promise> + +/** + * Converts log messages to formatted message strings suitable for printing in + * the terminal. This allows you to reuse the built-in behavior of esbuild's + * log message formatter. This is a batch-oriented API for efficiency. + * + * - Works in node: yes + * - Works in browser: yes + */ +export declare function formatMessages(messages: PartialMessage[], options: FormatMessagesOptions): Promise + +/** + * Pretty-prints an analysis of the metafile JSON to a string. This is just for + * convenience to be able to match esbuild's pretty-printing exactly. If you want + * to customize it, you can just inspect the data in the metafile yourself. + * + * - Works in node: yes + * - Works in browser: yes + * + * Documentation: https://esbuild.github.io/api/#analyze + */ +export declare function analyzeMetafile(metafile: Metafile | string, options?: AnalyzeMetafileOptions): Promise + +/** + * A synchronous version of "build". + * + * - Works in node: yes + * - Works in browser: no + * + * Documentation: https://esbuild.github.io/api/#build + */ +export declare function buildSync(options: SameShape): BuildResult + +/** + * A synchronous version of "transform". + * + * - Works in node: yes + * - Works in browser: no + * + * Documentation: https://esbuild.github.io/api/#transform + */ +export declare function transformSync(input: string | Uint8Array, options?: SameShape): TransformResult + +/** + * A synchronous version of "formatMessages". + * + * - Works in node: yes + * - Works in browser: no + */ +export declare function formatMessagesSync(messages: PartialMessage[], options: FormatMessagesOptions): string[] + +/** + * A synchronous version of "analyzeMetafile". + * + * - Works in node: yes + * - Works in browser: no + * + * Documentation: https://esbuild.github.io/api/#analyze + */ +export declare function analyzeMetafileSync(metafile: Metafile | string, options?: AnalyzeMetafileOptions): string + +/** + * This configures the browser-based version of esbuild. It is necessary to + * call this first and wait for the returned promise to be resolved before + * making other API calls when using esbuild in the browser. + * + * - Works in node: yes + * - Works in browser: yes ("options" is required) + * + * Documentation: https://esbuild.github.io/api/#browser + */ +export declare function initialize(options: InitializeOptions): Promise + +export interface InitializeOptions { + /** + * The URL of the "esbuild.wasm" file. This must be provided when running + * esbuild in the browser. + */ + wasmURL?: string | URL + + /** + * The result of calling "new WebAssembly.Module(buffer)" where "buffer" + * is a typed array or ArrayBuffer containing the binary code of the + * "esbuild.wasm" file. + * + * You can use this as an alternative to "wasmURL" for environments where it's + * not possible to download the WebAssembly module. + */ + wasmModule?: WebAssembly.Module + + /** + * By default esbuild runs the WebAssembly-based browser API in a web worker + * to avoid blocking the UI thread. This can be disabled by setting "worker" + * to false. + */ + worker?: boolean +} + +export let version: string + +// Call this function to terminate esbuild's child process. The child process +// is not terminated and re-created after each API call because it's more +// efficient to keep it around when there are multiple API calls. +// +// In node this happens automatically before the parent node process exits. So +// you only need to call this if you know you will not make any more esbuild +// API calls and you want to clean up resources. +// +// Unlike node, Deno lacks the necessary APIs to clean up child processes +// automatically. You must manually call stop() in Deno when you're done +// using esbuild or Deno will continue running forever. +// +// Another reason you might want to call this is if you are using esbuild from +// within a Deno test. Deno fails tests that create a child process without +// killing it before the test ends, so you have to call this function (and +// await the returned promise) in every Deno test that uses esbuild. +export declare function stop(): Promise + +// Note: These declarations exist to avoid type errors when you omit "dom" from +// "lib" in your "tsconfig.json" file. TypeScript confusingly declares the +// global "WebAssembly" type in "lib.dom.d.ts" even though it has nothing to do +// with the browser DOM and is present in many non-browser JavaScript runtimes +// (e.g. node and deno). Declaring it here allows esbuild's API to be used in +// these scenarios. +// +// There's an open issue about getting this problem corrected (although these +// declarations will need to remain even if this is fixed for backward +// compatibility with older TypeScript versions): +// +// https://github.com/microsoft/TypeScript-DOM-lib-generator/issues/826 +// +declare global { + namespace WebAssembly { + interface Module { + } + } + interface URL { + } +} diff --git a/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/lib/main.js b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/lib/main.js new file mode 100644 index 0000000..555613c --- /dev/null +++ b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/lib/main.js @@ -0,0 +1,2239 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// lib/npm/node.ts +var node_exports = {}; +__export(node_exports, { + analyzeMetafile: () => analyzeMetafile, + analyzeMetafileSync: () => analyzeMetafileSync, + build: () => build, + buildSync: () => buildSync, + context: () => context, + default: () => node_default, + formatMessages: () => formatMessages, + formatMessagesSync: () => formatMessagesSync, + initialize: () => initialize, + stop: () => stop, + transform: () => transform, + transformSync: () => transformSync, + version: () => version +}); +module.exports = __toCommonJS(node_exports); + +// lib/shared/stdio_protocol.ts +function encodePacket(packet) { + let visit = (value) => { + if (value === null) { + bb.write8(0); + } else if (typeof value === "boolean") { + bb.write8(1); + bb.write8(+value); + } else if (typeof value === "number") { + bb.write8(2); + bb.write32(value | 0); + } else if (typeof value === "string") { + bb.write8(3); + bb.write(encodeUTF8(value)); + } else if (value instanceof Uint8Array) { + bb.write8(4); + bb.write(value); + } else if (value instanceof Array) { + bb.write8(5); + bb.write32(value.length); + for (let item of value) { + visit(item); + } + } else { + let keys = Object.keys(value); + bb.write8(6); + bb.write32(keys.length); + for (let key of keys) { + bb.write(encodeUTF8(key)); + visit(value[key]); + } + } + }; + let bb = new ByteBuffer(); + bb.write32(0); + bb.write32(packet.id << 1 | +!packet.isRequest); + visit(packet.value); + writeUInt32LE(bb.buf, bb.len - 4, 0); + return bb.buf.subarray(0, bb.len); +} +function decodePacket(bytes) { + let visit = () => { + switch (bb.read8()) { + case 0: + return null; + case 1: + return !!bb.read8(); + case 2: + return bb.read32(); + case 3: + return decodeUTF8(bb.read()); + case 4: + return bb.read(); + case 5: { + let count = bb.read32(); + let value2 = []; + for (let i = 0; i < count; i++) { + value2.push(visit()); + } + return value2; + } + case 6: { + let count = bb.read32(); + let value2 = {}; + for (let i = 0; i < count; i++) { + value2[decodeUTF8(bb.read())] = visit(); + } + return value2; + } + default: + throw new Error("Invalid packet"); + } + }; + let bb = new ByteBuffer(bytes); + let id = bb.read32(); + let isRequest = (id & 1) === 0; + id >>>= 1; + let value = visit(); + if (bb.ptr !== bytes.length) { + throw new Error("Invalid packet"); + } + return { id, isRequest, value }; +} +var ByteBuffer = class { + constructor(buf = new Uint8Array(1024)) { + this.buf = buf; + this.len = 0; + this.ptr = 0; + } + _write(delta) { + if (this.len + delta > this.buf.length) { + let clone = new Uint8Array((this.len + delta) * 2); + clone.set(this.buf); + this.buf = clone; + } + this.len += delta; + return this.len - delta; + } + write8(value) { + let offset = this._write(1); + this.buf[offset] = value; + } + write32(value) { + let offset = this._write(4); + writeUInt32LE(this.buf, value, offset); + } + write(bytes) { + let offset = this._write(4 + bytes.length); + writeUInt32LE(this.buf, bytes.length, offset); + this.buf.set(bytes, offset + 4); + } + _read(delta) { + if (this.ptr + delta > this.buf.length) { + throw new Error("Invalid packet"); + } + this.ptr += delta; + return this.ptr - delta; + } + read8() { + return this.buf[this._read(1)]; + } + read32() { + return readUInt32LE(this.buf, this._read(4)); + } + read() { + let length = this.read32(); + let bytes = new Uint8Array(length); + let ptr = this._read(bytes.length); + bytes.set(this.buf.subarray(ptr, ptr + length)); + return bytes; + } +}; +var encodeUTF8; +var decodeUTF8; +var encodeInvariant; +if (typeof TextEncoder !== "undefined" && typeof TextDecoder !== "undefined") { + let encoder = new TextEncoder(); + let decoder = new TextDecoder(); + encodeUTF8 = (text) => encoder.encode(text); + decodeUTF8 = (bytes) => decoder.decode(bytes); + encodeInvariant = 'new TextEncoder().encode("")'; +} else if (typeof Buffer !== "undefined") { + encodeUTF8 = (text) => Buffer.from(text); + decodeUTF8 = (bytes) => { + let { buffer, byteOffset, byteLength } = bytes; + return Buffer.from(buffer, byteOffset, byteLength).toString(); + }; + encodeInvariant = 'Buffer.from("")'; +} else { + throw new Error("No UTF-8 codec found"); +} +if (!(encodeUTF8("") instanceof Uint8Array)) + throw new Error(`Invariant violation: "${encodeInvariant} instanceof Uint8Array" is incorrectly false + +This indicates that your JavaScript environment is broken. You cannot use +esbuild in this environment because esbuild relies on this invariant. This +is not a problem with esbuild. You need to fix your environment instead. +`); +function readUInt32LE(buffer, offset) { + return buffer[offset++] | buffer[offset++] << 8 | buffer[offset++] << 16 | buffer[offset++] << 24; +} +function writeUInt32LE(buffer, value, offset) { + buffer[offset++] = value; + buffer[offset++] = value >> 8; + buffer[offset++] = value >> 16; + buffer[offset++] = value >> 24; +} + +// lib/shared/common.ts +var quote = JSON.stringify; +var buildLogLevelDefault = "warning"; +var transformLogLevelDefault = "silent"; +function validateTarget(target) { + validateStringValue(target, "target"); + if (target.indexOf(",") >= 0) throw new Error(`Invalid target: ${target}`); + return target; +} +var canBeAnything = () => null; +var mustBeBoolean = (value) => typeof value === "boolean" ? null : "a boolean"; +var mustBeString = (value) => typeof value === "string" ? null : "a string"; +var mustBeRegExp = (value) => value instanceof RegExp ? null : "a RegExp object"; +var mustBeInteger = (value) => typeof value === "number" && value === (value | 0) ? null : "an integer"; +var mustBeFunction = (value) => typeof value === "function" ? null : "a function"; +var mustBeArray = (value) => Array.isArray(value) ? null : "an array"; +var mustBeObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value) ? null : "an object"; +var mustBeEntryPoints = (value) => typeof value === "object" && value !== null ? null : "an array or an object"; +var mustBeWebAssemblyModule = (value) => value instanceof WebAssembly.Module ? null : "a WebAssembly.Module"; +var mustBeObjectOrNull = (value) => typeof value === "object" && !Array.isArray(value) ? null : "an object or null"; +var mustBeStringOrBoolean = (value) => typeof value === "string" || typeof value === "boolean" ? null : "a string or a boolean"; +var mustBeStringOrObject = (value) => typeof value === "string" || typeof value === "object" && value !== null && !Array.isArray(value) ? null : "a string or an object"; +var mustBeStringOrArray = (value) => typeof value === "string" || Array.isArray(value) ? null : "a string or an array"; +var mustBeStringOrUint8Array = (value) => typeof value === "string" || value instanceof Uint8Array ? null : "a string or a Uint8Array"; +var mustBeStringOrURL = (value) => typeof value === "string" || value instanceof URL ? null : "a string or a URL"; +function getFlag(object, keys, key, mustBeFn) { + let value = object[key]; + keys[key + ""] = true; + if (value === void 0) return void 0; + let mustBe = mustBeFn(value); + if (mustBe !== null) throw new Error(`${quote(key)} must be ${mustBe}`); + return value; +} +function checkForInvalidFlags(object, keys, where) { + for (let key in object) { + if (!(key in keys)) { + throw new Error(`Invalid option ${where}: ${quote(key)}`); + } + } +} +function validateInitializeOptions(options) { + let keys = /* @__PURE__ */ Object.create(null); + let wasmURL = getFlag(options, keys, "wasmURL", mustBeStringOrURL); + let wasmModule = getFlag(options, keys, "wasmModule", mustBeWebAssemblyModule); + let worker = getFlag(options, keys, "worker", mustBeBoolean); + checkForInvalidFlags(options, keys, "in initialize() call"); + return { + wasmURL, + wasmModule, + worker + }; +} +function validateMangleCache(mangleCache) { + let validated; + if (mangleCache !== void 0) { + validated = /* @__PURE__ */ Object.create(null); + for (let key in mangleCache) { + let value = mangleCache[key]; + if (typeof value === "string" || value === false) { + validated[key] = value; + } else { + throw new Error(`Expected ${quote(key)} in mangle cache to map to either a string or false`); + } + } + } + return validated; +} +function pushLogFlags(flags, options, keys, isTTY2, logLevelDefault) { + let color = getFlag(options, keys, "color", mustBeBoolean); + let logLevel = getFlag(options, keys, "logLevel", mustBeString); + let logLimit = getFlag(options, keys, "logLimit", mustBeInteger); + if (color !== void 0) flags.push(`--color=${color}`); + else if (isTTY2) flags.push(`--color=true`); + flags.push(`--log-level=${logLevel || logLevelDefault}`); + flags.push(`--log-limit=${logLimit || 0}`); +} +function validateStringValue(value, what, key) { + if (typeof value !== "string") { + throw new Error(`Expected value for ${what}${key !== void 0 ? " " + quote(key) : ""} to be a string, got ${typeof value} instead`); + } + return value; +} +function pushCommonFlags(flags, options, keys) { + let legalComments = getFlag(options, keys, "legalComments", mustBeString); + let sourceRoot = getFlag(options, keys, "sourceRoot", mustBeString); + let sourcesContent = getFlag(options, keys, "sourcesContent", mustBeBoolean); + let target = getFlag(options, keys, "target", mustBeStringOrArray); + let format = getFlag(options, keys, "format", mustBeString); + let globalName = getFlag(options, keys, "globalName", mustBeString); + let mangleProps = getFlag(options, keys, "mangleProps", mustBeRegExp); + let reserveProps = getFlag(options, keys, "reserveProps", mustBeRegExp); + let mangleQuoted = getFlag(options, keys, "mangleQuoted", mustBeBoolean); + let minify = getFlag(options, keys, "minify", mustBeBoolean); + let minifySyntax = getFlag(options, keys, "minifySyntax", mustBeBoolean); + let minifyWhitespace = getFlag(options, keys, "minifyWhitespace", mustBeBoolean); + let minifyIdentifiers = getFlag(options, keys, "minifyIdentifiers", mustBeBoolean); + let lineLimit = getFlag(options, keys, "lineLimit", mustBeInteger); + let drop = getFlag(options, keys, "drop", mustBeArray); + let dropLabels = getFlag(options, keys, "dropLabels", mustBeArray); + let charset = getFlag(options, keys, "charset", mustBeString); + let treeShaking = getFlag(options, keys, "treeShaking", mustBeBoolean); + let ignoreAnnotations = getFlag(options, keys, "ignoreAnnotations", mustBeBoolean); + let jsx = getFlag(options, keys, "jsx", mustBeString); + let jsxFactory = getFlag(options, keys, "jsxFactory", mustBeString); + let jsxFragment = getFlag(options, keys, "jsxFragment", mustBeString); + let jsxImportSource = getFlag(options, keys, "jsxImportSource", mustBeString); + let jsxDev = getFlag(options, keys, "jsxDev", mustBeBoolean); + let jsxSideEffects = getFlag(options, keys, "jsxSideEffects", mustBeBoolean); + let define = getFlag(options, keys, "define", mustBeObject); + let logOverride = getFlag(options, keys, "logOverride", mustBeObject); + let supported = getFlag(options, keys, "supported", mustBeObject); + let pure = getFlag(options, keys, "pure", mustBeArray); + let keepNames = getFlag(options, keys, "keepNames", mustBeBoolean); + let platform = getFlag(options, keys, "platform", mustBeString); + let tsconfigRaw = getFlag(options, keys, "tsconfigRaw", mustBeStringOrObject); + if (legalComments) flags.push(`--legal-comments=${legalComments}`); + if (sourceRoot !== void 0) flags.push(`--source-root=${sourceRoot}`); + if (sourcesContent !== void 0) flags.push(`--sources-content=${sourcesContent}`); + if (target) { + if (Array.isArray(target)) flags.push(`--target=${Array.from(target).map(validateTarget).join(",")}`); + else flags.push(`--target=${validateTarget(target)}`); + } + if (format) flags.push(`--format=${format}`); + if (globalName) flags.push(`--global-name=${globalName}`); + if (platform) flags.push(`--platform=${platform}`); + if (tsconfigRaw) flags.push(`--tsconfig-raw=${typeof tsconfigRaw === "string" ? tsconfigRaw : JSON.stringify(tsconfigRaw)}`); + if (minify) flags.push("--minify"); + if (minifySyntax) flags.push("--minify-syntax"); + if (minifyWhitespace) flags.push("--minify-whitespace"); + if (minifyIdentifiers) flags.push("--minify-identifiers"); + if (lineLimit) flags.push(`--line-limit=${lineLimit}`); + if (charset) flags.push(`--charset=${charset}`); + if (treeShaking !== void 0) flags.push(`--tree-shaking=${treeShaking}`); + if (ignoreAnnotations) flags.push(`--ignore-annotations`); + if (drop) for (let what of drop) flags.push(`--drop:${validateStringValue(what, "drop")}`); + if (dropLabels) flags.push(`--drop-labels=${Array.from(dropLabels).map((what) => validateStringValue(what, "dropLabels")).join(",")}`); + if (mangleProps) flags.push(`--mangle-props=${mangleProps.source}`); + if (reserveProps) flags.push(`--reserve-props=${reserveProps.source}`); + if (mangleQuoted !== void 0) flags.push(`--mangle-quoted=${mangleQuoted}`); + if (jsx) flags.push(`--jsx=${jsx}`); + if (jsxFactory) flags.push(`--jsx-factory=${jsxFactory}`); + if (jsxFragment) flags.push(`--jsx-fragment=${jsxFragment}`); + if (jsxImportSource) flags.push(`--jsx-import-source=${jsxImportSource}`); + if (jsxDev) flags.push(`--jsx-dev`); + if (jsxSideEffects) flags.push(`--jsx-side-effects`); + if (define) { + for (let key in define) { + if (key.indexOf("=") >= 0) throw new Error(`Invalid define: ${key}`); + flags.push(`--define:${key}=${validateStringValue(define[key], "define", key)}`); + } + } + if (logOverride) { + for (let key in logOverride) { + if (key.indexOf("=") >= 0) throw new Error(`Invalid log override: ${key}`); + flags.push(`--log-override:${key}=${validateStringValue(logOverride[key], "log override", key)}`); + } + } + if (supported) { + for (let key in supported) { + if (key.indexOf("=") >= 0) throw new Error(`Invalid supported: ${key}`); + const value = supported[key]; + if (typeof value !== "boolean") throw new Error(`Expected value for supported ${quote(key)} to be a boolean, got ${typeof value} instead`); + flags.push(`--supported:${key}=${value}`); + } + } + if (pure) for (let fn of pure) flags.push(`--pure:${validateStringValue(fn, "pure")}`); + if (keepNames) flags.push(`--keep-names`); +} +function flagsForBuildOptions(callName, options, isTTY2, logLevelDefault, writeDefault) { + var _a2; + let flags = []; + let entries = []; + let keys = /* @__PURE__ */ Object.create(null); + let stdinContents = null; + let stdinResolveDir = null; + pushLogFlags(flags, options, keys, isTTY2, logLevelDefault); + pushCommonFlags(flags, options, keys); + let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean); + let bundle = getFlag(options, keys, "bundle", mustBeBoolean); + let splitting = getFlag(options, keys, "splitting", mustBeBoolean); + let preserveSymlinks = getFlag(options, keys, "preserveSymlinks", mustBeBoolean); + let metafile = getFlag(options, keys, "metafile", mustBeBoolean); + let outfile = getFlag(options, keys, "outfile", mustBeString); + let outdir = getFlag(options, keys, "outdir", mustBeString); + let outbase = getFlag(options, keys, "outbase", mustBeString); + let tsconfig = getFlag(options, keys, "tsconfig", mustBeString); + let resolveExtensions = getFlag(options, keys, "resolveExtensions", mustBeArray); + let nodePathsInput = getFlag(options, keys, "nodePaths", mustBeArray); + let mainFields = getFlag(options, keys, "mainFields", mustBeArray); + let conditions = getFlag(options, keys, "conditions", mustBeArray); + let external = getFlag(options, keys, "external", mustBeArray); + let packages = getFlag(options, keys, "packages", mustBeString); + let alias = getFlag(options, keys, "alias", mustBeObject); + let loader = getFlag(options, keys, "loader", mustBeObject); + let outExtension = getFlag(options, keys, "outExtension", mustBeObject); + let publicPath = getFlag(options, keys, "publicPath", mustBeString); + let entryNames = getFlag(options, keys, "entryNames", mustBeString); + let chunkNames = getFlag(options, keys, "chunkNames", mustBeString); + let assetNames = getFlag(options, keys, "assetNames", mustBeString); + let inject = getFlag(options, keys, "inject", mustBeArray); + let banner = getFlag(options, keys, "banner", mustBeObject); + let footer = getFlag(options, keys, "footer", mustBeObject); + let entryPoints = getFlag(options, keys, "entryPoints", mustBeEntryPoints); + let absWorkingDir = getFlag(options, keys, "absWorkingDir", mustBeString); + let stdin = getFlag(options, keys, "stdin", mustBeObject); + let write = (_a2 = getFlag(options, keys, "write", mustBeBoolean)) != null ? _a2 : writeDefault; + let allowOverwrite = getFlag(options, keys, "allowOverwrite", mustBeBoolean); + let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject); + keys.plugins = true; + checkForInvalidFlags(options, keys, `in ${callName}() call`); + if (sourcemap) flags.push(`--sourcemap${sourcemap === true ? "" : `=${sourcemap}`}`); + if (bundle) flags.push("--bundle"); + if (allowOverwrite) flags.push("--allow-overwrite"); + if (splitting) flags.push("--splitting"); + if (preserveSymlinks) flags.push("--preserve-symlinks"); + if (metafile) flags.push(`--metafile`); + if (outfile) flags.push(`--outfile=${outfile}`); + if (outdir) flags.push(`--outdir=${outdir}`); + if (outbase) flags.push(`--outbase=${outbase}`); + if (tsconfig) flags.push(`--tsconfig=${tsconfig}`); + if (packages) flags.push(`--packages=${packages}`); + if (resolveExtensions) { + let values = []; + for (let value of resolveExtensions) { + validateStringValue(value, "resolve extension"); + if (value.indexOf(",") >= 0) throw new Error(`Invalid resolve extension: ${value}`); + values.push(value); + } + flags.push(`--resolve-extensions=${values.join(",")}`); + } + if (publicPath) flags.push(`--public-path=${publicPath}`); + if (entryNames) flags.push(`--entry-names=${entryNames}`); + if (chunkNames) flags.push(`--chunk-names=${chunkNames}`); + if (assetNames) flags.push(`--asset-names=${assetNames}`); + if (mainFields) { + let values = []; + for (let value of mainFields) { + validateStringValue(value, "main field"); + if (value.indexOf(",") >= 0) throw new Error(`Invalid main field: ${value}`); + values.push(value); + } + flags.push(`--main-fields=${values.join(",")}`); + } + if (conditions) { + let values = []; + for (let value of conditions) { + validateStringValue(value, "condition"); + if (value.indexOf(",") >= 0) throw new Error(`Invalid condition: ${value}`); + values.push(value); + } + flags.push(`--conditions=${values.join(",")}`); + } + if (external) for (let name of external) flags.push(`--external:${validateStringValue(name, "external")}`); + if (alias) { + for (let old in alias) { + if (old.indexOf("=") >= 0) throw new Error(`Invalid package name in alias: ${old}`); + flags.push(`--alias:${old}=${validateStringValue(alias[old], "alias", old)}`); + } + } + if (banner) { + for (let type in banner) { + if (type.indexOf("=") >= 0) throw new Error(`Invalid banner file type: ${type}`); + flags.push(`--banner:${type}=${validateStringValue(banner[type], "banner", type)}`); + } + } + if (footer) { + for (let type in footer) { + if (type.indexOf("=") >= 0) throw new Error(`Invalid footer file type: ${type}`); + flags.push(`--footer:${type}=${validateStringValue(footer[type], "footer", type)}`); + } + } + if (inject) for (let path3 of inject) flags.push(`--inject:${validateStringValue(path3, "inject")}`); + if (loader) { + for (let ext in loader) { + if (ext.indexOf("=") >= 0) throw new Error(`Invalid loader extension: ${ext}`); + flags.push(`--loader:${ext}=${validateStringValue(loader[ext], "loader", ext)}`); + } + } + if (outExtension) { + for (let ext in outExtension) { + if (ext.indexOf("=") >= 0) throw new Error(`Invalid out extension: ${ext}`); + flags.push(`--out-extension:${ext}=${validateStringValue(outExtension[ext], "out extension", ext)}`); + } + } + if (entryPoints) { + if (Array.isArray(entryPoints)) { + for (let i = 0, n = entryPoints.length; i < n; i++) { + let entryPoint = entryPoints[i]; + if (typeof entryPoint === "object" && entryPoint !== null) { + let entryPointKeys = /* @__PURE__ */ Object.create(null); + let input = getFlag(entryPoint, entryPointKeys, "in", mustBeString); + let output = getFlag(entryPoint, entryPointKeys, "out", mustBeString); + checkForInvalidFlags(entryPoint, entryPointKeys, "in entry point at index " + i); + if (input === void 0) throw new Error('Missing property "in" for entry point at index ' + i); + if (output === void 0) throw new Error('Missing property "out" for entry point at index ' + i); + entries.push([output, input]); + } else { + entries.push(["", validateStringValue(entryPoint, "entry point at index " + i)]); + } + } + } else { + for (let key in entryPoints) { + entries.push([key, validateStringValue(entryPoints[key], "entry point", key)]); + } + } + } + if (stdin) { + let stdinKeys = /* @__PURE__ */ Object.create(null); + let contents = getFlag(stdin, stdinKeys, "contents", mustBeStringOrUint8Array); + let resolveDir = getFlag(stdin, stdinKeys, "resolveDir", mustBeString); + let sourcefile = getFlag(stdin, stdinKeys, "sourcefile", mustBeString); + let loader2 = getFlag(stdin, stdinKeys, "loader", mustBeString); + checkForInvalidFlags(stdin, stdinKeys, 'in "stdin" object'); + if (sourcefile) flags.push(`--sourcefile=${sourcefile}`); + if (loader2) flags.push(`--loader=${loader2}`); + if (resolveDir) stdinResolveDir = resolveDir; + if (typeof contents === "string") stdinContents = encodeUTF8(contents); + else if (contents instanceof Uint8Array) stdinContents = contents; + } + let nodePaths = []; + if (nodePathsInput) { + for (let value of nodePathsInput) { + value += ""; + nodePaths.push(value); + } + } + return { + entries, + flags, + write, + stdinContents, + stdinResolveDir, + absWorkingDir, + nodePaths, + mangleCache: validateMangleCache(mangleCache) + }; +} +function flagsForTransformOptions(callName, options, isTTY2, logLevelDefault) { + let flags = []; + let keys = /* @__PURE__ */ Object.create(null); + pushLogFlags(flags, options, keys, isTTY2, logLevelDefault); + pushCommonFlags(flags, options, keys); + let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean); + let sourcefile = getFlag(options, keys, "sourcefile", mustBeString); + let loader = getFlag(options, keys, "loader", mustBeString); + let banner = getFlag(options, keys, "banner", mustBeString); + let footer = getFlag(options, keys, "footer", mustBeString); + let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject); + checkForInvalidFlags(options, keys, `in ${callName}() call`); + if (sourcemap) flags.push(`--sourcemap=${sourcemap === true ? "external" : sourcemap}`); + if (sourcefile) flags.push(`--sourcefile=${sourcefile}`); + if (loader) flags.push(`--loader=${loader}`); + if (banner) flags.push(`--banner=${banner}`); + if (footer) flags.push(`--footer=${footer}`); + return { + flags, + mangleCache: validateMangleCache(mangleCache) + }; +} +function createChannel(streamIn) { + const requestCallbacksByKey = {}; + const closeData = { didClose: false, reason: "" }; + let responseCallbacks = {}; + let nextRequestID = 0; + let nextBuildKey = 0; + let stdout = new Uint8Array(16 * 1024); + let stdoutUsed = 0; + let readFromStdout = (chunk) => { + let limit = stdoutUsed + chunk.length; + if (limit > stdout.length) { + let swap = new Uint8Array(limit * 2); + swap.set(stdout); + stdout = swap; + } + stdout.set(chunk, stdoutUsed); + stdoutUsed += chunk.length; + let offset = 0; + while (offset + 4 <= stdoutUsed) { + let length = readUInt32LE(stdout, offset); + if (offset + 4 + length > stdoutUsed) { + break; + } + offset += 4; + handleIncomingPacket(stdout.subarray(offset, offset + length)); + offset += length; + } + if (offset > 0) { + stdout.copyWithin(0, offset, stdoutUsed); + stdoutUsed -= offset; + } + }; + let afterClose = (error) => { + closeData.didClose = true; + if (error) closeData.reason = ": " + (error.message || error); + const text = "The service was stopped" + closeData.reason; + for (let id in responseCallbacks) { + responseCallbacks[id](text, null); + } + responseCallbacks = {}; + }; + let sendRequest = (refs, value, callback) => { + if (closeData.didClose) return callback("The service is no longer running" + closeData.reason, null); + let id = nextRequestID++; + responseCallbacks[id] = (error, response) => { + try { + callback(error, response); + } finally { + if (refs) refs.unref(); + } + }; + if (refs) refs.ref(); + streamIn.writeToStdin(encodePacket({ id, isRequest: true, value })); + }; + let sendResponse = (id, value) => { + if (closeData.didClose) throw new Error("The service is no longer running" + closeData.reason); + streamIn.writeToStdin(encodePacket({ id, isRequest: false, value })); + }; + let handleRequest = async (id, request) => { + try { + if (request.command === "ping") { + sendResponse(id, {}); + return; + } + if (typeof request.key === "number") { + const requestCallbacks = requestCallbacksByKey[request.key]; + if (!requestCallbacks) { + return; + } + const callback = requestCallbacks[request.command]; + if (callback) { + await callback(id, request); + return; + } + } + throw new Error(`Invalid command: ` + request.command); + } catch (e) { + const errors = [extractErrorMessageV8(e, streamIn, null, void 0, "")]; + try { + sendResponse(id, { errors }); + } catch { + } + } + }; + let isFirstPacket = true; + let handleIncomingPacket = (bytes) => { + if (isFirstPacket) { + isFirstPacket = false; + let binaryVersion = String.fromCharCode(...bytes); + if (binaryVersion !== "0.21.5") { + throw new Error(`Cannot start service: Host version "${"0.21.5"}" does not match binary version ${quote(binaryVersion)}`); + } + return; + } + let packet = decodePacket(bytes); + if (packet.isRequest) { + handleRequest(packet.id, packet.value); + } else { + let callback = responseCallbacks[packet.id]; + delete responseCallbacks[packet.id]; + if (packet.value.error) callback(packet.value.error, {}); + else callback(null, packet.value); + } + }; + let buildOrContext = ({ callName, refs, options, isTTY: isTTY2, defaultWD: defaultWD2, callback }) => { + let refCount = 0; + const buildKey = nextBuildKey++; + const requestCallbacks = {}; + const buildRefs = { + ref() { + if (++refCount === 1) { + if (refs) refs.ref(); + } + }, + unref() { + if (--refCount === 0) { + delete requestCallbacksByKey[buildKey]; + if (refs) refs.unref(); + } + } + }; + requestCallbacksByKey[buildKey] = requestCallbacks; + buildRefs.ref(); + buildOrContextImpl( + callName, + buildKey, + sendRequest, + sendResponse, + buildRefs, + streamIn, + requestCallbacks, + options, + isTTY2, + defaultWD2, + (err, res) => { + try { + callback(err, res); + } finally { + buildRefs.unref(); + } + } + ); + }; + let transform2 = ({ callName, refs, input, options, isTTY: isTTY2, fs: fs3, callback }) => { + const details = createObjectStash(); + let start = (inputPath) => { + try { + if (typeof input !== "string" && !(input instanceof Uint8Array)) + throw new Error('The input to "transform" must be a string or a Uint8Array'); + let { + flags, + mangleCache + } = flagsForTransformOptions(callName, options, isTTY2, transformLogLevelDefault); + let request = { + command: "transform", + flags, + inputFS: inputPath !== null, + input: inputPath !== null ? encodeUTF8(inputPath) : typeof input === "string" ? encodeUTF8(input) : input + }; + if (mangleCache) request.mangleCache = mangleCache; + sendRequest(refs, request, (error, response) => { + if (error) return callback(new Error(error), null); + let errors = replaceDetailsInMessages(response.errors, details); + let warnings = replaceDetailsInMessages(response.warnings, details); + let outstanding = 1; + let next = () => { + if (--outstanding === 0) { + let result = { + warnings, + code: response.code, + map: response.map, + mangleCache: void 0, + legalComments: void 0 + }; + if ("legalComments" in response) result.legalComments = response == null ? void 0 : response.legalComments; + if (response.mangleCache) result.mangleCache = response == null ? void 0 : response.mangleCache; + callback(null, result); + } + }; + if (errors.length > 0) return callback(failureErrorWithLog("Transform failed", errors, warnings), null); + if (response.codeFS) { + outstanding++; + fs3.readFile(response.code, (err, contents) => { + if (err !== null) { + callback(err, null); + } else { + response.code = contents; + next(); + } + }); + } + if (response.mapFS) { + outstanding++; + fs3.readFile(response.map, (err, contents) => { + if (err !== null) { + callback(err, null); + } else { + response.map = contents; + next(); + } + }); + } + next(); + }); + } catch (e) { + let flags = []; + try { + pushLogFlags(flags, options, {}, isTTY2, transformLogLevelDefault); + } catch { + } + const error = extractErrorMessageV8(e, streamIn, details, void 0, ""); + sendRequest(refs, { command: "error", flags, error }, () => { + error.detail = details.load(error.detail); + callback(failureErrorWithLog("Transform failed", [error], []), null); + }); + } + }; + if ((typeof input === "string" || input instanceof Uint8Array) && input.length > 1024 * 1024) { + let next = start; + start = () => fs3.writeFile(input, next); + } + start(null); + }; + let formatMessages2 = ({ callName, refs, messages, options, callback }) => { + if (!options) throw new Error(`Missing second argument in ${callName}() call`); + let keys = {}; + let kind = getFlag(options, keys, "kind", mustBeString); + let color = getFlag(options, keys, "color", mustBeBoolean); + let terminalWidth = getFlag(options, keys, "terminalWidth", mustBeInteger); + checkForInvalidFlags(options, keys, `in ${callName}() call`); + if (kind === void 0) throw new Error(`Missing "kind" in ${callName}() call`); + if (kind !== "error" && kind !== "warning") throw new Error(`Expected "kind" to be "error" or "warning" in ${callName}() call`); + let request = { + command: "format-msgs", + messages: sanitizeMessages(messages, "messages", null, "", terminalWidth), + isWarning: kind === "warning" + }; + if (color !== void 0) request.color = color; + if (terminalWidth !== void 0) request.terminalWidth = terminalWidth; + sendRequest(refs, request, (error, response) => { + if (error) return callback(new Error(error), null); + callback(null, response.messages); + }); + }; + let analyzeMetafile2 = ({ callName, refs, metafile, options, callback }) => { + if (options === void 0) options = {}; + let keys = {}; + let color = getFlag(options, keys, "color", mustBeBoolean); + let verbose = getFlag(options, keys, "verbose", mustBeBoolean); + checkForInvalidFlags(options, keys, `in ${callName}() call`); + let request = { + command: "analyze-metafile", + metafile + }; + if (color !== void 0) request.color = color; + if (verbose !== void 0) request.verbose = verbose; + sendRequest(refs, request, (error, response) => { + if (error) return callback(new Error(error), null); + callback(null, response.result); + }); + }; + return { + readFromStdout, + afterClose, + service: { + buildOrContext, + transform: transform2, + formatMessages: formatMessages2, + analyzeMetafile: analyzeMetafile2 + } + }; +} +function buildOrContextImpl(callName, buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, options, isTTY2, defaultWD2, callback) { + const details = createObjectStash(); + const isContext = callName === "context"; + const handleError = (e, pluginName) => { + const flags = []; + try { + pushLogFlags(flags, options, {}, isTTY2, buildLogLevelDefault); + } catch { + } + const message = extractErrorMessageV8(e, streamIn, details, void 0, pluginName); + sendRequest(refs, { command: "error", flags, error: message }, () => { + message.detail = details.load(message.detail); + callback(failureErrorWithLog(isContext ? "Context failed" : "Build failed", [message], []), null); + }); + }; + let plugins; + if (typeof options === "object") { + const value = options.plugins; + if (value !== void 0) { + if (!Array.isArray(value)) return handleError(new Error(`"plugins" must be an array`), ""); + plugins = value; + } + } + if (plugins && plugins.length > 0) { + if (streamIn.isSync) return handleError(new Error("Cannot use plugins in synchronous API calls"), ""); + handlePlugins( + buildKey, + sendRequest, + sendResponse, + refs, + streamIn, + requestCallbacks, + options, + plugins, + details + ).then( + (result) => { + if (!result.ok) return handleError(result.error, result.pluginName); + try { + buildOrContextContinue(result.requestPlugins, result.runOnEndCallbacks, result.scheduleOnDisposeCallbacks); + } catch (e) { + handleError(e, ""); + } + }, + (e) => handleError(e, "") + ); + return; + } + try { + buildOrContextContinue(null, (result, done) => done([], []), () => { + }); + } catch (e) { + handleError(e, ""); + } + function buildOrContextContinue(requestPlugins, runOnEndCallbacks, scheduleOnDisposeCallbacks) { + const writeDefault = streamIn.hasFS; + const { + entries, + flags, + write, + stdinContents, + stdinResolveDir, + absWorkingDir, + nodePaths, + mangleCache + } = flagsForBuildOptions(callName, options, isTTY2, buildLogLevelDefault, writeDefault); + if (write && !streamIn.hasFS) throw new Error(`The "write" option is unavailable in this environment`); + const request = { + command: "build", + key: buildKey, + entries, + flags, + write, + stdinContents, + stdinResolveDir, + absWorkingDir: absWorkingDir || defaultWD2, + nodePaths, + context: isContext + }; + if (requestPlugins) request.plugins = requestPlugins; + if (mangleCache) request.mangleCache = mangleCache; + const buildResponseToResult = (response, callback2) => { + const result = { + errors: replaceDetailsInMessages(response.errors, details), + warnings: replaceDetailsInMessages(response.warnings, details), + outputFiles: void 0, + metafile: void 0, + mangleCache: void 0 + }; + const originalErrors = result.errors.slice(); + const originalWarnings = result.warnings.slice(); + if (response.outputFiles) result.outputFiles = response.outputFiles.map(convertOutputFiles); + if (response.metafile) result.metafile = JSON.parse(response.metafile); + if (response.mangleCache) result.mangleCache = response.mangleCache; + if (response.writeToStdout !== void 0) console.log(decodeUTF8(response.writeToStdout).replace(/\n$/, "")); + runOnEndCallbacks(result, (onEndErrors, onEndWarnings) => { + if (originalErrors.length > 0 || onEndErrors.length > 0) { + const error = failureErrorWithLog("Build failed", originalErrors.concat(onEndErrors), originalWarnings.concat(onEndWarnings)); + return callback2(error, null, onEndErrors, onEndWarnings); + } + callback2(null, result, onEndErrors, onEndWarnings); + }); + }; + let latestResultPromise; + let provideLatestResult; + if (isContext) + requestCallbacks["on-end"] = (id, request2) => new Promise((resolve) => { + buildResponseToResult(request2, (err, result, onEndErrors, onEndWarnings) => { + const response = { + errors: onEndErrors, + warnings: onEndWarnings + }; + if (provideLatestResult) provideLatestResult(err, result); + latestResultPromise = void 0; + provideLatestResult = void 0; + sendResponse(id, response); + resolve(); + }); + }); + sendRequest(refs, request, (error, response) => { + if (error) return callback(new Error(error), null); + if (!isContext) { + return buildResponseToResult(response, (err, res) => { + scheduleOnDisposeCallbacks(); + return callback(err, res); + }); + } + if (response.errors.length > 0) { + return callback(failureErrorWithLog("Context failed", response.errors, response.warnings), null); + } + let didDispose = false; + const result = { + rebuild: () => { + if (!latestResultPromise) latestResultPromise = new Promise((resolve, reject) => { + let settlePromise; + provideLatestResult = (err, result2) => { + if (!settlePromise) settlePromise = () => err ? reject(err) : resolve(result2); + }; + const triggerAnotherBuild = () => { + const request2 = { + command: "rebuild", + key: buildKey + }; + sendRequest(refs, request2, (error2, response2) => { + if (error2) { + reject(new Error(error2)); + } else if (settlePromise) { + settlePromise(); + } else { + triggerAnotherBuild(); + } + }); + }; + triggerAnotherBuild(); + }); + return latestResultPromise; + }, + watch: (options2 = {}) => new Promise((resolve, reject) => { + if (!streamIn.hasFS) throw new Error(`Cannot use the "watch" API in this environment`); + const keys = {}; + checkForInvalidFlags(options2, keys, `in watch() call`); + const request2 = { + command: "watch", + key: buildKey + }; + sendRequest(refs, request2, (error2) => { + if (error2) reject(new Error(error2)); + else resolve(void 0); + }); + }), + serve: (options2 = {}) => new Promise((resolve, reject) => { + if (!streamIn.hasFS) throw new Error(`Cannot use the "serve" API in this environment`); + const keys = {}; + const port = getFlag(options2, keys, "port", mustBeInteger); + const host = getFlag(options2, keys, "host", mustBeString); + const servedir = getFlag(options2, keys, "servedir", mustBeString); + const keyfile = getFlag(options2, keys, "keyfile", mustBeString); + const certfile = getFlag(options2, keys, "certfile", mustBeString); + const fallback = getFlag(options2, keys, "fallback", mustBeString); + const onRequest = getFlag(options2, keys, "onRequest", mustBeFunction); + checkForInvalidFlags(options2, keys, `in serve() call`); + const request2 = { + command: "serve", + key: buildKey, + onRequest: !!onRequest + }; + if (port !== void 0) request2.port = port; + if (host !== void 0) request2.host = host; + if (servedir !== void 0) request2.servedir = servedir; + if (keyfile !== void 0) request2.keyfile = keyfile; + if (certfile !== void 0) request2.certfile = certfile; + if (fallback !== void 0) request2.fallback = fallback; + sendRequest(refs, request2, (error2, response2) => { + if (error2) return reject(new Error(error2)); + if (onRequest) { + requestCallbacks["serve-request"] = (id, request3) => { + onRequest(request3.args); + sendResponse(id, {}); + }; + } + resolve(response2); + }); + }), + cancel: () => new Promise((resolve) => { + if (didDispose) return resolve(); + const request2 = { + command: "cancel", + key: buildKey + }; + sendRequest(refs, request2, () => { + resolve(); + }); + }), + dispose: () => new Promise((resolve) => { + if (didDispose) return resolve(); + didDispose = true; + const request2 = { + command: "dispose", + key: buildKey + }; + sendRequest(refs, request2, () => { + resolve(); + scheduleOnDisposeCallbacks(); + refs.unref(); + }); + }) + }; + refs.ref(); + callback(null, result); + }); + } +} +var handlePlugins = async (buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, initialOptions, plugins, details) => { + let onStartCallbacks = []; + let onEndCallbacks = []; + let onResolveCallbacks = {}; + let onLoadCallbacks = {}; + let onDisposeCallbacks = []; + let nextCallbackID = 0; + let i = 0; + let requestPlugins = []; + let isSetupDone = false; + plugins = [...plugins]; + for (let item of plugins) { + let keys = {}; + if (typeof item !== "object") throw new Error(`Plugin at index ${i} must be an object`); + const name = getFlag(item, keys, "name", mustBeString); + if (typeof name !== "string" || name === "") throw new Error(`Plugin at index ${i} is missing a name`); + try { + let setup = getFlag(item, keys, "setup", mustBeFunction); + if (typeof setup !== "function") throw new Error(`Plugin is missing a setup function`); + checkForInvalidFlags(item, keys, `on plugin ${quote(name)}`); + let plugin = { + name, + onStart: false, + onEnd: false, + onResolve: [], + onLoad: [] + }; + i++; + let resolve = (path3, options = {}) => { + if (!isSetupDone) throw new Error('Cannot call "resolve" before plugin setup has completed'); + if (typeof path3 !== "string") throw new Error(`The path to resolve must be a string`); + let keys2 = /* @__PURE__ */ Object.create(null); + let pluginName = getFlag(options, keys2, "pluginName", mustBeString); + let importer = getFlag(options, keys2, "importer", mustBeString); + let namespace = getFlag(options, keys2, "namespace", mustBeString); + let resolveDir = getFlag(options, keys2, "resolveDir", mustBeString); + let kind = getFlag(options, keys2, "kind", mustBeString); + let pluginData = getFlag(options, keys2, "pluginData", canBeAnything); + let importAttributes = getFlag(options, keys2, "with", mustBeObject); + checkForInvalidFlags(options, keys2, "in resolve() call"); + return new Promise((resolve2, reject) => { + const request = { + command: "resolve", + path: path3, + key: buildKey, + pluginName: name + }; + if (pluginName != null) request.pluginName = pluginName; + if (importer != null) request.importer = importer; + if (namespace != null) request.namespace = namespace; + if (resolveDir != null) request.resolveDir = resolveDir; + if (kind != null) request.kind = kind; + else throw new Error(`Must specify "kind" when calling "resolve"`); + if (pluginData != null) request.pluginData = details.store(pluginData); + if (importAttributes != null) request.with = sanitizeStringMap(importAttributes, "with"); + sendRequest(refs, request, (error, response) => { + if (error !== null) reject(new Error(error)); + else resolve2({ + errors: replaceDetailsInMessages(response.errors, details), + warnings: replaceDetailsInMessages(response.warnings, details), + path: response.path, + external: response.external, + sideEffects: response.sideEffects, + namespace: response.namespace, + suffix: response.suffix, + pluginData: details.load(response.pluginData) + }); + }); + }); + }; + let promise = setup({ + initialOptions, + resolve, + onStart(callback) { + let registeredText = `This error came from the "onStart" callback registered here:`; + let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onStart"); + onStartCallbacks.push({ name, callback, note: registeredNote }); + plugin.onStart = true; + }, + onEnd(callback) { + let registeredText = `This error came from the "onEnd" callback registered here:`; + let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onEnd"); + onEndCallbacks.push({ name, callback, note: registeredNote }); + plugin.onEnd = true; + }, + onResolve(options, callback) { + let registeredText = `This error came from the "onResolve" callback registered here:`; + let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onResolve"); + let keys2 = {}; + let filter = getFlag(options, keys2, "filter", mustBeRegExp); + let namespace = getFlag(options, keys2, "namespace", mustBeString); + checkForInvalidFlags(options, keys2, `in onResolve() call for plugin ${quote(name)}`); + if (filter == null) throw new Error(`onResolve() call is missing a filter`); + let id = nextCallbackID++; + onResolveCallbacks[id] = { name, callback, note: registeredNote }; + plugin.onResolve.push({ id, filter: filter.source, namespace: namespace || "" }); + }, + onLoad(options, callback) { + let registeredText = `This error came from the "onLoad" callback registered here:`; + let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onLoad"); + let keys2 = {}; + let filter = getFlag(options, keys2, "filter", mustBeRegExp); + let namespace = getFlag(options, keys2, "namespace", mustBeString); + checkForInvalidFlags(options, keys2, `in onLoad() call for plugin ${quote(name)}`); + if (filter == null) throw new Error(`onLoad() call is missing a filter`); + let id = nextCallbackID++; + onLoadCallbacks[id] = { name, callback, note: registeredNote }; + plugin.onLoad.push({ id, filter: filter.source, namespace: namespace || "" }); + }, + onDispose(callback) { + onDisposeCallbacks.push(callback); + }, + esbuild: streamIn.esbuild + }); + if (promise) await promise; + requestPlugins.push(plugin); + } catch (e) { + return { ok: false, error: e, pluginName: name }; + } + } + requestCallbacks["on-start"] = async (id, request) => { + let response = { errors: [], warnings: [] }; + await Promise.all(onStartCallbacks.map(async ({ name, callback, note }) => { + try { + let result = await callback(); + if (result != null) { + if (typeof result !== "object") throw new Error(`Expected onStart() callback in plugin ${quote(name)} to return an object`); + let keys = {}; + let errors = getFlag(result, keys, "errors", mustBeArray); + let warnings = getFlag(result, keys, "warnings", mustBeArray); + checkForInvalidFlags(result, keys, `from onStart() callback in plugin ${quote(name)}`); + if (errors != null) response.errors.push(...sanitizeMessages(errors, "errors", details, name, void 0)); + if (warnings != null) response.warnings.push(...sanitizeMessages(warnings, "warnings", details, name, void 0)); + } + } catch (e) { + response.errors.push(extractErrorMessageV8(e, streamIn, details, note && note(), name)); + } + })); + sendResponse(id, response); + }; + requestCallbacks["on-resolve"] = async (id, request) => { + let response = {}, name = "", callback, note; + for (let id2 of request.ids) { + try { + ({ name, callback, note } = onResolveCallbacks[id2]); + let result = await callback({ + path: request.path, + importer: request.importer, + namespace: request.namespace, + resolveDir: request.resolveDir, + kind: request.kind, + pluginData: details.load(request.pluginData), + with: request.with + }); + if (result != null) { + if (typeof result !== "object") throw new Error(`Expected onResolve() callback in plugin ${quote(name)} to return an object`); + let keys = {}; + let pluginName = getFlag(result, keys, "pluginName", mustBeString); + let path3 = getFlag(result, keys, "path", mustBeString); + let namespace = getFlag(result, keys, "namespace", mustBeString); + let suffix = getFlag(result, keys, "suffix", mustBeString); + let external = getFlag(result, keys, "external", mustBeBoolean); + let sideEffects = getFlag(result, keys, "sideEffects", mustBeBoolean); + let pluginData = getFlag(result, keys, "pluginData", canBeAnything); + let errors = getFlag(result, keys, "errors", mustBeArray); + let warnings = getFlag(result, keys, "warnings", mustBeArray); + let watchFiles = getFlag(result, keys, "watchFiles", mustBeArray); + let watchDirs = getFlag(result, keys, "watchDirs", mustBeArray); + checkForInvalidFlags(result, keys, `from onResolve() callback in plugin ${quote(name)}`); + response.id = id2; + if (pluginName != null) response.pluginName = pluginName; + if (path3 != null) response.path = path3; + if (namespace != null) response.namespace = namespace; + if (suffix != null) response.suffix = suffix; + if (external != null) response.external = external; + if (sideEffects != null) response.sideEffects = sideEffects; + if (pluginData != null) response.pluginData = details.store(pluginData); + if (errors != null) response.errors = sanitizeMessages(errors, "errors", details, name, void 0); + if (warnings != null) response.warnings = sanitizeMessages(warnings, "warnings", details, name, void 0); + if (watchFiles != null) response.watchFiles = sanitizeStringArray(watchFiles, "watchFiles"); + if (watchDirs != null) response.watchDirs = sanitizeStringArray(watchDirs, "watchDirs"); + break; + } + } catch (e) { + response = { id: id2, errors: [extractErrorMessageV8(e, streamIn, details, note && note(), name)] }; + break; + } + } + sendResponse(id, response); + }; + requestCallbacks["on-load"] = async (id, request) => { + let response = {}, name = "", callback, note; + for (let id2 of request.ids) { + try { + ({ name, callback, note } = onLoadCallbacks[id2]); + let result = await callback({ + path: request.path, + namespace: request.namespace, + suffix: request.suffix, + pluginData: details.load(request.pluginData), + with: request.with + }); + if (result != null) { + if (typeof result !== "object") throw new Error(`Expected onLoad() callback in plugin ${quote(name)} to return an object`); + let keys = {}; + let pluginName = getFlag(result, keys, "pluginName", mustBeString); + let contents = getFlag(result, keys, "contents", mustBeStringOrUint8Array); + let resolveDir = getFlag(result, keys, "resolveDir", mustBeString); + let pluginData = getFlag(result, keys, "pluginData", canBeAnything); + let loader = getFlag(result, keys, "loader", mustBeString); + let errors = getFlag(result, keys, "errors", mustBeArray); + let warnings = getFlag(result, keys, "warnings", mustBeArray); + let watchFiles = getFlag(result, keys, "watchFiles", mustBeArray); + let watchDirs = getFlag(result, keys, "watchDirs", mustBeArray); + checkForInvalidFlags(result, keys, `from onLoad() callback in plugin ${quote(name)}`); + response.id = id2; + if (pluginName != null) response.pluginName = pluginName; + if (contents instanceof Uint8Array) response.contents = contents; + else if (contents != null) response.contents = encodeUTF8(contents); + if (resolveDir != null) response.resolveDir = resolveDir; + if (pluginData != null) response.pluginData = details.store(pluginData); + if (loader != null) response.loader = loader; + if (errors != null) response.errors = sanitizeMessages(errors, "errors", details, name, void 0); + if (warnings != null) response.warnings = sanitizeMessages(warnings, "warnings", details, name, void 0); + if (watchFiles != null) response.watchFiles = sanitizeStringArray(watchFiles, "watchFiles"); + if (watchDirs != null) response.watchDirs = sanitizeStringArray(watchDirs, "watchDirs"); + break; + } + } catch (e) { + response = { id: id2, errors: [extractErrorMessageV8(e, streamIn, details, note && note(), name)] }; + break; + } + } + sendResponse(id, response); + }; + let runOnEndCallbacks = (result, done) => done([], []); + if (onEndCallbacks.length > 0) { + runOnEndCallbacks = (result, done) => { + (async () => { + const onEndErrors = []; + const onEndWarnings = []; + for (const { name, callback, note } of onEndCallbacks) { + let newErrors; + let newWarnings; + try { + const value = await callback(result); + if (value != null) { + if (typeof value !== "object") throw new Error(`Expected onEnd() callback in plugin ${quote(name)} to return an object`); + let keys = {}; + let errors = getFlag(value, keys, "errors", mustBeArray); + let warnings = getFlag(value, keys, "warnings", mustBeArray); + checkForInvalidFlags(value, keys, `from onEnd() callback in plugin ${quote(name)}`); + if (errors != null) newErrors = sanitizeMessages(errors, "errors", details, name, void 0); + if (warnings != null) newWarnings = sanitizeMessages(warnings, "warnings", details, name, void 0); + } + } catch (e) { + newErrors = [extractErrorMessageV8(e, streamIn, details, note && note(), name)]; + } + if (newErrors) { + onEndErrors.push(...newErrors); + try { + result.errors.push(...newErrors); + } catch { + } + } + if (newWarnings) { + onEndWarnings.push(...newWarnings); + try { + result.warnings.push(...newWarnings); + } catch { + } + } + } + done(onEndErrors, onEndWarnings); + })(); + }; + } + let scheduleOnDisposeCallbacks = () => { + for (const cb of onDisposeCallbacks) { + setTimeout(() => cb(), 0); + } + }; + isSetupDone = true; + return { + ok: true, + requestPlugins, + runOnEndCallbacks, + scheduleOnDisposeCallbacks + }; +}; +function createObjectStash() { + const map = /* @__PURE__ */ new Map(); + let nextID = 0; + return { + load(id) { + return map.get(id); + }, + store(value) { + if (value === void 0) return -1; + const id = nextID++; + map.set(id, value); + return id; + } + }; +} +function extractCallerV8(e, streamIn, ident) { + let note; + let tried = false; + return () => { + if (tried) return note; + tried = true; + try { + let lines = (e.stack + "").split("\n"); + lines.splice(1, 1); + let location = parseStackLinesV8(streamIn, lines, ident); + if (location) { + note = { text: e.message, location }; + return note; + } + } catch { + } + }; +} +function extractErrorMessageV8(e, streamIn, stash, note, pluginName) { + let text = "Internal error"; + let location = null; + try { + text = (e && e.message || e) + ""; + } catch { + } + try { + location = parseStackLinesV8(streamIn, (e.stack + "").split("\n"), ""); + } catch { + } + return { id: "", pluginName, text, location, notes: note ? [note] : [], detail: stash ? stash.store(e) : -1 }; +} +function parseStackLinesV8(streamIn, lines, ident) { + let at = " at "; + if (streamIn.readFileSync && !lines[0].startsWith(at) && lines[1].startsWith(at)) { + for (let i = 1; i < lines.length; i++) { + let line = lines[i]; + if (!line.startsWith(at)) continue; + line = line.slice(at.length); + while (true) { + let match = /^(?:new |async )?\S+ \((.*)\)$/.exec(line); + if (match) { + line = match[1]; + continue; + } + match = /^eval at \S+ \((.*)\)(?:, \S+:\d+:\d+)?$/.exec(line); + if (match) { + line = match[1]; + continue; + } + match = /^(\S+):(\d+):(\d+)$/.exec(line); + if (match) { + let contents; + try { + contents = streamIn.readFileSync(match[1], "utf8"); + } catch { + break; + } + let lineText = contents.split(/\r\n|\r|\n|\u2028|\u2029/)[+match[2] - 1] || ""; + let column = +match[3] - 1; + let length = lineText.slice(column, column + ident.length) === ident ? ident.length : 0; + return { + file: match[1], + namespace: "file", + line: +match[2], + column: encodeUTF8(lineText.slice(0, column)).length, + length: encodeUTF8(lineText.slice(column, column + length)).length, + lineText: lineText + "\n" + lines.slice(1).join("\n"), + suggestion: "" + }; + } + break; + } + } + } + return null; +} +function failureErrorWithLog(text, errors, warnings) { + let limit = 5; + text += errors.length < 1 ? "" : ` with ${errors.length} error${errors.length < 2 ? "" : "s"}:` + errors.slice(0, limit + 1).map((e, i) => { + if (i === limit) return "\n..."; + if (!e.location) return ` +error: ${e.text}`; + let { file, line, column } = e.location; + let pluginText = e.pluginName ? `[plugin: ${e.pluginName}] ` : ""; + return ` +${file}:${line}:${column}: ERROR: ${pluginText}${e.text}`; + }).join(""); + let error = new Error(text); + for (const [key, value] of [["errors", errors], ["warnings", warnings]]) { + Object.defineProperty(error, key, { + configurable: true, + enumerable: true, + get: () => value, + set: (value2) => Object.defineProperty(error, key, { + configurable: true, + enumerable: true, + value: value2 + }) + }); + } + return error; +} +function replaceDetailsInMessages(messages, stash) { + for (const message of messages) { + message.detail = stash.load(message.detail); + } + return messages; +} +function sanitizeLocation(location, where, terminalWidth) { + if (location == null) return null; + let keys = {}; + let file = getFlag(location, keys, "file", mustBeString); + let namespace = getFlag(location, keys, "namespace", mustBeString); + let line = getFlag(location, keys, "line", mustBeInteger); + let column = getFlag(location, keys, "column", mustBeInteger); + let length = getFlag(location, keys, "length", mustBeInteger); + let lineText = getFlag(location, keys, "lineText", mustBeString); + let suggestion = getFlag(location, keys, "suggestion", mustBeString); + checkForInvalidFlags(location, keys, where); + if (lineText) { + const relevantASCII = lineText.slice( + 0, + (column && column > 0 ? column : 0) + (length && length > 0 ? length : 0) + (terminalWidth && terminalWidth > 0 ? terminalWidth : 80) + ); + if (!/[\x7F-\uFFFF]/.test(relevantASCII) && !/\n/.test(lineText)) { + lineText = relevantASCII; + } + } + return { + file: file || "", + namespace: namespace || "", + line: line || 0, + column: column || 0, + length: length || 0, + lineText: lineText || "", + suggestion: suggestion || "" + }; +} +function sanitizeMessages(messages, property, stash, fallbackPluginName, terminalWidth) { + let messagesClone = []; + let index = 0; + for (const message of messages) { + let keys = {}; + let id = getFlag(message, keys, "id", mustBeString); + let pluginName = getFlag(message, keys, "pluginName", mustBeString); + let text = getFlag(message, keys, "text", mustBeString); + let location = getFlag(message, keys, "location", mustBeObjectOrNull); + let notes = getFlag(message, keys, "notes", mustBeArray); + let detail = getFlag(message, keys, "detail", canBeAnything); + let where = `in element ${index} of "${property}"`; + checkForInvalidFlags(message, keys, where); + let notesClone = []; + if (notes) { + for (const note of notes) { + let noteKeys = {}; + let noteText = getFlag(note, noteKeys, "text", mustBeString); + let noteLocation = getFlag(note, noteKeys, "location", mustBeObjectOrNull); + checkForInvalidFlags(note, noteKeys, where); + notesClone.push({ + text: noteText || "", + location: sanitizeLocation(noteLocation, where, terminalWidth) + }); + } + } + messagesClone.push({ + id: id || "", + pluginName: pluginName || fallbackPluginName, + text: text || "", + location: sanitizeLocation(location, where, terminalWidth), + notes: notesClone, + detail: stash ? stash.store(detail) : -1 + }); + index++; + } + return messagesClone; +} +function sanitizeStringArray(values, property) { + const result = []; + for (const value of values) { + if (typeof value !== "string") throw new Error(`${quote(property)} must be an array of strings`); + result.push(value); + } + return result; +} +function sanitizeStringMap(map, property) { + const result = /* @__PURE__ */ Object.create(null); + for (const key in map) { + const value = map[key]; + if (typeof value !== "string") throw new Error(`key ${quote(key)} in object ${quote(property)} must be a string`); + result[key] = value; + } + return result; +} +function convertOutputFiles({ path: path3, contents, hash }) { + let text = null; + return { + path: path3, + contents, + hash, + get text() { + const binary = this.contents; + if (text === null || binary !== contents) { + contents = binary; + text = decodeUTF8(binary); + } + return text; + } + }; +} + +// lib/npm/node-platform.ts +var fs = require("fs"); +var os = require("os"); +var path = require("path"); +var ESBUILD_BINARY_PATH = process.env.ESBUILD_BINARY_PATH || ESBUILD_BINARY_PATH; +var isValidBinaryPath = (x) => !!x && x !== "/usr/bin/esbuild"; +var packageDarwin_arm64 = "@esbuild/darwin-arm64"; +var packageDarwin_x64 = "@esbuild/darwin-x64"; +var knownWindowsPackages = { + "win32 arm64 LE": "@esbuild/win32-arm64", + "win32 ia32 LE": "@esbuild/win32-ia32", + "win32 x64 LE": "@esbuild/win32-x64" +}; +var knownUnixlikePackages = { + "aix ppc64 BE": "@esbuild/aix-ppc64", + "android arm64 LE": "@esbuild/android-arm64", + "darwin arm64 LE": "@esbuild/darwin-arm64", + "darwin x64 LE": "@esbuild/darwin-x64", + "freebsd arm64 LE": "@esbuild/freebsd-arm64", + "freebsd x64 LE": "@esbuild/freebsd-x64", + "linux arm LE": "@esbuild/linux-arm", + "linux arm64 LE": "@esbuild/linux-arm64", + "linux ia32 LE": "@esbuild/linux-ia32", + "linux mips64el LE": "@esbuild/linux-mips64el", + "linux ppc64 LE": "@esbuild/linux-ppc64", + "linux riscv64 LE": "@esbuild/linux-riscv64", + "linux s390x BE": "@esbuild/linux-s390x", + "linux x64 LE": "@esbuild/linux-x64", + "linux loong64 LE": "@esbuild/linux-loong64", + "netbsd x64 LE": "@esbuild/netbsd-x64", + "openbsd x64 LE": "@esbuild/openbsd-x64", + "sunos x64 LE": "@esbuild/sunos-x64" +}; +var knownWebAssemblyFallbackPackages = { + "android arm LE": "@esbuild/android-arm", + "android x64 LE": "@esbuild/android-x64" +}; +function pkgAndSubpathForCurrentPlatform() { + let pkg; + let subpath; + let isWASM = false; + let platformKey = `${process.platform} ${os.arch()} ${os.endianness()}`; + if (platformKey in knownWindowsPackages) { + pkg = knownWindowsPackages[platformKey]; + subpath = "esbuild.exe"; + } else if (platformKey in knownUnixlikePackages) { + pkg = knownUnixlikePackages[platformKey]; + subpath = "bin/esbuild"; + } else if (platformKey in knownWebAssemblyFallbackPackages) { + pkg = knownWebAssemblyFallbackPackages[platformKey]; + subpath = "bin/esbuild"; + isWASM = true; + } else { + throw new Error(`Unsupported platform: ${platformKey}`); + } + return { pkg, subpath, isWASM }; +} +function pkgForSomeOtherPlatform() { + const libMainJS = require.resolve("esbuild"); + const nodeModulesDirectory = path.dirname(path.dirname(path.dirname(libMainJS))); + if (path.basename(nodeModulesDirectory) === "node_modules") { + for (const unixKey in knownUnixlikePackages) { + try { + const pkg = knownUnixlikePackages[unixKey]; + if (fs.existsSync(path.join(nodeModulesDirectory, pkg))) return pkg; + } catch { + } + } + for (const windowsKey in knownWindowsPackages) { + try { + const pkg = knownWindowsPackages[windowsKey]; + if (fs.existsSync(path.join(nodeModulesDirectory, pkg))) return pkg; + } catch { + } + } + } + return null; +} +function downloadedBinPath(pkg, subpath) { + const esbuildLibDir = path.dirname(require.resolve("esbuild")); + return path.join(esbuildLibDir, `downloaded-${pkg.replace("/", "-")}-${path.basename(subpath)}`); +} +function generateBinPath() { + if (isValidBinaryPath(ESBUILD_BINARY_PATH)) { + if (!fs.existsSync(ESBUILD_BINARY_PATH)) { + console.warn(`[esbuild] Ignoring bad configuration: ESBUILD_BINARY_PATH=${ESBUILD_BINARY_PATH}`); + } else { + return { binPath: ESBUILD_BINARY_PATH, isWASM: false }; + } + } + const { pkg, subpath, isWASM } = pkgAndSubpathForCurrentPlatform(); + let binPath; + try { + binPath = require.resolve(`${pkg}/${subpath}`); + } catch (e) { + binPath = downloadedBinPath(pkg, subpath); + if (!fs.existsSync(binPath)) { + try { + require.resolve(pkg); + } catch { + const otherPkg = pkgForSomeOtherPlatform(); + if (otherPkg) { + let suggestions = ` +Specifically the "${otherPkg}" package is present but this platform +needs the "${pkg}" package instead. People often get into this +situation by installing esbuild on Windows or macOS and copying "node_modules" +into a Docker image that runs Linux, or by copying "node_modules" between +Windows and WSL environments. + +If you are installing with npm, you can try not copying the "node_modules" +directory when you copy the files over, and running "npm ci" or "npm install" +on the destination platform after the copy. Or you could consider using yarn +instead of npm which has built-in support for installing a package on multiple +platforms simultaneously. + +If you are installing with yarn, you can try listing both this platform and the +other platform in your ".yarnrc.yml" file using the "supportedArchitectures" +feature: https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures +Keep in mind that this means multiple copies of esbuild will be present. +`; + if (pkg === packageDarwin_x64 && otherPkg === packageDarwin_arm64 || pkg === packageDarwin_arm64 && otherPkg === packageDarwin_x64) { + suggestions = ` +Specifically the "${otherPkg}" package is present but this platform +needs the "${pkg}" package instead. People often get into this +situation by installing esbuild with npm running inside of Rosetta 2 and then +trying to use it with node running outside of Rosetta 2, or vice versa (Rosetta +2 is Apple's on-the-fly x86_64-to-arm64 translation service). + +If you are installing with npm, you can try ensuring that both npm and node are +not running under Rosetta 2 and then reinstalling esbuild. This likely involves +changing how you installed npm and/or node. For example, installing node with +the universal installer here should work: https://nodejs.org/en/download/. Or +you could consider using yarn instead of npm which has built-in support for +installing a package on multiple platforms simultaneously. + +If you are installing with yarn, you can try listing both "arm64" and "x64" +in your ".yarnrc.yml" file using the "supportedArchitectures" feature: +https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures +Keep in mind that this means multiple copies of esbuild will be present. +`; + } + throw new Error(` +You installed esbuild for another platform than the one you're currently using. +This won't work because esbuild is written with native code and needs to +install a platform-specific binary executable. +${suggestions} +Another alternative is to use the "esbuild-wasm" package instead, which works +the same way on all platforms. But it comes with a heavy performance cost and +can sometimes be 10x slower than the "esbuild" package, so you may also not +want to do that. +`); + } + throw new Error(`The package "${pkg}" could not be found, and is needed by esbuild. + +If you are installing esbuild with npm, make sure that you don't specify the +"--no-optional" or "--omit=optional" flags. The "optionalDependencies" feature +of "package.json" is used by esbuild to install the correct binary executable +for your current platform.`); + } + throw e; + } + } + if (/\.zip\//.test(binPath)) { + let pnpapi; + try { + pnpapi = require("pnpapi"); + } catch (e) { + } + if (pnpapi) { + const root = pnpapi.getPackageInformation(pnpapi.topLevel).packageLocation; + const binTargetPath = path.join( + root, + "node_modules", + ".cache", + "esbuild", + `pnpapi-${pkg.replace("/", "-")}-${"0.21.5"}-${path.basename(subpath)}` + ); + if (!fs.existsSync(binTargetPath)) { + fs.mkdirSync(path.dirname(binTargetPath), { recursive: true }); + fs.copyFileSync(binPath, binTargetPath); + fs.chmodSync(binTargetPath, 493); + } + return { binPath: binTargetPath, isWASM }; + } + } + return { binPath, isWASM }; +} + +// lib/npm/node.ts +var child_process = require("child_process"); +var crypto = require("crypto"); +var path2 = require("path"); +var fs2 = require("fs"); +var os2 = require("os"); +var tty = require("tty"); +var worker_threads; +if (process.env.ESBUILD_WORKER_THREADS !== "0") { + try { + worker_threads = require("worker_threads"); + } catch { + } + let [major, minor] = process.versions.node.split("."); + if ( + // { + if ((!ESBUILD_BINARY_PATH || false) && (path2.basename(__filename) !== "main.js" || path2.basename(__dirname) !== "lib")) { + throw new Error( + `The esbuild JavaScript API cannot be bundled. Please mark the "esbuild" package as external so it's not included in the bundle. + +More information: The file containing the code for esbuild's JavaScript API (${__filename}) does not appear to be inside the esbuild package on the file system, which usually means that the esbuild package was bundled into another file. This is problematic because the API needs to run a binary executable inside the esbuild package which is located using a relative path from the API code to the executable. If the esbuild package is bundled, the relative path will be incorrect and the executable won't be found.` + ); + } + if (false) { + return ["node", [path2.join(__dirname, "..", "bin", "esbuild")]]; + } else { + const { binPath, isWASM } = generateBinPath(); + if (isWASM) { + return ["node", [binPath]]; + } else { + return [binPath, []]; + } + } +}; +var isTTY = () => tty.isatty(2); +var fsSync = { + readFile(tempFile, callback) { + try { + let contents = fs2.readFileSync(tempFile, "utf8"); + try { + fs2.unlinkSync(tempFile); + } catch { + } + callback(null, contents); + } catch (err) { + callback(err, null); + } + }, + writeFile(contents, callback) { + try { + let tempFile = randomFileName(); + fs2.writeFileSync(tempFile, contents); + callback(tempFile); + } catch { + callback(null); + } + } +}; +var fsAsync = { + readFile(tempFile, callback) { + try { + fs2.readFile(tempFile, "utf8", (err, contents) => { + try { + fs2.unlink(tempFile, () => callback(err, contents)); + } catch { + callback(err, contents); + } + }); + } catch (err) { + callback(err, null); + } + }, + writeFile(contents, callback) { + try { + let tempFile = randomFileName(); + fs2.writeFile(tempFile, contents, (err) => err !== null ? callback(null) : callback(tempFile)); + } catch { + callback(null); + } + } +}; +var version = "0.21.5"; +var build = (options) => ensureServiceIsRunning().build(options); +var context = (buildOptions) => ensureServiceIsRunning().context(buildOptions); +var transform = (input, options) => ensureServiceIsRunning().transform(input, options); +var formatMessages = (messages, options) => ensureServiceIsRunning().formatMessages(messages, options); +var analyzeMetafile = (messages, options) => ensureServiceIsRunning().analyzeMetafile(messages, options); +var buildSync = (options) => { + if (worker_threads && !isInternalWorkerThread) { + if (!workerThreadService) workerThreadService = startWorkerThreadService(worker_threads); + return workerThreadService.buildSync(options); + } + let result; + runServiceSync((service) => service.buildOrContext({ + callName: "buildSync", + refs: null, + options, + isTTY: isTTY(), + defaultWD, + callback: (err, res) => { + if (err) throw err; + result = res; + } + })); + return result; +}; +var transformSync = (input, options) => { + if (worker_threads && !isInternalWorkerThread) { + if (!workerThreadService) workerThreadService = startWorkerThreadService(worker_threads); + return workerThreadService.transformSync(input, options); + } + let result; + runServiceSync((service) => service.transform({ + callName: "transformSync", + refs: null, + input, + options: options || {}, + isTTY: isTTY(), + fs: fsSync, + callback: (err, res) => { + if (err) throw err; + result = res; + } + })); + return result; +}; +var formatMessagesSync = (messages, options) => { + if (worker_threads && !isInternalWorkerThread) { + if (!workerThreadService) workerThreadService = startWorkerThreadService(worker_threads); + return workerThreadService.formatMessagesSync(messages, options); + } + let result; + runServiceSync((service) => service.formatMessages({ + callName: "formatMessagesSync", + refs: null, + messages, + options, + callback: (err, res) => { + if (err) throw err; + result = res; + } + })); + return result; +}; +var analyzeMetafileSync = (metafile, options) => { + if (worker_threads && !isInternalWorkerThread) { + if (!workerThreadService) workerThreadService = startWorkerThreadService(worker_threads); + return workerThreadService.analyzeMetafileSync(metafile, options); + } + let result; + runServiceSync((service) => service.analyzeMetafile({ + callName: "analyzeMetafileSync", + refs: null, + metafile: typeof metafile === "string" ? metafile : JSON.stringify(metafile), + options, + callback: (err, res) => { + if (err) throw err; + result = res; + } + })); + return result; +}; +var stop = () => { + if (stopService) stopService(); + if (workerThreadService) workerThreadService.stop(); + return Promise.resolve(); +}; +var initializeWasCalled = false; +var initialize = (options) => { + options = validateInitializeOptions(options || {}); + if (options.wasmURL) throw new Error(`The "wasmURL" option only works in the browser`); + if (options.wasmModule) throw new Error(`The "wasmModule" option only works in the browser`); + if (options.worker) throw new Error(`The "worker" option only works in the browser`); + if (initializeWasCalled) throw new Error('Cannot call "initialize" more than once'); + ensureServiceIsRunning(); + initializeWasCalled = true; + return Promise.resolve(); +}; +var defaultWD = process.cwd(); +var longLivedService; +var stopService; +var ensureServiceIsRunning = () => { + if (longLivedService) return longLivedService; + let [command, args] = esbuildCommandAndArgs(); + let child = child_process.spawn(command, args.concat(`--service=${"0.21.5"}`, "--ping"), { + windowsHide: true, + stdio: ["pipe", "pipe", "inherit"], + cwd: defaultWD + }); + let { readFromStdout, afterClose, service } = createChannel({ + writeToStdin(bytes) { + child.stdin.write(bytes, (err) => { + if (err) afterClose(err); + }); + }, + readFileSync: fs2.readFileSync, + isSync: false, + hasFS: true, + esbuild: node_exports + }); + child.stdin.on("error", afterClose); + child.on("error", afterClose); + const stdin = child.stdin; + const stdout = child.stdout; + stdout.on("data", readFromStdout); + stdout.on("end", afterClose); + stopService = () => { + stdin.destroy(); + stdout.destroy(); + child.kill(); + initializeWasCalled = false; + longLivedService = void 0; + stopService = void 0; + }; + let refCount = 0; + child.unref(); + if (stdin.unref) { + stdin.unref(); + } + if (stdout.unref) { + stdout.unref(); + } + const refs = { + ref() { + if (++refCount === 1) child.ref(); + }, + unref() { + if (--refCount === 0) child.unref(); + } + }; + longLivedService = { + build: (options) => new Promise((resolve, reject) => { + service.buildOrContext({ + callName: "build", + refs, + options, + isTTY: isTTY(), + defaultWD, + callback: (err, res) => err ? reject(err) : resolve(res) + }); + }), + context: (options) => new Promise((resolve, reject) => service.buildOrContext({ + callName: "context", + refs, + options, + isTTY: isTTY(), + defaultWD, + callback: (err, res) => err ? reject(err) : resolve(res) + })), + transform: (input, options) => new Promise((resolve, reject) => service.transform({ + callName: "transform", + refs, + input, + options: options || {}, + isTTY: isTTY(), + fs: fsAsync, + callback: (err, res) => err ? reject(err) : resolve(res) + })), + formatMessages: (messages, options) => new Promise((resolve, reject) => service.formatMessages({ + callName: "formatMessages", + refs, + messages, + options, + callback: (err, res) => err ? reject(err) : resolve(res) + })), + analyzeMetafile: (metafile, options) => new Promise((resolve, reject) => service.analyzeMetafile({ + callName: "analyzeMetafile", + refs, + metafile: typeof metafile === "string" ? metafile : JSON.stringify(metafile), + options, + callback: (err, res) => err ? reject(err) : resolve(res) + })) + }; + return longLivedService; +}; +var runServiceSync = (callback) => { + let [command, args] = esbuildCommandAndArgs(); + let stdin = new Uint8Array(); + let { readFromStdout, afterClose, service } = createChannel({ + writeToStdin(bytes) { + if (stdin.length !== 0) throw new Error("Must run at most one command"); + stdin = bytes; + }, + isSync: true, + hasFS: true, + esbuild: node_exports + }); + callback(service); + let stdout = child_process.execFileSync(command, args.concat(`--service=${"0.21.5"}`), { + cwd: defaultWD, + windowsHide: true, + input: stdin, + // We don't know how large the output could be. If it's too large, the + // command will fail with ENOBUFS. Reserve 16mb for now since that feels + // like it should be enough. Also allow overriding this with an environment + // variable. + maxBuffer: +process.env.ESBUILD_MAX_BUFFER || 16 * 1024 * 1024 + }); + readFromStdout(stdout); + afterClose(null); +}; +var randomFileName = () => { + return path2.join(os2.tmpdir(), `esbuild-${crypto.randomBytes(32).toString("hex")}`); +}; +var workerThreadService = null; +var startWorkerThreadService = (worker_threads2) => { + let { port1: mainPort, port2: workerPort } = new worker_threads2.MessageChannel(); + let worker = new worker_threads2.Worker(__filename, { + workerData: { workerPort, defaultWD, esbuildVersion: "0.21.5" }, + transferList: [workerPort], + // From node's documentation: https://nodejs.org/api/worker_threads.html + // + // Take care when launching worker threads from preload scripts (scripts loaded + // and run using the `-r` command line flag). Unless the `execArgv` option is + // explicitly set, new Worker threads automatically inherit the command line flags + // from the running process and will preload the same preload scripts as the main + // thread. If the preload script unconditionally launches a worker thread, every + // thread spawned will spawn another until the application crashes. + // + execArgv: [] + }); + let nextID = 0; + let fakeBuildError = (text) => { + let error = new Error(`Build failed with 1 error: +error: ${text}`); + let errors = [{ id: "", pluginName: "", text, location: null, notes: [], detail: void 0 }]; + error.errors = errors; + error.warnings = []; + return error; + }; + let validateBuildSyncOptions = (options) => { + if (!options) return; + let plugins = options.plugins; + if (plugins && plugins.length > 0) throw fakeBuildError(`Cannot use plugins in synchronous API calls`); + }; + let applyProperties = (object, properties) => { + for (let key in properties) { + object[key] = properties[key]; + } + }; + let runCallSync = (command, args) => { + let id = nextID++; + let sharedBuffer = new SharedArrayBuffer(8); + let sharedBufferView = new Int32Array(sharedBuffer); + let msg = { sharedBuffer, id, command, args }; + worker.postMessage(msg); + let status = Atomics.wait(sharedBufferView, 0, 0); + if (status !== "ok" && status !== "not-equal") throw new Error("Internal error: Atomics.wait() failed: " + status); + let { message: { id: id2, resolve, reject, properties } } = worker_threads2.receiveMessageOnPort(mainPort); + if (id !== id2) throw new Error(`Internal error: Expected id ${id} but got id ${id2}`); + if (reject) { + applyProperties(reject, properties); + throw reject; + } + return resolve; + }; + worker.unref(); + return { + buildSync(options) { + validateBuildSyncOptions(options); + return runCallSync("build", [options]); + }, + transformSync(input, options) { + return runCallSync("transform", [input, options]); + }, + formatMessagesSync(messages, options) { + return runCallSync("formatMessages", [messages, options]); + }, + analyzeMetafileSync(metafile, options) { + return runCallSync("analyzeMetafile", [metafile, options]); + }, + stop() { + worker.terminate(); + workerThreadService = null; + } + }; +}; +var startSyncServiceWorker = () => { + let workerPort = worker_threads.workerData.workerPort; + let parentPort = worker_threads.parentPort; + let extractProperties = (object) => { + let properties = {}; + if (object && typeof object === "object") { + for (let key in object) { + properties[key] = object[key]; + } + } + return properties; + }; + try { + let service = ensureServiceIsRunning(); + defaultWD = worker_threads.workerData.defaultWD; + parentPort.on("message", (msg) => { + (async () => { + let { sharedBuffer, id, command, args } = msg; + let sharedBufferView = new Int32Array(sharedBuffer); + try { + switch (command) { + case "build": + workerPort.postMessage({ id, resolve: await service.build(args[0]) }); + break; + case "transform": + workerPort.postMessage({ id, resolve: await service.transform(args[0], args[1]) }); + break; + case "formatMessages": + workerPort.postMessage({ id, resolve: await service.formatMessages(args[0], args[1]) }); + break; + case "analyzeMetafile": + workerPort.postMessage({ id, resolve: await service.analyzeMetafile(args[0], args[1]) }); + break; + default: + throw new Error(`Invalid command: ${command}`); + } + } catch (reject) { + workerPort.postMessage({ id, reject, properties: extractProperties(reject) }); + } + Atomics.add(sharedBufferView, 0, 1); + Atomics.notify(sharedBufferView, 0, Infinity); + })(); + }); + } catch (reject) { + parentPort.on("message", (msg) => { + let { sharedBuffer, id } = msg; + let sharedBufferView = new Int32Array(sharedBuffer); + workerPort.postMessage({ id, reject, properties: extractProperties(reject) }); + Atomics.add(sharedBufferView, 0, 1); + Atomics.notify(sharedBufferView, 0, Infinity); + }); + } +}; +if (isInternalWorkerThread) { + startSyncServiceWorker(); +} +var node_default = node_exports; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + analyzeMetafile, + analyzeMetafileSync, + build, + buildSync, + context, + formatMessages, + formatMessagesSync, + initialize, + stop, + transform, + transformSync, + version +}); diff --git a/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/node_modules/.bin/esbuild b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/node_modules/.bin/esbuild new file mode 100644 index 0000000..9cc915e --- /dev/null +++ b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/node_modules/.bin/esbuild @@ -0,0 +1,21 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../../bin/esbuild" "$@" +else + exec node "$basedir/../../bin/esbuild" "$@" +fi diff --git a/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/node_modules/.bin/esbuild.ps1 b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/node_modules/.bin/esbuild.ps1 new file mode 100644 index 0000000..47baadb --- /dev/null +++ b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/node_modules/.bin/esbuild.ps1 @@ -0,0 +1,41 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +$pathsep=":" +$env_node_path=$env:NODE_PATH +$new_node_path="F:\htmlWork\TestCode\frontend\node_modules\.pnpm\esbuild@0.21.5\node_modules\esbuild\bin\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\esbuild@0.21.5\node_modules\esbuild\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\esbuild@0.21.5\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\node_modules" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" + $pathsep=";" +} else { + $new_node_path="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules" +} +if ([string]::IsNullOrEmpty($env_node_path)) { + $env:NODE_PATH=$new_node_path +} else { + $env:NODE_PATH="$new_node_path$pathsep$env_node_path" +} + +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../../bin/esbuild" $args + } else { + & "$basedir/node$exe" "$basedir/../../bin/esbuild" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../../bin/esbuild" $args + } else { + & "node$exe" "$basedir/../../bin/esbuild" $args + } + $ret=$LASTEXITCODE +} +$env:NODE_PATH=$env_node_path +exit $ret diff --git a/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/package.json b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/package.json new file mode 100644 index 0000000..fe253fb --- /dev/null +++ b/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/package.json @@ -0,0 +1,46 @@ +{ + "name": "esbuild", + "version": "0.21.5", + "description": "An extremely fast JavaScript and CSS bundler and minifier.", + "repository": { + "type": "git", + "url": "git+https://github.com/evanw/esbuild.git" + }, + "scripts": { + "postinstall": "node install.js" + }, + "main": "lib/main.js", + "types": "lib/main.d.ts", + "engines": { + "node": ">=12" + }, + "bin": { + "esbuild": "bin/esbuild" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + }, + "license": "MIT" +} diff --git a/node_modules/.pnpm/lock.yaml b/node_modules/.pnpm/lock.yaml new file mode 100644 index 0000000..df2daa0 --- /dev/null +++ b/node_modules/.pnpm/lock.yaml @@ -0,0 +1,568 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + alova: + specifier: ^3.2.10 + version: 3.2.10 + devDependencies: + '@wailsio/runtime': + specifier: latest + version: 3.0.0-alpha.66 + vite: + specifier: ^5.0.0 + version: 5.4.19 + +packages: + + '@alova/shared@1.1.2': + resolution: {integrity: sha512-8q/gMHFpzm7XYcaUlsyTCMDRRhFnewwheTeObMjPl1+bFdr+wZuBEHEPYIyd8tyzLwfrqpBeonaMN2tlngM8EA==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@rollup/rollup-android-arm-eabi@4.40.2': + resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.40.2': + resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.40.2': + resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.40.2': + resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.40.2': + resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.40.2': + resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.40.2': + resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.40.2': + resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.40.2': + resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.40.2': + resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.40.2': + resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.40.2': + resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.40.2': + resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.40.2': + resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.40.2': + resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.40.2': + resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.40.2': + resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} + cpu: [x64] + os: [win32] + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@wailsio/runtime@3.0.0-alpha.66': + resolution: {integrity: sha512-ENLu8rn1griL1gFHJqkq1i+BVxrrA0JPJHYneUJYuf/s54kjuQViW0RKDEe/WTDo56ABpfykrd/T8OYpPUyXUw==} + + alova@3.2.10: + resolution: {integrity: sha512-OHMuSNUbIUEsAq6q5DabISNgFMIXqrC/DPBQv1QJEwxW3fWlYlaF6Vr8b4iqwZnUd2+0rCmFm9GnpKWk7vvx2w==} + engines: {node: '>= 18.0.0'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + rate-limiter-flexible@5.0.5: + resolution: {integrity: sha512-+/dSQfo+3FYwYygUs/V2BBdwGa9nFtakDwKt4l0bnvNB53TNT++QSFewwHX9qXrZJuMe9j+TUaU21lm5ARgqdQ==} + + rollup@4.40.2: + resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + +snapshots: + + '@alova/shared@1.1.2': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@rollup/rollup-android-arm-eabi@4.40.2': + optional: true + + '@rollup/rollup-android-arm64@4.40.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.40.2': + optional: true + + '@rollup/rollup-darwin-x64@4.40.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.40.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.40.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.40.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.40.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.40.2': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.40.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.40.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.40.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.40.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.40.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.40.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.40.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.40.2': + optional: true + + '@types/estree@1.0.7': {} + + '@wailsio/runtime@3.0.0-alpha.66': {} + + alova@3.2.10: + dependencies: + '@alova/shared': 1.1.2 + rate-limiter-flexible: 5.0.5 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + fsevents@2.3.3: + optional: true + + nanoid@3.3.11: {} + + picocolors@1.1.1: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + rate-limiter-flexible@5.0.5: {} + + rollup@4.40.2: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.40.2 + '@rollup/rollup-android-arm64': 4.40.2 + '@rollup/rollup-darwin-arm64': 4.40.2 + '@rollup/rollup-darwin-x64': 4.40.2 + '@rollup/rollup-freebsd-arm64': 4.40.2 + '@rollup/rollup-freebsd-x64': 4.40.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.2 + '@rollup/rollup-linux-arm-musleabihf': 4.40.2 + '@rollup/rollup-linux-arm64-gnu': 4.40.2 + '@rollup/rollup-linux-arm64-musl': 4.40.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2 + '@rollup/rollup-linux-riscv64-gnu': 4.40.2 + '@rollup/rollup-linux-riscv64-musl': 4.40.2 + '@rollup/rollup-linux-s390x-gnu': 4.40.2 + '@rollup/rollup-linux-x64-gnu': 4.40.2 + '@rollup/rollup-linux-x64-musl': 4.40.2 + '@rollup/rollup-win32-arm64-msvc': 4.40.2 + '@rollup/rollup-win32-ia32-msvc': 4.40.2 + '@rollup/rollup-win32-x64-msvc': 4.40.2 + fsevents: 2.3.3 + + source-map-js@1.2.1: {} + + vite@5.4.19: + dependencies: + esbuild: 0.21.5 + postcss: 8.5.3 + rollup: 4.40.2 + optionalDependencies: + fsevents: 2.3.3 diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/LICENSE b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/LICENSE new file mode 100644 index 0000000..37f56aa --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright 2017 Andrey Sitnik + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/README.md b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/README.md new file mode 100644 index 0000000..35abb57 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/README.md @@ -0,0 +1,39 @@ +# Nano ID + +Nano ID logo by Anton Lovchikov + +**English** | [Русский](./README.ru.md) | [简体中文](./README.zh-CN.md) | [Bahasa Indonesia](./README.id-ID.md) + +A tiny, secure, URL-friendly, unique string ID generator for JavaScript. + +> “An amazing level of senseless perfectionism, +> which is simply impossible not to respect.” + +* **Small.** 130 bytes (minified and gzipped). No dependencies. + [Size Limit] controls the size. +* **Fast.** It is 2 times faster than UUID. +* **Safe.** It uses hardware random generator. Can be used in clusters. +* **Short IDs.** It uses a larger alphabet than UUID (`A-Za-z0-9_-`). + So ID size was reduced from 36 to 21 symbols. +* **Portable.** Nano ID was ported + to [20 programming languages](#other-programming-languages). + +```js +import { nanoid } from 'nanoid' +model.id = nanoid() //=> "V1StGXR8_Z5jdHi6B-myT" +``` + +Supports modern browsers, IE [with Babel], Node.js and React Native. + +[online tool]: https://gitpod.io/#https://github.com/ai/nanoid/ +[with Babel]: https://developer.epages.com/blog/coding/how-to-transpile-node-modules-with-babel-and-webpack-in-a-monorepo/ +[Size Limit]: https://github.com/ai/size-limit + + + Sponsored by Evil Martians + + +## Docs +Read full docs **[here](https://github.com/ai/nanoid#readme)**. diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.browser.cjs b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.browser.cjs new file mode 100644 index 0000000..80d1871 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.browser.cjs @@ -0,0 +1,69 @@ +let random = async bytes => crypto.getRandomValues(new Uint8Array(bytes)) + +let customAlphabet = (alphabet, defaultSize = 21) => { + // First, a bitmask is necessary to generate the ID. The bitmask makes bytes + // values closer to the alphabet size. The bitmask calculates the closest + // `2^31 - 1` number, which exceeds the alphabet size. + // For example, the bitmask for the alphabet size 30 is 31 (00011111). + // `Math.clz32` is not used, because it is not available in browsers. + let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1 + // Though, the bitmask solution is not perfect since the bytes exceeding + // the alphabet size are refused. Therefore, to reliably generate the ID, + // the random bytes redundancy has to be satisfied. + + // Note: every hardware random generator call is performance expensive, + // because the system call for entropy collection takes a lot of time. + // So, to avoid additional system calls, extra bytes are requested in advance. + + // Next, a step determines how many random bytes to generate. + // The number of random bytes gets decided upon the ID size, mask, + // alphabet size, and magic number 1.6 (using 1.6 peaks at performance + // according to benchmarks). + + // `-~f => Math.ceil(f)` if f is a float + // `-~i => i + 1` if i is an integer + let step = -~((1.6 * mask * defaultSize) / alphabet.length) + + return async (size = defaultSize) => { + let id = '' + while (true) { + let bytes = crypto.getRandomValues(new Uint8Array(step)) + // A compact alternative for `for (var i = 0; i < step; i++)`. + let i = step | 0 + while (i--) { + // Adding `|| ''` refuses a random byte that exceeds the alphabet size. + id += alphabet[bytes[i] & mask] || '' + if (id.length === size) return id + } + } + } +} + +let nanoid = async (size = 21) => { + let id = '' + let bytes = crypto.getRandomValues(new Uint8Array((size |= 0))) + + // A compact alternative for `for (var i = 0; i < step; i++)`. + while (size--) { + // It is incorrect to use bytes exceeding the alphabet size. + // The following mask reduces the random byte in the 0-255 value + // range to the 0-63 value range. Therefore, adding hacks, such + // as empty string fallback or magic numbers, is unneccessary because + // the bitmask trims bytes down to the alphabet size. + let byte = bytes[size] & 63 + if (byte < 36) { + // `0-9a-z` + id += byte.toString(36) + } else if (byte < 62) { + // `A-Z` + id += (byte - 26).toString(36).toUpperCase() + } else if (byte < 63) { + id += '_' + } else { + id += '-' + } + } + return id +} + +module.exports = { nanoid, customAlphabet, random } diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.browser.js b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.browser.js new file mode 100644 index 0000000..fbaa230 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.browser.js @@ -0,0 +1,34 @@ +let random = async bytes => crypto.getRandomValues(new Uint8Array(bytes)) +let customAlphabet = (alphabet, defaultSize = 21) => { + let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1 + let step = -~((1.6 * mask * defaultSize) / alphabet.length) + return async (size = defaultSize) => { + let id = '' + while (true) { + let bytes = crypto.getRandomValues(new Uint8Array(step)) + let i = step | 0 + while (i--) { + id += alphabet[bytes[i] & mask] || '' + if (id.length === size) return id + } + } + } +} +let nanoid = async (size = 21) => { + let id = '' + let bytes = crypto.getRandomValues(new Uint8Array((size |= 0))) + while (size--) { + let byte = bytes[size] & 63 + if (byte < 36) { + id += byte.toString(36) + } else if (byte < 62) { + id += (byte - 26).toString(36).toUpperCase() + } else if (byte < 63) { + id += '_' + } else { + id += '-' + } + } + return id +} +export { nanoid, customAlphabet, random } diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.cjs b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.cjs new file mode 100644 index 0000000..f1b0ad0 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.cjs @@ -0,0 +1,71 @@ +let crypto = require('crypto') + +let { urlAlphabet } = require('../url-alphabet/index.cjs') + +// `crypto.randomFill()` is a little faster than `crypto.randomBytes()`, +// because it is possible to use in combination with `Buffer.allocUnsafe()`. +let random = bytes => + new Promise((resolve, reject) => { + // `Buffer.allocUnsafe()` is faster because it doesn’t flush the memory. + // Memory flushing is unnecessary since the buffer allocation itself resets + // the memory with the new bytes. + crypto.randomFill(Buffer.allocUnsafe(bytes), (err, buf) => { + if (err) { + reject(err) + } else { + resolve(buf) + } + }) + }) + +let customAlphabet = (alphabet, defaultSize = 21) => { + // First, a bitmask is necessary to generate the ID. The bitmask makes bytes + // values closer to the alphabet size. The bitmask calculates the closest + // `2^31 - 1` number, which exceeds the alphabet size. + // For example, the bitmask for the alphabet size 30 is 31 (00011111). + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 + // Though, the bitmask solution is not perfect since the bytes exceeding + // the alphabet size are refused. Therefore, to reliably generate the ID, + // the random bytes redundancy has to be satisfied. + + // Note: every hardware random generator call is performance expensive, + // because the system call for entropy collection takes a lot of time. + // So, to avoid additional system calls, extra bytes are requested in advance. + + // Next, a step determines how many random bytes to generate. + // The number of random bytes gets decided upon the ID size, mask, + // alphabet size, and magic number 1.6 (using 1.6 peaks at performance + // according to benchmarks). + let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length) + + let tick = (id, size = defaultSize) => + random(step).then(bytes => { + // A compact alternative for `for (var i = 0; i < step; i++)`. + let i = step + while (i--) { + // Adding `|| ''` refuses a random byte that exceeds the alphabet size. + id += alphabet[bytes[i] & mask] || '' + if (id.length >= size) return id + } + return tick(id, size) + }) + + return size => tick('', size) +} + +let nanoid = (size = 21) => + random((size |= 0)).then(bytes => { + let id = '' + // A compact alternative for `for (var i = 0; i < step; i++)`. + while (size--) { + // It is incorrect to use bytes exceeding the alphabet size. + // The following mask reduces the random byte in the 0-255 value + // range to the 0-63 value range. Therefore, adding hacks, such + // as empty string fallback or magic numbers, is unneccessary because + // the bitmask trims bytes down to the alphabet size. + id += urlAlphabet[bytes[size] & 63] + } + return id + }) + +module.exports = { nanoid, customAlphabet, random } diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.d.ts b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.d.ts new file mode 100644 index 0000000..9e91965 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.d.ts @@ -0,0 +1,56 @@ +/** + * Generate secure URL-friendly unique ID. The non-blocking version. + * + * By default, the ID will have 21 symbols to have a collision probability + * similar to UUID v4. + * + * ```js + * import { nanoid } from 'nanoid/async' + * nanoid().then(id => { + * model.id = id + * }) + * ``` + * + * @param size Size of the ID. The default size is 21. + * @returns A promise with a random string. + */ +export function nanoid(size?: number): Promise + +/** + * A low-level function. + * Generate secure unique ID with custom alphabet. The non-blocking version. + * + * Alphabet must contain 256 symbols or less. Otherwise, the generator + * will not be secure. + * + * @param alphabet Alphabet used to generate the ID. + * @param defaultSize Size of the ID. The default size is 21. + * @returns A function that returns a promise with a random string. + * + * ```js + * import { customAlphabet } from 'nanoid/async' + * const nanoid = customAlphabet('0123456789абвгдеё', 5) + * nanoid().then(id => { + * model.id = id //=> "8ё56а" + * }) + * ``` + */ +export function customAlphabet( + alphabet: string, + defaultSize?: number +): (size?: number) => Promise + +/** + * Generate an array of random bytes collected from hardware noise. + * + * ```js + * import { random } from 'nanoid/async' + * random(5).then(bytes => { + * bytes //=> [10, 67, 212, 67, 89] + * }) + * ``` + * + * @param bytes Size of the array. + * @returns A promise with a random bytes array. + */ +export function random(bytes: number): Promise diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.js b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.js new file mode 100644 index 0000000..cec454a --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.js @@ -0,0 +1,35 @@ +import crypto from 'crypto' +import { urlAlphabet } from '../url-alphabet/index.js' +let random = bytes => + new Promise((resolve, reject) => { + crypto.randomFill(Buffer.allocUnsafe(bytes), (err, buf) => { + if (err) { + reject(err) + } else { + resolve(buf) + } + }) + }) +let customAlphabet = (alphabet, defaultSize = 21) => { + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 + let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length) + let tick = (id, size = defaultSize) => + random(step).then(bytes => { + let i = step + while (i--) { + id += alphabet[bytes[i] & mask] || '' + if (id.length >= size) return id + } + return tick(id, size) + }) + return size => tick('', size) +} +let nanoid = (size = 21) => + random((size |= 0)).then(bytes => { + let id = '' + while (size--) { + id += urlAlphabet[bytes[size] & 63] + } + return id + }) +export { nanoid, customAlphabet, random } diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.native.js b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.native.js new file mode 100644 index 0000000..7c1d6f3 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.native.js @@ -0,0 +1,26 @@ +import { getRandomBytesAsync } from 'expo-random' +import { urlAlphabet } from '../url-alphabet/index.js' +let random = getRandomBytesAsync +let customAlphabet = (alphabet, defaultSize = 21) => { + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 + let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length) + let tick = (id, size = defaultSize) => + random(step).then(bytes => { + let i = step + while (i--) { + id += alphabet[bytes[i] & mask] || '' + if (id.length >= size) return id + } + return tick(id, size) + }) + return size => tick('', size) +} +let nanoid = (size = 21) => + random((size |= 0)).then(bytes => { + let id = '' + while (size--) { + id += urlAlphabet[bytes[size] & 63] + } + return id + }) +export { nanoid, customAlphabet, random } diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/package.json b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/package.json new file mode 100644 index 0000000..578cdb4 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/package.json @@ -0,0 +1,12 @@ +{ + "type": "module", + "main": "index.cjs", + "module": "index.js", + "react-native": { + "./index.js": "./index.native.js" + }, + "browser": { + "./index.js": "./index.browser.js", + "./index.cjs": "./index.browser.cjs" + } +} \ No newline at end of file diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/nanoid.cjs b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/nanoid.cjs new file mode 100644 index 0000000..c76db0f --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/nanoid.cjs @@ -0,0 +1,55 @@ +#!/usr/bin/env node + +let { nanoid, customAlphabet } = require('..') + +function print(msg) { + process.stdout.write(msg + '\n') +} + +function error(msg) { + process.stderr.write(msg + '\n') + process.exit(1) +} + +if (process.argv.includes('--help') || process.argv.includes('-h')) { + print(` + Usage + $ nanoid [options] + + Options + -s, --size Generated ID size + -a, --alphabet Alphabet to use + -h, --help Show this help + + Examples + $ nanoid --s 15 + S9sBF77U6sDB8Yg + + $ nanoid --size 10 --alphabet abc + bcabababca`) + process.exit() +} + +let alphabet, size +for (let i = 2; i < process.argv.length; i++) { + let arg = process.argv[i] + if (arg === '--size' || arg === '-s') { + size = Number(process.argv[i + 1]) + i += 1 + if (Number.isNaN(size) || size <= 0) { + error('Size must be positive integer') + } + } else if (arg === '--alphabet' || arg === '-a') { + alphabet = process.argv[i + 1] + i += 1 + } else { + error('Unknown argument ' + arg) + } +} + +if (alphabet) { + let customNanoid = customAlphabet(alphabet, size) + print(customNanoid()) +} else { + print(nanoid(size)) +} diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.browser.cjs b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.browser.cjs new file mode 100644 index 0000000..d21a91f --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.browser.cjs @@ -0,0 +1,72 @@ +// This file replaces `index.js` in bundlers like webpack or Rollup, +// according to `browser` config in `package.json`. + +let { urlAlphabet } = require('./url-alphabet/index.cjs') + +let random = bytes => crypto.getRandomValues(new Uint8Array(bytes)) + +let customRandom = (alphabet, defaultSize, getRandom) => { + // First, a bitmask is necessary to generate the ID. The bitmask makes bytes + // values closer to the alphabet size. The bitmask calculates the closest + // `2^31 - 1` number, which exceeds the alphabet size. + // For example, the bitmask for the alphabet size 30 is 31 (00011111). + // `Math.clz32` is not used, because it is not available in browsers. + let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1 + // Though, the bitmask solution is not perfect since the bytes exceeding + // the alphabet size are refused. Therefore, to reliably generate the ID, + // the random bytes redundancy has to be satisfied. + + // Note: every hardware random generator call is performance expensive, + // because the system call for entropy collection takes a lot of time. + // So, to avoid additional system calls, extra bytes are requested in advance. + + // Next, a step determines how many random bytes to generate. + // The number of random bytes gets decided upon the ID size, mask, + // alphabet size, and magic number 1.6 (using 1.6 peaks at performance + // according to benchmarks). + + // `-~f => Math.ceil(f)` if f is a float + // `-~i => i + 1` if i is an integer + let step = -~((1.6 * mask * defaultSize) / alphabet.length) + + return (size = defaultSize) => { + let id = '' + while (true) { + let bytes = getRandom(step) + // A compact alternative for `for (var i = 0; i < step; i++)`. + let j = step | 0 + while (j--) { + // Adding `|| ''` refuses a random byte that exceeds the alphabet size. + id += alphabet[bytes[j] & mask] || '' + if (id.length === size) return id + } + } + } +} + +let customAlphabet = (alphabet, size = 21) => + customRandom(alphabet, size, random) + +let nanoid = (size = 21) => + crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => { + // It is incorrect to use bytes exceeding the alphabet size. + // The following mask reduces the random byte in the 0-255 value + // range to the 0-63 value range. Therefore, adding hacks, such + // as empty string fallback or magic numbers, is unneccessary because + // the bitmask trims bytes down to the alphabet size. + byte &= 63 + if (byte < 36) { + // `0-9a-z` + id += byte.toString(36) + } else if (byte < 62) { + // `A-Z` + id += (byte - 26).toString(36).toUpperCase() + } else if (byte > 62) { + id += '-' + } else { + id += '_' + } + return id + }, '') + +module.exports = { nanoid, customAlphabet, customRandom, urlAlphabet, random } diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.browser.js b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.browser.js new file mode 100644 index 0000000..7d3b876 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.browser.js @@ -0,0 +1,34 @@ +import { urlAlphabet } from './url-alphabet/index.js' +let random = bytes => crypto.getRandomValues(new Uint8Array(bytes)) +let customRandom = (alphabet, defaultSize, getRandom) => { + let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1 + let step = -~((1.6 * mask * defaultSize) / alphabet.length) + return (size = defaultSize) => { + let id = '' + while (true) { + let bytes = getRandom(step) + let j = step | 0 + while (j--) { + id += alphabet[bytes[j] & mask] || '' + if (id.length === size) return id + } + } + } +} +let customAlphabet = (alphabet, size = 21) => + customRandom(alphabet, size, random) +let nanoid = (size = 21) => + crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => { + byte &= 63 + if (byte < 36) { + id += byte.toString(36) + } else if (byte < 62) { + id += (byte - 26).toString(36).toUpperCase() + } else if (byte > 62) { + id += '-' + } else { + id += '_' + } + return id + }, '') +export { nanoid, customAlphabet, customRandom, urlAlphabet, random } diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.cjs b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.cjs new file mode 100644 index 0000000..c20e374 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.cjs @@ -0,0 +1,85 @@ +let crypto = require('crypto') + +let { urlAlphabet } = require('./url-alphabet/index.cjs') + +// It is best to make fewer, larger requests to the crypto module to +// avoid system call overhead. So, random numbers are generated in a +// pool. The pool is a Buffer that is larger than the initial random +// request size by this multiplier. The pool is enlarged if subsequent +// requests exceed the maximum buffer size. +const POOL_SIZE_MULTIPLIER = 128 +let pool, poolOffset + +let fillPool = bytes => { + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER) + crypto.randomFillSync(pool) + poolOffset = 0 + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool) + poolOffset = 0 + } + poolOffset += bytes +} + +let random = bytes => { + // `|=` convert `bytes` to number to prevent `valueOf` abusing and pool pollution + fillPool((bytes |= 0)) + return pool.subarray(poolOffset - bytes, poolOffset) +} + +let customRandom = (alphabet, defaultSize, getRandom) => { + // First, a bitmask is necessary to generate the ID. The bitmask makes bytes + // values closer to the alphabet size. The bitmask calculates the closest + // `2^31 - 1` number, which exceeds the alphabet size. + // For example, the bitmask for the alphabet size 30 is 31 (00011111). + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 + // Though, the bitmask solution is not perfect since the bytes exceeding + // the alphabet size are refused. Therefore, to reliably generate the ID, + // the random bytes redundancy has to be satisfied. + + // Note: every hardware random generator call is performance expensive, + // because the system call for entropy collection takes a lot of time. + // So, to avoid additional system calls, extra bytes are requested in advance. + + // Next, a step determines how many random bytes to generate. + // The number of random bytes gets decided upon the ID size, mask, + // alphabet size, and magic number 1.6 (using 1.6 peaks at performance + // according to benchmarks). + let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length) + + return (size = defaultSize) => { + let id = '' + while (true) { + let bytes = getRandom(step) + // A compact alternative for `for (let i = 0; i < step; i++)`. + let i = step + while (i--) { + // Adding `|| ''` refuses a random byte that exceeds the alphabet size. + id += alphabet[bytes[i] & mask] || '' + if (id.length === size) return id + } + } + } +} + +let customAlphabet = (alphabet, size = 21) => + customRandom(alphabet, size, random) + +let nanoid = (size = 21) => { + // `|=` convert `size` to number to prevent `valueOf` abusing and pool pollution + fillPool((size |= 0)) + let id = '' + // We are reading directly from the random pool to avoid creating new array + for (let i = poolOffset - size; i < poolOffset; i++) { + // It is incorrect to use bytes exceeding the alphabet size. + // The following mask reduces the random byte in the 0-255 value + // range to the 0-63 value range. Therefore, adding hacks, such + // as empty string fallback or magic numbers, is unneccessary because + // the bitmask trims bytes down to the alphabet size. + id += urlAlphabet[pool[i] & 63] + } + return id +} + +module.exports = { nanoid, customAlphabet, customRandom, urlAlphabet, random } diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.d.cts b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.d.cts new file mode 100644 index 0000000..3e111a3 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.d.cts @@ -0,0 +1,91 @@ +/** + * Generate secure URL-friendly unique ID. + * + * By default, the ID will have 21 symbols to have a collision probability + * similar to UUID v4. + * + * ```js + * import { nanoid } from 'nanoid' + * model.id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqL" + * ``` + * + * @param size Size of the ID. The default size is 21. + * @returns A random string. + */ +export function nanoid(size?: number): string + +/** + * Generate secure unique ID with custom alphabet. + * + * Alphabet must contain 256 symbols or less. Otherwise, the generator + * will not be secure. + * + * @param alphabet Alphabet used to generate the ID. + * @param defaultSize Size of the ID. The default size is 21. + * @returns A random string generator. + * + * ```js + * const { customAlphabet } = require('nanoid') + * const nanoid = customAlphabet('0123456789абвгдеё', 5) + * nanoid() //=> "8ё56а" + * ``` + */ +export function customAlphabet( + alphabet: string, + defaultSize?: number +): (size?: number) => string + +/** + * Generate unique ID with custom random generator and alphabet. + * + * Alphabet must contain 256 symbols or less. Otherwise, the generator + * will not be secure. + * + * ```js + * import { customRandom } from 'nanoid/format' + * + * const nanoid = customRandom('abcdef', 5, size => { + * const random = [] + * for (let i = 0; i < size; i++) { + * random.push(randomByte()) + * } + * return random + * }) + * + * nanoid() //=> "fbaef" + * ``` + * + * @param alphabet Alphabet used to generate a random string. + * @param size Size of the random string. + * @param random A random bytes generator. + * @returns A random string generator. + */ +export function customRandom( + alphabet: string, + size: number, + random: (bytes: number) => Uint8Array +): () => string + +/** + * URL safe symbols. + * + * ```js + * import { urlAlphabet } from 'nanoid' + * const nanoid = customAlphabet(urlAlphabet, 10) + * nanoid() //=> "Uakgb_J5m9" + * ``` + */ +export const urlAlphabet: string + +/** + * Generate an array of random bytes collected from hardware noise. + * + * ```js + * import { customRandom, random } from 'nanoid' + * const nanoid = customRandom("abcdef", 5, random) + * ``` + * + * @param bytes Size of the array. + * @returns An array of random bytes. + */ +export function random(bytes: number): Uint8Array diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.d.ts b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.d.ts new file mode 100644 index 0000000..3e111a3 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.d.ts @@ -0,0 +1,91 @@ +/** + * Generate secure URL-friendly unique ID. + * + * By default, the ID will have 21 symbols to have a collision probability + * similar to UUID v4. + * + * ```js + * import { nanoid } from 'nanoid' + * model.id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqL" + * ``` + * + * @param size Size of the ID. The default size is 21. + * @returns A random string. + */ +export function nanoid(size?: number): string + +/** + * Generate secure unique ID with custom alphabet. + * + * Alphabet must contain 256 symbols or less. Otherwise, the generator + * will not be secure. + * + * @param alphabet Alphabet used to generate the ID. + * @param defaultSize Size of the ID. The default size is 21. + * @returns A random string generator. + * + * ```js + * const { customAlphabet } = require('nanoid') + * const nanoid = customAlphabet('0123456789абвгдеё', 5) + * nanoid() //=> "8ё56а" + * ``` + */ +export function customAlphabet( + alphabet: string, + defaultSize?: number +): (size?: number) => string + +/** + * Generate unique ID with custom random generator and alphabet. + * + * Alphabet must contain 256 symbols or less. Otherwise, the generator + * will not be secure. + * + * ```js + * import { customRandom } from 'nanoid/format' + * + * const nanoid = customRandom('abcdef', 5, size => { + * const random = [] + * for (let i = 0; i < size; i++) { + * random.push(randomByte()) + * } + * return random + * }) + * + * nanoid() //=> "fbaef" + * ``` + * + * @param alphabet Alphabet used to generate a random string. + * @param size Size of the random string. + * @param random A random bytes generator. + * @returns A random string generator. + */ +export function customRandom( + alphabet: string, + size: number, + random: (bytes: number) => Uint8Array +): () => string + +/** + * URL safe symbols. + * + * ```js + * import { urlAlphabet } from 'nanoid' + * const nanoid = customAlphabet(urlAlphabet, 10) + * nanoid() //=> "Uakgb_J5m9" + * ``` + */ +export const urlAlphabet: string + +/** + * Generate an array of random bytes collected from hardware noise. + * + * ```js + * import { customRandom, random } from 'nanoid' + * const nanoid = customRandom("abcdef", 5, random) + * ``` + * + * @param bytes Size of the array. + * @returns An array of random bytes. + */ +export function random(bytes: number): Uint8Array diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.js b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.js new file mode 100644 index 0000000..9bc909d --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.js @@ -0,0 +1,45 @@ +import crypto from 'crypto' +import { urlAlphabet } from './url-alphabet/index.js' +const POOL_SIZE_MULTIPLIER = 128 +let pool, poolOffset +let fillPool = bytes => { + if (!pool || pool.length < bytes) { + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER) + crypto.randomFillSync(pool) + poolOffset = 0 + } else if (poolOffset + bytes > pool.length) { + crypto.randomFillSync(pool) + poolOffset = 0 + } + poolOffset += bytes +} +let random = bytes => { + fillPool((bytes |= 0)) + return pool.subarray(poolOffset - bytes, poolOffset) +} +let customRandom = (alphabet, defaultSize, getRandom) => { + let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1 + let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length) + return (size = defaultSize) => { + let id = '' + while (true) { + let bytes = getRandom(step) + let i = step + while (i--) { + id += alphabet[bytes[i] & mask] || '' + if (id.length === size) return id + } + } + } +} +let customAlphabet = (alphabet, size = 21) => + customRandom(alphabet, size, random) +let nanoid = (size = 21) => { + fillPool((size |= 0)) + let id = '' + for (let i = poolOffset - size; i < poolOffset; i++) { + id += urlAlphabet[pool[i] & 63] + } + return id +} +export { nanoid, customAlphabet, customRandom, urlAlphabet, random } diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/nanoid.js b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/nanoid.js new file mode 100644 index 0000000..ec242ea --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/nanoid.js @@ -0,0 +1 @@ +export let nanoid=(t=21)=>crypto.getRandomValues(new Uint8Array(t)).reduce(((t,e)=>t+=(e&=63)<36?e.toString(36):e<62?(e-26).toString(36).toUpperCase():e<63?"_":"-"),""); \ No newline at end of file diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules/.bin/nanoid b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules/.bin/nanoid new file mode 100644 index 0000000..d84aa32 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules/.bin/nanoid @@ -0,0 +1,21 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../../bin/nanoid.cjs" "$@" +else + exec node "$basedir/../../bin/nanoid.cjs" "$@" +fi diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules/.bin/nanoid.ps1 b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules/.bin/nanoid.ps1 new file mode 100644 index 0000000..4f527b6 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules/.bin/nanoid.ps1 @@ -0,0 +1,41 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +$pathsep=":" +$env_node_path=$env:NODE_PATH +$new_node_path="F:\htmlWork\TestCode\frontend\node_modules\.pnpm\nanoid@3.3.11\node_modules\nanoid\bin\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\nanoid@3.3.11\node_modules\nanoid\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\nanoid@3.3.11\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\node_modules" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" + $pathsep=";" +} else { + $new_node_path="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules" +} +if ([string]::IsNullOrEmpty($env_node_path)) { + $env:NODE_PATH=$new_node_path +} else { + $env:NODE_PATH="$new_node_path$pathsep$env_node_path" +} + +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../../bin/nanoid.cjs" $args + } else { + & "$basedir/node$exe" "$basedir/../../bin/nanoid.cjs" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../../bin/nanoid.cjs" $args + } else { + & "node$exe" "$basedir/../../bin/nanoid.cjs" $args + } + $ret=$LASTEXITCODE +} +$env:NODE_PATH=$env_node_path +exit $ret diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/index.cjs b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/index.cjs new file mode 100644 index 0000000..d51fcb6 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/index.cjs @@ -0,0 +1,34 @@ +// This alphabet uses `A-Za-z0-9_-` symbols. +// The order of characters is optimized for better gzip and brotli compression. +// References to the same file (works both for gzip and brotli): +// `'use`, `andom`, and `rict'` +// References to the brotli default dictionary: +// `-26T`, `1983`, `40px`, `75px`, `bush`, `jack`, `mind`, `very`, and `wolf` +let urlAlphabet = + 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict' + +let customAlphabet = (alphabet, defaultSize = 21) => { + return (size = defaultSize) => { + let id = '' + // A compact alternative for `for (var i = 0; i < step; i++)`. + let i = size | 0 + while (i--) { + // `| 0` is more compact and faster than `Math.floor()`. + id += alphabet[(Math.random() * alphabet.length) | 0] + } + return id + } +} + +let nanoid = (size = 21) => { + let id = '' + // A compact alternative for `for (var i = 0; i < step; i++)`. + let i = size | 0 + while (i--) { + // `| 0` is more compact and faster than `Math.floor()`. + id += urlAlphabet[(Math.random() * 64) | 0] + } + return id +} + +module.exports = { nanoid, customAlphabet } diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/index.d.ts b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/index.d.ts new file mode 100644 index 0000000..4965322 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/index.d.ts @@ -0,0 +1,33 @@ +/** + * Generate URL-friendly unique ID. This method uses the non-secure + * predictable random generator with bigger collision probability. + * + * ```js + * import { nanoid } from 'nanoid/non-secure' + * model.id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqL" + * ``` + * + * @param size Size of the ID. The default size is 21. + * @returns A random string. + */ +export function nanoid(size?: number): string + +/** + * Generate a unique ID based on a custom alphabet. + * This method uses the non-secure predictable random generator + * with bigger collision probability. + * + * @param alphabet Alphabet used to generate the ID. + * @param defaultSize Size of the ID. The default size is 21. + * @returns A random string generator. + * + * ```js + * import { customAlphabet } from 'nanoid/non-secure' + * const nanoid = customAlphabet('0123456789абвгдеё', 5) + * model.id = //=> "8ё56а" + * ``` + */ +export function customAlphabet( + alphabet: string, + defaultSize?: number +): (size?: number) => string diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/index.js b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/index.js new file mode 100644 index 0000000..2ea5827 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/index.js @@ -0,0 +1,21 @@ +let urlAlphabet = + 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict' +let customAlphabet = (alphabet, defaultSize = 21) => { + return (size = defaultSize) => { + let id = '' + let i = size | 0 + while (i--) { + id += alphabet[(Math.random() * alphabet.length) | 0] + } + return id + } +} +let nanoid = (size = 21) => { + let id = '' + let i = size | 0 + while (i--) { + id += urlAlphabet[(Math.random() * 64) | 0] + } + return id +} +export { nanoid, customAlphabet } diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/package.json b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/package.json new file mode 100644 index 0000000..9930d6a --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/non-secure/package.json @@ -0,0 +1,6 @@ +{ + "type": "module", + "main": "index.cjs", + "module": "index.js", + "react-native": "index.js" +} \ No newline at end of file diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/package.json b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/package.json new file mode 100644 index 0000000..a3d3f44 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/package.json @@ -0,0 +1,89 @@ +{ + "name": "nanoid", + "version": "3.3.11", + "description": "A tiny (116 bytes), secure URL-friendly unique string ID generator", + "keywords": [ + "uuid", + "random", + "id", + "url" + ], + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "author": "Andrey Sitnik ", + "license": "MIT", + "repository": "ai/nanoid", + "browser": { + "./index.js": "./index.browser.js", + "./async/index.js": "./async/index.browser.js", + "./async/index.cjs": "./async/index.browser.cjs", + "./index.cjs": "./index.browser.cjs" + }, + "react-native": "index.js", + "bin": "./bin/nanoid.cjs", + "sideEffects": false, + "types": "./index.d.ts", + "type": "module", + "main": "index.cjs", + "module": "index.js", + "exports": { + ".": { + "react-native": "./index.browser.js", + "browser": "./index.browser.js", + "require": { + "types": "./index.d.cts", + "default": "./index.cjs" + }, + "import": { + "types": "./index.d.ts", + "default": "./index.js" + }, + "default": "./index.js" + }, + "./package.json": "./package.json", + "./async/package.json": "./async/package.json", + "./async": { + "browser": "./async/index.browser.js", + "require": { + "types": "./index.d.cts", + "default": "./async/index.cjs" + }, + "import": { + "types": "./index.d.ts", + "default": "./async/index.js" + }, + "default": "./async/index.js" + }, + "./non-secure/package.json": "./non-secure/package.json", + "./non-secure": { + "require": { + "types": "./index.d.cts", + "default": "./non-secure/index.cjs" + }, + "import": { + "types": "./index.d.ts", + "default": "./non-secure/index.js" + }, + "default": "./non-secure/index.js" + }, + "./url-alphabet/package.json": "./url-alphabet/package.json", + "./url-alphabet": { + "require": { + "types": "./index.d.cts", + "default": "./url-alphabet/index.cjs" + }, + "import": { + "types": "./index.d.ts", + "default": "./url-alphabet/index.js" + }, + "default": "./url-alphabet/index.js" + } + } +} diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/url-alphabet/index.cjs b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/url-alphabet/index.cjs new file mode 100644 index 0000000..a332f0b --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/url-alphabet/index.cjs @@ -0,0 +1,7 @@ +// This alphabet uses `A-Za-z0-9_-` symbols. +// The order of characters is optimized for better gzip and brotli compression. +// Same as in non-secure/index.js +let urlAlphabet = + 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict' + +module.exports = { urlAlphabet } diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/url-alphabet/index.js b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/url-alphabet/index.js new file mode 100644 index 0000000..c2782e5 --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/url-alphabet/index.js @@ -0,0 +1,3 @@ +let urlAlphabet = + 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict' +export { urlAlphabet } diff --git a/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/url-alphabet/package.json b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/url-alphabet/package.json new file mode 100644 index 0000000..9930d6a --- /dev/null +++ b/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/url-alphabet/package.json @@ -0,0 +1,6 @@ +{ + "type": "module", + "main": "index.cjs", + "module": "index.js", + "react-native": "index.js" +} \ No newline at end of file diff --git a/node_modules/.pnpm/node_modules/.bin/esbuild b/node_modules/.pnpm/node_modules/.bin/esbuild new file mode 100644 index 0000000..542f246 --- /dev/null +++ b/node_modules/.pnpm/node_modules/.bin/esbuild @@ -0,0 +1,21 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../esbuild/bin/esbuild" "$@" +else + exec node "$basedir/../esbuild/bin/esbuild" "$@" +fi diff --git a/node_modules/.pnpm/node_modules/.bin/esbuild.ps1 b/node_modules/.pnpm/node_modules/.bin/esbuild.ps1 new file mode 100644 index 0000000..abe067a --- /dev/null +++ b/node_modules/.pnpm/node_modules/.bin/esbuild.ps1 @@ -0,0 +1,41 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +$pathsep=":" +$env_node_path=$env:NODE_PATH +$new_node_path="F:\htmlWork\TestCode\frontend\node_modules\.pnpm\esbuild@0.21.5\node_modules\esbuild\bin\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\esbuild@0.21.5\node_modules\esbuild\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\esbuild@0.21.5\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\node_modules" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" + $pathsep=";" +} else { + $new_node_path="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/esbuild@0.21.5/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules" +} +if ([string]::IsNullOrEmpty($env_node_path)) { + $env:NODE_PATH=$new_node_path +} else { + $env:NODE_PATH="$new_node_path$pathsep$env_node_path" +} + +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../esbuild/bin/esbuild" $args + } else { + & "$basedir/node$exe" "$basedir/../esbuild/bin/esbuild" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../esbuild/bin/esbuild" $args + } else { + & "node$exe" "$basedir/../esbuild/bin/esbuild" $args + } + $ret=$LASTEXITCODE +} +$env:NODE_PATH=$env_node_path +exit $ret diff --git a/node_modules/.pnpm/node_modules/.bin/nanoid b/node_modules/.pnpm/node_modules/.bin/nanoid new file mode 100644 index 0000000..f63d683 --- /dev/null +++ b/node_modules/.pnpm/node_modules/.bin/nanoid @@ -0,0 +1,21 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../nanoid/bin/nanoid.cjs" "$@" +else + exec node "$basedir/../nanoid/bin/nanoid.cjs" "$@" +fi diff --git a/node_modules/.pnpm/node_modules/.bin/nanoid.ps1 b/node_modules/.pnpm/node_modules/.bin/nanoid.ps1 new file mode 100644 index 0000000..d88b929 --- /dev/null +++ b/node_modules/.pnpm/node_modules/.bin/nanoid.ps1 @@ -0,0 +1,41 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +$pathsep=":" +$env_node_path=$env:NODE_PATH +$new_node_path="F:\htmlWork\TestCode\frontend\node_modules\.pnpm\nanoid@3.3.11\node_modules\nanoid\bin\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\nanoid@3.3.11\node_modules\nanoid\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\nanoid@3.3.11\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\node_modules" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" + $pathsep=";" +} else { + $new_node_path="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/nanoid@3.3.11/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules" +} +if ([string]::IsNullOrEmpty($env_node_path)) { + $env:NODE_PATH=$new_node_path +} else { + $env:NODE_PATH="$new_node_path$pathsep$env_node_path" +} + +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../nanoid/bin/nanoid.cjs" $args + } else { + & "$basedir/node$exe" "$basedir/../nanoid/bin/nanoid.cjs" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../nanoid/bin/nanoid.cjs" $args + } else { + & "node$exe" "$basedir/../nanoid/bin/nanoid.cjs" $args + } + $ret=$LASTEXITCODE +} +$env:NODE_PATH=$env_node_path +exit $ret diff --git a/node_modules/.pnpm/node_modules/.bin/rollup b/node_modules/.pnpm/node_modules/.bin/rollup new file mode 100644 index 0000000..a9add21 --- /dev/null +++ b/node_modules/.pnpm/node_modules/.bin/rollup @@ -0,0 +1,21 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/rollup@4.40.2/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/rollup@4.40.2/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../rollup/dist/bin/rollup" "$@" +else + exec node "$basedir/../rollup/dist/bin/rollup" "$@" +fi diff --git a/node_modules/.pnpm/node_modules/.bin/rollup.ps1 b/node_modules/.pnpm/node_modules/.bin/rollup.ps1 new file mode 100644 index 0000000..6f7a09b --- /dev/null +++ b/node_modules/.pnpm/node_modules/.bin/rollup.ps1 @@ -0,0 +1,41 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +$pathsep=":" +$env_node_path=$env:NODE_PATH +$new_node_path="F:\htmlWork\TestCode\frontend\node_modules\.pnpm\rollup@4.40.2\node_modules\rollup\dist\bin\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\rollup@4.40.2\node_modules\rollup\dist\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\rollup@4.40.2\node_modules\rollup\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\rollup@4.40.2\node_modules;F:\htmlWork\TestCode\frontend\node_modules\.pnpm\node_modules" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" + $pathsep=";" +} else { + $new_node_path="/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/bin/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/dist/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/rollup@4.40.2/node_modules/rollup/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/rollup@4.40.2/node_modules:/mnt/f/htmlWork/TestCode/frontend/node_modules/.pnpm/node_modules" +} +if ([string]::IsNullOrEmpty($env_node_path)) { + $env:NODE_PATH=$new_node_path +} else { + $env:NODE_PATH="$new_node_path$pathsep$env_node_path" +} + +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../rollup/dist/bin/rollup" $args + } else { + & "$basedir/node$exe" "$basedir/../rollup/dist/bin/rollup" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../rollup/dist/bin/rollup" $args + } else { + & "node$exe" "$basedir/../rollup/dist/bin/rollup" $args + } + $ret=$LASTEXITCODE +} +$env:NODE_PATH=$env_node_path +exit $ret diff --git a/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/LICENSE b/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/LICENSE new file mode 100644 index 0000000..46c9b95 --- /dev/null +++ b/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2021-2024 Oleksii Raspopov, Kostiantyn Denysov, Anton Verinov + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/README.md b/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/README.md new file mode 100644 index 0000000..8e47aa8 --- /dev/null +++ b/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/README.md @@ -0,0 +1,21 @@ +# picocolors + +The tiniest and the fastest library for terminal output formatting with ANSI colors. + +```javascript +import pc from "picocolors" + +console.log( + pc.green(`How are ${pc.italic(`you`)} doing?`) +) +``` + +- **No dependencies.** +- **14 times** smaller and **2 times** faster than chalk. +- Used by popular tools like PostCSS, SVGO, Stylelint, and Browserslist. +- Node.js v6+ & browsers support. Support for both CJS and ESM projects. +- TypeScript type declarations included. +- [`NO_COLOR`](https://no-color.org/) friendly. + +## Docs +Read **[full docs](https://github.com/alexeyraspopov/picocolors#readme)** on GitHub. diff --git a/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/package.json b/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/package.json new file mode 100644 index 0000000..372d4b6 --- /dev/null +++ b/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/package.json @@ -0,0 +1,25 @@ +{ + "name": "picocolors", + "version": "1.1.1", + "main": "./picocolors.js", + "types": "./picocolors.d.ts", + "browser": { + "./picocolors.js": "./picocolors.browser.js" + }, + "sideEffects": false, + "description": "The tiniest and the fastest library for terminal output formatting with ANSI colors", + "files": [ + "picocolors.*", + "types.d.ts" + ], + "keywords": [ + "terminal", + "colors", + "formatting", + "cli", + "console" + ], + "author": "Alexey Raspopov", + "repository": "alexeyraspopov/picocolors", + "license": "ISC" +} diff --git a/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.browser.js b/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.browser.js new file mode 100644 index 0000000..9dcf637 --- /dev/null +++ b/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.browser.js @@ -0,0 +1,4 @@ +var x=String; +var create=function() {return {isColorSupported:false,reset:x,bold:x,dim:x,italic:x,underline:x,inverse:x,hidden:x,strikethrough:x,black:x,red:x,green:x,yellow:x,blue:x,magenta:x,cyan:x,white:x,gray:x,bgBlack:x,bgRed:x,bgGreen:x,bgYellow:x,bgBlue:x,bgMagenta:x,bgCyan:x,bgWhite:x,blackBright:x,redBright:x,greenBright:x,yellowBright:x,blueBright:x,magentaBright:x,cyanBright:x,whiteBright:x,bgBlackBright:x,bgRedBright:x,bgGreenBright:x,bgYellowBright:x,bgBlueBright:x,bgMagentaBright:x,bgCyanBright:x,bgWhiteBright:x}}; +module.exports=create(); +module.exports.createColors = create; diff --git a/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.d.ts b/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.d.ts new file mode 100644 index 0000000..94e146a --- /dev/null +++ b/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.d.ts @@ -0,0 +1,5 @@ +import { Colors } from "./types" + +declare const picocolors: Colors & { createColors: (enabled?: boolean) => Colors } + +export = picocolors diff --git a/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js b/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js new file mode 100644 index 0000000..e32df85 --- /dev/null +++ b/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js @@ -0,0 +1,75 @@ +let p = process || {}, argv = p.argv || [], env = p.env || {} +let isColorSupported = + !(!!env.NO_COLOR || argv.includes("--no-color")) && + (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || ((p.stdout || {}).isTTY && env.TERM !== "dumb") || !!env.CI) + +let formatter = (open, close, replace = open) => + input => { + let string = "" + input, index = string.indexOf(close, open.length) + return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close + } + +let replaceClose = (string, close, replace, index) => { + let result = "", cursor = 0 + do { + result += string.substring(cursor, index) + replace + cursor = index + close.length + index = string.indexOf(close, cursor) + } while (~index) + return result + string.substring(cursor) +} + +let createColors = (enabled = isColorSupported) => { + let f = enabled ? formatter : () => String + return { + isColorSupported: enabled, + reset: f("\x1b[0m", "\x1b[0m"), + bold: f("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m"), + dim: f("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m"), + italic: f("\x1b[3m", "\x1b[23m"), + underline: f("\x1b[4m", "\x1b[24m"), + inverse: f("\x1b[7m", "\x1b[27m"), + hidden: f("\x1b[8m", "\x1b[28m"), + strikethrough: f("\x1b[9m", "\x1b[29m"), + + black: f("\x1b[30m", "\x1b[39m"), + red: f("\x1b[31m", "\x1b[39m"), + green: f("\x1b[32m", "\x1b[39m"), + yellow: f("\x1b[33m", "\x1b[39m"), + blue: f("\x1b[34m", "\x1b[39m"), + magenta: f("\x1b[35m", "\x1b[39m"), + cyan: f("\x1b[36m", "\x1b[39m"), + white: f("\x1b[37m", "\x1b[39m"), + gray: f("\x1b[90m", "\x1b[39m"), + + bgBlack: f("\x1b[40m", "\x1b[49m"), + bgRed: f("\x1b[41m", "\x1b[49m"), + bgGreen: f("\x1b[42m", "\x1b[49m"), + bgYellow: f("\x1b[43m", "\x1b[49m"), + bgBlue: f("\x1b[44m", "\x1b[49m"), + bgMagenta: f("\x1b[45m", "\x1b[49m"), + bgCyan: f("\x1b[46m", "\x1b[49m"), + bgWhite: f("\x1b[47m", "\x1b[49m"), + + blackBright: f("\x1b[90m", "\x1b[39m"), + redBright: f("\x1b[91m", "\x1b[39m"), + greenBright: f("\x1b[92m", "\x1b[39m"), + yellowBright: f("\x1b[93m", "\x1b[39m"), + blueBright: f("\x1b[94m", "\x1b[39m"), + magentaBright: f("\x1b[95m", "\x1b[39m"), + cyanBright: f("\x1b[96m", "\x1b[39m"), + whiteBright: f("\x1b[97m", "\x1b[39m"), + + bgBlackBright: f("\x1b[100m", "\x1b[49m"), + bgRedBright: f("\x1b[101m", "\x1b[49m"), + bgGreenBright: f("\x1b[102m", "\x1b[49m"), + bgYellowBright: f("\x1b[103m", "\x1b[49m"), + bgBlueBright: f("\x1b[104m", "\x1b[49m"), + bgMagentaBright: f("\x1b[105m", "\x1b[49m"), + bgCyanBright: f("\x1b[106m", "\x1b[49m"), + bgWhiteBright: f("\x1b[107m", "\x1b[49m"), + } +} + +module.exports = createColors() +module.exports.createColors = createColors diff --git a/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/types.d.ts b/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/types.d.ts new file mode 100644 index 0000000..cd1aec4 --- /dev/null +++ b/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/types.d.ts @@ -0,0 +1,51 @@ +export type Formatter = (input: string | number | null | undefined) => string + +export interface Colors { + isColorSupported: boolean + + reset: Formatter + bold: Formatter + dim: Formatter + italic: Formatter + underline: Formatter + inverse: Formatter + hidden: Formatter + strikethrough: Formatter + + black: Formatter + red: Formatter + green: Formatter + yellow: Formatter + blue: Formatter + magenta: Formatter + cyan: Formatter + white: Formatter + gray: Formatter + + bgBlack: Formatter + bgRed: Formatter + bgGreen: Formatter + bgYellow: Formatter + bgBlue: Formatter + bgMagenta: Formatter + bgCyan: Formatter + bgWhite: Formatter + + blackBright: Formatter + redBright: Formatter + greenBright: Formatter + yellowBright: Formatter + blueBright: Formatter + magentaBright: Formatter + cyanBright: Formatter + whiteBright: Formatter + + bgBlackBright: Formatter + bgRedBright: Formatter + bgGreenBright: Formatter + bgYellowBright: Formatter + bgBlueBright: Formatter + bgMagentaBright: Formatter + bgCyanBright: Formatter + bgWhiteBright: Formatter +} diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/LICENSE b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/LICENSE new file mode 100644 index 0000000..da057b4 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright 2013 Andrey Sitnik + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/README.md b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/README.md new file mode 100644 index 0000000..939a802 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/README.md @@ -0,0 +1,28 @@ +# PostCSS + +Philosopher’s stone, logo of PostCSS + +PostCSS is a tool for transforming styles with JS plugins. +These plugins can lint your CSS, support variables and mixins, +transpile future CSS syntax, inline images, and more. + +PostCSS is used by industry leaders including Wikipedia, Twitter, Alibaba, +and JetBrains. The [Autoprefixer] and [Stylelint] PostCSS plugins is one of the most popular CSS tools. + +--- + +  Made at Evil Martians, product consulting for developer tools. + +--- + +[Abstract Syntax Tree]: https://en.wikipedia.org/wiki/Abstract_syntax_tree +[Evil Martians]: https://evilmartians.com/?utm_source=postcss +[Autoprefixer]: https://github.com/postcss/autoprefixer +[Stylelint]: https://stylelint.io/ +[plugins]: https://github.com/postcss/postcss#plugins + + +## Docs +Read full docs **[here](https://postcss.org/)**. diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/at-rule.d.ts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/at-rule.d.ts new file mode 100644 index 0000000..89fb505 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/at-rule.d.ts @@ -0,0 +1,140 @@ +import Container, { + ContainerProps, + ContainerWithChildren +} from './container.js' + +declare namespace AtRule { + export interface AtRuleRaws extends Record { + /** + * The space symbols after the last child of the node to the end of the node. + */ + after?: string + + /** + * The space between the at-rule name and its parameters. + */ + afterName?: string + + /** + * The space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + */ + before?: string + + /** + * The symbols between the last parameter and `{` for rules. + */ + between?: string + + /** + * The rule’s selector with comments. + */ + params?: { + raw: string + value: string + } + + /** + * Contains `true` if the last child has an (optional) semicolon. + */ + semicolon?: boolean + } + + export interface AtRuleProps extends ContainerProps { + /** Name of the at-rule. */ + name: string + /** Parameters following the name of the at-rule. */ + params?: number | string + /** Information used to generate byte-to-byte equal node string as it was in the origin input. */ + raws?: AtRuleRaws + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { AtRule_ as default } +} + +/** + * Represents an at-rule. + * + * ```js + * Once (root, { AtRule }) { + * let media = new AtRule({ name: 'media', params: 'print' }) + * media.append(…) + * root.append(media) + * } + * ``` + * + * If it’s followed in the CSS by a `{}` block, this node will have + * a nodes property representing its children. + * + * ```js + * const root = postcss.parse('@charset "UTF-8"; @media print {}') + * + * const charset = root.first + * charset.type //=> 'atrule' + * charset.nodes //=> undefined + * + * const media = root.last + * media.nodes //=> [] + * ``` + */ +declare class AtRule_ extends Container { + /** + * An array containing the layer’s children. + * + * ```js + * const root = postcss.parse('@layer example { a { color: black } }') + * const layer = root.first + * layer.nodes.length //=> 1 + * layer.nodes[0].selector //=> 'a' + * ``` + * + * Can be `undefinded` if the at-rule has no body. + * + * ```js + * const root = postcss.parse('@layer a, b, c;') + * const layer = root.first + * layer.nodes //=> undefined + * ``` + */ + nodes: Container['nodes'] | undefined + parent: ContainerWithChildren | undefined + + raws: AtRule.AtRuleRaws + type: 'atrule' + /** + * The at-rule’s name immediately follows the `@`. + * + * ```js + * const root = postcss.parse('@media print {}') + * const media = root.first + * media.name //=> 'media' + * ``` + */ + get name(): string + set name(value: string) + + /** + * The at-rule’s parameters, the values that follow the at-rule’s name + * but precede any `{}` block. + * + * ```js + * const root = postcss.parse('@media print, screen {}') + * const media = root.first + * media.params //=> 'print, screen' + * ``` + */ + get params(): string + + set params(value: string) + + constructor(defaults?: AtRule.AtRuleProps) + assign(overrides: AtRule.AtRuleProps | object): this + clone(overrides?: Partial): this + cloneAfter(overrides?: Partial): this + cloneBefore(overrides?: Partial): this +} + +declare class AtRule extends AtRule_ {} + +export = AtRule diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/at-rule.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/at-rule.js new file mode 100644 index 0000000..9486447 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/at-rule.js @@ -0,0 +1,25 @@ +'use strict' + +let Container = require('./container') + +class AtRule extends Container { + constructor(defaults) { + super(defaults) + this.type = 'atrule' + } + + append(...children) { + if (!this.proxyOf.nodes) this.nodes = [] + return super.append(...children) + } + + prepend(...children) { + if (!this.proxyOf.nodes) this.nodes = [] + return super.prepend(...children) + } +} + +module.exports = AtRule +AtRule.default = AtRule + +Container.registerAtRule(AtRule) diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/comment.d.ts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/comment.d.ts new file mode 100644 index 0000000..6f1f66f --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/comment.d.ts @@ -0,0 +1,68 @@ +import Container from './container.js' +import Node, { NodeProps } from './node.js' + +declare namespace Comment { + export interface CommentRaws extends Record { + /** + * The space symbols before the node. + */ + before?: string + + /** + * The space symbols between `/*` and the comment’s text. + */ + left?: string + + /** + * The space symbols between the comment’s text. + */ + right?: string + } + + export interface CommentProps extends NodeProps { + /** Information used to generate byte-to-byte equal node string as it was in the origin input. */ + raws?: CommentRaws + /** Content of the comment. */ + text: string + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Comment_ as default } +} + +/** + * It represents a class that handles + * [CSS comments](https://developer.mozilla.org/en-US/docs/Web/CSS/Comments) + * + * ```js + * Once (root, { Comment }) { + * const note = new Comment({ text: 'Note: …' }) + * root.append(note) + * } + * ``` + * + * Remember that CSS comments inside selectors, at-rule parameters, + * or declaration values will be stored in the `raws` properties + * explained above. + */ +declare class Comment_ extends Node { + parent: Container | undefined + raws: Comment.CommentRaws + type: 'comment' + /** + * The comment's text. + */ + get text(): string + + set text(value: string) + + constructor(defaults?: Comment.CommentProps) + assign(overrides: Comment.CommentProps | object): this + clone(overrides?: Partial): this + cloneAfter(overrides?: Partial): this + cloneBefore(overrides?: Partial): this +} + +declare class Comment extends Comment_ {} + +export = Comment diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/comment.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/comment.js new file mode 100644 index 0000000..c566506 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/comment.js @@ -0,0 +1,13 @@ +'use strict' + +let Node = require('./node') + +class Comment extends Node { + constructor(defaults) { + super(defaults) + this.type = 'comment' + } +} + +module.exports = Comment +Comment.default = Comment diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/container.d.ts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/container.d.ts new file mode 100644 index 0000000..9569f34 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/container.d.ts @@ -0,0 +1,480 @@ +import AtRule from './at-rule.js' +import Comment from './comment.js' +import Declaration from './declaration.js' +import Node, { ChildNode, ChildProps, NodeProps } from './node.js' +import Rule from './rule.js' + +declare namespace Container { + export class ContainerWithChildren< + Child extends Node = ChildNode + > extends Container_ { + nodes: Child[] + } + + export interface ValueOptions { + /** + * String that’s used to narrow down values and speed up the regexp search. + */ + fast?: string + + /** + * An array of property names. + */ + props?: readonly string[] + } + + export interface ContainerProps extends NodeProps { + nodes?: readonly (ChildProps | Node)[] + } + + /** + * All types that can be passed into container methods to create or add a new + * child node. + */ + export type NewChild = + | ChildProps + | Node + | readonly ChildProps[] + | readonly Node[] + | readonly string[] + | string + | undefined + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Container_ as default } +} + +/** + * The `Root`, `AtRule`, and `Rule` container nodes + * inherit some common methods to help work with their children. + * + * Note that all containers can store any content. If you write a rule inside + * a rule, PostCSS will parse it. + */ +declare abstract class Container_ extends Node { + /** + * An array containing the container’s children. + * + * ```js + * const root = postcss.parse('a { color: black }') + * root.nodes.length //=> 1 + * root.nodes[0].selector //=> 'a' + * root.nodes[0].nodes[0].prop //=> 'color' + * ``` + */ + nodes: Child[] | undefined + + /** + * The container’s first child. + * + * ```js + * rule.first === rules.nodes[0] + * ``` + */ + get first(): Child | undefined + + /** + * The container’s last child. + * + * ```js + * rule.last === rule.nodes[rule.nodes.length - 1] + * ``` + */ + get last(): Child | undefined + /** + * Inserts new nodes to the end of the container. + * + * ```js + * const decl1 = new Declaration({ prop: 'color', value: 'black' }) + * const decl2 = new Declaration({ prop: 'background-color', value: 'white' }) + * rule.append(decl1, decl2) + * + * root.append({ name: 'charset', params: '"UTF-8"' }) // at-rule + * root.append({ selector: 'a' }) // rule + * rule.append({ prop: 'color', value: 'black' }) // declaration + * rule.append({ text: 'Comment' }) // comment + * + * root.append('a {}') + * root.first.append('color: black; z-index: 1') + * ``` + * + * @param nodes New nodes. + * @return This node for methods chain. + */ + append(...nodes: Container.NewChild[]): this + assign(overrides: Container.ContainerProps | object): this + clone(overrides?: Partial): this + + cloneAfter(overrides?: Partial): this + + cloneBefore(overrides?: Partial): this + /** + * Iterates through the container’s immediate children, + * calling `callback` for each child. + * + * Returning `false` in the callback will break iteration. + * + * This method only iterates through the container’s immediate children. + * If you need to recursively iterate through all the container’s descendant + * nodes, use `Container#walk`. + * + * Unlike the for `{}`-cycle or `Array#forEach` this iterator is safe + * if you are mutating the array of child nodes during iteration. + * PostCSS will adjust the current index to match the mutations. + * + * ```js + * const root = postcss.parse('a { color: black; z-index: 1 }') + * const rule = root.first + * + * for (const decl of rule.nodes) { + * decl.cloneBefore({ prop: '-webkit-' + decl.prop }) + * // Cycle will be infinite, because cloneBefore moves the current node + * // to the next index + * } + * + * rule.each(decl => { + * decl.cloneBefore({ prop: '-webkit-' + decl.prop }) + * // Will be executed only for color and z-index + * }) + * ``` + * + * @param callback Iterator receives each node and index. + * @return Returns `false` if iteration was broke. + */ + each( + callback: (node: Child, index: number) => false | void + ): false | undefined + + /** + * Returns `true` if callback returns `true` + * for all of the container’s children. + * + * ```js + * const noPrefixes = rule.every(i => i.prop[0] !== '-') + * ``` + * + * @param condition Iterator returns true or false. + * @return Is every child pass condition. + */ + every( + condition: (node: Child, index: number, nodes: Child[]) => boolean + ): boolean + /** + * Returns a `child`’s index within the `Container#nodes` array. + * + * ```js + * rule.index( rule.nodes[2] ) //=> 2 + * ``` + * + * @param child Child of the current container. + * @return Child index. + */ + index(child: Child | number): number + + /** + * Insert new node after old node within the container. + * + * @param oldNode Child or child’s index. + * @param newNode New node. + * @return This node for methods chain. + */ + insertAfter(oldNode: Child | number, newNode: Container.NewChild): this + + /** + * Traverses the container’s descendant nodes, calling callback + * for each comment node. + * + * Like `Container#each`, this method is safe + * to use if you are mutating arrays during iteration. + * + * ```js + * root.walkComments(comment => { + * comment.remove() + * }) + * ``` + * + * @param callback Iterator receives each node and index. + * @return Returns `false` if iteration was broke. + */ + + /** + * Insert new node before old node within the container. + * + * ```js + * rule.insertBefore(decl, decl.clone({ prop: '-webkit-' + decl.prop })) + * ``` + * + * @param oldNode Child or child’s index. + * @param newNode New node. + * @return This node for methods chain. + */ + insertBefore(oldNode: Child | number, newNode: Container.NewChild): this + /** + * Inserts new nodes to the start of the container. + * + * ```js + * const decl1 = new Declaration({ prop: 'color', value: 'black' }) + * const decl2 = new Declaration({ prop: 'background-color', value: 'white' }) + * rule.prepend(decl1, decl2) + * + * root.append({ name: 'charset', params: '"UTF-8"' }) // at-rule + * root.append({ selector: 'a' }) // rule + * rule.append({ prop: 'color', value: 'black' }) // declaration + * rule.append({ text: 'Comment' }) // comment + * + * root.append('a {}') + * root.first.append('color: black; z-index: 1') + * ``` + * + * @param nodes New nodes. + * @return This node for methods chain. + */ + prepend(...nodes: Container.NewChild[]): this + + /** + * Add child to the end of the node. + * + * ```js + * rule.push(new Declaration({ prop: 'color', value: 'black' })) + * ``` + * + * @param child New node. + * @return This node for methods chain. + */ + push(child: Child): this + + /** + * Removes all children from the container + * and cleans their parent properties. + * + * ```js + * rule.removeAll() + * rule.nodes.length //=> 0 + * ``` + * + * @return This node for methods chain. + */ + removeAll(): this + + /** + * Removes node from the container and cleans the parent properties + * from the node and its children. + * + * ```js + * rule.nodes.length //=> 5 + * rule.removeChild(decl) + * rule.nodes.length //=> 4 + * decl.parent //=> undefined + * ``` + * + * @param child Child or child’s index. + * @return This node for methods chain. + */ + removeChild(child: Child | number): this + + replaceValues( + pattern: RegExp | string, + replaced: { (substring: string, ...args: any[]): string } | string + ): this + /** + * Passes all declaration values within the container that match pattern + * through callback, replacing those values with the returned result + * of callback. + * + * This method is useful if you are using a custom unit or function + * and need to iterate through all values. + * + * ```js + * root.replaceValues(/\d+rem/, { fast: 'rem' }, string => { + * return 15 * parseInt(string) + 'px' + * }) + * ``` + * + * @param pattern Replace pattern. + * @param {object} options Options to speed up the search. + * @param replaced String to replace pattern or callback + * that returns a new value. The callback + * will receive the same arguments + * as those passed to a function parameter + * of `String#replace`. + * @return This node for methods chain. + */ + replaceValues( + pattern: RegExp | string, + options: Container.ValueOptions, + replaced: { (substring: string, ...args: any[]): string } | string + ): this + + /** + * Returns `true` if callback returns `true` for (at least) one + * of the container’s children. + * + * ```js + * const hasPrefix = rule.some(i => i.prop[0] === '-') + * ``` + * + * @param condition Iterator returns true or false. + * @return Is some child pass condition. + */ + some( + condition: (node: Child, index: number, nodes: Child[]) => boolean + ): boolean + + /** + * Traverses the container’s descendant nodes, calling callback + * for each node. + * + * Like container.each(), this method is safe to use + * if you are mutating arrays during iteration. + * + * If you only need to iterate through the container’s immediate children, + * use `Container#each`. + * + * ```js + * root.walk(node => { + * // Traverses all descendant nodes. + * }) + * ``` + * + * @param callback Iterator receives each node and index. + * @return Returns `false` if iteration was broke. + */ + walk( + callback: (node: ChildNode, index: number) => false | void + ): false | undefined + + /** + * Traverses the container’s descendant nodes, calling callback + * for each at-rule node. + * + * If you pass a filter, iteration will only happen over at-rules + * that have matching names. + * + * Like `Container#each`, this method is safe + * to use if you are mutating arrays during iteration. + * + * ```js + * root.walkAtRules(rule => { + * if (isOld(rule.name)) rule.remove() + * }) + * + * let first = false + * root.walkAtRules('charset', rule => { + * if (!first) { + * first = true + * } else { + * rule.remove() + * } + * }) + * ``` + * + * @param name String or regular expression to filter at-rules by name. + * @param callback Iterator receives each node and index. + * @return Returns `false` if iteration was broke. + */ + walkAtRules( + nameFilter: RegExp | string, + callback: (atRule: AtRule, index: number) => false | void + ): false | undefined + walkAtRules( + callback: (atRule: AtRule, index: number) => false | void + ): false | undefined + + walkComments( + callback: (comment: Comment, indexed: number) => false | void + ): false | undefined + walkComments( + callback: (comment: Comment, indexed: number) => false | void + ): false | undefined + + /** + * Traverses the container’s descendant nodes, calling callback + * for each declaration node. + * + * If you pass a filter, iteration will only happen over declarations + * with matching properties. + * + * ```js + * root.walkDecls(decl => { + * checkPropertySupport(decl.prop) + * }) + * + * root.walkDecls('border-radius', decl => { + * decl.remove() + * }) + * + * root.walkDecls(/^background/, decl => { + * decl.value = takeFirstColorFromGradient(decl.value) + * }) + * ``` + * + * Like `Container#each`, this method is safe + * to use if you are mutating arrays during iteration. + * + * @param prop String or regular expression to filter declarations + * by property name. + * @param callback Iterator receives each node and index. + * @return Returns `false` if iteration was broke. + */ + walkDecls( + propFilter: RegExp | string, + callback: (decl: Declaration, index: number) => false | void + ): false | undefined + walkDecls( + callback: (decl: Declaration, index: number) => false | void + ): false | undefined + /** + * Traverses the container’s descendant nodes, calling callback + * for each rule node. + * + * If you pass a filter, iteration will only happen over rules + * with matching selectors. + * + * Like `Container#each`, this method is safe + * to use if you are mutating arrays during iteration. + * + * ```js + * const selectors = [] + * root.walkRules(rule => { + * selectors.push(rule.selector) + * }) + * console.log(`Your CSS uses ${ selectors.length } selectors`) + * ``` + * + * @param selector String or regular expression to filter rules by selector. + * @param callback Iterator receives each node and index. + * @return Returns `false` if iteration was broke. + */ + walkRules( + selectorFilter: RegExp | string, + callback: (rule: Rule, index: number) => false | void + ): false | undefined + walkRules( + callback: (rule: Rule, index: number) => false | void + ): false | undefined + /** + * An internal method that converts a {@link NewChild} into a list of actual + * child nodes that can then be added to this container. + * + * This ensures that the nodes' parent is set to this container, that they use + * the correct prototype chain, and that they're marked as dirty. + * + * @param mnodes The new node or nodes to add. + * @param sample A node from whose raws the new node's `before` raw should be + * taken. + * @param type This should be set to `'prepend'` if the new nodes will be + * inserted at the beginning of the container. + * @hidden + */ + protected normalize( + nodes: Container.NewChild, + sample: Node | undefined, + type?: 'prepend' | false + ): Child[] +} + +declare class Container< + Child extends Node = ChildNode +> extends Container_ {} + +export = Container diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/container.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/container.js new file mode 100644 index 0000000..edb07cc --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/container.js @@ -0,0 +1,447 @@ +'use strict' + +let Comment = require('./comment') +let Declaration = require('./declaration') +let Node = require('./node') +let { isClean, my } = require('./symbols') + +let AtRule, parse, Root, Rule + +function cleanSource(nodes) { + return nodes.map(i => { + if (i.nodes) i.nodes = cleanSource(i.nodes) + delete i.source + return i + }) +} + +function markTreeDirty(node) { + node[isClean] = false + if (node.proxyOf.nodes) { + for (let i of node.proxyOf.nodes) { + markTreeDirty(i) + } + } +} + +class Container extends Node { + get first() { + if (!this.proxyOf.nodes) return undefined + return this.proxyOf.nodes[0] + } + + get last() { + if (!this.proxyOf.nodes) return undefined + return this.proxyOf.nodes[this.proxyOf.nodes.length - 1] + } + + append(...children) { + for (let child of children) { + let nodes = this.normalize(child, this.last) + for (let node of nodes) this.proxyOf.nodes.push(node) + } + + this.markDirty() + + return this + } + + cleanRaws(keepBetween) { + super.cleanRaws(keepBetween) + if (this.nodes) { + for (let node of this.nodes) node.cleanRaws(keepBetween) + } + } + + each(callback) { + if (!this.proxyOf.nodes) return undefined + let iterator = this.getIterator() + + let index, result + while (this.indexes[iterator] < this.proxyOf.nodes.length) { + index = this.indexes[iterator] + result = callback(this.proxyOf.nodes[index], index) + if (result === false) break + + this.indexes[iterator] += 1 + } + + delete this.indexes[iterator] + return result + } + + every(condition) { + return this.nodes.every(condition) + } + + getIterator() { + if (!this.lastEach) this.lastEach = 0 + if (!this.indexes) this.indexes = {} + + this.lastEach += 1 + let iterator = this.lastEach + this.indexes[iterator] = 0 + + return iterator + } + + getProxyProcessor() { + return { + get(node, prop) { + if (prop === 'proxyOf') { + return node + } else if (!node[prop]) { + return node[prop] + } else if ( + prop === 'each' || + (typeof prop === 'string' && prop.startsWith('walk')) + ) { + return (...args) => { + return node[prop]( + ...args.map(i => { + if (typeof i === 'function') { + return (child, index) => i(child.toProxy(), index) + } else { + return i + } + }) + ) + } + } else if (prop === 'every' || prop === 'some') { + return cb => { + return node[prop]((child, ...other) => + cb(child.toProxy(), ...other) + ) + } + } else if (prop === 'root') { + return () => node.root().toProxy() + } else if (prop === 'nodes') { + return node.nodes.map(i => i.toProxy()) + } else if (prop === 'first' || prop === 'last') { + return node[prop].toProxy() + } else { + return node[prop] + } + }, + + set(node, prop, value) { + if (node[prop] === value) return true + node[prop] = value + if (prop === 'name' || prop === 'params' || prop === 'selector') { + node.markDirty() + } + return true + } + } + } + + index(child) { + if (typeof child === 'number') return child + if (child.proxyOf) child = child.proxyOf + return this.proxyOf.nodes.indexOf(child) + } + + insertAfter(exist, add) { + let existIndex = this.index(exist) + let nodes = this.normalize(add, this.proxyOf.nodes[existIndex]).reverse() + existIndex = this.index(exist) + for (let node of nodes) this.proxyOf.nodes.splice(existIndex + 1, 0, node) + + let index + for (let id in this.indexes) { + index = this.indexes[id] + if (existIndex < index) { + this.indexes[id] = index + nodes.length + } + } + + this.markDirty() + + return this + } + + insertBefore(exist, add) { + let existIndex = this.index(exist) + let type = existIndex === 0 ? 'prepend' : false + let nodes = this.normalize( + add, + this.proxyOf.nodes[existIndex], + type + ).reverse() + existIndex = this.index(exist) + for (let node of nodes) this.proxyOf.nodes.splice(existIndex, 0, node) + + let index + for (let id in this.indexes) { + index = this.indexes[id] + if (existIndex <= index) { + this.indexes[id] = index + nodes.length + } + } + + this.markDirty() + + return this + } + + normalize(nodes, sample) { + if (typeof nodes === 'string') { + nodes = cleanSource(parse(nodes).nodes) + } else if (typeof nodes === 'undefined') { + nodes = [] + } else if (Array.isArray(nodes)) { + nodes = nodes.slice(0) + for (let i of nodes) { + if (i.parent) i.parent.removeChild(i, 'ignore') + } + } else if (nodes.type === 'root' && this.type !== 'document') { + nodes = nodes.nodes.slice(0) + for (let i of nodes) { + if (i.parent) i.parent.removeChild(i, 'ignore') + } + } else if (nodes.type) { + nodes = [nodes] + } else if (nodes.prop) { + if (typeof nodes.value === 'undefined') { + throw new Error('Value field is missed in node creation') + } else if (typeof nodes.value !== 'string') { + nodes.value = String(nodes.value) + } + nodes = [new Declaration(nodes)] + } else if (nodes.selector || nodes.selectors) { + nodes = [new Rule(nodes)] + } else if (nodes.name) { + nodes = [new AtRule(nodes)] + } else if (nodes.text) { + nodes = [new Comment(nodes)] + } else { + throw new Error('Unknown node type in node creation') + } + + let processed = nodes.map(i => { + /* c8 ignore next */ + if (!i[my]) Container.rebuild(i) + i = i.proxyOf + if (i.parent) i.parent.removeChild(i) + if (i[isClean]) markTreeDirty(i) + + if (!i.raws) i.raws = {} + if (typeof i.raws.before === 'undefined') { + if (sample && typeof sample.raws.before !== 'undefined') { + i.raws.before = sample.raws.before.replace(/\S/g, '') + } + } + i.parent = this.proxyOf + return i + }) + + return processed + } + + prepend(...children) { + children = children.reverse() + for (let child of children) { + let nodes = this.normalize(child, this.first, 'prepend').reverse() + for (let node of nodes) this.proxyOf.nodes.unshift(node) + for (let id in this.indexes) { + this.indexes[id] = this.indexes[id] + nodes.length + } + } + + this.markDirty() + + return this + } + + push(child) { + child.parent = this + this.proxyOf.nodes.push(child) + return this + } + + removeAll() { + for (let node of this.proxyOf.nodes) node.parent = undefined + this.proxyOf.nodes = [] + + this.markDirty() + + return this + } + + removeChild(child) { + child = this.index(child) + this.proxyOf.nodes[child].parent = undefined + this.proxyOf.nodes.splice(child, 1) + + let index + for (let id in this.indexes) { + index = this.indexes[id] + if (index >= child) { + this.indexes[id] = index - 1 + } + } + + this.markDirty() + + return this + } + + replaceValues(pattern, opts, callback) { + if (!callback) { + callback = opts + opts = {} + } + + this.walkDecls(decl => { + if (opts.props && !opts.props.includes(decl.prop)) return + if (opts.fast && !decl.value.includes(opts.fast)) return + + decl.value = decl.value.replace(pattern, callback) + }) + + this.markDirty() + + return this + } + + some(condition) { + return this.nodes.some(condition) + } + + walk(callback) { + return this.each((child, i) => { + let result + try { + result = callback(child, i) + } catch (e) { + throw child.addToError(e) + } + if (result !== false && child.walk) { + result = child.walk(callback) + } + + return result + }) + } + + walkAtRules(name, callback) { + if (!callback) { + callback = name + return this.walk((child, i) => { + if (child.type === 'atrule') { + return callback(child, i) + } + }) + } + if (name instanceof RegExp) { + return this.walk((child, i) => { + if (child.type === 'atrule' && name.test(child.name)) { + return callback(child, i) + } + }) + } + return this.walk((child, i) => { + if (child.type === 'atrule' && child.name === name) { + return callback(child, i) + } + }) + } + + walkComments(callback) { + return this.walk((child, i) => { + if (child.type === 'comment') { + return callback(child, i) + } + }) + } + + walkDecls(prop, callback) { + if (!callback) { + callback = prop + return this.walk((child, i) => { + if (child.type === 'decl') { + return callback(child, i) + } + }) + } + if (prop instanceof RegExp) { + return this.walk((child, i) => { + if (child.type === 'decl' && prop.test(child.prop)) { + return callback(child, i) + } + }) + } + return this.walk((child, i) => { + if (child.type === 'decl' && child.prop === prop) { + return callback(child, i) + } + }) + } + + walkRules(selector, callback) { + if (!callback) { + callback = selector + + return this.walk((child, i) => { + if (child.type === 'rule') { + return callback(child, i) + } + }) + } + if (selector instanceof RegExp) { + return this.walk((child, i) => { + if (child.type === 'rule' && selector.test(child.selector)) { + return callback(child, i) + } + }) + } + return this.walk((child, i) => { + if (child.type === 'rule' && child.selector === selector) { + return callback(child, i) + } + }) + } +} + +Container.registerParse = dependant => { + parse = dependant +} + +Container.registerRule = dependant => { + Rule = dependant +} + +Container.registerAtRule = dependant => { + AtRule = dependant +} + +Container.registerRoot = dependant => { + Root = dependant +} + +module.exports = Container +Container.default = Container + +/* c8 ignore start */ +Container.rebuild = node => { + if (node.type === 'atrule') { + Object.setPrototypeOf(node, AtRule.prototype) + } else if (node.type === 'rule') { + Object.setPrototypeOf(node, Rule.prototype) + } else if (node.type === 'decl') { + Object.setPrototypeOf(node, Declaration.prototype) + } else if (node.type === 'comment') { + Object.setPrototypeOf(node, Comment.prototype) + } else if (node.type === 'root') { + Object.setPrototypeOf(node, Root.prototype) + } + + node[my] = true + + if (node.nodes) { + node.nodes.forEach(child => { + Container.rebuild(child) + }) + } +} +/* c8 ignore stop */ diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/css-syntax-error.d.ts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/css-syntax-error.d.ts new file mode 100644 index 0000000..e540d84 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/css-syntax-error.d.ts @@ -0,0 +1,248 @@ +import { FilePosition } from './input.js' + +declare namespace CssSyntaxError { + /** + * A position that is part of a range. + */ + export interface RangePosition { + /** + * The column number in the input. + */ + column: number + + /** + * The line number in the input. + */ + line: number + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { CssSyntaxError_ as default } +} + +/** + * The CSS parser throws this error for broken CSS. + * + * Custom parsers can throw this error for broken custom syntax using + * the `Node#error` method. + * + * PostCSS will use the input source map to detect the original error location. + * If you wrote a Sass file, compiled it to CSS and then parsed it with PostCSS, + * PostCSS will show the original position in the Sass file. + * + * If you need the position in the PostCSS input + * (e.g., to debug the previous compiler), use `error.input.file`. + * + * ```js + * // Raising error from plugin + * throw node.error('Unknown variable', { plugin: 'postcss-vars' }) + * ``` + * + * ```js + * // Catching and checking syntax error + * try { + * postcss.parse('a{') + * } catch (error) { + * if (error.name === 'CssSyntaxError') { + * error //=> CssSyntaxError + * } + * } + * ``` + */ +declare class CssSyntaxError_ extends Error { + /** + * Source column of the error. + * + * ```js + * error.column //=> 1 + * error.input.column //=> 4 + * ``` + * + * PostCSS will use the input source map to detect the original location. + * If you need the position in the PostCSS input, use `error.input.column`. + */ + column?: number + + /** + * Source column of the error's end, exclusive. Provided if the error pertains + * to a range. + * + * ```js + * error.endColumn //=> 1 + * error.input.endColumn //=> 4 + * ``` + * + * PostCSS will use the input source map to detect the original location. + * If you need the position in the PostCSS input, use `error.input.endColumn`. + */ + endColumn?: number + + /** + * Source line of the error's end, exclusive. Provided if the error pertains + * to a range. + * + * ```js + * error.endLine //=> 3 + * error.input.endLine //=> 4 + * ``` + * + * PostCSS will use the input source map to detect the original location. + * If you need the position in the PostCSS input, use `error.input.endLine`. + */ + endLine?: number + + /** + * Absolute path to the broken file. + * + * ```js + * error.file //=> 'a.sass' + * error.input.file //=> 'a.css' + * ``` + * + * PostCSS will use the input source map to detect the original location. + * If you need the position in the PostCSS input, use `error.input.file`. + */ + file?: string + + /** + * Input object with PostCSS internal information + * about input file. If input has source map + * from previous tool, PostCSS will use origin + * (for example, Sass) source. You can use this + * object to get PostCSS input source. + * + * ```js + * error.input.file //=> 'a.css' + * error.file //=> 'a.sass' + * ``` + */ + input?: FilePosition + + /** + * Source line of the error. + * + * ```js + * error.line //=> 2 + * error.input.line //=> 4 + * ``` + * + * PostCSS will use the input source map to detect the original location. + * If you need the position in the PostCSS input, use `error.input.line`. + */ + line?: number + + /** + * Full error text in the GNU error format + * with plugin, file, line and column. + * + * ```js + * error.message //=> 'a.css:1:1: Unclosed block' + * ``` + */ + message: string + + /** + * Always equal to `'CssSyntaxError'`. You should always check error type + * by `error.name === 'CssSyntaxError'` + * instead of `error instanceof CssSyntaxError`, + * because npm could have several PostCSS versions. + * + * ```js + * if (error.name === 'CssSyntaxError') { + * error //=> CssSyntaxError + * } + * ``` + */ + name: 'CssSyntaxError' + + /** + * Plugin name, if error came from plugin. + * + * ```js + * error.plugin //=> 'postcss-vars' + * ``` + */ + plugin?: string + + /** + * Error message. + * + * ```js + * error.message //=> 'Unclosed block' + * ``` + */ + reason: string + + /** + * Source code of the broken file. + * + * ```js + * error.source //=> 'a { b {} }' + * error.input.source //=> 'a b { }' + * ``` + */ + source?: string + + stack: string + + /** + * Instantiates a CSS syntax error. Can be instantiated for a single position + * or for a range. + * @param message Error message. + * @param lineOrStartPos If for a single position, the line number, or if for + * a range, the inclusive start position of the error. + * @param columnOrEndPos If for a single position, the column number, or if for + * a range, the exclusive end position of the error. + * @param source Source code of the broken file. + * @param file Absolute path to the broken file. + * @param plugin PostCSS plugin name, if error came from plugin. + */ + constructor( + message: string, + lineOrStartPos?: CssSyntaxError.RangePosition | number, + columnOrEndPos?: CssSyntaxError.RangePosition | number, + source?: string, + file?: string, + plugin?: string + ) + + /** + * Returns a few lines of CSS source that caused the error. + * + * If the CSS has an input source map without `sourceContent`, + * this method will return an empty string. + * + * ```js + * error.showSourceCode() //=> " 4 | } + * // 5 | a { + * // > 6 | bad + * // | ^ + * // 7 | } + * // 8 | b {" + * ``` + * + * @param color Whether arrow will be colored red by terminal + * color codes. By default, PostCSS will detect + * color support by `process.stdout.isTTY` + * and `process.env.NODE_DISABLE_COLORS`. + * @return Few lines of CSS source that caused the error. + */ + showSourceCode(color?: boolean): string + + /** + * Returns error position, message and source code of the broken part. + * + * ```js + * error.toString() //=> "CssSyntaxError: app.css:1:1: Unclosed block + * // > 1 | a { + * // | ^" + * ``` + * + * @return Error position, message and source code. + */ + toString(): string +} + +declare class CssSyntaxError extends CssSyntaxError_ {} + +export = CssSyntaxError diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/css-syntax-error.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/css-syntax-error.js new file mode 100644 index 0000000..275a4f6 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/css-syntax-error.js @@ -0,0 +1,133 @@ +'use strict' + +let pico = require('picocolors') + +let terminalHighlight = require('./terminal-highlight') + +class CssSyntaxError extends Error { + constructor(message, line, column, source, file, plugin) { + super(message) + this.name = 'CssSyntaxError' + this.reason = message + + if (file) { + this.file = file + } + if (source) { + this.source = source + } + if (plugin) { + this.plugin = plugin + } + if (typeof line !== 'undefined' && typeof column !== 'undefined') { + if (typeof line === 'number') { + this.line = line + this.column = column + } else { + this.line = line.line + this.column = line.column + this.endLine = column.line + this.endColumn = column.column + } + } + + this.setMessage() + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, CssSyntaxError) + } + } + + setMessage() { + this.message = this.plugin ? this.plugin + ': ' : '' + this.message += this.file ? this.file : '' + if (typeof this.line !== 'undefined') { + this.message += ':' + this.line + ':' + this.column + } + this.message += ': ' + this.reason + } + + showSourceCode(color) { + if (!this.source) return '' + + let css = this.source + if (color == null) color = pico.isColorSupported + + let aside = text => text + let mark = text => text + let highlight = text => text + if (color) { + let { bold, gray, red } = pico.createColors(true) + mark = text => bold(red(text)) + aside = text => gray(text) + if (terminalHighlight) { + highlight = text => terminalHighlight(text) + } + } + + let lines = css.split(/\r?\n/) + let start = Math.max(this.line - 3, 0) + let end = Math.min(this.line + 2, lines.length) + let maxWidth = String(end).length + + return lines + .slice(start, end) + .map((line, index) => { + let number = start + 1 + index + let gutter = ' ' + (' ' + number).slice(-maxWidth) + ' | ' + if (number === this.line) { + if (line.length > 160) { + let padding = 20 + let subLineStart = Math.max(0, this.column - padding) + let subLineEnd = Math.max( + this.column + padding, + this.endColumn + padding + ) + let subLine = line.slice(subLineStart, subLineEnd) + + let spacing = + aside(gutter.replace(/\d/g, ' ')) + + line + .slice(0, Math.min(this.column - 1, padding - 1)) + .replace(/[^\t]/g, ' ') + + return ( + mark('>') + + aside(gutter) + + highlight(subLine) + + '\n ' + + spacing + + mark('^') + ) + } + + let spacing = + aside(gutter.replace(/\d/g, ' ')) + + line.slice(0, this.column - 1).replace(/[^\t]/g, ' ') + + return ( + mark('>') + + aside(gutter) + + highlight(line) + + '\n ' + + spacing + + mark('^') + ) + } + + return ' ' + aside(gutter) + highlight(line) + }) + .join('\n') + } + + toString() { + let code = this.showSourceCode() + if (code) { + code = '\n\n' + code + '\n' + } + return this.name + ': ' + this.message + code + } +} + +module.exports = CssSyntaxError +CssSyntaxError.default = CssSyntaxError diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/declaration.d.ts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/declaration.d.ts new file mode 100644 index 0000000..d489b42 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/declaration.d.ts @@ -0,0 +1,151 @@ +import { ContainerWithChildren } from './container.js' +import Node from './node.js' + +declare namespace Declaration { + export interface DeclarationRaws extends Record { + /** + * The space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + */ + before?: string + + /** + * The symbols between the property and value for declarations. + */ + between?: string + + /** + * The content of the important statement, if it is not just `!important`. + */ + important?: string + + /** + * Declaration value with comments. + */ + value?: { + raw: string + value: string + } + } + + export interface DeclarationProps { + /** Whether the declaration has an `!important` annotation. */ + important?: boolean + /** Name of the declaration. */ + prop: string + /** Information used to generate byte-to-byte equal node string as it was in the origin input. */ + raws?: DeclarationRaws + /** Value of the declaration. */ + value: string + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Declaration_ as default } +} + +/** + * It represents a class that handles + * [CSS declarations](https://developer.mozilla.org/en-US/docs/Web/CSS/Syntax#css_declarations) + * + * ```js + * Once (root, { Declaration }) { + * const color = new Declaration({ prop: 'color', value: 'black' }) + * root.append(color) + * } + * ``` + * + * ```js + * const root = postcss.parse('a { color: black }') + * const decl = root.first?.first + * + * decl.type //=> 'decl' + * decl.toString() //=> ' color: black' + * ``` + */ +declare class Declaration_ extends Node { + parent: ContainerWithChildren | undefined + raws: Declaration.DeclarationRaws + + type: 'decl' + + /** + * It represents a specificity of the declaration. + * + * If true, the CSS declaration will have an + * [important](https://developer.mozilla.org/en-US/docs/Web/CSS/important) + * specifier. + * + * ```js + * const root = postcss.parse('a { color: black !important; color: red }') + * + * root.first.first.important //=> true + * root.first.last.important //=> undefined + * ``` + */ + get important(): boolean + set important(value: boolean) + + /** + * The property name for a CSS declaration. + * + * ```js + * const root = postcss.parse('a { color: black }') + * const decl = root.first.first + * + * decl.prop //=> 'color' + * ``` + */ + get prop(): string + + set prop(value: string) + + /** + * The property value for a CSS declaration. + * + * Any CSS comments inside the value string will be filtered out. + * CSS comments present in the source value will be available in + * the `raws` property. + * + * Assigning new `value` would ignore the comments in `raws` + * property while compiling node to string. + * + * ```js + * const root = postcss.parse('a { color: black }') + * const decl = root.first.first + * + * decl.value //=> 'black' + * ``` + */ + get value(): string + set value(value: string) + + /** + * It represents a getter that returns `true` if a declaration starts with + * `--` or `$`, which are used to declare variables in CSS and SASS/SCSS. + * + * ```js + * const root = postcss.parse(':root { --one: 1 }') + * const one = root.first.first + * + * one.variable //=> true + * ``` + * + * ```js + * const root = postcss.parse('$one: 1') + * const one = root.first + * + * one.variable //=> true + * ``` + */ + get variable(): boolean + constructor(defaults?: Declaration.DeclarationProps) + + assign(overrides: Declaration.DeclarationProps | object): this + clone(overrides?: Partial): this + cloneAfter(overrides?: Partial): this + cloneBefore(overrides?: Partial): this +} + +declare class Declaration extends Declaration_ {} + +export = Declaration diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/declaration.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/declaration.js new file mode 100644 index 0000000..65a03aa --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/declaration.js @@ -0,0 +1,24 @@ +'use strict' + +let Node = require('./node') + +class Declaration extends Node { + get variable() { + return this.prop.startsWith('--') || this.prop[0] === '$' + } + + constructor(defaults) { + if ( + defaults && + typeof defaults.value !== 'undefined' && + typeof defaults.value !== 'string' + ) { + defaults = { ...defaults, value: String(defaults.value) } + } + super(defaults) + this.type = 'decl' + } +} + +module.exports = Declaration +Declaration.default = Declaration diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/document.d.ts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/document.d.ts new file mode 100644 index 0000000..f9e8063 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/document.d.ts @@ -0,0 +1,69 @@ +import Container, { ContainerProps } from './container.js' +import { ProcessOptions } from './postcss.js' +import Result from './result.js' +import Root from './root.js' + +declare namespace Document { + export interface DocumentProps extends ContainerProps { + nodes?: readonly Root[] + + /** + * Information to generate byte-to-byte equal node string as it was + * in the origin input. + * + * Every parser saves its own properties. + */ + raws?: Record + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Document_ as default } +} + +/** + * Represents a file and contains all its parsed nodes. + * + * **Experimental:** some aspects of this node could change within minor + * or patch version releases. + * + * ```js + * const document = htmlParser( + * '' + * ) + * document.type //=> 'document' + * document.nodes.length //=> 2 + * ``` + */ +declare class Document_ extends Container { + nodes: Root[] + parent: undefined + type: 'document' + + constructor(defaults?: Document.DocumentProps) + + assign(overrides: Document.DocumentProps | object): this + clone(overrides?: Partial): this + cloneAfter(overrides?: Partial): this + cloneBefore(overrides?: Partial): this + + /** + * Returns a `Result` instance representing the document’s CSS roots. + * + * ```js + * const root1 = postcss.parse(css1, { from: 'a.css' }) + * const root2 = postcss.parse(css2, { from: 'b.css' }) + * const document = postcss.document() + * document.append(root1) + * document.append(root2) + * const result = document.toResult({ to: 'all.css', map: true }) + * ``` + * + * @param opts Options. + * @return Result with current document’s CSS. + */ + toResult(options?: ProcessOptions): Result +} + +declare class Document extends Document_ {} + +export = Document diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/document.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/document.js new file mode 100644 index 0000000..4468991 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/document.js @@ -0,0 +1,33 @@ +'use strict' + +let Container = require('./container') + +let LazyResult, Processor + +class Document extends Container { + constructor(defaults) { + // type needs to be passed to super, otherwise child roots won't be normalized correctly + super({ type: 'document', ...defaults }) + + if (!this.nodes) { + this.nodes = [] + } + } + + toResult(opts = {}) { + let lazy = new LazyResult(new Processor(), this, opts) + + return lazy.stringify() + } +} + +Document.registerLazyResult = dependant => { + LazyResult = dependant +} + +Document.registerProcessor = dependant => { + Processor = dependant +} + +module.exports = Document +Document.default = Document diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/fromJSON.d.ts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/fromJSON.d.ts new file mode 100644 index 0000000..e1deedb --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/fromJSON.d.ts @@ -0,0 +1,9 @@ +import { JSONHydrator } from './postcss.js' + +interface FromJSON extends JSONHydrator { + default: FromJSON +} + +declare const fromJSON: FromJSON + +export = fromJSON diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/fromJSON.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/fromJSON.js new file mode 100644 index 0000000..c9ac1a8 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/fromJSON.js @@ -0,0 +1,54 @@ +'use strict' + +let AtRule = require('./at-rule') +let Comment = require('./comment') +let Declaration = require('./declaration') +let Input = require('./input') +let PreviousMap = require('./previous-map') +let Root = require('./root') +let Rule = require('./rule') + +function fromJSON(json, inputs) { + if (Array.isArray(json)) return json.map(n => fromJSON(n)) + + let { inputs: ownInputs, ...defaults } = json + if (ownInputs) { + inputs = [] + for (let input of ownInputs) { + let inputHydrated = { ...input, __proto__: Input.prototype } + if (inputHydrated.map) { + inputHydrated.map = { + ...inputHydrated.map, + __proto__: PreviousMap.prototype + } + } + inputs.push(inputHydrated) + } + } + if (defaults.nodes) { + defaults.nodes = json.nodes.map(n => fromJSON(n, inputs)) + } + if (defaults.source) { + let { inputId, ...source } = defaults.source + defaults.source = source + if (inputId != null) { + defaults.source.input = inputs[inputId] + } + } + if (defaults.type === 'root') { + return new Root(defaults) + } else if (defaults.type === 'decl') { + return new Declaration(defaults) + } else if (defaults.type === 'rule') { + return new Rule(defaults) + } else if (defaults.type === 'comment') { + return new Comment(defaults) + } else if (defaults.type === 'atrule') { + return new AtRule(defaults) + } else { + throw new Error('Unknown node type: ' + json.type) + } +} + +module.exports = fromJSON +fromJSON.default = fromJSON diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/input.d.ts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/input.d.ts new file mode 100644 index 0000000..260040f --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/input.d.ts @@ -0,0 +1,206 @@ +import { CssSyntaxError, ProcessOptions } from './postcss.js' +import PreviousMap from './previous-map.js' + +declare namespace Input { + export interface FilePosition { + /** + * Column of inclusive start position in source file. + */ + column: number + + /** + * Column of exclusive end position in source file. + */ + endColumn?: number + + /** + * Line of exclusive end position in source file. + */ + endLine?: number + + /** + * Absolute path to the source file. + */ + file?: string + + /** + * Line of inclusive start position in source file. + */ + line: number + + /** + * Source code. + */ + source?: string + + /** + * URL for the source file. + */ + url: string + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Input_ as default } +} + +/** + * Represents the source CSS. + * + * ```js + * const root = postcss.parse(css, { from: file }) + * const input = root.source.input + * ``` + */ +declare class Input_ { + /** + * Input CSS source. + * + * ```js + * const input = postcss.parse('a{}', { from: file }).input + * input.css //=> "a{}" + * ``` + */ + css: string + + /** + * Input source with support for non-CSS documents. + * + * ```js + * const input = postcss.parse('a{}', { from: file, document: '' }).input + * input.document //=> "" + * input.css //=> "a{}" + * ``` + */ + document: string + + /** + * The absolute path to the CSS source file defined + * with the `from` option. + * + * ```js + * const root = postcss.parse(css, { from: 'a.css' }) + * root.source.input.file //=> '/home/ai/a.css' + * ``` + */ + file?: string + + /** + * The flag to indicate whether or not the source code has Unicode BOM. + */ + hasBOM: boolean + + /** + * The unique ID of the CSS source. It will be created if `from` option + * is not provided (because PostCSS does not know the file path). + * + * ```js + * const root = postcss.parse(css) + * root.source.input.file //=> undefined + * root.source.input.id //=> "" + * ``` + */ + id?: string + + /** + * The input source map passed from a compilation step before PostCSS + * (for example, from Sass compiler). + * + * ```js + * root.source.input.map.consumer().sources //=> ['a.sass'] + * ``` + */ + map: PreviousMap + + /** + * The CSS source identifier. Contains `Input#file` if the user + * set the `from` option, or `Input#id` if they did not. + * + * ```js + * const root = postcss.parse(css, { from: 'a.css' }) + * root.source.input.from //=> "/home/ai/a.css" + * + * const root = postcss.parse(css) + * root.source.input.from //=> "" + * ``` + */ + get from(): string + + /** + * @param css Input CSS source. + * @param opts Process options. + */ + constructor(css: string, opts?: ProcessOptions) + + error( + message: string, + start: + | { + column: number + line: number + } + | { + offset: number + }, + end: + | { + column: number + line: number + } + | { + offset: number + }, + opts?: { plugin?: CssSyntaxError['plugin'] } + ): CssSyntaxError + /** + * Returns `CssSyntaxError` with information about the error and its position. + */ + error( + message: string, + line: number, + column: number, + opts?: { plugin?: CssSyntaxError['plugin'] } + ): CssSyntaxError + error( + message: string, + offset: number, + opts?: { plugin?: CssSyntaxError['plugin'] } + ): CssSyntaxError + /** + * Converts source offset to line and column. + * + * @param offset Source offset. + */ + fromOffset(offset: number): { col: number; line: number } | null + /** + * Reads the input source map and returns a symbol position + * in the input source (e.g., in a Sass file that was compiled + * to CSS before being passed to PostCSS). Optionally takes an + * end position, exclusive. + * + * ```js + * root.source.input.origin(1, 1) //=> { file: 'a.css', line: 3, column: 1 } + * root.source.input.origin(1, 1, 1, 4) + * //=> { file: 'a.css', line: 3, column: 1, endLine: 3, endColumn: 4 } + * ``` + * + * @param line Line for inclusive start position in input CSS. + * @param column Column for inclusive start position in input CSS. + * @param endLine Line for exclusive end position in input CSS. + * @param endColumn Column for exclusive end position in input CSS. + * + * @return Position in input source. + */ + origin( + line: number, + column: number, + endLine?: number, + endColumn?: number + ): false | Input.FilePosition + + /** Converts this to a JSON-friendly object representation. */ + toJSON(): object +} + +declare class Input extends Input_ {} + +export = Input diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/input.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/input.js new file mode 100644 index 0000000..9773e0f --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/input.js @@ -0,0 +1,251 @@ +'use strict' + +let { nanoid } = require('nanoid/non-secure') +let { isAbsolute, resolve } = require('path') +let { SourceMapConsumer, SourceMapGenerator } = require('source-map-js') +let { fileURLToPath, pathToFileURL } = require('url') + +let CssSyntaxError = require('./css-syntax-error') +let PreviousMap = require('./previous-map') +let terminalHighlight = require('./terminal-highlight') + +let fromOffsetCache = Symbol('fromOffsetCache') + +let sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator) +let pathAvailable = Boolean(resolve && isAbsolute) + +class Input { + get from() { + return this.file || this.id + } + + constructor(css, opts = {}) { + if ( + css === null || + typeof css === 'undefined' || + (typeof css === 'object' && !css.toString) + ) { + throw new Error(`PostCSS received ${css} instead of CSS string`) + } + + this.css = css.toString() + + if (this.css[0] === '\uFEFF' || this.css[0] === '\uFFFE') { + this.hasBOM = true + this.css = this.css.slice(1) + } else { + this.hasBOM = false + } + + this.document = this.css + if (opts.document) this.document = opts.document.toString() + + if (opts.from) { + if ( + !pathAvailable || + /^\w+:\/\//.test(opts.from) || + isAbsolute(opts.from) + ) { + this.file = opts.from + } else { + this.file = resolve(opts.from) + } + } + + if (pathAvailable && sourceMapAvailable) { + let map = new PreviousMap(this.css, opts) + if (map.text) { + this.map = map + let file = map.consumer().file + if (!this.file && file) this.file = this.mapResolve(file) + } + } + + if (!this.file) { + this.id = '' + } + if (this.map) this.map.file = this.from + } + + error(message, line, column, opts = {}) { + let endColumn, endLine, result + + if (line && typeof line === 'object') { + let start = line + let end = column + if (typeof start.offset === 'number') { + let pos = this.fromOffset(start.offset) + line = pos.line + column = pos.col + } else { + line = start.line + column = start.column + } + if (typeof end.offset === 'number') { + let pos = this.fromOffset(end.offset) + endLine = pos.line + endColumn = pos.col + } else { + endLine = end.line + endColumn = end.column + } + } else if (!column) { + let pos = this.fromOffset(line) + line = pos.line + column = pos.col + } + + let origin = this.origin(line, column, endLine, endColumn) + if (origin) { + result = new CssSyntaxError( + message, + origin.endLine === undefined + ? origin.line + : { column: origin.column, line: origin.line }, + origin.endLine === undefined + ? origin.column + : { column: origin.endColumn, line: origin.endLine }, + origin.source, + origin.file, + opts.plugin + ) + } else { + result = new CssSyntaxError( + message, + endLine === undefined ? line : { column, line }, + endLine === undefined ? column : { column: endColumn, line: endLine }, + this.css, + this.file, + opts.plugin + ) + } + + result.input = { column, endColumn, endLine, line, source: this.css } + if (this.file) { + if (pathToFileURL) { + result.input.url = pathToFileURL(this.file).toString() + } + result.input.file = this.file + } + + return result + } + + fromOffset(offset) { + let lastLine, lineToIndex + if (!this[fromOffsetCache]) { + let lines = this.css.split('\n') + lineToIndex = new Array(lines.length) + let prevIndex = 0 + + for (let i = 0, l = lines.length; i < l; i++) { + lineToIndex[i] = prevIndex + prevIndex += lines[i].length + 1 + } + + this[fromOffsetCache] = lineToIndex + } else { + lineToIndex = this[fromOffsetCache] + } + lastLine = lineToIndex[lineToIndex.length - 1] + + let min = 0 + if (offset >= lastLine) { + min = lineToIndex.length - 1 + } else { + let max = lineToIndex.length - 2 + let mid + while (min < max) { + mid = min + ((max - min) >> 1) + if (offset < lineToIndex[mid]) { + max = mid - 1 + } else if (offset >= lineToIndex[mid + 1]) { + min = mid + 1 + } else { + min = mid + break + } + } + } + return { + col: offset - lineToIndex[min] + 1, + line: min + 1 + } + } + + mapResolve(file) { + if (/^\w+:\/\//.test(file)) { + return file + } + return resolve(this.map.consumer().sourceRoot || this.map.root || '.', file) + } + + origin(line, column, endLine, endColumn) { + if (!this.map) return false + let consumer = this.map.consumer() + + let from = consumer.originalPositionFor({ column, line }) + if (!from.source) return false + + let to + if (typeof endLine === 'number') { + to = consumer.originalPositionFor({ column: endColumn, line: endLine }) + } + + let fromUrl + + if (isAbsolute(from.source)) { + fromUrl = pathToFileURL(from.source) + } else { + fromUrl = new URL( + from.source, + this.map.consumer().sourceRoot || pathToFileURL(this.map.mapFile) + ) + } + + let result = { + column: from.column, + endColumn: to && to.column, + endLine: to && to.line, + line: from.line, + url: fromUrl.toString() + } + + if (fromUrl.protocol === 'file:') { + if (fileURLToPath) { + result.file = fileURLToPath(fromUrl) + } else { + /* c8 ignore next 2 */ + throw new Error(`file: protocol is not available in this PostCSS build`) + } + } + + let source = consumer.sourceContentFor(from.source) + if (source) result.source = source + + return result + } + + toJSON() { + let json = {} + for (let name of ['hasBOM', 'css', 'file', 'id']) { + if (this[name] != null) { + json[name] = this[name] + } + } + if (this.map) { + json.map = { ...this.map } + if (json.map.consumerCache) { + json.map.consumerCache = undefined + } + } + return json + } +} + +module.exports = Input +Input.default = Input + +if (terminalHighlight && terminalHighlight.registerInput) { + terminalHighlight.registerInput(Input) +} diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/lazy-result.d.ts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/lazy-result.d.ts new file mode 100644 index 0000000..2eb7279 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/lazy-result.d.ts @@ -0,0 +1,190 @@ +import Document from './document.js' +import { SourceMap } from './postcss.js' +import Processor from './processor.js' +import Result, { Message, ResultOptions } from './result.js' +import Root from './root.js' +import Warning from './warning.js' + +declare namespace LazyResult { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { LazyResult_ as default } +} + +/** + * A Promise proxy for the result of PostCSS transformations. + * + * A `LazyResult` instance is returned by `Processor#process`. + * + * ```js + * const lazy = postcss([autoprefixer]).process(css) + * ``` + */ +declare class LazyResult_ + implements PromiseLike> +{ + /** + * Processes input CSS through synchronous and asynchronous plugins + * and calls onRejected for each error thrown in any plugin. + * + * It implements standard Promise API. + * + * ```js + * postcss([autoprefixer]).process(css).then(result => { + * console.log(result.css) + * }).catch(error => { + * console.error(error) + * }) + * ``` + */ + catch: Promise>['catch'] + + /** + * Processes input CSS through synchronous and asynchronous plugins + * and calls onFinally on any error or when all plugins will finish work. + * + * It implements standard Promise API. + * + * ```js + * postcss([autoprefixer]).process(css).finally(() => { + * console.log('processing ended') + * }) + * ``` + */ + finally: Promise>['finally'] + + /** + * Processes input CSS through synchronous and asynchronous plugins + * and calls `onFulfilled` with a Result instance. If a plugin throws + * an error, the `onRejected` callback will be executed. + * + * It implements standard Promise API. + * + * ```js + * postcss([autoprefixer]).process(css, { from: cssPath }).then(result => { + * console.log(result.css) + * }) + * ``` + */ + then: Promise>['then'] + + /** + * An alias for the `css` property. Use it with syntaxes + * that generate non-CSS output. + * + * This property will only work with synchronous plugins. + * If the processor contains any asynchronous plugins + * it will throw an error. + * + * PostCSS runners should always use `LazyResult#then`. + */ + get content(): string + + /** + * Processes input CSS through synchronous plugins, converts `Root` + * to a CSS string and returns `Result#css`. + * + * This property will only work with synchronous plugins. + * If the processor contains any asynchronous plugins + * it will throw an error. + * + * PostCSS runners should always use `LazyResult#then`. + */ + get css(): string + + /** + * Processes input CSS through synchronous plugins + * and returns `Result#map`. + * + * This property will only work with synchronous plugins. + * If the processor contains any asynchronous plugins + * it will throw an error. + * + * PostCSS runners should always use `LazyResult#then`. + */ + get map(): SourceMap + + /** + * Processes input CSS through synchronous plugins + * and returns `Result#messages`. + * + * This property will only work with synchronous plugins. If the processor + * contains any asynchronous plugins it will throw an error. + * + * PostCSS runners should always use `LazyResult#then`. + */ + get messages(): Message[] + + /** + * Options from the `Processor#process` call. + */ + get opts(): ResultOptions + + /** + * Returns a `Processor` instance, which will be used + * for CSS transformations. + */ + get processor(): Processor + + /** + * Processes input CSS through synchronous plugins + * and returns `Result#root`. + * + * This property will only work with synchronous plugins. If the processor + * contains any asynchronous plugins it will throw an error. + * + * PostCSS runners should always use `LazyResult#then`. + */ + get root(): RootNode + + /** + * Returns the default string description of an object. + * Required to implement the Promise interface. + */ + get [Symbol.toStringTag](): string + + /** + * @param processor Processor used for this transformation. + * @param css CSS to parse and transform. + * @param opts Options from the `Processor#process` or `Root#toResult`. + */ + constructor(processor: Processor, css: string, opts: ResultOptions) + + /** + * Run plugin in async way and return `Result`. + * + * @return Result with output content. + */ + async(): Promise> + + /** + * Run plugin in sync way and return `Result`. + * + * @return Result with output content. + */ + sync(): Result + + /** + * Alias for the `LazyResult#css` property. + * + * ```js + * lazy + '' === lazy.css + * ``` + * + * @return Output CSS. + */ + toString(): string + + /** + * Processes input CSS through synchronous plugins + * and calls `Result#warnings`. + * + * @return Warnings from plugins. + */ + warnings(): Warning[] +} + +declare class LazyResult< + RootNode = Document | Root +> extends LazyResult_ {} + +export = LazyResult diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/lazy-result.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/lazy-result.js new file mode 100644 index 0000000..1ea52b8 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/lazy-result.js @@ -0,0 +1,550 @@ +'use strict' + +let Container = require('./container') +let Document = require('./document') +let MapGenerator = require('./map-generator') +let parse = require('./parse') +let Result = require('./result') +let Root = require('./root') +let stringify = require('./stringify') +let { isClean, my } = require('./symbols') +let warnOnce = require('./warn-once') + +const TYPE_TO_CLASS_NAME = { + atrule: 'AtRule', + comment: 'Comment', + decl: 'Declaration', + document: 'Document', + root: 'Root', + rule: 'Rule' +} + +const PLUGIN_PROPS = { + AtRule: true, + AtRuleExit: true, + Comment: true, + CommentExit: true, + Declaration: true, + DeclarationExit: true, + Document: true, + DocumentExit: true, + Once: true, + OnceExit: true, + postcssPlugin: true, + prepare: true, + Root: true, + RootExit: true, + Rule: true, + RuleExit: true +} + +const NOT_VISITORS = { + Once: true, + postcssPlugin: true, + prepare: true +} + +const CHILDREN = 0 + +function isPromise(obj) { + return typeof obj === 'object' && typeof obj.then === 'function' +} + +function getEvents(node) { + let key = false + let type = TYPE_TO_CLASS_NAME[node.type] + if (node.type === 'decl') { + key = node.prop.toLowerCase() + } else if (node.type === 'atrule') { + key = node.name.toLowerCase() + } + + if (key && node.append) { + return [ + type, + type + '-' + key, + CHILDREN, + type + 'Exit', + type + 'Exit-' + key + ] + } else if (key) { + return [type, type + '-' + key, type + 'Exit', type + 'Exit-' + key] + } else if (node.append) { + return [type, CHILDREN, type + 'Exit'] + } else { + return [type, type + 'Exit'] + } +} + +function toStack(node) { + let events + if (node.type === 'document') { + events = ['Document', CHILDREN, 'DocumentExit'] + } else if (node.type === 'root') { + events = ['Root', CHILDREN, 'RootExit'] + } else { + events = getEvents(node) + } + + return { + eventIndex: 0, + events, + iterator: 0, + node, + visitorIndex: 0, + visitors: [] + } +} + +function cleanMarks(node) { + node[isClean] = false + if (node.nodes) node.nodes.forEach(i => cleanMarks(i)) + return node +} + +let postcss = {} + +class LazyResult { + get content() { + return this.stringify().content + } + + get css() { + return this.stringify().css + } + + get map() { + return this.stringify().map + } + + get messages() { + return this.sync().messages + } + + get opts() { + return this.result.opts + } + + get processor() { + return this.result.processor + } + + get root() { + return this.sync().root + } + + get [Symbol.toStringTag]() { + return 'LazyResult' + } + + constructor(processor, css, opts) { + this.stringified = false + this.processed = false + + let root + if ( + typeof css === 'object' && + css !== null && + (css.type === 'root' || css.type === 'document') + ) { + root = cleanMarks(css) + } else if (css instanceof LazyResult || css instanceof Result) { + root = cleanMarks(css.root) + if (css.map) { + if (typeof opts.map === 'undefined') opts.map = {} + if (!opts.map.inline) opts.map.inline = false + opts.map.prev = css.map + } + } else { + let parser = parse + if (opts.syntax) parser = opts.syntax.parse + if (opts.parser) parser = opts.parser + if (parser.parse) parser = parser.parse + + try { + root = parser(css, opts) + } catch (error) { + this.processed = true + this.error = error + } + + if (root && !root[my]) { + /* c8 ignore next 2 */ + Container.rebuild(root) + } + } + + this.result = new Result(processor, root, opts) + this.helpers = { ...postcss, postcss, result: this.result } + this.plugins = this.processor.plugins.map(plugin => { + if (typeof plugin === 'object' && plugin.prepare) { + return { ...plugin, ...plugin.prepare(this.result) } + } else { + return plugin + } + }) + } + + async() { + if (this.error) return Promise.reject(this.error) + if (this.processed) return Promise.resolve(this.result) + if (!this.processing) { + this.processing = this.runAsync() + } + return this.processing + } + + catch(onRejected) { + return this.async().catch(onRejected) + } + + finally(onFinally) { + return this.async().then(onFinally, onFinally) + } + + getAsyncError() { + throw new Error('Use process(css).then(cb) to work with async plugins') + } + + handleError(error, node) { + let plugin = this.result.lastPlugin + try { + if (node) node.addToError(error) + this.error = error + if (error.name === 'CssSyntaxError' && !error.plugin) { + error.plugin = plugin.postcssPlugin + error.setMessage() + } else if (plugin.postcssVersion) { + if (process.env.NODE_ENV !== 'production') { + let pluginName = plugin.postcssPlugin + let pluginVer = plugin.postcssVersion + let runtimeVer = this.result.processor.version + let a = pluginVer.split('.') + let b = runtimeVer.split('.') + + if (a[0] !== b[0] || parseInt(a[1]) > parseInt(b[1])) { + // eslint-disable-next-line no-console + console.error( + 'Unknown error from PostCSS plugin. Your current PostCSS ' + + 'version is ' + + runtimeVer + + ', but ' + + pluginName + + ' uses ' + + pluginVer + + '. Perhaps this is the source of the error below.' + ) + } + } + } + } catch (err) { + /* c8 ignore next 3 */ + // eslint-disable-next-line no-console + if (console && console.error) console.error(err) + } + return error + } + + prepareVisitors() { + this.listeners = {} + let add = (plugin, type, cb) => { + if (!this.listeners[type]) this.listeners[type] = [] + this.listeners[type].push([plugin, cb]) + } + for (let plugin of this.plugins) { + if (typeof plugin === 'object') { + for (let event in plugin) { + if (!PLUGIN_PROPS[event] && /^[A-Z]/.test(event)) { + throw new Error( + `Unknown event ${event} in ${plugin.postcssPlugin}. ` + + `Try to update PostCSS (${this.processor.version} now).` + ) + } + if (!NOT_VISITORS[event]) { + if (typeof plugin[event] === 'object') { + for (let filter in plugin[event]) { + if (filter === '*') { + add(plugin, event, plugin[event][filter]) + } else { + add( + plugin, + event + '-' + filter.toLowerCase(), + plugin[event][filter] + ) + } + } + } else if (typeof plugin[event] === 'function') { + add(plugin, event, plugin[event]) + } + } + } + } + } + this.hasListener = Object.keys(this.listeners).length > 0 + } + + async runAsync() { + this.plugin = 0 + for (let i = 0; i < this.plugins.length; i++) { + let plugin = this.plugins[i] + let promise = this.runOnRoot(plugin) + if (isPromise(promise)) { + try { + await promise + } catch (error) { + throw this.handleError(error) + } + } + } + + this.prepareVisitors() + if (this.hasListener) { + let root = this.result.root + while (!root[isClean]) { + root[isClean] = true + let stack = [toStack(root)] + while (stack.length > 0) { + let promise = this.visitTick(stack) + if (isPromise(promise)) { + try { + await promise + } catch (e) { + let node = stack[stack.length - 1].node + throw this.handleError(e, node) + } + } + } + } + + if (this.listeners.OnceExit) { + for (let [plugin, visitor] of this.listeners.OnceExit) { + this.result.lastPlugin = plugin + try { + if (root.type === 'document') { + let roots = root.nodes.map(subRoot => + visitor(subRoot, this.helpers) + ) + + await Promise.all(roots) + } else { + await visitor(root, this.helpers) + } + } catch (e) { + throw this.handleError(e) + } + } + } + } + + this.processed = true + return this.stringify() + } + + runOnRoot(plugin) { + this.result.lastPlugin = plugin + try { + if (typeof plugin === 'object' && plugin.Once) { + if (this.result.root.type === 'document') { + let roots = this.result.root.nodes.map(root => + plugin.Once(root, this.helpers) + ) + + if (isPromise(roots[0])) { + return Promise.all(roots) + } + + return roots + } + + return plugin.Once(this.result.root, this.helpers) + } else if (typeof plugin === 'function') { + return plugin(this.result.root, this.result) + } + } catch (error) { + throw this.handleError(error) + } + } + + stringify() { + if (this.error) throw this.error + if (this.stringified) return this.result + this.stringified = true + + this.sync() + + let opts = this.result.opts + let str = stringify + if (opts.syntax) str = opts.syntax.stringify + if (opts.stringifier) str = opts.stringifier + if (str.stringify) str = str.stringify + + let map = new MapGenerator(str, this.result.root, this.result.opts) + let data = map.generate() + this.result.css = data[0] + this.result.map = data[1] + + return this.result + } + + sync() { + if (this.error) throw this.error + if (this.processed) return this.result + this.processed = true + + if (this.processing) { + throw this.getAsyncError() + } + + for (let plugin of this.plugins) { + let promise = this.runOnRoot(plugin) + if (isPromise(promise)) { + throw this.getAsyncError() + } + } + + this.prepareVisitors() + if (this.hasListener) { + let root = this.result.root + while (!root[isClean]) { + root[isClean] = true + this.walkSync(root) + } + if (this.listeners.OnceExit) { + if (root.type === 'document') { + for (let subRoot of root.nodes) { + this.visitSync(this.listeners.OnceExit, subRoot) + } + } else { + this.visitSync(this.listeners.OnceExit, root) + } + } + } + + return this.result + } + + then(onFulfilled, onRejected) { + if (process.env.NODE_ENV !== 'production') { + if (!('from' in this.opts)) { + warnOnce( + 'Without `from` option PostCSS could generate wrong source map ' + + 'and will not find Browserslist config. Set it to CSS file path ' + + 'or to `undefined` to prevent this warning.' + ) + } + } + return this.async().then(onFulfilled, onRejected) + } + + toString() { + return this.css + } + + visitSync(visitors, node) { + for (let [plugin, visitor] of visitors) { + this.result.lastPlugin = plugin + let promise + try { + promise = visitor(node, this.helpers) + } catch (e) { + throw this.handleError(e, node.proxyOf) + } + if (node.type !== 'root' && node.type !== 'document' && !node.parent) { + return true + } + if (isPromise(promise)) { + throw this.getAsyncError() + } + } + } + + visitTick(stack) { + let visit = stack[stack.length - 1] + let { node, visitors } = visit + + if (node.type !== 'root' && node.type !== 'document' && !node.parent) { + stack.pop() + return + } + + if (visitors.length > 0 && visit.visitorIndex < visitors.length) { + let [plugin, visitor] = visitors[visit.visitorIndex] + visit.visitorIndex += 1 + if (visit.visitorIndex === visitors.length) { + visit.visitors = [] + visit.visitorIndex = 0 + } + this.result.lastPlugin = plugin + try { + return visitor(node.toProxy(), this.helpers) + } catch (e) { + throw this.handleError(e, node) + } + } + + if (visit.iterator !== 0) { + let iterator = visit.iterator + let child + while ((child = node.nodes[node.indexes[iterator]])) { + node.indexes[iterator] += 1 + if (!child[isClean]) { + child[isClean] = true + stack.push(toStack(child)) + return + } + } + visit.iterator = 0 + delete node.indexes[iterator] + } + + let events = visit.events + while (visit.eventIndex < events.length) { + let event = events[visit.eventIndex] + visit.eventIndex += 1 + if (event === CHILDREN) { + if (node.nodes && node.nodes.length) { + node[isClean] = true + visit.iterator = node.getIterator() + } + return + } else if (this.listeners[event]) { + visit.visitors = this.listeners[event] + return + } + } + stack.pop() + } + + walkSync(node) { + node[isClean] = true + let events = getEvents(node) + for (let event of events) { + if (event === CHILDREN) { + if (node.nodes) { + node.each(child => { + if (!child[isClean]) this.walkSync(child) + }) + } + } else { + let visitors = this.listeners[event] + if (visitors) { + if (this.visitSync(visitors, node.toProxy())) return + } + } + } + } + + warnings() { + return this.sync().warnings() + } +} + +LazyResult.registerPostcss = dependant => { + postcss = dependant +} + +module.exports = LazyResult +LazyResult.default = LazyResult + +Root.registerLazyResult(LazyResult) +Document.registerLazyResult(LazyResult) diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/list.d.ts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/list.d.ts new file mode 100644 index 0000000..e262ad3 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/list.d.ts @@ -0,0 +1,60 @@ +declare namespace list { + type List = { + /** + * Safely splits comma-separated values (such as those for `transition-*` + * and `background` properties). + * + * ```js + * Once (root, { list }) { + * list.comma('black, linear-gradient(white, black)') + * //=> ['black', 'linear-gradient(white, black)'] + * } + * ``` + * + * @param str Comma-separated values. + * @return Split values. + */ + comma(str: string): string[] + + default: List + + /** + * Safely splits space-separated values (such as those for `background`, + * `border-radius`, and other shorthand properties). + * + * ```js + * Once (root, { list }) { + * list.space('1px calc(10% + 1px)') //=> ['1px', 'calc(10% + 1px)'] + * } + * ``` + * + * @param str Space-separated values. + * @return Split values. + */ + space(str: string): string[] + + /** + * Safely splits values. + * + * ```js + * Once (root, { list }) { + * list.split('1px calc(10% + 1px)', [' ', '\n', '\t']) //=> ['1px', 'calc(10% + 1px)'] + * } + * ``` + * + * @param string separated values. + * @param separators array of separators. + * @param last boolean indicator. + * @return Split values. + */ + split( + string: string, + separators: readonly string[], + last: boolean + ): string[] + } +} + +declare const list: list.List + +export = list diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/list.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/list.js new file mode 100644 index 0000000..1b31f98 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/list.js @@ -0,0 +1,58 @@ +'use strict' + +let list = { + comma(string) { + return list.split(string, [','], true) + }, + + space(string) { + let spaces = [' ', '\n', '\t'] + return list.split(string, spaces) + }, + + split(string, separators, last) { + let array = [] + let current = '' + let split = false + + let func = 0 + let inQuote = false + let prevQuote = '' + let escape = false + + for (let letter of string) { + if (escape) { + escape = false + } else if (letter === '\\') { + escape = true + } else if (inQuote) { + if (letter === prevQuote) { + inQuote = false + } + } else if (letter === '"' || letter === "'") { + inQuote = true + prevQuote = letter + } else if (letter === '(') { + func += 1 + } else if (letter === ')') { + if (func > 0) func -= 1 + } else if (func === 0) { + if (separators.includes(letter)) split = true + } + + if (split) { + if (current !== '') array.push(current.trim()) + current = '' + split = false + } else { + current += letter + } + } + + if (last || current !== '') array.push(current.trim()) + return array + } +} + +module.exports = list +list.default = list diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/map-generator.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/map-generator.js new file mode 100644 index 0000000..89069d3 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/map-generator.js @@ -0,0 +1,368 @@ +'use strict' + +let { dirname, relative, resolve, sep } = require('path') +let { SourceMapConsumer, SourceMapGenerator } = require('source-map-js') +let { pathToFileURL } = require('url') + +let Input = require('./input') + +let sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator) +let pathAvailable = Boolean(dirname && resolve && relative && sep) + +class MapGenerator { + constructor(stringify, root, opts, cssString) { + this.stringify = stringify + this.mapOpts = opts.map || {} + this.root = root + this.opts = opts + this.css = cssString + this.originalCSS = cssString + this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute + + this.memoizedFileURLs = new Map() + this.memoizedPaths = new Map() + this.memoizedURLs = new Map() + } + + addAnnotation() { + let content + + if (this.isInline()) { + content = + 'data:application/json;base64,' + this.toBase64(this.map.toString()) + } else if (typeof this.mapOpts.annotation === 'string') { + content = this.mapOpts.annotation + } else if (typeof this.mapOpts.annotation === 'function') { + content = this.mapOpts.annotation(this.opts.to, this.root) + } else { + content = this.outputFile() + '.map' + } + let eol = '\n' + if (this.css.includes('\r\n')) eol = '\r\n' + + this.css += eol + '/*# sourceMappingURL=' + content + ' */' + } + + applyPrevMaps() { + for (let prev of this.previous()) { + let from = this.toUrl(this.path(prev.file)) + let root = prev.root || dirname(prev.file) + let map + + if (this.mapOpts.sourcesContent === false) { + map = new SourceMapConsumer(prev.text) + if (map.sourcesContent) { + map.sourcesContent = null + } + } else { + map = prev.consumer() + } + + this.map.applySourceMap(map, from, this.toUrl(this.path(root))) + } + } + + clearAnnotation() { + if (this.mapOpts.annotation === false) return + + if (this.root) { + let node + for (let i = this.root.nodes.length - 1; i >= 0; i--) { + node = this.root.nodes[i] + if (node.type !== 'comment') continue + if (node.text.startsWith('# sourceMappingURL=')) { + this.root.removeChild(i) + } + } + } else if (this.css) { + this.css = this.css.replace(/\n*\/\*#[\S\s]*?\*\/$/gm, '') + } + } + + generate() { + this.clearAnnotation() + if (pathAvailable && sourceMapAvailable && this.isMap()) { + return this.generateMap() + } else { + let result = '' + this.stringify(this.root, i => { + result += i + }) + return [result] + } + } + + generateMap() { + if (this.root) { + this.generateString() + } else if (this.previous().length === 1) { + let prev = this.previous()[0].consumer() + prev.file = this.outputFile() + this.map = SourceMapGenerator.fromSourceMap(prev, { + ignoreInvalidMapping: true + }) + } else { + this.map = new SourceMapGenerator({ + file: this.outputFile(), + ignoreInvalidMapping: true + }) + this.map.addMapping({ + generated: { column: 0, line: 1 }, + original: { column: 0, line: 1 }, + source: this.opts.from + ? this.toUrl(this.path(this.opts.from)) + : '' + }) + } + + if (this.isSourcesContent()) this.setSourcesContent() + if (this.root && this.previous().length > 0) this.applyPrevMaps() + if (this.isAnnotation()) this.addAnnotation() + + if (this.isInline()) { + return [this.css] + } else { + return [this.css, this.map] + } + } + + generateString() { + this.css = '' + this.map = new SourceMapGenerator({ + file: this.outputFile(), + ignoreInvalidMapping: true + }) + + let line = 1 + let column = 1 + + let noSource = '' + let mapping = { + generated: { column: 0, line: 0 }, + original: { column: 0, line: 0 }, + source: '' + } + + let last, lines + this.stringify(this.root, (str, node, type) => { + this.css += str + + if (node && type !== 'end') { + mapping.generated.line = line + mapping.generated.column = column - 1 + if (node.source && node.source.start) { + mapping.source = this.sourcePath(node) + mapping.original.line = node.source.start.line + mapping.original.column = node.source.start.column - 1 + this.map.addMapping(mapping) + } else { + mapping.source = noSource + mapping.original.line = 1 + mapping.original.column = 0 + this.map.addMapping(mapping) + } + } + + lines = str.match(/\n/g) + if (lines) { + line += lines.length + last = str.lastIndexOf('\n') + column = str.length - last + } else { + column += str.length + } + + if (node && type !== 'start') { + let p = node.parent || { raws: {} } + let childless = + node.type === 'decl' || (node.type === 'atrule' && !node.nodes) + if (!childless || node !== p.last || p.raws.semicolon) { + if (node.source && node.source.end) { + mapping.source = this.sourcePath(node) + mapping.original.line = node.source.end.line + mapping.original.column = node.source.end.column - 1 + mapping.generated.line = line + mapping.generated.column = column - 2 + this.map.addMapping(mapping) + } else { + mapping.source = noSource + mapping.original.line = 1 + mapping.original.column = 0 + mapping.generated.line = line + mapping.generated.column = column - 1 + this.map.addMapping(mapping) + } + } + } + }) + } + + isAnnotation() { + if (this.isInline()) { + return true + } + if (typeof this.mapOpts.annotation !== 'undefined') { + return this.mapOpts.annotation + } + if (this.previous().length) { + return this.previous().some(i => i.annotation) + } + return true + } + + isInline() { + if (typeof this.mapOpts.inline !== 'undefined') { + return this.mapOpts.inline + } + + let annotation = this.mapOpts.annotation + if (typeof annotation !== 'undefined' && annotation !== true) { + return false + } + + if (this.previous().length) { + return this.previous().some(i => i.inline) + } + return true + } + + isMap() { + if (typeof this.opts.map !== 'undefined') { + return !!this.opts.map + } + return this.previous().length > 0 + } + + isSourcesContent() { + if (typeof this.mapOpts.sourcesContent !== 'undefined') { + return this.mapOpts.sourcesContent + } + if (this.previous().length) { + return this.previous().some(i => i.withContent()) + } + return true + } + + outputFile() { + if (this.opts.to) { + return this.path(this.opts.to) + } else if (this.opts.from) { + return this.path(this.opts.from) + } else { + return 'to.css' + } + } + + path(file) { + if (this.mapOpts.absolute) return file + if (file.charCodeAt(0) === 60 /* `<` */) return file + if (/^\w+:\/\//.test(file)) return file + let cached = this.memoizedPaths.get(file) + if (cached) return cached + + let from = this.opts.to ? dirname(this.opts.to) : '.' + + if (typeof this.mapOpts.annotation === 'string') { + from = dirname(resolve(from, this.mapOpts.annotation)) + } + + let path = relative(from, file) + this.memoizedPaths.set(file, path) + + return path + } + + previous() { + if (!this.previousMaps) { + this.previousMaps = [] + if (this.root) { + this.root.walk(node => { + if (node.source && node.source.input.map) { + let map = node.source.input.map + if (!this.previousMaps.includes(map)) { + this.previousMaps.push(map) + } + } + }) + } else { + let input = new Input(this.originalCSS, this.opts) + if (input.map) this.previousMaps.push(input.map) + } + } + + return this.previousMaps + } + + setSourcesContent() { + let already = {} + if (this.root) { + this.root.walk(node => { + if (node.source) { + let from = node.source.input.from + if (from && !already[from]) { + already[from] = true + let fromUrl = this.usesFileUrls + ? this.toFileUrl(from) + : this.toUrl(this.path(from)) + this.map.setSourceContent(fromUrl, node.source.input.css) + } + } + }) + } else if (this.css) { + let from = this.opts.from + ? this.toUrl(this.path(this.opts.from)) + : '' + this.map.setSourceContent(from, this.css) + } + } + + sourcePath(node) { + if (this.mapOpts.from) { + return this.toUrl(this.mapOpts.from) + } else if (this.usesFileUrls) { + return this.toFileUrl(node.source.input.from) + } else { + return this.toUrl(this.path(node.source.input.from)) + } + } + + toBase64(str) { + if (Buffer) { + return Buffer.from(str).toString('base64') + } else { + return window.btoa(unescape(encodeURIComponent(str))) + } + } + + toFileUrl(path) { + let cached = this.memoizedFileURLs.get(path) + if (cached) return cached + + if (pathToFileURL) { + let fileURL = pathToFileURL(path).toString() + this.memoizedFileURLs.set(path, fileURL) + + return fileURL + } else { + throw new Error( + '`map.absolute` option is not available in this PostCSS build' + ) + } + } + + toUrl(path) { + let cached = this.memoizedURLs.get(path) + if (cached) return cached + + if (sep === '\\') { + path = path.replace(/\\/g, '/') + } + + let url = encodeURI(path).replace(/[#?]/g, encodeURIComponent) + this.memoizedURLs.set(path, url) + + return url + } +} + +module.exports = MapGenerator diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/no-work-result.d.ts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/no-work-result.d.ts new file mode 100644 index 0000000..094f30a --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/no-work-result.d.ts @@ -0,0 +1,46 @@ +import LazyResult from './lazy-result.js' +import { SourceMap } from './postcss.js' +import Processor from './processor.js' +import Result, { Message, ResultOptions } from './result.js' +import Root from './root.js' +import Warning from './warning.js' + +declare namespace NoWorkResult { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { NoWorkResult_ as default } +} + +/** + * A Promise proxy for the result of PostCSS transformations. + * This lazy result instance doesn't parse css unless `NoWorkResult#root` or `Result#root` + * are accessed. See the example below for details. + * A `NoWork` instance is returned by `Processor#process` ONLY when no plugins defined. + * + * ```js + * const noWorkResult = postcss().process(css) // No plugins are defined. + * // CSS is not parsed + * let root = noWorkResult.root // now css is parsed because we accessed the root + * ``` + */ +declare class NoWorkResult_ implements LazyResult { + catch: Promise>['catch'] + finally: Promise>['finally'] + then: Promise>['then'] + get content(): string + get css(): string + get map(): SourceMap + get messages(): Message[] + get opts(): ResultOptions + get processor(): Processor + get root(): Root + get [Symbol.toStringTag](): string + constructor(processor: Processor, css: string, opts: ResultOptions) + async(): Promise> + sync(): Result + toString(): string + warnings(): Warning[] +} + +declare class NoWorkResult extends NoWorkResult_ {} + +export = NoWorkResult diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/no-work-result.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/no-work-result.js new file mode 100644 index 0000000..dd46182 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/no-work-result.js @@ -0,0 +1,138 @@ +'use strict' + +let MapGenerator = require('./map-generator') +let parse = require('./parse') +const Result = require('./result') +let stringify = require('./stringify') +let warnOnce = require('./warn-once') + +class NoWorkResult { + get content() { + return this.result.css + } + + get css() { + return this.result.css + } + + get map() { + return this.result.map + } + + get messages() { + return [] + } + + get opts() { + return this.result.opts + } + + get processor() { + return this.result.processor + } + + get root() { + if (this._root) { + return this._root + } + + let root + let parser = parse + + try { + root = parser(this._css, this._opts) + } catch (error) { + this.error = error + } + + if (this.error) { + throw this.error + } else { + this._root = root + return root + } + } + + get [Symbol.toStringTag]() { + return 'NoWorkResult' + } + + constructor(processor, css, opts) { + css = css.toString() + this.stringified = false + + this._processor = processor + this._css = css + this._opts = opts + this._map = undefined + let root + + let str = stringify + this.result = new Result(this._processor, root, this._opts) + this.result.css = css + + let self = this + Object.defineProperty(this.result, 'root', { + get() { + return self.root + } + }) + + let map = new MapGenerator(str, root, this._opts, css) + if (map.isMap()) { + let [generatedCSS, generatedMap] = map.generate() + if (generatedCSS) { + this.result.css = generatedCSS + } + if (generatedMap) { + this.result.map = generatedMap + } + } else { + map.clearAnnotation() + this.result.css = map.css + } + } + + async() { + if (this.error) return Promise.reject(this.error) + return Promise.resolve(this.result) + } + + catch(onRejected) { + return this.async().catch(onRejected) + } + + finally(onFinally) { + return this.async().then(onFinally, onFinally) + } + + sync() { + if (this.error) throw this.error + return this.result + } + + then(onFulfilled, onRejected) { + if (process.env.NODE_ENV !== 'production') { + if (!('from' in this._opts)) { + warnOnce( + 'Without `from` option PostCSS could generate wrong source map ' + + 'and will not find Browserslist config. Set it to CSS file path ' + + 'or to `undefined` to prevent this warning.' + ) + } + } + + return this.async().then(onFulfilled, onRejected) + } + + toString() { + return this._css + } + + warnings() { + return [] + } +} + +module.exports = NoWorkResult +NoWorkResult.default = NoWorkResult diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/node.d.ts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/node.d.ts new file mode 100644 index 0000000..aa7229f --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/node.d.ts @@ -0,0 +1,541 @@ +import AtRule = require('./at-rule.js') + +import { AtRuleProps } from './at-rule.js' +import Comment, { CommentProps } from './comment.js' +import Container, { NewChild } from './container.js' +import CssSyntaxError from './css-syntax-error.js' +import Declaration, { DeclarationProps } from './declaration.js' +import Document from './document.js' +import Input from './input.js' +import { Stringifier, Syntax } from './postcss.js' +import Result from './result.js' +import Root from './root.js' +import Rule, { RuleProps } from './rule.js' +import Warning, { WarningOptions } from './warning.js' + +declare namespace Node { + export type ChildNode = AtRule.default | Comment | Declaration | Rule + + export type AnyNode = + | AtRule.default + | Comment + | Declaration + | Document + | Root + | Rule + + export type ChildProps = + | AtRuleProps + | CommentProps + | DeclarationProps + | RuleProps + + export interface Position { + /** + * Source line in file. In contrast to `offset` it starts from 1. + */ + column: number + + /** + * Source column in file. + */ + line: number + + /** + * Source offset in file. It starts from 0. + */ + offset: number + } + + export interface Range { + /** + * End position, exclusive. + */ + end: Position + + /** + * Start position, inclusive. + */ + start: Position + } + + /** + * Source represents an interface for the {@link Node.source} property. + */ + export interface Source { + /** + * The inclusive ending position for the source + * code of a node. + */ + end?: Position + + /** + * The source file from where a node has originated. + */ + input: Input + + /** + * The inclusive starting position for the source + * code of a node. + */ + start?: Position + } + + /** + * Interface represents an interface for an object received + * as parameter by Node class constructor. + */ + export interface NodeProps { + source?: Source + } + + export interface NodeErrorOptions { + /** + * An ending index inside a node's string that should be highlighted as + * source of error. + */ + endIndex?: number + /** + * An index inside a node's string that should be highlighted as source + * of error. + */ + index?: number + /** + * Plugin name that created this error. PostCSS will set it automatically. + */ + plugin?: string + /** + * A word inside a node's string, that should be highlighted as source + * of error. + */ + word?: string + } + + // eslint-disable-next-line @typescript-eslint/no-shadow + class Node extends Node_ {} + export { Node as default } +} + +/** + * It represents an abstract class that handles common + * methods for other CSS abstract syntax tree nodes. + * + * Any node that represents CSS selector or value should + * not extend the `Node` class. + */ +declare abstract class Node_ { + /** + * It represents parent of the current node. + * + * ```js + * root.nodes[0].parent === root //=> true + * ``` + */ + parent: Container | Document | undefined + + /** + * It represents unnecessary whitespace and characters present + * in the css source code. + * + * Information to generate byte-to-byte equal node string as it was + * in the origin input. + * + * The properties of the raws object are decided by parser, + * the default parser uses the following properties: + * + * * `before`: the space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + * * `after`: the space symbols after the last child of the node + * to the end of the node. + * * `between`: the symbols between the property and value + * for declarations, selector and `{` for rules, or last parameter + * and `{` for at-rules. + * * `semicolon`: contains true if the last child has + * an (optional) semicolon. + * * `afterName`: the space between the at-rule name and its parameters. + * * `left`: the space symbols between `/*` and the comment’s text. + * * `right`: the space symbols between the comment’s text + * and */. + * - `important`: the content of the important statement, + * if it is not just `!important`. + * + * PostCSS filters out the comments inside selectors, declaration values + * and at-rule parameters but it stores the origin content in raws. + * + * ```js + * const root = postcss.parse('a {\n color:black\n}') + * root.first.first.raws //=> { before: '\n ', between: ':' } + * ``` + */ + raws: any + + /** + * It represents information related to origin of a node and is required + * for generating source maps. + * + * The nodes that are created manually using the public APIs + * provided by PostCSS will have `source` undefined and + * will be absent in the source map. + * + * For this reason, the plugin developer should consider + * duplicating nodes as the duplicate node will have the + * same source as the original node by default or assign + * source to a node created manually. + * + * ```js + * decl.source.input.from //=> '/home/ai/source.css' + * decl.source.start //=> { line: 10, column: 2 } + * decl.source.end //=> { line: 10, column: 12 } + * ``` + * + * ```js + * // Incorrect method, source not specified! + * const prefixed = postcss.decl({ + * prop: '-moz-' + decl.prop, + * value: decl.value + * }) + * + * // Correct method, source is inherited when duplicating. + * const prefixed = decl.clone({ + * prop: '-moz-' + decl.prop + * }) + * ``` + * + * ```js + * if (atrule.name === 'add-link') { + * const rule = postcss.rule({ + * selector: 'a', + * source: atrule.source + * }) + * + * atrule.parent.insertBefore(atrule, rule) + * } + * ``` + */ + source?: Node.Source + + /** + * It represents type of a node in + * an abstract syntax tree. + * + * A type of node helps in identification of a node + * and perform operation based on it's type. + * + * ```js + * const declaration = new Declaration({ + * prop: 'color', + * value: 'black' + * }) + * + * declaration.type //=> 'decl' + * ``` + */ + type: string + + constructor(defaults?: object) + + /** + * Insert new node after current node to current node’s parent. + * + * Just alias for `node.parent.insertAfter(node, add)`. + * + * ```js + * decl.after('color: black') + * ``` + * + * @param newNode New node. + * @return This node for methods chain. + */ + after( + newNode: Node | Node.ChildProps | readonly Node[] | string | undefined + ): this + + /** + * It assigns properties to an existing node instance. + * + * ```js + * decl.assign({ prop: 'word-wrap', value: 'break-word' }) + * ``` + * + * @param overrides New properties to override the node. + * + * @return `this` for method chaining. + */ + assign(overrides: object): this + + /** + * Insert new node before current node to current node’s parent. + * + * Just alias for `node.parent.insertBefore(node, add)`. + * + * ```js + * decl.before('content: ""') + * ``` + * + * @param newNode New node. + * @return This node for methods chain. + */ + before( + newNode: Node | Node.ChildProps | readonly Node[] | string | undefined + ): this + + /** + * Clear the code style properties for the node and its children. + * + * ```js + * node.raws.before //=> ' ' + * node.cleanRaws() + * node.raws.before //=> undefined + * ``` + * + * @param keepBetween Keep the `raws.between` symbols. + */ + cleanRaws(keepBetween?: boolean): void + + /** + * It creates clone of an existing node, which includes all the properties + * and their values, that includes `raws` but not `type`. + * + * ```js + * decl.raws.before //=> "\n " + * const cloned = decl.clone({ prop: '-moz-' + decl.prop }) + * cloned.raws.before //=> "\n " + * cloned.toString() //=> -moz-transform: scale(0) + * ``` + * + * @param overrides New properties to override in the clone. + * + * @return Duplicate of the node instance. + */ + clone(overrides?: object): this + + /** + * Shortcut to clone the node and insert the resulting cloned node + * after the current node. + * + * @param overrides New properties to override in the clone. + * @return New node. + */ + cloneAfter(overrides?: object): this + + /** + * Shortcut to clone the node and insert the resulting cloned node + * before the current node. + * + * ```js + * decl.cloneBefore({ prop: '-moz-' + decl.prop }) + * ``` + * + * @param overrides Mew properties to override in the clone. + * + * @return New node + */ + cloneBefore(overrides?: object): this + + /** + * It creates an instance of the class `CssSyntaxError` and parameters passed + * to this method are assigned to the error instance. + * + * The error instance will have description for the + * error, original position of the node in the + * source, showing line and column number. + * + * If any previous map is present, it would be used + * to get original position of the source. + * + * The Previous Map here is referred to the source map + * generated by previous compilation, example: Less, + * Stylus and Sass. + * + * This method returns the error instance instead of + * throwing it. + * + * ```js + * if (!variables[name]) { + * throw decl.error(`Unknown variable ${name}`, { word: name }) + * // CssSyntaxError: postcss-vars:a.sass:4:3: Unknown variable $black + * // color: $black + * // a + * // ^ + * // background: white + * } + * ``` + * + * @param message Description for the error instance. + * @param options Options for the error instance. + * + * @return Error instance is returned. + */ + error(message: string, options?: Node.NodeErrorOptions): CssSyntaxError + + /** + * Returns the next child of the node’s parent. + * Returns `undefined` if the current node is the last child. + * + * ```js + * if (comment.text === 'delete next') { + * const next = comment.next() + * if (next) { + * next.remove() + * } + * } + * ``` + * + * @return Next node. + */ + next(): Node.ChildNode | undefined + + /** + * Get the position for a word or an index inside the node. + * + * @param opts Options. + * @return Position. + */ + positionBy(opts?: Pick): Node.Position + + /** + * Convert string index to line/column. + * + * @param index The symbol number in the node’s string. + * @return Symbol position in file. + */ + positionInside(index: number): Node.Position + + /** + * Returns the previous child of the node’s parent. + * Returns `undefined` if the current node is the first child. + * + * ```js + * const annotation = decl.prev() + * if (annotation.type === 'comment') { + * readAnnotation(annotation.text) + * } + * ``` + * + * @return Previous node. + */ + prev(): Node.ChildNode | undefined + + /** + * Get the range for a word or start and end index inside the node. + * The start index is inclusive; the end index is exclusive. + * + * @param opts Options. + * @return Range. + */ + rangeBy( + opts?: Pick + ): Node.Range + + /** + * Returns a `raws` value. If the node is missing + * the code style property (because the node was manually built or cloned), + * PostCSS will try to autodetect the code style property by looking + * at other nodes in the tree. + * + * ```js + * const root = postcss.parse('a { background: white }') + * root.nodes[0].append({ prop: 'color', value: 'black' }) + * root.nodes[0].nodes[1].raws.before //=> undefined + * root.nodes[0].nodes[1].raw('before') //=> ' ' + * ``` + * + * @param prop Name of code style property. + * @param defaultType Name of default value, it can be missed + * if the value is the same as prop. + * @return {string} Code style value. + */ + raw(prop: string, defaultType?: string): string + + /** + * It removes the node from its parent and deletes its parent property. + * + * ```js + * if (decl.prop.match(/^-webkit-/)) { + * decl.remove() + * } + * ``` + * + * @return `this` for method chaining. + */ + remove(): this + + /** + * Inserts node(s) before the current node and removes the current node. + * + * ```js + * AtRule: { + * mixin: atrule => { + * atrule.replaceWith(mixinRules[atrule.params]) + * } + * } + * ``` + * + * @param nodes Mode(s) to replace current one. + * @return Current node to methods chain. + */ + replaceWith(...nodes: NewChild[]): this + + /** + * Finds the Root instance of the node’s tree. + * + * ```js + * root.nodes[0].nodes[0].root() === root + * ``` + * + * @return Root parent. + */ + root(): Root + + /** + * Fix circular links on `JSON.stringify()`. + * + * @return Cleaned object. + */ + toJSON(): object + + /** + * It compiles the node to browser readable cascading style sheets string + * depending on it's type. + * + * ```js + * new Rule({ selector: 'a' }).toString() //=> "a {}" + * ``` + * + * @param stringifier A syntax to use in string generation. + * @return CSS string of this node. + */ + toString(stringifier?: Stringifier | Syntax): string + + /** + * It is a wrapper for {@link Result#warn}, providing convenient + * way of generating warnings. + * + * ```js + * Declaration: { + * bad: (decl, { result }) => { + * decl.warn(result, 'Deprecated property: bad') + * } + * } + * ``` + * + * @param result The `Result` instance that will receive the warning. + * @param message Description for the warning. + * @param options Options for the warning. + * + * @return `Warning` instance is returned + */ + warn(result: Result, message: string, options?: WarningOptions): Warning + + /** + * If this node isn't already dirty, marks it and its ancestors as such. This + * indicates to the LazyResult processor that the {@link Root} has been + * modified by the current plugin and may need to be processed again by other + * plugins. + */ + protected markDirty(): void +} + +declare class Node extends Node_ {} + +export = Node diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/node.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/node.js new file mode 100644 index 0000000..2b865ba --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/node.js @@ -0,0 +1,434 @@ +'use strict' + +let CssSyntaxError = require('./css-syntax-error') +let Stringifier = require('./stringifier') +let stringify = require('./stringify') +let { isClean, my } = require('./symbols') + +function cloneNode(obj, parent) { + let cloned = new obj.constructor() + + for (let i in obj) { + if (!Object.prototype.hasOwnProperty.call(obj, i)) { + /* c8 ignore next 2 */ + continue + } + if (i === 'proxyCache') continue + let value = obj[i] + let type = typeof value + + if (i === 'parent' && type === 'object') { + if (parent) cloned[i] = parent + } else if (i === 'source') { + cloned[i] = value + } else if (Array.isArray(value)) { + cloned[i] = value.map(j => cloneNode(j, cloned)) + } else { + if (type === 'object' && value !== null) value = cloneNode(value) + cloned[i] = value + } + } + + return cloned +} + +function sourceOffset(inputCSS, position) { + // Not all custom syntaxes support `offset` in `source.start` and `source.end` + if ( + position && + typeof position.offset !== 'undefined' + ) { + return position.offset; + } + + let column = 1 + let line = 1 + let offset = 0 + + for (let i = 0; i < inputCSS.length; i++) { + if (line === position.line && column === position.column) { + offset = i + break + } + + if (inputCSS[i] === '\n') { + column = 1 + line += 1 + } else { + column += 1 + } + } + + return offset +} + +class Node { + get proxyOf() { + return this + } + + constructor(defaults = {}) { + this.raws = {} + this[isClean] = false + this[my] = true + + for (let name in defaults) { + if (name === 'nodes') { + this.nodes = [] + for (let node of defaults[name]) { + if (typeof node.clone === 'function') { + this.append(node.clone()) + } else { + this.append(node) + } + } + } else { + this[name] = defaults[name] + } + } + } + + addToError(error) { + error.postcssNode = this + if (error.stack && this.source && /\n\s{4}at /.test(error.stack)) { + let s = this.source + error.stack = error.stack.replace( + /\n\s{4}at /, + `$&${s.input.from}:${s.start.line}:${s.start.column}$&` + ) + } + return error + } + + after(add) { + this.parent.insertAfter(this, add) + return this + } + + assign(overrides = {}) { + for (let name in overrides) { + this[name] = overrides[name] + } + return this + } + + before(add) { + this.parent.insertBefore(this, add) + return this + } + + cleanRaws(keepBetween) { + delete this.raws.before + delete this.raws.after + if (!keepBetween) delete this.raws.between + } + + clone(overrides = {}) { + let cloned = cloneNode(this) + for (let name in overrides) { + cloned[name] = overrides[name] + } + return cloned + } + + cloneAfter(overrides = {}) { + let cloned = this.clone(overrides) + this.parent.insertAfter(this, cloned) + return cloned + } + + cloneBefore(overrides = {}) { + let cloned = this.clone(overrides) + this.parent.insertBefore(this, cloned) + return cloned + } + + error(message, opts = {}) { + if (this.source) { + let { end, start } = this.rangeBy(opts) + return this.source.input.error( + message, + { column: start.column, line: start.line }, + { column: end.column, line: end.line }, + opts + ) + } + return new CssSyntaxError(message) + } + + getProxyProcessor() { + return { + get(node, prop) { + if (prop === 'proxyOf') { + return node + } else if (prop === 'root') { + return () => node.root().toProxy() + } else { + return node[prop] + } + }, + + set(node, prop, value) { + if (node[prop] === value) return true + node[prop] = value + if ( + prop === 'prop' || + prop === 'value' || + prop === 'name' || + prop === 'params' || + prop === 'important' || + /* c8 ignore next */ + prop === 'text' + ) { + node.markDirty() + } + return true + } + } + } + + /* c8 ignore next 3 */ + markClean() { + this[isClean] = true + } + + markDirty() { + if (this[isClean]) { + this[isClean] = false + let next = this + while ((next = next.parent)) { + next[isClean] = false + } + } + } + + next() { + if (!this.parent) return undefined + let index = this.parent.index(this) + return this.parent.nodes[index + 1] + } + + positionBy(opts) { + let pos = this.source.start + if (opts.index) { + pos = this.positionInside(opts.index) + } else if (opts.word) { + let inputString = ('document' in this.source.input) + ? this.source.input.document + : this.source.input.css + let stringRepresentation = inputString.slice( + sourceOffset(inputString, this.source.start), + sourceOffset(inputString, this.source.end) + ) + let index = stringRepresentation.indexOf(opts.word) + if (index !== -1) pos = this.positionInside(index) + } + return pos + } + + positionInside(index) { + let column = this.source.start.column + let line = this.source.start.line + let inputString = ('document' in this.source.input) + ? this.source.input.document + : this.source.input.css + let offset = sourceOffset(inputString, this.source.start) + let end = offset + index + + for (let i = offset; i < end; i++) { + if (inputString[i] === '\n') { + column = 1 + line += 1 + } else { + column += 1 + } + } + + return { column, line } + } + + prev() { + if (!this.parent) return undefined + let index = this.parent.index(this) + return this.parent.nodes[index - 1] + } + + rangeBy(opts) { + let start = { + column: this.source.start.column, + line: this.source.start.line + } + let end = this.source.end + ? { + column: this.source.end.column + 1, + line: this.source.end.line + } + : { + column: start.column + 1, + line: start.line + } + + if (opts.word) { + let inputString = ('document' in this.source.input) + ? this.source.input.document + : this.source.input.css + let stringRepresentation = inputString.slice( + sourceOffset(inputString, this.source.start), + sourceOffset(inputString, this.source.end) + ) + let index = stringRepresentation.indexOf(opts.word) + if (index !== -1) { + start = this.positionInside(index) + end = this.positionInside( + index + opts.word.length, + ) + } + } else { + if (opts.start) { + start = { + column: opts.start.column, + line: opts.start.line + } + } else if (opts.index) { + start = this.positionInside(opts.index) + } + + if (opts.end) { + end = { + column: opts.end.column, + line: opts.end.line + } + } else if (typeof opts.endIndex === 'number') { + end = this.positionInside(opts.endIndex) + } else if (opts.index) { + end = this.positionInside(opts.index + 1) + } + } + + if ( + end.line < start.line || + (end.line === start.line && end.column <= start.column) + ) { + end = { column: start.column + 1, line: start.line } + } + + return { end, start } + } + + raw(prop, defaultType) { + let str = new Stringifier() + return str.raw(this, prop, defaultType) + } + + remove() { + if (this.parent) { + this.parent.removeChild(this) + } + this.parent = undefined + return this + } + + replaceWith(...nodes) { + if (this.parent) { + let bookmark = this + let foundSelf = false + for (let node of nodes) { + if (node === this) { + foundSelf = true + } else if (foundSelf) { + this.parent.insertAfter(bookmark, node) + bookmark = node + } else { + this.parent.insertBefore(bookmark, node) + } + } + + if (!foundSelf) { + this.remove() + } + } + + return this + } + + root() { + let result = this + while (result.parent && result.parent.type !== 'document') { + result = result.parent + } + return result + } + + toJSON(_, inputs) { + let fixed = {} + let emitInputs = inputs == null + inputs = inputs || new Map() + let inputsNextIndex = 0 + + for (let name in this) { + if (!Object.prototype.hasOwnProperty.call(this, name)) { + /* c8 ignore next 2 */ + continue + } + if (name === 'parent' || name === 'proxyCache') continue + let value = this[name] + + if (Array.isArray(value)) { + fixed[name] = value.map(i => { + if (typeof i === 'object' && i.toJSON) { + return i.toJSON(null, inputs) + } else { + return i + } + }) + } else if (typeof value === 'object' && value.toJSON) { + fixed[name] = value.toJSON(null, inputs) + } else if (name === 'source') { + let inputId = inputs.get(value.input) + if (inputId == null) { + inputId = inputsNextIndex + inputs.set(value.input, inputsNextIndex) + inputsNextIndex++ + } + fixed[name] = { + end: value.end, + inputId, + start: value.start + } + } else { + fixed[name] = value + } + } + + if (emitInputs) { + fixed.inputs = [...inputs.keys()].map(input => input.toJSON()) + } + + return fixed + } + + toProxy() { + if (!this.proxyCache) { + this.proxyCache = new Proxy(this, this.getProxyProcessor()) + } + return this.proxyCache + } + + toString(stringifier = stringify) { + if (stringifier.stringify) stringifier = stringifier.stringify + let result = '' + stringifier(this, i => { + result += i + }) + return result + } + + warn(result, text, opts) { + let data = { node: this } + for (let i in opts) data[i] = opts[i] + return result.warn(text, data) + } +} + +module.exports = Node +Node.default = Node diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/parse.d.ts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/parse.d.ts new file mode 100644 index 0000000..4c943a4 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/parse.d.ts @@ -0,0 +1,9 @@ +import { Parser } from './postcss.js' + +interface Parse extends Parser { + default: Parse +} + +declare const parse: Parse + +export = parse diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/parse.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/parse.js new file mode 100644 index 0000000..00a1037 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/parse.js @@ -0,0 +1,42 @@ +'use strict' + +let Container = require('./container') +let Input = require('./input') +let Parser = require('./parser') + +function parse(css, opts) { + let input = new Input(css, opts) + let parser = new Parser(input) + try { + parser.parse() + } catch (e) { + if (process.env.NODE_ENV !== 'production') { + if (e.name === 'CssSyntaxError' && opts && opts.from) { + if (/\.scss$/i.test(opts.from)) { + e.message += + '\nYou tried to parse SCSS with ' + + 'the standard CSS parser; ' + + 'try again with the postcss-scss parser' + } else if (/\.sass/i.test(opts.from)) { + e.message += + '\nYou tried to parse Sass with ' + + 'the standard CSS parser; ' + + 'try again with the postcss-sass parser' + } else if (/\.less$/i.test(opts.from)) { + e.message += + '\nYou tried to parse Less with ' + + 'the standard CSS parser; ' + + 'try again with the postcss-less parser' + } + } + } + throw e + } + + return parser.root +} + +module.exports = parse +parse.default = parse + +Container.registerParse(parse) diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/parser.js b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/parser.js new file mode 100644 index 0000000..64fb5d8 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/parser.js @@ -0,0 +1,611 @@ +'use strict' + +let AtRule = require('./at-rule') +let Comment = require('./comment') +let Declaration = require('./declaration') +let Root = require('./root') +let Rule = require('./rule') +let tokenizer = require('./tokenize') + +const SAFE_COMMENT_NEIGHBOR = { + empty: true, + space: true +} + +function findLastWithPosition(tokens) { + for (let i = tokens.length - 1; i >= 0; i--) { + let token = tokens[i] + let pos = token[3] || token[2] + if (pos) return pos + } +} + +class Parser { + constructor(input) { + this.input = input + + this.root = new Root() + this.current = this.root + this.spaces = '' + this.semicolon = false + + this.createTokenizer() + this.root.source = { input, start: { column: 1, line: 1, offset: 0 } } + } + + atrule(token) { + let node = new AtRule() + node.name = token[1].slice(1) + if (node.name === '') { + this.unnamedAtrule(node, token) + } + this.init(node, token[2]) + + let type + let prev + let shift + let last = false + let open = false + let params = [] + let brackets = [] + + while (!this.tokenizer.endOfFile()) { + token = this.tokenizer.nextToken() + type = token[0] + + if (type === '(' || type === '[') { + brackets.push(type === '(' ? ')' : ']') + } else if (type === '{' && brackets.length > 0) { + brackets.push('}') + } else if (type === brackets[brackets.length - 1]) { + brackets.pop() + } + + if (brackets.length === 0) { + if (type === ';') { + node.source.end = this.getPosition(token[2]) + node.source.end.offset++ + this.semicolon = true + break + } else if (type === '{') { + open = true + break + } else if (type === '}') { + if (params.length > 0) { + shift = params.length - 1 + prev = params[shift] + while (prev && prev[0] === 'space') { + prev = params[--shift] + } + if (prev) { + node.source.end = this.getPosition(prev[3] || prev[2]) + node.source.end.offset++ + } + } + this.end(token) + break + } else { + params.push(token) + } + } else { + params.push(token) + } + + if (this.tokenizer.endOfFile()) { + last = true + break + } + } + + node.raws.between = this.spacesAndCommentsFromEnd(params) + if (params.length) { + node.raws.afterName = this.spacesAndCommentsFromStart(params) + this.raw(node, 'params', params) + if (last) { + token = params[params.length - 1] + node.source.end = this.getPosition(token[3] || token[2]) + node.source.end.offset++ + this.spaces = node.raws.between + node.raws.between = '' + } + } else { + node.raws.afterName = '' + node.params = '' + } + + if (open) { + node.nodes = [] + this.current = node + } + } + + checkMissedSemicolon(tokens) { + let colon = this.colon(tokens) + if (colon === false) return + + let founded = 0 + let token + for (let j = colon - 1; j >= 0; j--) { + token = tokens[j] + if (token[0] !== 'space') { + founded += 1 + if (founded === 2) break + } + } + // If the token is a word, e.g. `!important`, `red` or any other valid property's value. + // Then we need to return the colon after that word token. [3] is the "end" colon of that word. + // And because we need it after that one we do +1 to get the next one. + throw this.input.error( + 'Missed semicolon', + token[0] === 'word' ? token[3] + 1 : token[2] + ) + } + + colon(tokens) { + let brackets = 0 + let prev, token, type + for (let [i, element] of tokens.entries()) { + token = element + type = token[0] + + if (type === '(') { + brackets += 1 + } + if (type === ')') { + brackets -= 1 + } + if (brackets === 0 && type === ':') { + if (!prev) { + this.doubleColon(token) + } else if (prev[0] === 'word' && prev[1] === 'progid') { + continue + } else { + return i + } + } + + prev = token + } + return false + } + + comment(token) { + let node = new Comment() + this.init(node, token[2]) + node.source.end = this.getPosition(token[3] || token[2]) + node.source.end.offset++ + + let text = token[1].slice(2, -2) + if (/^\s*$/.test(text)) { + node.text = '' + node.raws.left = text + node.raws.right = '' + } else { + let match = text.match(/^(\s*)([^]*\S)(\s*)$/) + node.text = match[2] + node.raws.left = match[1] + node.raws.right = match[3] + } + } + + createTokenizer() { + this.tokenizer = tokenizer(this.input) + } + + decl(tokens, customProperty) { + let node = new Declaration() + this.init(node, tokens[0][2]) + + let last = tokens[tokens.length - 1] + if (last[0] === ';') { + this.semicolon = true + tokens.pop() + } + + node.source.end = this.getPosition( + last[3] || last[2] || findLastWithPosition(tokens) + ) + node.source.end.offset++ + + while (tokens[0][0] !== 'word') { + if (tokens.length === 1) this.unknownWord(tokens) + node.raws.before += tokens.shift()[1] + } + node.source.start = this.getPosition(tokens[0][2]) + + node.prop = '' + while (tokens.length) { + let type = tokens[0][0] + if (type === ':' || type === 'space' || type === 'comment') { + break + } + node.prop += tokens.shift()[1] + } + + node.raws.between = '' + + let token + while (tokens.length) { + token = tokens.shift() + + if (token[0] === ':') { + node.raws.between += token[1] + break + } else { + if (token[0] === 'word' && /\w/.test(token[1])) { + this.unknownWord([token]) + } + node.raws.between += token[1] + } + } + + if (node.prop[0] === '_' || node.prop[0] === '*') { + node.raws.before += node.prop[0] + node.prop = node.prop.slice(1) + } + + let firstSpaces = [] + let next + while (tokens.length) { + next = tokens[0][0] + if (next !== 'space' && next !== 'comment') break + firstSpaces.push(tokens.shift()) + } + + this.precheckMissedSemicolon(tokens) + + for (let i = tokens.length - 1; i >= 0; i--) { + token = tokens[i] + if (token[1].toLowerCase() === '!important') { + node.important = true + let string = this.stringFrom(tokens, i) + string = this.spacesFromEnd(tokens) + string + if (string !== ' !important') node.raws.important = string + break + } else if (token[1].toLowerCase() === 'important') { + let cache = tokens.slice(0) + let str = '' + for (let j = i; j > 0; j--) { + let type = cache[j][0] + if (str.trim().startsWith('!') && type !== 'space') { + break + } + str = cache.pop()[1] + str + } + if (str.trim().startsWith('!')) { + node.important = true + node.raws.important = str + tokens = cache + } + } + + if (token[0] !== 'space' && token[0] !== 'comment') { + break + } + } + + let hasWord = tokens.some(i => i[0] !== 'space' && i[0] !== 'comment') + + if (hasWord) { + node.raws.between += firstSpaces.map(i => i[1]).join('') + firstSpaces = [] + } + this.raw(node, 'value', firstSpaces.concat(tokens), customProperty) + + if (node.value.includes(':') && !customProperty) { + this.checkMissedSemicolon(tokens) + } + } + + doubleColon(token) { + throw this.input.error( + 'Double colon', + { offset: token[2] }, + { offset: token[2] + token[1].length } + ) + } + + emptyRule(token) { + let node = new Rule() + this.init(node, token[2]) + node.selector = '' + node.raws.between = '' + this.current = node + } + + end(token) { + if (this.current.nodes && this.current.nodes.length) { + this.current.raws.semicolon = this.semicolon + } + this.semicolon = false + + this.current.raws.after = (this.current.raws.after || '') + this.spaces + this.spaces = '' + + if (this.current.parent) { + this.current.source.end = this.getPosition(token[2]) + this.current.source.end.offset++ + this.current = this.current.parent + } else { + this.unexpectedClose(token) + } + } + + endFile() { + if (this.current.parent) this.unclosedBlock() + if (this.current.nodes && this.current.nodes.length) { + this.current.raws.semicolon = this.semicolon + } + this.current.raws.after = (this.current.raws.after || '') + this.spaces + this.root.source.end = this.getPosition(this.tokenizer.position()) + } + + freeSemicolon(token) { + this.spaces += token[1] + if (this.current.nodes) { + let prev = this.current.nodes[this.current.nodes.length - 1] + if (prev && prev.type === 'rule' && !prev.raws.ownSemicolon) { + prev.raws.ownSemicolon = this.spaces + this.spaces = '' + prev.source.end = this.getPosition(token[2]) + prev.source.end.offset += prev.raws.ownSemicolon.length + } + } + } + + // Helpers + + getPosition(offset) { + let pos = this.input.fromOffset(offset) + return { + column: pos.col, + line: pos.line, + offset + } + } + + init(node, offset) { + this.current.push(node) + node.source = { + input: this.input, + start: this.getPosition(offset) + } + node.raws.before = this.spaces + this.spaces = '' + if (node.type !== 'comment') this.semicolon = false + } + + other(start) { + let end = false + let type = null + let colon = false + let bracket = null + let brackets = [] + let customProperty = start[1].startsWith('--') + + let tokens = [] + let token = start + while (token) { + type = token[0] + tokens.push(token) + + if (type === '(' || type === '[') { + if (!bracket) bracket = token + brackets.push(type === '(' ? ')' : ']') + } else if (customProperty && colon && type === '{') { + if (!bracket) bracket = token + brackets.push('}') + } else if (brackets.length === 0) { + if (type === ';') { + if (colon) { + this.decl(tokens, customProperty) + return + } else { + break + } + } else if (type === '{') { + this.rule(tokens) + return + } else if (type === '}') { + this.tokenizer.back(tokens.pop()) + end = true + break + } else if (type === ':') { + colon = true + } + } else if (type === brackets[brackets.length - 1]) { + brackets.pop() + if (brackets.length === 0) bracket = null + } + + token = this.tokenizer.nextToken() + } + + if (this.tokenizer.endOfFile()) end = true + if (brackets.length > 0) this.unclosedBracket(bracket) + + if (end && colon) { + if (!customProperty) { + while (tokens.length) { + token = tokens[tokens.length - 1][0] + if (token !== 'space' && token !== 'comment') break + this.tokenizer.back(tokens.pop()) + } + } + this.decl(tokens, customProperty) + } else { + this.unknownWord(tokens) + } + } + + parse() { + let token + while (!this.tokenizer.endOfFile()) { + token = this.tokenizer.nextToken() + + switch (token[0]) { + case 'space': + this.spaces += token[1] + break + + case ';': + this.freeSemicolon(token) + break + + case '}': + this.end(token) + break + + case 'comment': + this.comment(token) + break + + case 'at-word': + this.atrule(token) + break + + case '{': + this.emptyRule(token) + break + + default: + this.other(token) + break + } + } + this.endFile() + } + + precheckMissedSemicolon(/* tokens */) { + // Hook for Safe Parser + } + + raw(node, prop, tokens, customProperty) { + let token, type + let length = tokens.length + let value = '' + let clean = true + let next, prev + + for (let i = 0; i < length; i += 1) { + token = tokens[i] + type = token[0] + if (type === 'space' && i === length - 1 && !customProperty) { + clean = false + } else if (type === 'comment') { + prev = tokens[i - 1] ? tokens[i - 1][0] : 'empty' + next = tokens[i + 1] ? tokens[i + 1][0] : 'empty' + if (!SAFE_COMMENT_NEIGHBOR[prev] && !SAFE_COMMENT_NEIGHBOR[next]) { + if (value.slice(-1) === ',') { + clean = false + } else { + value += token[1] + } + } else { + clean = false + } + } else { + value += token[1] + } + } + if (!clean) { + let raw = tokens.reduce((all, i) => all + i[1], '') + node.raws[prop] = { raw, value } + } + node[prop] = value + } + + rule(tokens) { + tokens.pop() + + let node = new Rule() + this.init(node, tokens[0][2]) + + node.raws.between = this.spacesAndCommentsFromEnd(tokens) + this.raw(node, 'selector', tokens) + this.current = node + } + + spacesAndCommentsFromEnd(tokens) { + let lastTokenType + let spaces = '' + while (tokens.length) { + lastTokenType = tokens[tokens.length - 1][0] + if (lastTokenType !== 'space' && lastTokenType !== 'comment') break + spaces = tokens.pop()[1] + spaces + } + return spaces + } + + // Errors + + spacesAndCommentsFromStart(tokens) { + let next + let spaces = '' + while (tokens.length) { + next = tokens[0][0] + if (next !== 'space' && next !== 'comment') break + spaces += tokens.shift()[1] + } + return spaces + } + + spacesFromEnd(tokens) { + let lastTokenType + let spaces = '' + while (tokens.length) { + lastTokenType = tokens[tokens.length - 1][0] + if (lastTokenType !== 'space') break + spaces = tokens.pop()[1] + spaces + } + return spaces + } + + stringFrom(tokens, from) { + let result = '' + for (let i = from; i < tokens.length; i++) { + result += tokens[i][1] + } + tokens.splice(from, tokens.length - from) + return result + } + + unclosedBlock() { + let pos = this.current.source.start + throw this.input.error('Unclosed block', pos.line, pos.column) + } + + unclosedBracket(bracket) { + throw this.input.error( + 'Unclosed bracket', + { offset: bracket[2] }, + { offset: bracket[2] + 1 } + ) + } + + unexpectedClose(token) { + throw this.input.error( + 'Unexpected }', + { offset: token[2] }, + { offset: token[2] + 1 } + ) + } + + unknownWord(tokens) { + throw this.input.error( + 'Unknown word ' + tokens[0][1], + { offset: tokens[0][2] }, + { offset: tokens[0][2] + tokens[0][1].length } + ) + } + + unnamedAtrule(node, token) { + throw this.input.error( + 'At-rule without name', + { offset: token[2] }, + { offset: token[2] + token[1].length } + ) + } +} + +module.exports = Parser diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/postcss.d.mts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/postcss.d.mts new file mode 100644 index 0000000..d343f3c --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/postcss.d.mts @@ -0,0 +1,69 @@ +export { + // Type-only exports + AcceptedPlugin, + + AnyNode, + atRule, + AtRule, + AtRuleProps, + Builder, + ChildNode, + ChildProps, + comment, + Comment, + CommentProps, + Container, + ContainerProps, + CssSyntaxError, + decl, + Declaration, + DeclarationProps, + // postcss function / namespace + default, + document, + Document, + DocumentProps, + FilePosition, + fromJSON, + Helpers, + Input, + + JSONHydrator, + // This is a class, but it’s not re-exported. That’s why it’s exported as type-only here. + type LazyResult, + list, + Message, + Node, + NodeErrorOptions, + NodeProps, + OldPlugin, + parse, + Parser, + // @ts-expect-error This value exists, but it’s untyped. + plugin, + Plugin, + PluginCreator, + Position, + Postcss, + ProcessOptions, + Processor, + Result, + root, + Root, + RootProps, + rule, + Rule, + RuleProps, + Source, + SourceMap, + SourceMapOptions, + Stringifier, + // Value exports from postcss.mjs + stringify, + Syntax, + TransformCallback, + Transformer, + Warning, + + WarningOptions +} from './postcss.js' diff --git a/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/postcss.d.ts b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/postcss.d.ts new file mode 100644 index 0000000..c5e3605 --- /dev/null +++ b/node_modules/.pnpm/postcss@8.5.3/node_modules/postcss/lib/postcss.d.ts @@ -0,0 +1,458 @@ +import { RawSourceMap, SourceMapGenerator } from 'source-map-js' + +import AtRule, { AtRuleProps } from './at-rule.js' +import Comment, { CommentProps } from './comment.js' +import Container, { ContainerProps, NewChild } from './container.js' +import CssSyntaxError from './css-syntax-error.js' +import Declaration, { DeclarationProps } from './declaration.js' +import Document, { DocumentProps } from './document.js' +import Input, { FilePosition } from './input.js' +import LazyResult from './lazy-result.js' +import list from './list.js' +import Node, { + AnyNode, + ChildNode, + ChildProps, + NodeErrorOptions, + NodeProps, + Position, + Source +} from './node.js' +import Processor from './processor.js' +import Result, { Message } from './result.js' +import Root, { RootProps } from './root.js' +import Rule, { RuleProps } from './rule.js' +import Warning, { WarningOptions } from './warning.js' + +type DocumentProcessor = ( + document: Document, + helper: postcss.Helpers +) => Promise | void +type RootProcessor = ( + root: Root, + helper: postcss.Helpers +) => Promise | void +type DeclarationProcessor = ( + decl: Declaration, + helper: postcss.Helpers +) => Promise | void +type RuleProcessor = ( + rule: Rule, + helper: postcss.Helpers +) => Promise | void +type AtRuleProcessor = ( + atRule: AtRule, + helper: postcss.Helpers +) => Promise | void +type CommentProcessor = ( + comment: Comment, + helper: postcss.Helpers +) => Promise | void + +interface Processors { + /** + * Will be called on all`AtRule` nodes. + * + * Will be called again on node or children changes. + */ + AtRule?: { [name: string]: AtRuleProcessor } | AtRuleProcessor + + /** + * Will be called on all `AtRule` nodes, when all children will be processed. + * + * Will be called again on node or children changes. + */ + AtRuleExit?: { [name: string]: AtRuleProcessor } | AtRuleProcessor + + /** + * Will be called on all `Comment` nodes. + * + * Will be called again on node or children changes. + */ + Comment?: CommentProcessor + + /** + * Will be called on all `Comment` nodes after listeners + * for `Comment` event. + * + * Will be called again on node or children changes. + */ + CommentExit?: CommentProcessor + + /** + * Will be called on all `Declaration` nodes after listeners + * for `Declaration` event. + * + * Will be called again on node or children changes. + */ + Declaration?: { [prop: string]: DeclarationProcessor } | DeclarationProcessor + + /** + * Will be called on all `Declaration` nodes. + * + * Will be called again on node or children changes. + */ + DeclarationExit?: + | { [prop: string]: DeclarationProcessor } + | DeclarationProcessor + + /** + * Will be called on `Document` node. + * + * Will be called again on children changes. + */ + Document?: DocumentProcessor + + /** + * Will be called on `Document` node, when all children will be processed. + * + * Will be called again on children changes. + */ + DocumentExit?: DocumentProcessor + + /** + * Will be called on `Root` node once. + */ + Once?: RootProcessor + + /** + * Will be called on `Root` node once, when all children will be processed. + */ + OnceExit?: RootProcessor + + /** + * Will be called on `Root` node. + * + * Will be called again on children changes. + */ + Root?: RootProcessor + + /** + * Will be called on `Root` node, when all children will be processed. + * + * Will be called again on children changes. + */ + RootExit?: RootProcessor + + /** + * Will be called on all `Rule` nodes. + * + * Will be called again on node or children changes. + */ + Rule?: RuleProcessor + + /** + * Will be called on all `Rule` nodes, when all children will be processed. + * + * Will be called again on node or children changes. + */ + RuleExit?: RuleProcessor +} + +declare namespace postcss { + export { + AnyNode, + AtRule, + AtRuleProps, + ChildNode, + ChildProps, + Comment, + CommentProps, + Container, + ContainerProps, + CssSyntaxError, + Declaration, + DeclarationProps, + Document, + DocumentProps, + FilePosition, + Input, + LazyResult, + list, + Message, + NewChild, + Node, + NodeErrorOptions, + NodeProps, + Position, + Processor, + Result, + Root, + RootProps, + Rule, + RuleProps, + Source, + Warning, + WarningOptions + } + + export type SourceMap = { + toJSON(): RawSourceMap + } & SourceMapGenerator + + export type Helpers = { postcss: Postcss; result: Result } & Postcss + + export interface Plugin extends Processors { + postcssPlugin: string + prepare?: (result: Result) => Processors + } + + export interface PluginCreator { + (opts?: PluginOptions): Plugin | Processor + postcss: true + } + + export interface Transformer extends TransformCallback { + postcssPlugin: string + postcssVersion: string + } + + export interface TransformCallback { + (root: Root, result: Result): Promise | void + } + + export interface OldPlugin extends Transformer { + (opts?: T): Transformer + postcss: Transformer + } + + export type AcceptedPlugin = + | { + postcss: Processor | TransformCallback + } + | OldPlugin + | Plugin + | PluginCreator + | Processor + | TransformCallback + + export interface Parser { + ( + css: { toString(): string } | string, + opts?: Pick + ): RootNode + } + + export interface Builder { + (part: string, node?: AnyNode, type?: 'end' | 'start'): void + } + + export interface Stringifier { + (node: AnyNode, builder: Builder): void + } + + export interface JSONHydrator { + (data: object): Node + (data: object[]): Node[] + } + + export interface Syntax { + /** + * Function to generate AST by string. + */ + parse?: Parser + + /** + * Class to generate string by AST. + */ + stringify?: Stringifier + } + + export interface SourceMapOptions { + /** + * Use absolute path in generated source map. + */ + absolute?: boolean + + /** + * Indicates that PostCSS should add annotation comments to the CSS. + * By default, PostCSS will always add a comment with a path + * to the source map. PostCSS will not add annotations to CSS files + * that do not contain any comments. + * + * By default, PostCSS presumes that you want to save the source map as + * `opts.to + '.map'` and will use this path in the annotation comment. + * A different path can be set by providing a string value for annotation. + * + * If you have set `inline: true`, annotation cannot be disabled. + */ + annotation?: ((file: string, root: Root) => string) | boolean | string + + /** + * Override `from` in map’s sources. + */ + from?: string + + /** + * Indicates that the source map should be embedded in the output CSS + * as a Base64-encoded comment. By default, it is `true`. + * But if all previous maps are external, not inline, PostCSS will not embed + * the map even if you do not set this option. + * + * If you have an inline source map, the result.map property will be empty, + * as the source map will be contained within the text of `result.css`. + */ + inline?: boolean + + /** + * Source map content from a previous processing step (e.g., Sass). + * + * PostCSS will try to read the previous source map + * automatically (based on comments within the source CSS), but you can use + * this option to identify it manually. + * + * If desired, you can omit the previous map with prev: `false`. + */ + prev?: ((file: string) => string) | boolean | object | string + + /** + * Indicates that PostCSS should set the origin content (e.g., Sass source) + * of the source map. By default, it is true. But if all previous maps do not + * contain sources content, PostCSS will also leave it out even if you + * do not set this option. + */ + sourcesContent?: boolean + } + + export interface ProcessOptions { + /** + * Input file if it is not simple CSS file, but HTML with + + `; +} + +const ERR_LOAD_URL = "ERR_LOAD_URL"; +const ERR_LOAD_PUBLIC_URL = "ERR_LOAD_PUBLIC_URL"; +const ERR_DENIED_ID = "ERR_DENIED_ID"; +const debugLoad = createDebugger("vite:load"); +const debugTransform = createDebugger("vite:transform"); +const debugCache$1 = createDebugger("vite:cache"); +function transformRequest(url, server, options = {}) { + if (server._restartPromise && !options.ssr) throwClosedServerError(); + const cacheKey = (options.ssr ? "ssr:" : options.html ? "html:" : "") + url; + const timestamp = Date.now(); + const pending = server._pendingRequests.get(cacheKey); + if (pending) { + return server.moduleGraph.getModuleByUrl(removeTimestampQuery(url), options.ssr).then((module) => { + if (!module || pending.timestamp > module.lastInvalidationTimestamp) { + return pending.request; + } else { + pending.abort(); + return transformRequest(url, server, options); + } + }); + } + const request = doTransform(url, server, options, timestamp); + let cleared = false; + const clearCache = () => { + if (!cleared) { + server._pendingRequests.delete(cacheKey); + cleared = true; + } + }; + server._pendingRequests.set(cacheKey, { + request, + timestamp, + abort: clearCache + }); + return request.finally(clearCache); +} +async function doTransform(url, server, options, timestamp) { + url = removeTimestampQuery(url); + const { config, pluginContainer } = server; + const ssr = !!options.ssr; + if (ssr && isDepsOptimizerEnabled(config, true)) { + await initDevSsrDepsOptimizer(config, server); + } + let module = await server.moduleGraph.getModuleByUrl(url, ssr); + if (module) { + const cached = await getCachedTransformResult( + url, + module, + server, + ssr, + timestamp + ); + if (cached) return cached; + } + const resolved = module ? void 0 : await pluginContainer.resolveId(url, void 0, { ssr }) ?? void 0; + const id = module?.id ?? resolved?.id ?? url; + module ??= server.moduleGraph.getModuleById(id); + if (module) { + await server.moduleGraph._ensureEntryFromUrl(url, ssr, void 0, resolved); + const cached = await getCachedTransformResult( + url, + module, + server, + ssr, + timestamp + ); + if (cached) return cached; + } + const result = loadAndTransform( + id, + url, + server, + options, + timestamp, + module, + resolved + ); + if (!ssr) { + const depsOptimizer = getDepsOptimizer(config, ssr); + if (!depsOptimizer?.isOptimizedDepFile(id)) { + server._registerRequestProcessing(id, () => result); + } + } + return result; +} +async function getCachedTransformResult(url, module, server, ssr, timestamp) { + const prettyUrl = debugCache$1 ? prettifyUrl(url, server.config.root) : ""; + const softInvalidatedTransformResult = module && await handleModuleSoftInvalidation(module, ssr, timestamp, server); + if (softInvalidatedTransformResult) { + debugCache$1?.(`[memory-hmr] ${prettyUrl}`); + return softInvalidatedTransformResult; + } + const cached = module && (ssr ? module.ssrTransformResult : module.transformResult); + if (cached) { + debugCache$1?.(`[memory] ${prettyUrl}`); + return cached; + } +} +async function loadAndTransform(id, url, server, options, timestamp, mod, resolved) { + const { config, pluginContainer, moduleGraph } = server; + const { logger } = config; + const prettyUrl = debugLoad || debugTransform ? prettifyUrl(url, config.root) : ""; + const ssr = !!options.ssr; + const file = cleanUrl(id); + if (options.allowId && !options.allowId(id)) { + const err = new Error(`Denied ID ${id}`); + err.code = ERR_DENIED_ID; + throw err; + } + let code = null; + let map = null; + const loadStart = debugLoad ? performance$1.now() : 0; + const loadResult = await pluginContainer.load(id, { ssr }); + if (loadResult == null) { + if (options.html && !id.endsWith(".html")) { + return null; + } + if (options.ssr || isFileServingAllowed(file, server)) { + try { + code = await fsp.readFile(file, "utf-8"); + debugLoad?.(`${timeFrom(loadStart)} [fs] ${prettyUrl}`); + } catch (e) { + if (e.code !== "ENOENT") { + if (e.code === "EISDIR") { + e.message = `${e.message} ${file}`; + } + throw e; + } + } + if (code != null) { + ensureWatchedFile(server.watcher, file, config.root); + } + } + if (code) { + try { + const extracted = await extractSourcemapFromFile(code, file); + if (extracted) { + code = extracted.code; + map = extracted.map; + } + } catch (e) { + logger.warn(`Failed to load source map for ${file}. +${e}`, { + timestamp: true + }); + } + } + } else { + debugLoad?.(`${timeFrom(loadStart)} [plugin] ${prettyUrl}`); + if (isObject$1(loadResult)) { + code = loadResult.code; + map = loadResult.map; + } else { + code = loadResult; + } + } + if (code == null) { + const isPublicFile = checkPublicFile(url, config); + let publicDirName = path$n.relative(config.root, config.publicDir); + if (publicDirName[0] !== ".") publicDirName = "/" + publicDirName; + const msg = isPublicFile ? `This file is in ${publicDirName} and will be copied as-is during build without going through the plugin transforms, and therefore should not be imported from source code. It can only be referenced via HTML tags.` : `Does the file exist?`; + const importerMod = server.moduleGraph.idToModuleMap.get(id)?.importers.values().next().value; + const importer = importerMod?.file || importerMod?.url; + const err = new Error( + `Failed to load url ${url} (resolved id: ${id})${importer ? ` in ${importer}` : ""}. ${msg}` + ); + err.code = isPublicFile ? ERR_LOAD_PUBLIC_URL : ERR_LOAD_URL; + throw err; + } + if (server._restartPromise && !ssr) throwClosedServerError(); + mod ??= await moduleGraph._ensureEntryFromUrl(url, ssr, void 0, resolved); + const transformStart = debugTransform ? performance$1.now() : 0; + const transformResult = await pluginContainer.transform(code, id, { + inMap: map, + ssr + }); + const originalCode = code; + if (transformResult == null || isObject$1(transformResult) && transformResult.code == null) { + debugTransform?.( + timeFrom(transformStart) + colors$1.dim(` [skipped] ${prettyUrl}`) + ); + } else { + debugTransform?.(`${timeFrom(transformStart)} ${prettyUrl}`); + code = transformResult.code; + map = transformResult.map; + } + let normalizedMap; + if (typeof map === "string") { + normalizedMap = JSON.parse(map); + } else if (map) { + normalizedMap = map; + } else { + normalizedMap = null; + } + if (normalizedMap && "version" in normalizedMap && mod.file) { + if (normalizedMap.mappings) { + await injectSourcesContent(normalizedMap, mod.file, logger); + } + const sourcemapPath = `${mod.file}.map`; + applySourcemapIgnoreList( + normalizedMap, + sourcemapPath, + config.server.sourcemapIgnoreList, + logger + ); + if (path$n.isAbsolute(mod.file)) { + let modDirname; + for (let sourcesIndex = 0; sourcesIndex < normalizedMap.sources.length; ++sourcesIndex) { + const sourcePath = normalizedMap.sources[sourcesIndex]; + if (sourcePath) { + if (path$n.isAbsolute(sourcePath)) { + modDirname ??= path$n.dirname(mod.file); + normalizedMap.sources[sourcesIndex] = path$n.relative( + modDirname, + sourcePath + ); + } + } + } + } + } + if (server._restartPromise && !ssr) throwClosedServerError(); + const result = ssr && !server.config.experimental.skipSsrTransform ? await server.ssrTransform(code, normalizedMap, url, originalCode) : { + code, + map: normalizedMap, + etag: getEtag(code, { weak: true }) + }; + if (timestamp > mod.lastInvalidationTimestamp) + moduleGraph.updateModuleTransformResult(mod, result, ssr); + return result; +} +async function handleModuleSoftInvalidation(mod, ssr, timestamp, server) { + const transformResult = ssr ? mod.ssrInvalidationState : mod.invalidationState; + if (ssr) mod.ssrInvalidationState = void 0; + else mod.invalidationState = void 0; + if (!transformResult || transformResult === "HARD_INVALIDATED") return; + if (ssr ? mod.ssrTransformResult : mod.transformResult) { + throw new Error( + `Internal server error: Soft-invalidated module "${mod.url}" should not have existing transform result` + ); + } + let result; + if (ssr) { + result = transformResult; + } else { + await init; + const source = transformResult.code; + const s = new MagicString(source); + const [imports] = parse$d(source, mod.id || void 0); + for (const imp of imports) { + let rawUrl = source.slice(imp.s, imp.e); + if (rawUrl === "import.meta") continue; + const hasQuotes = rawUrl[0] === '"' || rawUrl[0] === "'"; + if (hasQuotes) { + rawUrl = rawUrl.slice(1, -1); + } + const urlWithoutTimestamp = removeTimestampQuery(rawUrl); + const hmrUrl = unwrapId$1( + stripBase(removeImportQuery(urlWithoutTimestamp), server.config.base) + ); + for (const importedMod of mod.clientImportedModules) { + if (importedMod.url !== hmrUrl) continue; + if (importedMod.lastHMRTimestamp > 0) { + const replacedUrl = injectQuery( + urlWithoutTimestamp, + `t=${importedMod.lastHMRTimestamp}` + ); + const start = hasQuotes ? imp.s + 1 : imp.s; + const end = hasQuotes ? imp.e - 1 : imp.e; + s.overwrite(start, end, replacedUrl); + } + if (imp.d === -1 && server.config.server.preTransformRequests) { + server.warmupRequest(hmrUrl, { ssr }); + } + break; + } + } + const code = s.toString(); + result = { + ...transformResult, + code, + etag: getEtag(code, { weak: true }) + }; + } + if (timestamp > mod.lastInvalidationTimestamp) + server.moduleGraph.updateModuleTransformResult(mod, result, ssr); + return result; +} + +function analyzeImportedModDifference(mod, rawId, moduleType, metadata) { + if (metadata?.isDynamicImport) return; + if (metadata?.importedNames?.length) { + const missingBindings = metadata.importedNames.filter((s) => !(s in mod)); + if (missingBindings.length) { + const lastBinding = missingBindings[missingBindings.length - 1]; + if (moduleType === "module") { + throw new SyntaxError( + `[vite] The requested module '${rawId}' does not provide an export named '${lastBinding}'` + ); + } else { + throw new SyntaxError(`[vite] Named export '${lastBinding}' not found. The requested module '${rawId}' is a CommonJS module, which may not support all module.exports as named exports. +CommonJS modules can always be imported via the default export, for example using: + +import pkg from '${rawId}'; +const {${missingBindings.join(", ")}} = pkg; +`); + } + } + } +} + +/** + * @param {import('estree').Node} param + * @returns {string[]} + */ +function extract_names(param) { + return extract_identifiers(param).map((node) => node.name); +} + +/** + * @param {import('estree').Node} param + * @param {import('estree').Identifier[]} nodes + * @returns {import('estree').Identifier[]} + */ +function extract_identifiers(param, nodes = []) { + switch (param.type) { + case 'Identifier': + nodes.push(param); + break; + + case 'MemberExpression': + let object = param; + while (object.type === 'MemberExpression') { + object = /** @type {any} */ (object.object); + } + nodes.push(/** @type {any} */ (object)); + break; + + case 'ObjectPattern': + for (const prop of param.properties) { + if (prop.type === 'RestElement') { + extract_identifiers(prop.argument, nodes); + } else { + extract_identifiers(prop.value, nodes); + } + } + + break; + + case 'ArrayPattern': + for (const element of param.elements) { + if (element) extract_identifiers(element, nodes); + } + + break; + + case 'RestElement': + extract_identifiers(param.argument, nodes); + break; + + case 'AssignmentPattern': + extract_identifiers(param.left, nodes); + break; + } + + return nodes; +} + +/** + * @typedef { import('estree').Node} Node + * @typedef {{ + * skip: () => void; + * remove: () => void; + * replace: (node: Node) => void; + * }} WalkerContext + */ + +class WalkerBase { + constructor() { + /** @type {boolean} */ + this.should_skip = false; + + /** @type {boolean} */ + this.should_remove = false; + + /** @type {Node | null} */ + this.replacement = null; + + /** @type {WalkerContext} */ + this.context = { + skip: () => (this.should_skip = true), + remove: () => (this.should_remove = true), + replace: (node) => (this.replacement = node) + }; + } + + /** + * @template {Node} Parent + * @param {Parent | null | undefined} parent + * @param {keyof Parent | null | undefined} prop + * @param {number | null | undefined} index + * @param {Node} node + */ + replace(parent, prop, index, node) { + if (parent && prop) { + if (index != null) { + /** @type {Array} */ (parent[prop])[index] = node; + } else { + /** @type {Node} */ (parent[prop]) = node; + } + } + } + + /** + * @template {Node} Parent + * @param {Parent | null | undefined} parent + * @param {keyof Parent | null | undefined} prop + * @param {number | null | undefined} index + */ + remove(parent, prop, index) { + if (parent && prop) { + if (index !== null && index !== undefined) { + /** @type {Array} */ (parent[prop]).splice(index, 1); + } else { + delete parent[prop]; + } + } + } +} + +/** + * @typedef { import('estree').Node} Node + * @typedef { import('./walker.js').WalkerContext} WalkerContext + * @typedef {( + * this: WalkerContext, + * node: Node, + * parent: Node | null, + * key: string | number | symbol | null | undefined, + * index: number | null | undefined + * ) => void} SyncHandler + */ + +class SyncWalker extends WalkerBase { + /** + * + * @param {SyncHandler} [enter] + * @param {SyncHandler} [leave] + */ + constructor(enter, leave) { + super(); + + /** @type {boolean} */ + this.should_skip = false; + + /** @type {boolean} */ + this.should_remove = false; + + /** @type {Node | null} */ + this.replacement = null; + + /** @type {WalkerContext} */ + this.context = { + skip: () => (this.should_skip = true), + remove: () => (this.should_remove = true), + replace: (node) => (this.replacement = node) + }; + + /** @type {SyncHandler | undefined} */ + this.enter = enter; + + /** @type {SyncHandler | undefined} */ + this.leave = leave; + } + + /** + * @template {Node} Parent + * @param {Node} node + * @param {Parent | null} parent + * @param {keyof Parent} [prop] + * @param {number | null} [index] + * @returns {Node | null} + */ + visit(node, parent, prop, index) { + if (node) { + if (this.enter) { + const _should_skip = this.should_skip; + const _should_remove = this.should_remove; + const _replacement = this.replacement; + this.should_skip = false; + this.should_remove = false; + this.replacement = null; + + this.enter.call(this.context, node, parent, prop, index); + + if (this.replacement) { + node = this.replacement; + this.replace(parent, prop, index, node); + } + + if (this.should_remove) { + this.remove(parent, prop, index); + } + + const skipped = this.should_skip; + const removed = this.should_remove; + + this.should_skip = _should_skip; + this.should_remove = _should_remove; + this.replacement = _replacement; + + if (skipped) return node; + if (removed) return null; + } + + /** @type {keyof Node} */ + let key; + + for (key in node) { + /** @type {unknown} */ + const value = node[key]; + + if (value && typeof value === 'object') { + if (Array.isArray(value)) { + const nodes = /** @type {Array} */ (value); + for (let i = 0; i < nodes.length; i += 1) { + const item = nodes[i]; + if (isNode(item)) { + if (!this.visit(item, node, key, i)) { + // removed + i--; + } + } + } + } else if (isNode(value)) { + this.visit(value, node, key, null); + } + } + } + + if (this.leave) { + const _replacement = this.replacement; + const _should_remove = this.should_remove; + this.replacement = null; + this.should_remove = false; + + this.leave.call(this.context, node, parent, prop, index); + + if (this.replacement) { + node = this.replacement; + this.replace(parent, prop, index, node); + } + + if (this.should_remove) { + this.remove(parent, prop, index); + } + + const removed = this.should_remove; + + this.replacement = _replacement; + this.should_remove = _should_remove; + + if (removed) return null; + } + } + + return node; + } +} + +/** + * Ducktype a node. + * + * @param {unknown} value + * @returns {value is Node} + */ +function isNode(value) { + return ( + value !== null && typeof value === 'object' && 'type' in value && typeof value.type === 'string' + ); +} + +/** + * @typedef {import('estree').Node} Node + * @typedef {import('./sync.js').SyncHandler} SyncHandler + * @typedef {import('./async.js').AsyncHandler} AsyncHandler + */ + +/** + * @param {Node} ast + * @param {{ + * enter?: SyncHandler + * leave?: SyncHandler + * }} walker + * @returns {Node | null} + */ +function walk$1(ast, { enter, leave }) { + const instance = new SyncWalker(enter, leave); + return instance.visit(ast, null); +} + +const ssrModuleExportsKey = `__vite_ssr_exports__`; +const ssrImportKey = `__vite_ssr_import__`; +const ssrDynamicImportKey = `__vite_ssr_dynamic_import__`; +const ssrExportAllKey = `__vite_ssr_exportAll__`; +const ssrImportMetaKey = `__vite_ssr_import_meta__`; +const hashbangRE = /^#!.*\n/; +async function ssrTransform(code, inMap, url, originalCode, options) { + if (options?.json?.stringify && isJSONRequest(url)) { + return ssrTransformJSON(code, inMap); + } + return ssrTransformScript(code, inMap, url, originalCode); +} +async function ssrTransformJSON(code, inMap) { + return { + code: code.replace("export default", `${ssrModuleExportsKey}.default =`), + map: inMap, + deps: [], + dynamicDeps: [] + }; +} +async function ssrTransformScript(code, inMap, url, originalCode) { + const s = new MagicString(code); + let ast; + try { + ast = await parseAstAsync(code); + } catch (err) { + if (!err.loc || !err.loc.line) throw err; + const line = err.loc.line; + throw new Error( + `Parse failure: ${err.message} +At file: ${url} +Contents of line ${line}: ${code.split("\n")[line - 1]}` + ); + } + let uid = 0; + const deps = /* @__PURE__ */ new Set(); + const dynamicDeps = /* @__PURE__ */ new Set(); + const idToImportMap = /* @__PURE__ */ new Map(); + const declaredConst = /* @__PURE__ */ new Set(); + const hoistIndex = hashbangRE.exec(code)?.[0].length ?? 0; + function defineImport(index, source, metadata) { + deps.add(source); + const importId = `__vite_ssr_import_${uid++}__`; + if (metadata && (metadata.importedNames == null || metadata.importedNames.length === 0)) { + metadata = void 0; + } + const metadataStr = metadata ? `, ${JSON.stringify(metadata)}` : ""; + s.appendLeft( + index, + `const ${importId} = await ${ssrImportKey}(${JSON.stringify( + source + )}${metadataStr}); +` + ); + return importId; + } + function defineExport(position, name, local = name) { + s.appendLeft( + position, + ` +Object.defineProperty(${ssrModuleExportsKey}, "${name}", { enumerable: true, configurable: true, get(){ return ${local} }});` + ); + } + const imports = []; + const exports = []; + for (const node of ast.body) { + if (node.type === "ImportDeclaration") { + imports.push(node); + } else if (node.type === "ExportNamedDeclaration" || node.type === "ExportDefaultDeclaration" || node.type === "ExportAllDeclaration") { + exports.push(node); + } + } + for (const node of imports) { + const importId = defineImport(hoistIndex, node.source.value, { + importedNames: node.specifiers.map((s2) => { + if (s2.type === "ImportSpecifier") + return s2.imported.type === "Identifier" ? s2.imported.name : ( + // @ts-expect-error TODO: Estree types don't consider arbitrary module namespace specifiers yet + s2.imported.value + ); + else if (s2.type === "ImportDefaultSpecifier") return "default"; + }).filter(isDefined) + }); + s.remove(node.start, node.end); + for (const spec of node.specifiers) { + if (spec.type === "ImportSpecifier") { + if (spec.imported.type === "Identifier") { + idToImportMap.set( + spec.local.name, + `${importId}.${spec.imported.name}` + ); + } else { + idToImportMap.set( + spec.local.name, + `${importId}[${// @ts-expect-error TODO: Estree types don't consider arbitrary module namespace specifiers yet + JSON.stringify(spec.imported.value)}]` + ); + } + } else if (spec.type === "ImportDefaultSpecifier") { + idToImportMap.set(spec.local.name, `${importId}.default`); + } else { + idToImportMap.set(spec.local.name, importId); + } + } + } + for (const node of exports) { + if (node.type === "ExportNamedDeclaration") { + if (node.declaration) { + if (node.declaration.type === "FunctionDeclaration" || node.declaration.type === "ClassDeclaration") { + defineExport(node.end, node.declaration.id.name); + } else { + for (const declaration of node.declaration.declarations) { + const names = extract_names(declaration.id); + for (const name of names) { + defineExport(node.end, name); + } + } + } + s.remove(node.start, node.declaration.start); + } else { + s.remove(node.start, node.end); + if (node.source) { + const importId = defineImport( + node.start, + node.source.value, + { + importedNames: node.specifiers.map((s2) => s2.local.name) + } + ); + for (const spec of node.specifiers) { + const exportedAs = spec.exported.type === "Identifier" ? spec.exported.name : ( + // @ts-expect-error TODO: Estree types don't consider arbitrary module namespace specifiers yet + spec.exported.value + ); + defineExport( + node.start, + exportedAs, + `${importId}.${spec.local.name}` + ); + } + } else { + for (const spec of node.specifiers) { + const local = spec.local.name; + const binding = idToImportMap.get(local); + const exportedAs = spec.exported.type === "Identifier" ? spec.exported.name : ( + // @ts-expect-error TODO: Estree types don't consider arbitrary module namespace specifiers yet + spec.exported.value + ); + defineExport(node.end, exportedAs, binding || local); + } + } + } + } + if (node.type === "ExportDefaultDeclaration") { + const expressionTypes = ["FunctionExpression", "ClassExpression"]; + if ("id" in node.declaration && node.declaration.id && !expressionTypes.includes(node.declaration.type)) { + const { name } = node.declaration.id; + s.remove( + node.start, + node.start + 15 + /* 'export default '.length */ + ); + s.append( + ` +Object.defineProperty(${ssrModuleExportsKey}, "default", { enumerable: true, configurable: true, value: ${name} });` + ); + } else { + s.update( + node.start, + node.start + 14, + `${ssrModuleExportsKey}.default =` + ); + } + } + if (node.type === "ExportAllDeclaration") { + s.remove(node.start, node.end); + const importId = defineImport(node.start, node.source.value); + if (node.exported) { + defineExport(node.start, node.exported.name, `${importId}`); + } else { + s.appendLeft(node.start, `${ssrExportAllKey}(${importId}); +`); + } + } + } + walk(ast, { + onIdentifier(id, parent, parentStack) { + const grandparent = parentStack[1]; + const binding = idToImportMap.get(id.name); + if (!binding) { + return; + } + if (isStaticProperty(parent) && parent.shorthand) { + if (!isNodeInPattern(parent) || isInDestructuringAssignment(parent, parentStack)) { + s.appendLeft(id.end, `: ${binding}`); + } + } else if (parent.type === "PropertyDefinition" && grandparent?.type === "ClassBody" || parent.type === "ClassDeclaration" && id === parent.superClass) { + if (!declaredConst.has(id.name)) { + declaredConst.add(id.name); + const topNode = parentStack[parentStack.length - 2]; + s.prependRight(topNode.start, `const ${id.name} = ${binding}; +`); + } + } else if ( + // don't transform class name identifier + !(parent.type === "ClassExpression" && id === parent.id) + ) { + s.update(id.start, id.end, binding); + } + }, + onImportMeta(node) { + s.update(node.start, node.end, ssrImportMetaKey); + }, + onDynamicImport(node) { + s.update(node.start, node.start + 6, ssrDynamicImportKey); + if (node.type === "ImportExpression" && node.source.type === "Literal") { + dynamicDeps.add(node.source.value); + } + } + }); + let map = s.generateMap({ hires: "boundary" }); + map.sources = [path$n.basename(url)]; + map.sourcesContent = [originalCode]; + if (inMap && inMap.mappings && "sources" in inMap && inMap.sources.length > 0) { + map = combineSourcemaps(url, [ + map, + inMap + ]); + } + return { + code: s.toString(), + map, + deps: [...deps], + dynamicDeps: [...dynamicDeps] + }; +} +const isNodeInPatternWeakSet = /* @__PURE__ */ new WeakSet(); +const setIsNodeInPattern = (node) => isNodeInPatternWeakSet.add(node); +const isNodeInPattern = (node) => isNodeInPatternWeakSet.has(node); +function walk(root, { onIdentifier, onImportMeta, onDynamicImport }) { + const parentStack = []; + const varKindStack = []; + const scopeMap = /* @__PURE__ */ new WeakMap(); + const identifiers = []; + const setScope = (node, name) => { + let scopeIds = scopeMap.get(node); + if (scopeIds && scopeIds.has(name)) { + return; + } + if (!scopeIds) { + scopeIds = /* @__PURE__ */ new Set(); + scopeMap.set(node, scopeIds); + } + scopeIds.add(name); + }; + function isInScope(name, parents) { + return parents.some((node) => node && scopeMap.get(node)?.has(name)); + } + function handlePattern(p, parentScope) { + if (p.type === "Identifier") { + setScope(parentScope, p.name); + } else if (p.type === "RestElement") { + handlePattern(p.argument, parentScope); + } else if (p.type === "ObjectPattern") { + p.properties.forEach((property) => { + if (property.type === "RestElement") { + setScope(parentScope, property.argument.name); + } else { + handlePattern(property.value, parentScope); + } + }); + } else if (p.type === "ArrayPattern") { + p.elements.forEach((element) => { + if (element) { + handlePattern(element, parentScope); + } + }); + } else if (p.type === "AssignmentPattern") { + handlePattern(p.left, parentScope); + } else { + setScope(parentScope, p.name); + } + } + walk$1(root, { + enter(node, parent) { + if (node.type === "ImportDeclaration") { + return this.skip(); + } + if (parent && !(parent.type === "IfStatement" && node === parent.alternate)) { + parentStack.unshift(parent); + } + if (node.type === "VariableDeclaration") { + varKindStack.unshift(node.kind); + } + if (node.type === "MetaProperty" && node.meta.name === "import") { + onImportMeta(node); + } else if (node.type === "ImportExpression") { + onDynamicImport(node); + } + if (node.type === "Identifier") { + if (!isInScope(node.name, parentStack) && isRefIdentifier(node, parent, parentStack)) { + identifiers.push([node, parentStack.slice(0)]); + } + } else if (isFunction$1(node)) { + if (node.type === "FunctionDeclaration") { + const parentScope = findParentScope(parentStack); + if (parentScope) { + setScope(parentScope, node.id.name); + } + } + if (node.type === "FunctionExpression" && node.id) { + setScope(node, node.id.name); + } + node.params.forEach((p) => { + if (p.type === "ObjectPattern" || p.type === "ArrayPattern") { + handlePattern(p, node); + return; + } + walk$1(p.type === "AssignmentPattern" ? p.left : p, { + enter(child, parent2) { + if (parent2?.type === "AssignmentPattern" && parent2?.right === child) { + return this.skip(); + } + if (child.type !== "Identifier") return; + if (isStaticPropertyKey(child, parent2)) return; + if (parent2?.type === "TemplateLiteral" && parent2?.expressions.includes(child) || parent2?.type === "CallExpression" && parent2?.callee === child) { + return; + } + setScope(node, child.name); + } + }); + }); + } else if (node.type === "ClassDeclaration") { + const parentScope = findParentScope(parentStack); + if (parentScope) { + setScope(parentScope, node.id.name); + } + } else if (node.type === "ClassExpression" && node.id) { + setScope(node, node.id.name); + } else if (node.type === "Property" && parent.type === "ObjectPattern") { + setIsNodeInPattern(node); + } else if (node.type === "VariableDeclarator") { + const parentFunction = findParentScope( + parentStack, + varKindStack[0] === "var" + ); + if (parentFunction) { + handlePattern(node.id, parentFunction); + } + } else if (node.type === "CatchClause" && node.param) { + handlePattern(node.param, node); + } + }, + leave(node, parent) { + if (parent && !(parent.type === "IfStatement" && node === parent.alternate)) { + parentStack.shift(); + } + if (node.type === "VariableDeclaration") { + varKindStack.shift(); + } + } + }); + identifiers.forEach(([node, stack]) => { + if (!isInScope(node.name, stack)) onIdentifier(node, stack[0], stack); + }); +} +function isRefIdentifier(id, parent, parentStack) { + if (parent.type === "CatchClause" || (parent.type === "VariableDeclarator" || parent.type === "ClassDeclaration") && parent.id === id) { + return false; + } + if (isFunction$1(parent)) { + if (parent.id === id) { + return false; + } + if (parent.params.includes(id)) { + return false; + } + } + if (parent.type === "MethodDefinition" && !parent.computed) { + return false; + } + if (isStaticPropertyKey(id, parent)) { + return false; + } + if (isNodeInPattern(parent) && parent.value === id) { + return false; + } + if (parent.type === "ArrayPattern" && !isInDestructuringAssignment(parent, parentStack)) { + return false; + } + if (parent.type === "MemberExpression" && parent.property === id && !parent.computed) { + return false; + } + if (parent.type === "ExportSpecifier") { + return false; + } + if (id.name === "arguments") { + return false; + } + return true; +} +const isStaticProperty = (node) => node && node.type === "Property" && !node.computed; +const isStaticPropertyKey = (node, parent) => isStaticProperty(parent) && parent.key === node; +const functionNodeTypeRE = /Function(?:Expression|Declaration)$|Method$/; +function isFunction$1(node) { + return functionNodeTypeRE.test(node.type); +} +const blockNodeTypeRE = /^BlockStatement$|^For(?:In|Of)?Statement$/; +function isBlock(node) { + return blockNodeTypeRE.test(node.type); +} +function findParentScope(parentStack, isVar = false) { + return parentStack.find(isVar ? isFunction$1 : isBlock); +} +function isInDestructuringAssignment(parent, parentStack) { + if (parent && (parent.type === "Property" || parent.type === "ArrayPattern")) { + return parentStack.some((i) => i.type === "AssignmentExpression"); + } + return false; +} + +let offset; +function calculateOffsetOnce() { + if (offset !== void 0) { + return; + } + try { + new Function("throw new Error(1)")(); + } catch (e) { + const match = /:(\d+):\d+\)$/.exec(e.stack.split("\n")[1]); + offset = match ? +match[1] - 1 : 0; + } +} +function ssrRewriteStacktrace(stack, moduleGraph) { + calculateOffsetOnce(); + return stack.split("\n").map((line) => { + return line.replace( + /^ {4}at (?:(\S.*?)\s\()?(.+?):(\d+)(?::(\d+))?\)?/, + (input, varName, id, line2, column) => { + if (!id) return input; + const mod = moduleGraph.idToModuleMap.get(id); + const rawSourceMap = mod?.ssrTransformResult?.map; + if (!rawSourceMap) { + return input; + } + const traced = new TraceMap(rawSourceMap); + const pos = originalPositionFor$1(traced, { + line: Number(line2) - offset, + // stacktrace's column is 1-indexed, but sourcemap's one is 0-indexed + column: Number(column) - 1 + }); + if (!pos.source || pos.line == null || pos.column == null) { + return input; + } + const trimmedVarName = varName.trim(); + const sourceFile = path$n.resolve(path$n.dirname(id), pos.source); + const source = `${sourceFile}:${pos.line}:${pos.column + 1}`; + if (!trimmedVarName || trimmedVarName === "eval") { + return ` at ${source}`; + } else { + return ` at ${trimmedVarName} (${source})`; + } + } + ); + }).join("\n"); +} +function rebindErrorStacktrace(e, stacktrace) { + const { configurable, writable } = Object.getOwnPropertyDescriptor( + e, + "stack" + ); + if (configurable) { + Object.defineProperty(e, "stack", { + value: stacktrace, + enumerable: true, + configurable: true, + writable: true + }); + } else if (writable) { + e.stack = stacktrace; + } +} +const rewroteStacktraces = /* @__PURE__ */ new WeakSet(); +function ssrFixStacktrace(e, moduleGraph) { + if (!e.stack) return; + if (rewroteStacktraces.has(e)) return; + const stacktrace = ssrRewriteStacktrace(e.stack, moduleGraph); + rebindErrorStacktrace(e, stacktrace); + rewroteStacktraces.add(e); +} + +const pendingModules = /* @__PURE__ */ new Map(); +const pendingModuleDependencyGraph = /* @__PURE__ */ new Map(); +const importErrors = /* @__PURE__ */ new WeakMap(); +async function ssrLoadModule(url, server, fixStacktrace) { + url = unwrapId$1(url); + const pending = pendingModules.get(url); + if (pending) { + return pending; + } + const modulePromise = instantiateModule(url, server, fixStacktrace); + pendingModules.set(url, modulePromise); + modulePromise.catch(() => { + }).finally(() => { + pendingModules.delete(url); + }); + return modulePromise; +} +async function instantiateModule(url, server, fixStacktrace) { + const { moduleGraph } = server; + const mod = await moduleGraph.ensureEntryFromUrl(url, true); + if (mod.ssrError) { + throw mod.ssrError; + } + if (mod.ssrModule) { + return mod.ssrModule; + } + const result = mod.ssrTransformResult || await transformRequest(url, server, { ssr: true }); + if (!result) { + throw new Error(`failed to load module for ssr: ${url}`); + } + const ssrModule = { + [Symbol.toStringTag]: "Module" + }; + Object.defineProperty(ssrModule, "__esModule", { value: true }); + mod.ssrModule = ssrModule; + const osNormalizedFilename = isWindows$3 ? path$n.resolve(mod.file) : mod.file; + const ssrImportMeta = { + dirname: path$n.dirname(osNormalizedFilename), + filename: osNormalizedFilename, + // The filesystem URL, matching native Node.js modules + url: pathToFileURL(mod.file).toString() + }; + const { + isProduction, + resolve: { dedupe, preserveSymlinks }, + root, + ssr + } = server.config; + const overrideConditions = ssr.resolve?.externalConditions || []; + const resolveOptions = { + mainFields: ["main"], + conditions: [], + overrideConditions: [...overrideConditions, "production", "development"], + extensions: [".js", ".cjs", ".json"], + dedupe, + preserveSymlinks, + isBuild: false, + isProduction, + root, + ssrConfig: ssr, + legacyProxySsrExternalModules: server.config.legacy?.proxySsrExternalModules, + packageCache: server.config.packageCache + }; + const ssrImport = async (dep, metadata) => { + try { + if (dep[0] !== "." && dep[0] !== "/") { + return await nodeImport(dep, mod.file, resolveOptions, metadata); + } + dep = unwrapId$1(dep); + if (!metadata?.isDynamicImport) { + addPendingModuleDependency(url, dep); + if (checkModuleDependencyExists(dep, url)) { + const depSsrModule = moduleGraph.urlToModuleMap.get(dep)?.ssrModule; + if (!depSsrModule) { + throw new Error( + "[vite] The dependency module is not yet fully initialized due to circular dependency. This is a bug in Vite SSR" + ); + } + return depSsrModule; + } + } + return ssrLoadModule(dep, server, fixStacktrace); + } catch (err) { + importErrors.set(err, { importee: dep }); + throw err; + } + }; + const ssrDynamicImport = (dep) => { + if (dep[0] === ".") { + dep = path$n.posix.resolve(path$n.dirname(url), dep); + } + return ssrImport(dep, { isDynamicImport: true }); + }; + function ssrExportAll(sourceModule) { + for (const key in sourceModule) { + if (key !== "default" && key !== "__esModule") { + Object.defineProperty(ssrModule, key, { + enumerable: true, + configurable: true, + get() { + return sourceModule[key]; + } + }); + } + } + } + let sourceMapSuffix = ""; + if (result.map && "version" in result.map) { + const moduleSourceMap = Object.assign({}, result.map, { + mappings: ";".repeat(asyncFunctionDeclarationPaddingLineCount) + result.map.mappings + }); + sourceMapSuffix = ` +//# ${SOURCEMAPPING_URL}=${genSourceMapUrl(moduleSourceMap)}`; + } + try { + const initModule = new AsyncFunction( + ssrModuleExportsKey, + ssrImportMetaKey, + ssrImportKey, + ssrDynamicImportKey, + ssrExportAllKey, + '"use strict";' + result.code + ` +//# sourceURL=${mod.id}${sourceMapSuffix}` + ); + await initModule( + ssrModule, + ssrImportMeta, + ssrImport, + ssrDynamicImport, + ssrExportAll + ); + } catch (e) { + mod.ssrError = e; + const errorData = importErrors.get(e); + if (e.stack && fixStacktrace) { + ssrFixStacktrace(e, moduleGraph); + } + server.config.logger.error( + colors$1.red( + `Error when evaluating SSR module ${url}:` + (errorData?.importee ? ` failed to import "${errorData.importee}"` : "") + ` +|- ${e.stack} +` + ), + { + timestamp: true, + clear: server.config.clearScreen, + error: e + } + ); + throw e; + } finally { + pendingModuleDependencyGraph.delete(url); + } + return Object.freeze(ssrModule); +} +function addPendingModuleDependency(originUrl, depUrl) { + if (pendingModuleDependencyGraph.has(originUrl)) { + pendingModuleDependencyGraph.get(originUrl).add(depUrl); + } else { + pendingModuleDependencyGraph.set(originUrl, /* @__PURE__ */ new Set([depUrl])); + } +} +function checkModuleDependencyExists(originUrl, targetUrl) { + const visited = /* @__PURE__ */ new Set(); + const stack = [originUrl]; + while (stack.length) { + const currentUrl = stack.pop(); + if (currentUrl === targetUrl) { + return true; + } + if (!visited.has(currentUrl)) { + visited.add(currentUrl); + const dependencies = pendingModuleDependencyGraph.get(currentUrl); + if (dependencies) { + for (const depUrl of dependencies) { + if (!visited.has(depUrl)) { + stack.push(depUrl); + } + } + } + } + } + return false; +} +async function nodeImport(id, importer, resolveOptions, metadata) { + let url; + let filePath; + if (id.startsWith("data:") || isExternalUrl(id) || isBuiltin(id)) { + url = id; + } else { + const resolved = tryNodeResolve( + id, + importer, + { ...resolveOptions, tryEsmOnly: true }, + false, + void 0, + true + ); + if (!resolved) { + const err = new Error( + `Cannot find module '${id}' imported from '${importer}'` + ); + err.code = "ERR_MODULE_NOT_FOUND"; + throw err; + } + filePath = resolved.id; + url = pathToFileURL(resolved.id).toString(); + } + const mod = await import(url); + if (resolveOptions.legacyProxySsrExternalModules) { + return proxyESM(mod); + } else if (filePath) { + analyzeImportedModDifference( + mod, + id, + isFilePathESM(filePath, resolveOptions.packageCache) ? "module" : void 0, + metadata + ); + return mod; + } else { + return mod; + } +} +function proxyESM(mod) { + if (isPrimitive(mod)) return { default: mod }; + let defaultExport = "default" in mod ? mod.default : mod; + if (!isPrimitive(defaultExport) && "__esModule" in defaultExport) { + mod = defaultExport; + if ("default" in defaultExport) { + defaultExport = defaultExport.default; + } + } + return new Proxy(mod, { + get(mod2, prop) { + if (prop === "default") return defaultExport; + return mod2[prop] ?? defaultExport?.[prop]; + } + }); +} +function isPrimitive(value) { + return !value || typeof value !== "object" && typeof value !== "function"; +} + +var isWsl$2 = {exports: {}}; + +const fs$3 = require$$0__default; + +let isDocker$2; + +function hasDockerEnv() { + try { + fs$3.statSync('/.dockerenv'); + return true; + } catch (_) { + return false; + } +} + +function hasDockerCGroup() { + try { + return fs$3.readFileSync('/proc/self/cgroup', 'utf8').includes('docker'); + } catch (_) { + return false; + } +} + +var isDocker_1 = () => { + if (isDocker$2 === undefined) { + isDocker$2 = hasDockerEnv() || hasDockerCGroup(); + } + + return isDocker$2; +}; + +const os = require$$2; +const fs$2 = require$$0__default; +const isDocker$1 = isDocker_1; + +const isWsl$1 = () => { + if (process.platform !== 'linux') { + return false; + } + + if (os.release().toLowerCase().includes('microsoft')) { + if (isDocker$1()) { + return false; + } + + return true; + } + + try { + return fs$2.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft') ? + !isDocker$1() : false; + } catch (_) { + return false; + } +}; + +if (process.env.__IS_WSL_TEST__) { + isWsl$2.exports = isWsl$1; +} else { + isWsl$2.exports = isWsl$1(); +} + +var isWslExports = isWsl$2.exports; + +var defineLazyProp = (object, propertyName, fn) => { + const define = value => Object.defineProperty(object, propertyName, {value, enumerable: true, writable: true}); + + Object.defineProperty(object, propertyName, { + configurable: true, + enumerable: true, + get() { + const result = fn(); + define(result); + return result; + }, + set(value) { + define(value); + } + }); + + return object; +}; + +const path$3 = require$$0$4; +const childProcess = require$$2$1; +const {promises: fs$1, constants: fsConstants} = require$$0__default; +const isWsl = isWslExports; +const isDocker = isDocker_1; +const defineLazyProperty = defineLazyProp; + +// Path to included `xdg-open`. +const localXdgOpenPath = path$3.join(__dirname, 'xdg-open'); + +const {platform, arch} = process; + +// Podman detection +const hasContainerEnv = () => { + try { + fs$1.statSync('/run/.containerenv'); + return true; + } catch { + return false; + } +}; + +let cachedResult; +function isInsideContainer() { + if (cachedResult === undefined) { + cachedResult = hasContainerEnv() || isDocker(); + } + + return cachedResult; +} + +/** +Get the mount point for fixed drives in WSL. + +@inner +@returns {string} The mount point. +*/ +const getWslDrivesMountPoint = (() => { + // Default value for "root" param + // according to https://docs.microsoft.com/en-us/windows/wsl/wsl-config + const defaultMountPoint = '/mnt/'; + + let mountPoint; + + return async function () { + if (mountPoint) { + // Return memoized mount point value + return mountPoint; + } + + const configFilePath = '/etc/wsl.conf'; + + let isConfigFileExists = false; + try { + await fs$1.access(configFilePath, fsConstants.F_OK); + isConfigFileExists = true; + } catch {} + + if (!isConfigFileExists) { + return defaultMountPoint; + } + + const configContent = await fs$1.readFile(configFilePath, {encoding: 'utf8'}); + const configMountPoint = /(?.*)/g.exec(configContent); + + if (!configMountPoint) { + return defaultMountPoint; + } + + mountPoint = configMountPoint.groups.mountPoint.trim(); + mountPoint = mountPoint.endsWith('/') ? mountPoint : `${mountPoint}/`; + + return mountPoint; + }; +})(); + +const pTryEach = async (array, mapper) => { + let latestError; + + for (const item of array) { + try { + return await mapper(item); // eslint-disable-line no-await-in-loop + } catch (error) { + latestError = error; + } + } + + throw latestError; +}; + +const baseOpen = async options => { + options = { + wait: false, + background: false, + newInstance: false, + allowNonzeroExitCode: false, + ...options + }; + + if (Array.isArray(options.app)) { + return pTryEach(options.app, singleApp => baseOpen({ + ...options, + app: singleApp + })); + } + + let {name: app, arguments: appArguments = []} = options.app || {}; + appArguments = [...appArguments]; + + if (Array.isArray(app)) { + return pTryEach(app, appName => baseOpen({ + ...options, + app: { + name: appName, + arguments: appArguments + } + })); + } + + let command; + const cliArguments = []; + const childProcessOptions = {}; + + if (platform === 'darwin') { + command = 'open'; + + if (options.wait) { + cliArguments.push('--wait-apps'); + } + + if (options.background) { + cliArguments.push('--background'); + } + + if (options.newInstance) { + cliArguments.push('--new'); + } + + if (app) { + cliArguments.push('-a', app); + } + } else if (platform === 'win32' || (isWsl && !isInsideContainer() && !app)) { + const mountPoint = await getWslDrivesMountPoint(); + + command = isWsl ? + `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe` : + `${process.env.SYSTEMROOT}\\System32\\WindowsPowerShell\\v1.0\\powershell`; + + cliArguments.push( + '-NoProfile', + '-NonInteractive', + '–ExecutionPolicy', + 'Bypass', + '-EncodedCommand' + ); + + if (!isWsl) { + childProcessOptions.windowsVerbatimArguments = true; + } + + const encodedArguments = ['Start']; + + if (options.wait) { + encodedArguments.push('-Wait'); + } + + if (app) { + // Double quote with double quotes to ensure the inner quotes are passed through. + // Inner quotes are delimited for PowerShell interpretation with backticks. + encodedArguments.push(`"\`"${app}\`""`, '-ArgumentList'); + if (options.target) { + appArguments.unshift(options.target); + } + } else if (options.target) { + encodedArguments.push(`"${options.target}"`); + } + + if (appArguments.length > 0) { + appArguments = appArguments.map(arg => `"\`"${arg}\`""`); + encodedArguments.push(appArguments.join(',')); + } + + // Using Base64-encoded command, accepted by PowerShell, to allow special characters. + options.target = Buffer.from(encodedArguments.join(' '), 'utf16le').toString('base64'); + } else { + if (app) { + command = app; + } else { + // When bundled by Webpack, there's no actual package file path and no local `xdg-open`. + const isBundled = !__dirname || __dirname === '/'; + + // Check if local `xdg-open` exists and is executable. + let exeLocalXdgOpen = false; + try { + await fs$1.access(localXdgOpenPath, fsConstants.X_OK); + exeLocalXdgOpen = true; + } catch {} + + const useSystemXdgOpen = process.versions.electron || + platform === 'android' || isBundled || !exeLocalXdgOpen; + command = useSystemXdgOpen ? 'xdg-open' : localXdgOpenPath; + } + + if (appArguments.length > 0) { + cliArguments.push(...appArguments); + } + + if (!options.wait) { + // `xdg-open` will block the process unless stdio is ignored + // and it's detached from the parent even if it's unref'd. + childProcessOptions.stdio = 'ignore'; + childProcessOptions.detached = true; + } + } + + if (options.target) { + cliArguments.push(options.target); + } + + if (platform === 'darwin' && appArguments.length > 0) { + cliArguments.push('--args', ...appArguments); + } + + const subprocess = childProcess.spawn(command, cliArguments, childProcessOptions); + + if (options.wait) { + return new Promise((resolve, reject) => { + subprocess.once('error', reject); + + subprocess.once('close', exitCode => { + if (!options.allowNonzeroExitCode && exitCode > 0) { + reject(new Error(`Exited with code ${exitCode}`)); + return; + } + + resolve(subprocess); + }); + }); + } + + subprocess.unref(); + + return subprocess; +}; + +const open = (target, options) => { + if (typeof target !== 'string') { + throw new TypeError('Expected a `target`'); + } + + return baseOpen({ + ...options, + target + }); +}; + +const openApp = (name, options) => { + if (typeof name !== 'string') { + throw new TypeError('Expected a `name`'); + } + + const {arguments: appArguments = []} = options || {}; + if (appArguments !== undefined && appArguments !== null && !Array.isArray(appArguments)) { + throw new TypeError('Expected `appArguments` as Array type'); + } + + return baseOpen({ + ...options, + app: { + name, + arguments: appArguments + } + }); +}; + +function detectArchBinary(binary) { + if (typeof binary === 'string' || Array.isArray(binary)) { + return binary; + } + + const {[arch]: archBinary} = binary; + + if (!archBinary) { + throw new Error(`${arch} is not supported`); + } + + return archBinary; +} + +function detectPlatformBinary({[platform]: platformBinary}, {wsl}) { + if (wsl && isWsl) { + return detectArchBinary(wsl); + } + + if (!platformBinary) { + throw new Error(`${platform} is not supported`); + } + + return detectArchBinary(platformBinary); +} + +const apps = {}; + +defineLazyProperty(apps, 'chrome', () => detectPlatformBinary({ + darwin: 'google chrome', + win32: 'chrome', + linux: ['google-chrome', 'google-chrome-stable', 'chromium'] +}, { + wsl: { + ia32: '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe', + x64: ['/mnt/c/Program Files/Google/Chrome/Application/chrome.exe', '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe'] + } +})); + +defineLazyProperty(apps, 'firefox', () => detectPlatformBinary({ + darwin: 'firefox', + win32: 'C:\\Program Files\\Mozilla Firefox\\firefox.exe', + linux: 'firefox' +}, { + wsl: '/mnt/c/Program Files/Mozilla Firefox/firefox.exe' +})); + +defineLazyProperty(apps, 'edge', () => detectPlatformBinary({ + darwin: 'microsoft edge', + win32: 'msedge', + linux: ['microsoft-edge', 'microsoft-edge-dev'] +}, { + wsl: '/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe' +})); + +open.apps = apps; +open.openApp = openApp; + +var open_1 = open; + +var open$1 = /*@__PURE__*/getDefaultExportFromCjs(open_1); + +var crossSpawn = {exports: {}}; + +var windows; +var hasRequiredWindows; + +function requireWindows () { + if (hasRequiredWindows) return windows; + hasRequiredWindows = 1; + windows = isexe; + isexe.sync = sync; + + var fs = require$$0__default; + + function checkPathExt (path, options) { + var pathext = options.pathExt !== undefined ? + options.pathExt : process.env.PATHEXT; + + if (!pathext) { + return true + } + + pathext = pathext.split(';'); + if (pathext.indexOf('') !== -1) { + return true + } + for (var i = 0; i < pathext.length; i++) { + var p = pathext[i].toLowerCase(); + if (p && path.substr(-p.length).toLowerCase() === p) { + return true + } + } + return false + } + + function checkStat (stat, path, options) { + if (!stat.isSymbolicLink() && !stat.isFile()) { + return false + } + return checkPathExt(path, options) + } + + function isexe (path, options, cb) { + fs.stat(path, function (er, stat) { + cb(er, er ? false : checkStat(stat, path, options)); + }); + } + + function sync (path, options) { + return checkStat(fs.statSync(path), path, options) + } + return windows; +} + +var mode; +var hasRequiredMode; + +function requireMode () { + if (hasRequiredMode) return mode; + hasRequiredMode = 1; + mode = isexe; + isexe.sync = sync; + + var fs = require$$0__default; + + function isexe (path, options, cb) { + fs.stat(path, function (er, stat) { + cb(er, er ? false : checkStat(stat, options)); + }); + } + + function sync (path, options) { + return checkStat(fs.statSync(path), options) + } + + function checkStat (stat, options) { + return stat.isFile() && checkMode(stat, options) + } + + function checkMode (stat, options) { + var mod = stat.mode; + var uid = stat.uid; + var gid = stat.gid; + + var myUid = options.uid !== undefined ? + options.uid : process.getuid && process.getuid(); + var myGid = options.gid !== undefined ? + options.gid : process.getgid && process.getgid(); + + var u = parseInt('100', 8); + var g = parseInt('010', 8); + var o = parseInt('001', 8); + var ug = u | g; + + var ret = (mod & o) || + (mod & g) && gid === myGid || + (mod & u) && uid === myUid || + (mod & ug) && myUid === 0; + + return ret + } + return mode; +} + +var core; +if (process.platform === 'win32' || commonjsGlobal.TESTING_WINDOWS) { + core = requireWindows(); +} else { + core = requireMode(); +} + +var isexe_1 = isexe$1; +isexe$1.sync = sync; + +function isexe$1 (path, options, cb) { + if (typeof options === 'function') { + cb = options; + options = {}; + } + + if (!cb) { + if (typeof Promise !== 'function') { + throw new TypeError('callback not provided') + } + + return new Promise(function (resolve, reject) { + isexe$1(path, options || {}, function (er, is) { + if (er) { + reject(er); + } else { + resolve(is); + } + }); + }) + } + + core(path, options || {}, function (er, is) { + // ignore EACCES because that just means we aren't allowed to run it + if (er) { + if (er.code === 'EACCES' || options && options.ignoreErrors) { + er = null; + is = false; + } + } + cb(er, is); + }); +} + +function sync (path, options) { + // my kingdom for a filtered catch + try { + return core.sync(path, options || {}) + } catch (er) { + if (options && options.ignoreErrors || er.code === 'EACCES') { + return false + } else { + throw er + } + } +} + +const isWindows = process.platform === 'win32' || + process.env.OSTYPE === 'cygwin' || + process.env.OSTYPE === 'msys'; + +const path$2 = require$$0$4; +const COLON = isWindows ? ';' : ':'; +const isexe = isexe_1; + +const getNotFoundError = (cmd) => + Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' }); + +const getPathInfo = (cmd, opt) => { + const colon = opt.colon || COLON; + + // If it has a slash, then we don't bother searching the pathenv. + // just check the file itself, and that's it. + const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [''] + : ( + [ + // windows always checks the cwd first + ...(isWindows ? [process.cwd()] : []), + ...(opt.path || process.env.PATH || + /* istanbul ignore next: very unusual */ '').split(colon), + ] + ); + const pathExtExe = isWindows + ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM' + : ''; + const pathExt = isWindows ? pathExtExe.split(colon) : ['']; + + if (isWindows) { + if (cmd.indexOf('.') !== -1 && pathExt[0] !== '') + pathExt.unshift(''); + } + + return { + pathEnv, + pathExt, + pathExtExe, + } +}; + +const which$1 = (cmd, opt, cb) => { + if (typeof opt === 'function') { + cb = opt; + opt = {}; + } + if (!opt) + opt = {}; + + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt); + const found = []; + + const step = i => new Promise((resolve, reject) => { + if (i === pathEnv.length) + return opt.all && found.length ? resolve(found) + : reject(getNotFoundError(cmd)) + + const ppRaw = pathEnv[i]; + const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw; + + const pCmd = path$2.join(pathPart, cmd); + const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd + : pCmd; + + resolve(subStep(p, i, 0)); + }); + + const subStep = (p, i, ii) => new Promise((resolve, reject) => { + if (ii === pathExt.length) + return resolve(step(i + 1)) + const ext = pathExt[ii]; + isexe(p + ext, { pathExt: pathExtExe }, (er, is) => { + if (!er && is) { + if (opt.all) + found.push(p + ext); + else + return resolve(p + ext) + } + return resolve(subStep(p, i, ii + 1)) + }); + }); + + return cb ? step(0).then(res => cb(null, res), cb) : step(0) +}; + +const whichSync = (cmd, opt) => { + opt = opt || {}; + + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt); + const found = []; + + for (let i = 0; i < pathEnv.length; i ++) { + const ppRaw = pathEnv[i]; + const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw; + + const pCmd = path$2.join(pathPart, cmd); + const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd + : pCmd; + + for (let j = 0; j < pathExt.length; j ++) { + const cur = p + pathExt[j]; + try { + const is = isexe.sync(cur, { pathExt: pathExtExe }); + if (is) { + if (opt.all) + found.push(cur); + else + return cur + } + } catch (ex) {} + } + } + + if (opt.all && found.length) + return found + + if (opt.nothrow) + return null + + throw getNotFoundError(cmd) +}; + +var which_1 = which$1; +which$1.sync = whichSync; + +var pathKey$1 = {exports: {}}; + +const pathKey = (options = {}) => { + const environment = options.env || process.env; + const platform = options.platform || process.platform; + + if (platform !== 'win32') { + return 'PATH'; + } + + return Object.keys(environment).reverse().find(key => key.toUpperCase() === 'PATH') || 'Path'; +}; + +pathKey$1.exports = pathKey; +// TODO: Remove this for the next major release +pathKey$1.exports.default = pathKey; + +var pathKeyExports = pathKey$1.exports; + +const path$1 = require$$0$4; +const which = which_1; +const getPathKey = pathKeyExports; + +function resolveCommandAttempt(parsed, withoutPathExt) { + const env = parsed.options.env || process.env; + const cwd = process.cwd(); + const hasCustomCwd = parsed.options.cwd != null; + // Worker threads do not have process.chdir() + const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined && !process.chdir.disabled; + + // If a custom `cwd` was specified, we need to change the process cwd + // because `which` will do stat calls but does not support a custom cwd + if (shouldSwitchCwd) { + try { + process.chdir(parsed.options.cwd); + } catch (err) { + /* Empty */ + } + } + + let resolved; + + try { + resolved = which.sync(parsed.command, { + path: env[getPathKey({ env })], + pathExt: withoutPathExt ? path$1.delimiter : undefined, + }); + } catch (e) { + /* Empty */ + } finally { + if (shouldSwitchCwd) { + process.chdir(cwd); + } + } + + // If we successfully resolved, ensure that an absolute path is returned + // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it + if (resolved) { + resolved = path$1.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved); + } + + return resolved; +} + +function resolveCommand$1(parsed) { + return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true); +} + +var resolveCommand_1 = resolveCommand$1; + +var _escape = {}; + +// See http://www.robvanderwoude.com/escapechars.php +const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g; + +function escapeCommand(arg) { + // Escape meta chars + arg = arg.replace(metaCharsRegExp, '^$1'); + + return arg; +} + +function escapeArgument(arg, doubleEscapeMetaChars) { + // Convert to string + arg = `${arg}`; + + // Algorithm below is based on https://qntm.org/cmd + + // Sequence of backslashes followed by a double quote: + // double up all the backslashes and escape the double quote + arg = arg.replace(/(\\*)"/g, '$1$1\\"'); + + // Sequence of backslashes followed by the end of the string + // (which will become a double quote later): + // double up all the backslashes + arg = arg.replace(/(\\*)$/, '$1$1'); + + // All other backslashes occur literally + + // Quote the whole thing: + arg = `"${arg}"`; + + // Escape meta chars + arg = arg.replace(metaCharsRegExp, '^$1'); + + // Double escape meta chars if necessary + if (doubleEscapeMetaChars) { + arg = arg.replace(metaCharsRegExp, '^$1'); + } + + return arg; +} + +_escape.command = escapeCommand; +_escape.argument = escapeArgument; + +var shebangRegex$1 = /^#!(.*)/; + +const shebangRegex = shebangRegex$1; + +var shebangCommand$1 = (string = '') => { + const match = string.match(shebangRegex); + + if (!match) { + return null; + } + + const [path, argument] = match[0].replace(/#! ?/, '').split(' '); + const binary = path.split('/').pop(); + + if (binary === 'env') { + return argument; + } + + return argument ? `${binary} ${argument}` : binary; +}; + +const fs = require$$0__default; +const shebangCommand = shebangCommand$1; + +function readShebang$1(command) { + // Read the first 150 bytes from the file + const size = 150; + const buffer = Buffer.alloc(size); + + let fd; + + try { + fd = fs.openSync(command, 'r'); + fs.readSync(fd, buffer, 0, size, 0); + fs.closeSync(fd); + } catch (e) { /* Empty */ } + + // Attempt to extract shebang (null is returned if not a shebang) + return shebangCommand(buffer.toString()); +} + +var readShebang_1 = readShebang$1; + +const path = require$$0$4; +const resolveCommand = resolveCommand_1; +const escape$1 = _escape; +const readShebang = readShebang_1; + +const isWin$1 = process.platform === 'win32'; +const isExecutableRegExp = /\.(?:com|exe)$/i; +const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i; + +function detectShebang(parsed) { + parsed.file = resolveCommand(parsed); + + const shebang = parsed.file && readShebang(parsed.file); + + if (shebang) { + parsed.args.unshift(parsed.file); + parsed.command = shebang; + + return resolveCommand(parsed); + } + + return parsed.file; +} + +function parseNonShell(parsed) { + if (!isWin$1) { + return parsed; + } + + // Detect & add support for shebangs + const commandFile = detectShebang(parsed); + + // We don't need a shell if the command filename is an executable + const needsShell = !isExecutableRegExp.test(commandFile); + + // If a shell is required, use cmd.exe and take care of escaping everything correctly + // Note that `forceShell` is an hidden option used only in tests + if (parsed.options.forceShell || needsShell) { + // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/` + // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument + // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called, + // we need to double escape them + const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); + + // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar) + // This is necessary otherwise it will always fail with ENOENT in those cases + parsed.command = path.normalize(parsed.command); + + // Escape command & arguments + parsed.command = escape$1.command(parsed.command); + parsed.args = parsed.args.map((arg) => escape$1.argument(arg, needsDoubleEscapeMetaChars)); + + const shellCommand = [parsed.command].concat(parsed.args).join(' '); + + parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`]; + parsed.command = process.env.comspec || 'cmd.exe'; + parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped + } + + return parsed; +} + +function parse$4(command, args, options) { + // Normalize arguments, similar to nodejs + if (args && !Array.isArray(args)) { + options = args; + args = null; + } + + args = args ? args.slice(0) : []; // Clone array to avoid changing the original + options = Object.assign({}, options); // Clone object to avoid changing the original + + // Build our parsed object + const parsed = { + command, + args, + options, + file: undefined, + original: { + command, + args, + }, + }; + + // Delegate further parsing to shell or non-shell + return options.shell ? parsed : parseNonShell(parsed); +} + +var parse_1 = parse$4; + +const isWin = process.platform === 'win32'; + +function notFoundError(original, syscall) { + return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), { + code: 'ENOENT', + errno: 'ENOENT', + syscall: `${syscall} ${original.command}`, + path: original.command, + spawnargs: original.args, + }); +} + +function hookChildProcess(cp, parsed) { + if (!isWin) { + return; + } + + const originalEmit = cp.emit; + + cp.emit = function (name, arg1) { + // If emitting "exit" event and exit code is 1, we need to check if + // the command exists and emit an "error" instead + // See https://github.com/IndigoUnited/node-cross-spawn/issues/16 + if (name === 'exit') { + const err = verifyENOENT(arg1, parsed); + + if (err) { + return originalEmit.call(cp, 'error', err); + } + } + + return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params + }; +} + +function verifyENOENT(status, parsed) { + if (isWin && status === 1 && !parsed.file) { + return notFoundError(parsed.original, 'spawn'); + } + + return null; +} + +function verifyENOENTSync(status, parsed) { + if (isWin && status === 1 && !parsed.file) { + return notFoundError(parsed.original, 'spawnSync'); + } + + return null; +} + +var enoent$1 = { + hookChildProcess, + verifyENOENT, + verifyENOENTSync, + notFoundError, +}; + +const cp = require$$2$1; +const parse$3 = parse_1; +const enoent = enoent$1; + +function spawn(command, args, options) { + // Parse the arguments + const parsed = parse$3(command, args, options); + + // Spawn the child process + const spawned = cp.spawn(parsed.command, parsed.args, parsed.options); + + // Hook into child process "exit" event to emit an error if the command + // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 + enoent.hookChildProcess(spawned, parsed); + + return spawned; +} + +function spawnSync(command, args, options) { + // Parse the arguments + const parsed = parse$3(command, args, options); + + // Spawn the child process + const result = cp.spawnSync(parsed.command, parsed.args, parsed.options); + + // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 + result.error = result.error || enoent.verifyENOENTSync(result.status, parsed); + + return result; +} + +crossSpawn.exports = spawn; +crossSpawn.exports.spawn = spawn; +crossSpawn.exports.sync = spawnSync; + +crossSpawn.exports._parse = parse$3; +crossSpawn.exports._enoent = enoent; + +var crossSpawnExports = crossSpawn.exports; +var spawn$1 = /*@__PURE__*/getDefaultExportFromCjs(crossSpawnExports); + +function openBrowser(url, opt, logger) { + const browser = process.env.BROWSER || ""; + if (browser.toLowerCase().endsWith(".js")) { + executeNodeScript(browser, url, logger); + } else if (browser.toLowerCase() !== "none") { + const browserArgs = process.env.BROWSER_ARGS ? process.env.BROWSER_ARGS.split(" ") : []; + startBrowserProcess(browser, browserArgs, url, logger); + } +} +function executeNodeScript(scriptPath, url, logger) { + const extraArgs = process.argv.slice(2); + const child = spawn$1(process.execPath, [scriptPath, ...extraArgs, url], { + stdio: "inherit" + }); + child.on("close", (code) => { + if (code !== 0) { + logger.error( + colors$1.red( + ` +The script specified as BROWSER environment variable failed. + +${colors$1.cyan( + scriptPath + )} exited with code ${code}.` + ), + { error: null } + ); + } + }); +} +const supportedChromiumBrowsers = [ + "Google Chrome Canary", + "Google Chrome Dev", + "Google Chrome Beta", + "Google Chrome", + "Microsoft Edge", + "Brave Browser", + "Vivaldi", + "Chromium" +]; +async function startBrowserProcess(browser, browserArgs, url, logger) { + const preferredOSXBrowser = browser === "google chrome" ? "Google Chrome" : browser; + const shouldTryOpenChromeWithAppleScript = process.platform === "darwin" && (!preferredOSXBrowser || supportedChromiumBrowsers.includes(preferredOSXBrowser)); + if (shouldTryOpenChromeWithAppleScript) { + try { + const ps = await execAsync("ps cax"); + const openedBrowser = preferredOSXBrowser && ps.includes(preferredOSXBrowser) ? preferredOSXBrowser : supportedChromiumBrowsers.find((b) => ps.includes(b)); + if (openedBrowser) { + await execAsync( + `osascript openChrome.applescript "${encodeURI( + url + )}" "${openedBrowser}"`, + { + cwd: join$2(VITE_PACKAGE_DIR, "bin") + } + ); + return true; + } + } catch (err) { + } + } + if (process.platform === "darwin" && browser === "open") { + browser = void 0; + } + try { + const options = browser ? { app: { name: browser, arguments: browserArgs } } : {}; + new Promise((_, reject) => { + open$1(url, options).then((subprocess) => { + subprocess.on("error", reject); + }).catch(reject); + }).catch((err) => { + logger.error(err.stack || err.message); + }); + return true; + } catch (err) { + return false; + } +} +function execAsync(command, options) { + return new Promise((resolve, reject) => { + exec(command, options, (error, stdout) => { + if (error) { + reject(error); + } else { + resolve(stdout.toString()); + } + }); + }); +} + +function bindCLIShortcuts(server, opts) { + if (!server.httpServer || !process.stdin.isTTY || process.env.CI) { + return; + } + const isDev = isDevServer(server); + if (isDev) { + server._shortcutsOptions = opts; + } + if (opts?.print) { + server.config.logger.info( + colors$1.dim(colors$1.green(" \u279C")) + colors$1.dim(" press ") + colors$1.bold("h + enter") + colors$1.dim(" to show help") + ); + } + const shortcuts = (opts?.customShortcuts ?? []).concat( + isDev ? BASE_DEV_SHORTCUTS : BASE_PREVIEW_SHORTCUTS + ); + let actionRunning = false; + const onInput = async (input) => { + if (actionRunning) return; + if (input === "h") { + const loggedKeys = /* @__PURE__ */ new Set(); + server.config.logger.info("\n Shortcuts"); + for (const shortcut2 of shortcuts) { + if (loggedKeys.has(shortcut2.key)) continue; + loggedKeys.add(shortcut2.key); + if (shortcut2.action == null) continue; + server.config.logger.info( + colors$1.dim(" press ") + colors$1.bold(`${shortcut2.key} + enter`) + colors$1.dim(` to ${shortcut2.description}`) + ); + } + return; + } + const shortcut = shortcuts.find((shortcut2) => shortcut2.key === input); + if (!shortcut || shortcut.action == null) return; + actionRunning = true; + await shortcut.action(server); + actionRunning = false; + }; + const rl = readline.createInterface({ input: process.stdin }); + rl.on("line", onInput); + server.httpServer.on("close", () => rl.close()); +} +const BASE_DEV_SHORTCUTS = [ + { + key: "r", + description: "restart the server", + async action(server) { + await restartServerWithUrls(server); + } + }, + { + key: "u", + description: "show server url", + action(server) { + server.config.logger.info(""); + server.printUrls(); + } + }, + { + key: "o", + description: "open in browser", + action(server) { + server.openBrowser(); + } + }, + { + key: "c", + description: "clear console", + action(server) { + server.config.logger.clearScreen("error"); + } + }, + { + key: "q", + description: "quit", + async action(server) { + try { + await server.close(); + } finally { + process.exit(); + } + } + } +]; +const BASE_PREVIEW_SHORTCUTS = [ + { + key: "o", + description: "open in browser", + action(server) { + const url = server.resolvedUrls?.local[0] ?? server.resolvedUrls?.network[0]; + if (url) { + openBrowser(url, true, server.config.logger); + } else { + server.config.logger.warn("No URL available to open in browser"); + } + } + }, + { + key: "q", + description: "quit", + async action(server) { + try { + await server.close(); + } finally { + process.exit(); + } + } + } +]; + +function getResolvedOutDirs(root, outDir, outputOptions) { + const resolvedOutDir = path$n.resolve(root, outDir); + if (!outputOptions) return /* @__PURE__ */ new Set([resolvedOutDir]); + return new Set( + arraify(outputOptions).map( + ({ dir }) => dir ? path$n.resolve(root, dir) : resolvedOutDir + ) + ); +} +function resolveEmptyOutDir(emptyOutDir, root, outDirs, logger) { + if (emptyOutDir != null) return emptyOutDir; + for (const outDir of outDirs) { + if (!normalizePath$3(outDir).startsWith(withTrailingSlash(root))) { + logger?.warn( + colors$1.yellow( + ` +${colors$1.bold(`(!)`)} outDir ${colors$1.white( + colors$1.dim(outDir) + )} is not inside project root and will not be emptied. +Use --emptyOutDir to override. +` + ) + ); + return false; + } + } + return true; +} +function resolveChokidarOptions(options, resolvedOutDirs, emptyOutDir, cacheDir) { + const { ignored: ignoredList, ...otherOptions } = options ?? {}; + const ignored = [ + "**/.git/**", + "**/node_modules/**", + "**/test-results/**", + // Playwright + glob.escapePath(cacheDir) + "/**", + ...arraify(ignoredList || []) + ]; + if (emptyOutDir) { + ignored.push( + ...[...resolvedOutDirs].map((outDir) => glob.escapePath(outDir) + "/**") + ); + } + const resolvedWatchOptions = { + ignored, + ignoreInitial: true, + ignorePermissionErrors: true, + ...otherOptions + }; + return resolvedWatchOptions; +} +class NoopWatcher extends EventEmitter$4 { + constructor(options) { + super(); + this.options = options; + } + add() { + return this; + } + unwatch() { + return this; + } + getWatched() { + return {}; + } + ref() { + return this; + } + unref() { + return this; + } + async close() { + } +} +function createNoopWatcher(options) { + return new NoopWatcher(options); +} + +async function fetchModule(server, url, importer, options = {}) { + if (url.startsWith("data:") || isBuiltin(url)) { + return { externalize: url, type: "builtin" }; + } + if (isExternalUrl(url)) { + return { externalize: url, type: "network" }; + } + if (url[0] !== "." && url[0] !== "/") { + const { + isProduction, + resolve: { dedupe, preserveSymlinks }, + root, + ssr + } = server.config; + const overrideConditions = ssr.resolve?.externalConditions || []; + const resolveOptions = { + mainFields: ["main"], + conditions: [], + overrideConditions: [...overrideConditions, "production", "development"], + extensions: [".js", ".cjs", ".json"], + dedupe, + preserveSymlinks, + isBuild: false, + isProduction, + root, + ssrConfig: ssr, + packageCache: server.config.packageCache + }; + const resolved = tryNodeResolve( + url, + importer, + { ...resolveOptions, tryEsmOnly: true }, + false, + void 0, + true + ); + if (!resolved) { + const err = new Error( + `Cannot find module '${url}' imported from '${importer}'` + ); + err.code = "ERR_MODULE_NOT_FOUND"; + throw err; + } + const file = pathToFileURL(resolved.id).toString(); + const type = isFilePathESM(resolved.id, server.config.packageCache) ? "module" : "commonjs"; + return { externalize: file, type }; + } + url = unwrapId$1(url); + let result = await server.transformRequest(url, { ssr: true }); + if (!result) { + throw new Error( + `[vite] transform failed for module '${url}'${importer ? ` imported from '${importer}'` : ""}.` + ); + } + const mod = await server.moduleGraph.getModuleByUrl(url, true); + if (!mod) { + throw new Error( + `[vite] cannot find module '${url}' ${importer ? ` imported from '${importer}'` : ""}.` + ); + } + if (options.inlineSourceMap !== false) { + result = inlineSourceMap(mod, result, options.processSourceMap); + } + if (result.code[0] === "#") + result.code = result.code.replace(/^#!.*/, (s) => " ".repeat(s.length)); + return { code: result.code, file: mod.file }; +} +const OTHER_SOURCE_MAP_REGEXP = new RegExp( + `//# ${SOURCEMAPPING_URL}=data:application/json[^,]+base64,([A-Za-z0-9+/=]+)$`, + "gm" +); +function inlineSourceMap(mod, result, processSourceMap) { + const map = result.map; + let code = result.code; + if (!map || !("version" in map) || code.includes(VITE_RUNTIME_SOURCEMAPPING_SOURCE)) + return result; + OTHER_SOURCE_MAP_REGEXP.lastIndex = 0; + if (OTHER_SOURCE_MAP_REGEXP.test(code)) + code = code.replace(OTHER_SOURCE_MAP_REGEXP, ""); + const sourceMap = processSourceMap?.(map) || map; + result.code = `${code.trimEnd()} +//# sourceURL=${mod.id} +${VITE_RUNTIME_SOURCEMAPPING_SOURCE} +//# ${SOURCEMAPPING_URL}=${genSourceMapUrl(sourceMap)} +`; + return result; +} + +function ssrFetchModule(server, id, importer) { + return fetchModule(server, id, importer, { + processSourceMap(map) { + return Object.assign({}, map, { + mappings: ";".repeat(asyncFunctionDeclarationPaddingLineCount) + map.mappings + }); + } + }); +} + +var bufferUtil$1 = {exports: {}}; + +const BINARY_TYPES$2 = ['nodebuffer', 'arraybuffer', 'fragments']; +const hasBlob$1 = typeof Blob !== 'undefined'; + +if (hasBlob$1) BINARY_TYPES$2.push('blob'); + +var constants = { + BINARY_TYPES: BINARY_TYPES$2, + EMPTY_BUFFER: Buffer.alloc(0), + GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', + hasBlob: hasBlob$1, + kForOnEventAttribute: Symbol('kIsForOnEventAttribute'), + kListener: Symbol('kListener'), + kStatusCode: Symbol('status-code'), + kWebSocket: Symbol('websocket'), + NOOP: () => {} +}; + +const { EMPTY_BUFFER: EMPTY_BUFFER$3 } = constants; + +const FastBuffer$2 = Buffer[Symbol.species]; + +/** + * Merges an array of buffers into a new buffer. + * + * @param {Buffer[]} list The array of buffers to concat + * @param {Number} totalLength The total length of buffers in the list + * @return {Buffer} The resulting buffer + * @public + */ +function concat$1(list, totalLength) { + if (list.length === 0) return EMPTY_BUFFER$3; + if (list.length === 1) return list[0]; + + const target = Buffer.allocUnsafe(totalLength); + let offset = 0; + + for (let i = 0; i < list.length; i++) { + const buf = list[i]; + target.set(buf, offset); + offset += buf.length; + } + + if (offset < totalLength) { + return new FastBuffer$2(target.buffer, target.byteOffset, offset); + } + + return target; +} + +/** + * Masks a buffer using the given mask. + * + * @param {Buffer} source The buffer to mask + * @param {Buffer} mask The mask to use + * @param {Buffer} output The buffer where to store the result + * @param {Number} offset The offset at which to start writing + * @param {Number} length The number of bytes to mask. + * @public + */ +function _mask(source, mask, output, offset, length) { + for (let i = 0; i < length; i++) { + output[offset + i] = source[i] ^ mask[i & 3]; + } +} + +/** + * Unmasks a buffer using the given mask. + * + * @param {Buffer} buffer The buffer to unmask + * @param {Buffer} mask The mask to use + * @public + */ +function _unmask(buffer, mask) { + for (let i = 0; i < buffer.length; i++) { + buffer[i] ^= mask[i & 3]; + } +} + +/** + * Converts a buffer to an `ArrayBuffer`. + * + * @param {Buffer} buf The buffer to convert + * @return {ArrayBuffer} Converted buffer + * @public + */ +function toArrayBuffer$1(buf) { + if (buf.length === buf.buffer.byteLength) { + return buf.buffer; + } + + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length); +} + +/** + * Converts `data` to a `Buffer`. + * + * @param {*} data The data to convert + * @return {Buffer} The buffer + * @throws {TypeError} + * @public + */ +function toBuffer$2(data) { + toBuffer$2.readOnly = true; + + if (Buffer.isBuffer(data)) return data; + + let buf; + + if (data instanceof ArrayBuffer) { + buf = new FastBuffer$2(data); + } else if (ArrayBuffer.isView(data)) { + buf = new FastBuffer$2(data.buffer, data.byteOffset, data.byteLength); + } else { + buf = Buffer.from(data); + toBuffer$2.readOnly = false; + } + + return buf; +} + +bufferUtil$1.exports = { + concat: concat$1, + mask: _mask, + toArrayBuffer: toArrayBuffer$1, + toBuffer: toBuffer$2, + unmask: _unmask +}; + +/* istanbul ignore else */ +if (!process.env.WS_NO_BUFFER_UTIL) { + try { + const bufferUtil = require('bufferutil'); + + bufferUtil$1.exports.mask = function (source, mask, output, offset, length) { + if (length < 48) _mask(source, mask, output, offset, length); + else bufferUtil.mask(source, mask, output, offset, length); + }; + + bufferUtil$1.exports.unmask = function (buffer, mask) { + if (buffer.length < 32) _unmask(buffer, mask); + else bufferUtil.unmask(buffer, mask); + }; + } catch (e) { + // Continue regardless of the error. + } +} + +var bufferUtilExports = bufferUtil$1.exports; + +const kDone = Symbol('kDone'); +const kRun = Symbol('kRun'); + +/** + * A very simple job queue with adjustable concurrency. Adapted from + * https://github.com/STRML/async-limiter + */ +let Limiter$1 = class Limiter { + /** + * Creates a new `Limiter`. + * + * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed + * to run concurrently + */ + constructor(concurrency) { + this[kDone] = () => { + this.pending--; + this[kRun](); + }; + this.concurrency = concurrency || Infinity; + this.jobs = []; + this.pending = 0; + } + + /** + * Adds a job to the queue. + * + * @param {Function} job The job to run + * @public + */ + add(job) { + this.jobs.push(job); + this[kRun](); + } + + /** + * Removes a job from the queue and runs it if possible. + * + * @private + */ + [kRun]() { + if (this.pending === this.concurrency) return; + + if (this.jobs.length) { + const job = this.jobs.shift(); + + this.pending++; + job(this[kDone]); + } + } +}; + +var limiter = Limiter$1; + +const zlib = zlib$1; + +const bufferUtil = bufferUtilExports; +const Limiter = limiter; +const { kStatusCode: kStatusCode$2 } = constants; + +const FastBuffer$1 = Buffer[Symbol.species]; +const TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]); +const kPerMessageDeflate = Symbol('permessage-deflate'); +const kTotalLength = Symbol('total-length'); +const kCallback = Symbol('callback'); +const kBuffers = Symbol('buffers'); +const kError$1 = Symbol('error'); + +// +// We limit zlib concurrency, which prevents severe memory fragmentation +// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913 +// and https://github.com/websockets/ws/issues/1202 +// +// Intentionally global; it's the global thread pool that's an issue. +// +let zlibLimiter; + +/** + * permessage-deflate implementation. + */ +let PerMessageDeflate$4 = class PerMessageDeflate { + /** + * Creates a PerMessageDeflate instance. + * + * @param {Object} [options] Configuration options + * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support + * for, or request, a custom client window size + * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/ + * acknowledge disabling of client context takeover + * @param {Number} [options.concurrencyLimit=10] The number of concurrent + * calls to zlib + * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the + * use of a custom server window size + * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept + * disabling of server context takeover + * @param {Number} [options.threshold=1024] Size (in bytes) below which + * messages should not be compressed if context takeover is disabled + * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on + * deflate + * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on + * inflate + * @param {Boolean} [isServer=false] Create the instance in either server or + * client mode + * @param {Number} [maxPayload=0] The maximum allowed message length + */ + constructor(options, isServer, maxPayload) { + this._maxPayload = maxPayload | 0; + this._options = options || {}; + this._threshold = + this._options.threshold !== undefined ? this._options.threshold : 1024; + this._isServer = !!isServer; + this._deflate = null; + this._inflate = null; + + this.params = null; + + if (!zlibLimiter) { + const concurrency = + this._options.concurrencyLimit !== undefined + ? this._options.concurrencyLimit + : 10; + zlibLimiter = new Limiter(concurrency); + } + } + + /** + * @type {String} + */ + static get extensionName() { + return 'permessage-deflate'; + } + + /** + * Create an extension negotiation offer. + * + * @return {Object} Extension parameters + * @public + */ + offer() { + const params = {}; + + if (this._options.serverNoContextTakeover) { + params.server_no_context_takeover = true; + } + if (this._options.clientNoContextTakeover) { + params.client_no_context_takeover = true; + } + if (this._options.serverMaxWindowBits) { + params.server_max_window_bits = this._options.serverMaxWindowBits; + } + if (this._options.clientMaxWindowBits) { + params.client_max_window_bits = this._options.clientMaxWindowBits; + } else if (this._options.clientMaxWindowBits == null) { + params.client_max_window_bits = true; + } + + return params; + } + + /** + * Accept an extension negotiation offer/response. + * + * @param {Array} configurations The extension negotiation offers/reponse + * @return {Object} Accepted configuration + * @public + */ + accept(configurations) { + configurations = this.normalizeParams(configurations); + + this.params = this._isServer + ? this.acceptAsServer(configurations) + : this.acceptAsClient(configurations); + + return this.params; + } + + /** + * Releases all resources used by the extension. + * + * @public + */ + cleanup() { + if (this._inflate) { + this._inflate.close(); + this._inflate = null; + } + + if (this._deflate) { + const callback = this._deflate[kCallback]; + + this._deflate.close(); + this._deflate = null; + + if (callback) { + callback( + new Error( + 'The deflate stream was closed while data was being processed' + ) + ); + } + } + } + + /** + * Accept an extension negotiation offer. + * + * @param {Array} offers The extension negotiation offers + * @return {Object} Accepted configuration + * @private + */ + acceptAsServer(offers) { + const opts = this._options; + const accepted = offers.find((params) => { + if ( + (opts.serverNoContextTakeover === false && + params.server_no_context_takeover) || + (params.server_max_window_bits && + (opts.serverMaxWindowBits === false || + (typeof opts.serverMaxWindowBits === 'number' && + opts.serverMaxWindowBits > params.server_max_window_bits))) || + (typeof opts.clientMaxWindowBits === 'number' && + !params.client_max_window_bits) + ) { + return false; + } + + return true; + }); + + if (!accepted) { + throw new Error('None of the extension offers can be accepted'); + } + + if (opts.serverNoContextTakeover) { + accepted.server_no_context_takeover = true; + } + if (opts.clientNoContextTakeover) { + accepted.client_no_context_takeover = true; + } + if (typeof opts.serverMaxWindowBits === 'number') { + accepted.server_max_window_bits = opts.serverMaxWindowBits; + } + if (typeof opts.clientMaxWindowBits === 'number') { + accepted.client_max_window_bits = opts.clientMaxWindowBits; + } else if ( + accepted.client_max_window_bits === true || + opts.clientMaxWindowBits === false + ) { + delete accepted.client_max_window_bits; + } + + return accepted; + } + + /** + * Accept the extension negotiation response. + * + * @param {Array} response The extension negotiation response + * @return {Object} Accepted configuration + * @private + */ + acceptAsClient(response) { + const params = response[0]; + + if ( + this._options.clientNoContextTakeover === false && + params.client_no_context_takeover + ) { + throw new Error('Unexpected parameter "client_no_context_takeover"'); + } + + if (!params.client_max_window_bits) { + if (typeof this._options.clientMaxWindowBits === 'number') { + params.client_max_window_bits = this._options.clientMaxWindowBits; + } + } else if ( + this._options.clientMaxWindowBits === false || + (typeof this._options.clientMaxWindowBits === 'number' && + params.client_max_window_bits > this._options.clientMaxWindowBits) + ) { + throw new Error( + 'Unexpected or invalid parameter "client_max_window_bits"' + ); + } + + return params; + } + + /** + * Normalize parameters. + * + * @param {Array} configurations The extension negotiation offers/reponse + * @return {Array} The offers/response with normalized parameters + * @private + */ + normalizeParams(configurations) { + configurations.forEach((params) => { + Object.keys(params).forEach((key) => { + let value = params[key]; + + if (value.length > 1) { + throw new Error(`Parameter "${key}" must have only a single value`); + } + + value = value[0]; + + if (key === 'client_max_window_bits') { + if (value !== true) { + const num = +value; + if (!Number.isInteger(num) || num < 8 || num > 15) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + value = num; + } else if (!this._isServer) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + } else if (key === 'server_max_window_bits') { + const num = +value; + if (!Number.isInteger(num) || num < 8 || num > 15) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + value = num; + } else if ( + key === 'client_no_context_takeover' || + key === 'server_no_context_takeover' + ) { + if (value !== true) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + } else { + throw new Error(`Unknown parameter "${key}"`); + } + + params[key] = value; + }); + }); + + return configurations; + } + + /** + * Decompress data. Concurrency limited. + * + * @param {Buffer} data Compressed data + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @public + */ + decompress(data, fin, callback) { + zlibLimiter.add((done) => { + this._decompress(data, fin, (err, result) => { + done(); + callback(err, result); + }); + }); + } + + /** + * Compress data. Concurrency limited. + * + * @param {(Buffer|String)} data Data to compress + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @public + */ + compress(data, fin, callback) { + zlibLimiter.add((done) => { + this._compress(data, fin, (err, result) => { + done(); + callback(err, result); + }); + }); + } + + /** + * Decompress data. + * + * @param {Buffer} data Compressed data + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @private + */ + _decompress(data, fin, callback) { + const endpoint = this._isServer ? 'client' : 'server'; + + if (!this._inflate) { + const key = `${endpoint}_max_window_bits`; + const windowBits = + typeof this.params[key] !== 'number' + ? zlib.Z_DEFAULT_WINDOWBITS + : this.params[key]; + + this._inflate = zlib.createInflateRaw({ + ...this._options.zlibInflateOptions, + windowBits + }); + this._inflate[kPerMessageDeflate] = this; + this._inflate[kTotalLength] = 0; + this._inflate[kBuffers] = []; + this._inflate.on('error', inflateOnError); + this._inflate.on('data', inflateOnData); + } + + this._inflate[kCallback] = callback; + + this._inflate.write(data); + if (fin) this._inflate.write(TRAILER); + + this._inflate.flush(() => { + const err = this._inflate[kError$1]; + + if (err) { + this._inflate.close(); + this._inflate = null; + callback(err); + return; + } + + const data = bufferUtil.concat( + this._inflate[kBuffers], + this._inflate[kTotalLength] + ); + + if (this._inflate._readableState.endEmitted) { + this._inflate.close(); + this._inflate = null; + } else { + this._inflate[kTotalLength] = 0; + this._inflate[kBuffers] = []; + + if (fin && this.params[`${endpoint}_no_context_takeover`]) { + this._inflate.reset(); + } + } + + callback(null, data); + }); + } + + /** + * Compress data. + * + * @param {(Buffer|String)} data Data to compress + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @private + */ + _compress(data, fin, callback) { + const endpoint = this._isServer ? 'server' : 'client'; + + if (!this._deflate) { + const key = `${endpoint}_max_window_bits`; + const windowBits = + typeof this.params[key] !== 'number' + ? zlib.Z_DEFAULT_WINDOWBITS + : this.params[key]; + + this._deflate = zlib.createDeflateRaw({ + ...this._options.zlibDeflateOptions, + windowBits + }); + + this._deflate[kTotalLength] = 0; + this._deflate[kBuffers] = []; + + this._deflate.on('data', deflateOnData); + } + + this._deflate[kCallback] = callback; + + this._deflate.write(data); + this._deflate.flush(zlib.Z_SYNC_FLUSH, () => { + if (!this._deflate) { + // + // The deflate stream was closed while data was being processed. + // + return; + } + + let data = bufferUtil.concat( + this._deflate[kBuffers], + this._deflate[kTotalLength] + ); + + if (fin) { + data = new FastBuffer$1(data.buffer, data.byteOffset, data.length - 4); + } + + // + // Ensure that the callback will not be called again in + // `PerMessageDeflate#cleanup()`. + // + this._deflate[kCallback] = null; + + this._deflate[kTotalLength] = 0; + this._deflate[kBuffers] = []; + + if (fin && this.params[`${endpoint}_no_context_takeover`]) { + this._deflate.reset(); + } + + callback(null, data); + }); + } +}; + +var permessageDeflate = PerMessageDeflate$4; + +/** + * The listener of the `zlib.DeflateRaw` stream `'data'` event. + * + * @param {Buffer} chunk A chunk of data + * @private + */ +function deflateOnData(chunk) { + this[kBuffers].push(chunk); + this[kTotalLength] += chunk.length; +} + +/** + * The listener of the `zlib.InflateRaw` stream `'data'` event. + * + * @param {Buffer} chunk A chunk of data + * @private + */ +function inflateOnData(chunk) { + this[kTotalLength] += chunk.length; + + if ( + this[kPerMessageDeflate]._maxPayload < 1 || + this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload + ) { + this[kBuffers].push(chunk); + return; + } + + this[kError$1] = new RangeError('Max payload size exceeded'); + this[kError$1].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'; + this[kError$1][kStatusCode$2] = 1009; + this.removeListener('data', inflateOnData); + this.reset(); +} + +/** + * The listener of the `zlib.InflateRaw` stream `'error'` event. + * + * @param {Error} err The emitted error + * @private + */ +function inflateOnError(err) { + // + // There is no need to call `Zlib#close()` as the handle is automatically + // closed when an error is emitted. + // + this[kPerMessageDeflate]._inflate = null; + err[kStatusCode$2] = 1007; + this[kCallback](err); +} + +var validation = {exports: {}}; + +const { isUtf8 } = require$$0$a; + +const { hasBlob } = constants; + +// +// Allowed token characters: +// +// '!', '#', '$', '%', '&', ''', '*', '+', '-', +// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~' +// +// tokenChars[32] === 0 // ' ' +// tokenChars[33] === 1 // '!' +// tokenChars[34] === 0 // '"' +// ... +// +// prettier-ignore +const tokenChars$2 = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31 + 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63 + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127 +]; + +/** + * Checks if a status code is allowed in a close frame. + * + * @param {Number} code The status code + * @return {Boolean} `true` if the status code is valid, else `false` + * @public + */ +function isValidStatusCode$2(code) { + return ( + (code >= 1000 && + code <= 1014 && + code !== 1004 && + code !== 1005 && + code !== 1006) || + (code >= 3000 && code <= 4999) + ); +} + +/** + * Checks if a given buffer contains only correct UTF-8. + * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by + * Markus Kuhn. + * + * @param {Buffer} buf The buffer to check + * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false` + * @public + */ +function _isValidUTF8(buf) { + const len = buf.length; + let i = 0; + + while (i < len) { + if ((buf[i] & 0x80) === 0) { + // 0xxxxxxx + i++; + } else if ((buf[i] & 0xe0) === 0xc0) { + // 110xxxxx 10xxxxxx + if ( + i + 1 === len || + (buf[i + 1] & 0xc0) !== 0x80 || + (buf[i] & 0xfe) === 0xc0 // Overlong + ) { + return false; + } + + i += 2; + } else if ((buf[i] & 0xf0) === 0xe0) { + // 1110xxxx 10xxxxxx 10xxxxxx + if ( + i + 2 >= len || + (buf[i + 1] & 0xc0) !== 0x80 || + (buf[i + 2] & 0xc0) !== 0x80 || + (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong + (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF) + ) { + return false; + } + + i += 3; + } else if ((buf[i] & 0xf8) === 0xf0) { + // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + if ( + i + 3 >= len || + (buf[i + 1] & 0xc0) !== 0x80 || + (buf[i + 2] & 0xc0) !== 0x80 || + (buf[i + 3] & 0xc0) !== 0x80 || + (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong + (buf[i] === 0xf4 && buf[i + 1] > 0x8f) || + buf[i] > 0xf4 // > U+10FFFF + ) { + return false; + } + + i += 4; + } else { + return false; + } + } + + return true; +} + +/** + * Determines whether a value is a `Blob`. + * + * @param {*} value The value to be tested + * @return {Boolean} `true` if `value` is a `Blob`, else `false` + * @private + */ +function isBlob$2(value) { + return ( + hasBlob && + typeof value === 'object' && + typeof value.arrayBuffer === 'function' && + typeof value.type === 'string' && + typeof value.stream === 'function' && + (value[Symbol.toStringTag] === 'Blob' || + value[Symbol.toStringTag] === 'File') + ); +} + +validation.exports = { + isBlob: isBlob$2, + isValidStatusCode: isValidStatusCode$2, + isValidUTF8: _isValidUTF8, + tokenChars: tokenChars$2 +}; + +if (isUtf8) { + validation.exports.isValidUTF8 = function (buf) { + return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf); + }; +} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) { + try { + const isValidUTF8 = require('utf-8-validate'); + + validation.exports.isValidUTF8 = function (buf) { + return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf); + }; + } catch (e) { + // Continue regardless of the error. + } +} + +var validationExports = validation.exports; + +const { Writable: Writable$1 } = require$$0$6; + +const PerMessageDeflate$3 = permessageDeflate; +const { + BINARY_TYPES: BINARY_TYPES$1, + EMPTY_BUFFER: EMPTY_BUFFER$2, + kStatusCode: kStatusCode$1, + kWebSocket: kWebSocket$3 +} = constants; +const { concat, toArrayBuffer, unmask } = bufferUtilExports; +const { isValidStatusCode: isValidStatusCode$1, isValidUTF8 } = validationExports; + +const FastBuffer = Buffer[Symbol.species]; + +const GET_INFO = 0; +const GET_PAYLOAD_LENGTH_16 = 1; +const GET_PAYLOAD_LENGTH_64 = 2; +const GET_MASK = 3; +const GET_DATA = 4; +const INFLATING = 5; +const DEFER_EVENT = 6; + +/** + * HyBi Receiver implementation. + * + * @extends Writable + */ +let Receiver$1 = class Receiver extends Writable$1 { + /** + * Creates a Receiver instance. + * + * @param {Object} [options] Options object + * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether + * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted + * multiple times in the same tick + * @param {String} [options.binaryType=nodebuffer] The type for binary data + * @param {Object} [options.extensions] An object containing the negotiated + * extensions + * @param {Boolean} [options.isServer=false] Specifies whether to operate in + * client or server mode + * @param {Number} [options.maxPayload=0] The maximum allowed message length + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + */ + constructor(options = {}) { + super(); + + this._allowSynchronousEvents = + options.allowSynchronousEvents !== undefined + ? options.allowSynchronousEvents + : true; + this._binaryType = options.binaryType || BINARY_TYPES$1[0]; + this._extensions = options.extensions || {}; + this._isServer = !!options.isServer; + this._maxPayload = options.maxPayload | 0; + this._skipUTF8Validation = !!options.skipUTF8Validation; + this[kWebSocket$3] = undefined; + + this._bufferedBytes = 0; + this._buffers = []; + + this._compressed = false; + this._payloadLength = 0; + this._mask = undefined; + this._fragmented = 0; + this._masked = false; + this._fin = false; + this._opcode = 0; + + this._totalPayloadLength = 0; + this._messageLength = 0; + this._fragments = []; + + this._errored = false; + this._loop = false; + this._state = GET_INFO; + } + + /** + * Implements `Writable.prototype._write()`. + * + * @param {Buffer} chunk The chunk of data to write + * @param {String} encoding The character encoding of `chunk` + * @param {Function} cb Callback + * @private + */ + _write(chunk, encoding, cb) { + if (this._opcode === 0x08 && this._state == GET_INFO) return cb(); + + this._bufferedBytes += chunk.length; + this._buffers.push(chunk); + this.startLoop(cb); + } + + /** + * Consumes `n` bytes from the buffered data. + * + * @param {Number} n The number of bytes to consume + * @return {Buffer} The consumed bytes + * @private + */ + consume(n) { + this._bufferedBytes -= n; + + if (n === this._buffers[0].length) return this._buffers.shift(); + + if (n < this._buffers[0].length) { + const buf = this._buffers[0]; + this._buffers[0] = new FastBuffer( + buf.buffer, + buf.byteOffset + n, + buf.length - n + ); + + return new FastBuffer(buf.buffer, buf.byteOffset, n); + } + + const dst = Buffer.allocUnsafe(n); + + do { + const buf = this._buffers[0]; + const offset = dst.length - n; + + if (n >= buf.length) { + dst.set(this._buffers.shift(), offset); + } else { + dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset); + this._buffers[0] = new FastBuffer( + buf.buffer, + buf.byteOffset + n, + buf.length - n + ); + } + + n -= buf.length; + } while (n > 0); + + return dst; + } + + /** + * Starts the parsing loop. + * + * @param {Function} cb Callback + * @private + */ + startLoop(cb) { + this._loop = true; + + do { + switch (this._state) { + case GET_INFO: + this.getInfo(cb); + break; + case GET_PAYLOAD_LENGTH_16: + this.getPayloadLength16(cb); + break; + case GET_PAYLOAD_LENGTH_64: + this.getPayloadLength64(cb); + break; + case GET_MASK: + this.getMask(); + break; + case GET_DATA: + this.getData(cb); + break; + case INFLATING: + case DEFER_EVENT: + this._loop = false; + return; + } + } while (this._loop); + + if (!this._errored) cb(); + } + + /** + * Reads the first two bytes of a frame. + * + * @param {Function} cb Callback + * @private + */ + getInfo(cb) { + if (this._bufferedBytes < 2) { + this._loop = false; + return; + } + + const buf = this.consume(2); + + if ((buf[0] & 0x30) !== 0x00) { + const error = this.createError( + RangeError, + 'RSV2 and RSV3 must be clear', + true, + 1002, + 'WS_ERR_UNEXPECTED_RSV_2_3' + ); + + cb(error); + return; + } + + const compressed = (buf[0] & 0x40) === 0x40; + + if (compressed && !this._extensions[PerMessageDeflate$3.extensionName]) { + const error = this.createError( + RangeError, + 'RSV1 must be clear', + true, + 1002, + 'WS_ERR_UNEXPECTED_RSV_1' + ); + + cb(error); + return; + } + + this._fin = (buf[0] & 0x80) === 0x80; + this._opcode = buf[0] & 0x0f; + this._payloadLength = buf[1] & 0x7f; + + if (this._opcode === 0x00) { + if (compressed) { + const error = this.createError( + RangeError, + 'RSV1 must be clear', + true, + 1002, + 'WS_ERR_UNEXPECTED_RSV_1' + ); + + cb(error); + return; + } + + if (!this._fragmented) { + const error = this.createError( + RangeError, + 'invalid opcode 0', + true, + 1002, + 'WS_ERR_INVALID_OPCODE' + ); + + cb(error); + return; + } + + this._opcode = this._fragmented; + } else if (this._opcode === 0x01 || this._opcode === 0x02) { + if (this._fragmented) { + const error = this.createError( + RangeError, + `invalid opcode ${this._opcode}`, + true, + 1002, + 'WS_ERR_INVALID_OPCODE' + ); + + cb(error); + return; + } + + this._compressed = compressed; + } else if (this._opcode > 0x07 && this._opcode < 0x0b) { + if (!this._fin) { + const error = this.createError( + RangeError, + 'FIN must be set', + true, + 1002, + 'WS_ERR_EXPECTED_FIN' + ); + + cb(error); + return; + } + + if (compressed) { + const error = this.createError( + RangeError, + 'RSV1 must be clear', + true, + 1002, + 'WS_ERR_UNEXPECTED_RSV_1' + ); + + cb(error); + return; + } + + if ( + this._payloadLength > 0x7d || + (this._opcode === 0x08 && this._payloadLength === 1) + ) { + const error = this.createError( + RangeError, + `invalid payload length ${this._payloadLength}`, + true, + 1002, + 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH' + ); + + cb(error); + return; + } + } else { + const error = this.createError( + RangeError, + `invalid opcode ${this._opcode}`, + true, + 1002, + 'WS_ERR_INVALID_OPCODE' + ); + + cb(error); + return; + } + + if (!this._fin && !this._fragmented) this._fragmented = this._opcode; + this._masked = (buf[1] & 0x80) === 0x80; + + if (this._isServer) { + if (!this._masked) { + const error = this.createError( + RangeError, + 'MASK must be set', + true, + 1002, + 'WS_ERR_EXPECTED_MASK' + ); + + cb(error); + return; + } + } else if (this._masked) { + const error = this.createError( + RangeError, + 'MASK must be clear', + true, + 1002, + 'WS_ERR_UNEXPECTED_MASK' + ); + + cb(error); + return; + } + + if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16; + else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64; + else this.haveLength(cb); + } + + /** + * Gets extended payload length (7+16). + * + * @param {Function} cb Callback + * @private + */ + getPayloadLength16(cb) { + if (this._bufferedBytes < 2) { + this._loop = false; + return; + } + + this._payloadLength = this.consume(2).readUInt16BE(0); + this.haveLength(cb); + } + + /** + * Gets extended payload length (7+64). + * + * @param {Function} cb Callback + * @private + */ + getPayloadLength64(cb) { + if (this._bufferedBytes < 8) { + this._loop = false; + return; + } + + const buf = this.consume(8); + const num = buf.readUInt32BE(0); + + // + // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned + // if payload length is greater than this number. + // + if (num > Math.pow(2, 53 - 32) - 1) { + const error = this.createError( + RangeError, + 'Unsupported WebSocket frame: payload length > 2^53 - 1', + false, + 1009, + 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH' + ); + + cb(error); + return; + } + + this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4); + this.haveLength(cb); + } + + /** + * Payload length has been read. + * + * @param {Function} cb Callback + * @private + */ + haveLength(cb) { + if (this._payloadLength && this._opcode < 0x08) { + this._totalPayloadLength += this._payloadLength; + if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) { + const error = this.createError( + RangeError, + 'Max payload size exceeded', + false, + 1009, + 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH' + ); + + cb(error); + return; + } + } + + if (this._masked) this._state = GET_MASK; + else this._state = GET_DATA; + } + + /** + * Reads mask bytes. + * + * @private + */ + getMask() { + if (this._bufferedBytes < 4) { + this._loop = false; + return; + } + + this._mask = this.consume(4); + this._state = GET_DATA; + } + + /** + * Reads data bytes. + * + * @param {Function} cb Callback + * @private + */ + getData(cb) { + let data = EMPTY_BUFFER$2; + + if (this._payloadLength) { + if (this._bufferedBytes < this._payloadLength) { + this._loop = false; + return; + } + + data = this.consume(this._payloadLength); + + if ( + this._masked && + (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0 + ) { + unmask(data, this._mask); + } + } + + if (this._opcode > 0x07) { + this.controlMessage(data, cb); + return; + } + + if (this._compressed) { + this._state = INFLATING; + this.decompress(data, cb); + return; + } + + if (data.length) { + // + // This message is not compressed so its length is the sum of the payload + // length of all fragments. + // + this._messageLength = this._totalPayloadLength; + this._fragments.push(data); + } + + this.dataMessage(cb); + } + + /** + * Decompresses data. + * + * @param {Buffer} data Compressed data + * @param {Function} cb Callback + * @private + */ + decompress(data, cb) { + const perMessageDeflate = this._extensions[PerMessageDeflate$3.extensionName]; + + perMessageDeflate.decompress(data, this._fin, (err, buf) => { + if (err) return cb(err); + + if (buf.length) { + this._messageLength += buf.length; + if (this._messageLength > this._maxPayload && this._maxPayload > 0) { + const error = this.createError( + RangeError, + 'Max payload size exceeded', + false, + 1009, + 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH' + ); + + cb(error); + return; + } + + this._fragments.push(buf); + } + + this.dataMessage(cb); + if (this._state === GET_INFO) this.startLoop(cb); + }); + } + + /** + * Handles a data message. + * + * @param {Function} cb Callback + * @private + */ + dataMessage(cb) { + if (!this._fin) { + this._state = GET_INFO; + return; + } + + const messageLength = this._messageLength; + const fragments = this._fragments; + + this._totalPayloadLength = 0; + this._messageLength = 0; + this._fragmented = 0; + this._fragments = []; + + if (this._opcode === 2) { + let data; + + if (this._binaryType === 'nodebuffer') { + data = concat(fragments, messageLength); + } else if (this._binaryType === 'arraybuffer') { + data = toArrayBuffer(concat(fragments, messageLength)); + } else if (this._binaryType === 'blob') { + data = new Blob(fragments); + } else { + data = fragments; + } + + if (this._allowSynchronousEvents) { + this.emit('message', data, true); + this._state = GET_INFO; + } else { + this._state = DEFER_EVENT; + setImmediate(() => { + this.emit('message', data, true); + this._state = GET_INFO; + this.startLoop(cb); + }); + } + } else { + const buf = concat(fragments, messageLength); + + if (!this._skipUTF8Validation && !isValidUTF8(buf)) { + const error = this.createError( + Error, + 'invalid UTF-8 sequence', + true, + 1007, + 'WS_ERR_INVALID_UTF8' + ); + + cb(error); + return; + } + + if (this._state === INFLATING || this._allowSynchronousEvents) { + this.emit('message', buf, false); + this._state = GET_INFO; + } else { + this._state = DEFER_EVENT; + setImmediate(() => { + this.emit('message', buf, false); + this._state = GET_INFO; + this.startLoop(cb); + }); + } + } + } + + /** + * Handles a control message. + * + * @param {Buffer} data Data to handle + * @return {(Error|RangeError|undefined)} A possible error + * @private + */ + controlMessage(data, cb) { + if (this._opcode === 0x08) { + if (data.length === 0) { + this._loop = false; + this.emit('conclude', 1005, EMPTY_BUFFER$2); + this.end(); + } else { + const code = data.readUInt16BE(0); + + if (!isValidStatusCode$1(code)) { + const error = this.createError( + RangeError, + `invalid status code ${code}`, + true, + 1002, + 'WS_ERR_INVALID_CLOSE_CODE' + ); + + cb(error); + return; + } + + const buf = new FastBuffer( + data.buffer, + data.byteOffset + 2, + data.length - 2 + ); + + if (!this._skipUTF8Validation && !isValidUTF8(buf)) { + const error = this.createError( + Error, + 'invalid UTF-8 sequence', + true, + 1007, + 'WS_ERR_INVALID_UTF8' + ); + + cb(error); + return; + } + + this._loop = false; + this.emit('conclude', code, buf); + this.end(); + } + + this._state = GET_INFO; + return; + } + + if (this._allowSynchronousEvents) { + this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data); + this._state = GET_INFO; + } else { + this._state = DEFER_EVENT; + setImmediate(() => { + this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data); + this._state = GET_INFO; + this.startLoop(cb); + }); + } + } + + /** + * Builds an error object. + * + * @param {function(new:Error|RangeError)} ErrorCtor The error constructor + * @param {String} message The error message + * @param {Boolean} prefix Specifies whether or not to add a default prefix to + * `message` + * @param {Number} statusCode The status code + * @param {String} errorCode The exposed error code + * @return {(Error|RangeError)} The error + * @private + */ + createError(ErrorCtor, message, prefix, statusCode, errorCode) { + this._loop = false; + this._errored = true; + + const err = new ErrorCtor( + prefix ? `Invalid WebSocket frame: ${message}` : message + ); + + Error.captureStackTrace(err, this.createError); + err.code = errorCode; + err[kStatusCode$1] = statusCode; + return err; + } +}; + +var receiver = Receiver$1; + +/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^Duplex" }] */ +const { randomFillSync } = require$$3$1; + +const PerMessageDeflate$2 = permessageDeflate; +const { EMPTY_BUFFER: EMPTY_BUFFER$1, kWebSocket: kWebSocket$2, NOOP: NOOP$2 } = constants; +const { isBlob: isBlob$1, isValidStatusCode } = validationExports; +const { mask: applyMask, toBuffer: toBuffer$1 } = bufferUtilExports; + +const kByteLength = Symbol('kByteLength'); +const maskBuffer = Buffer.alloc(4); +const RANDOM_POOL_SIZE = 8 * 1024; +let randomPool; +let randomPoolPointer = RANDOM_POOL_SIZE; + +const DEFAULT = 0; +const DEFLATING = 1; +const GET_BLOB_DATA = 2; + +/** + * HyBi Sender implementation. + */ +let Sender$1 = class Sender { + /** + * Creates a Sender instance. + * + * @param {Duplex} socket The connection socket + * @param {Object} [extensions] An object containing the negotiated extensions + * @param {Function} [generateMask] The function used to generate the masking + * key + */ + constructor(socket, extensions, generateMask) { + this._extensions = extensions || {}; + + if (generateMask) { + this._generateMask = generateMask; + this._maskBuffer = Buffer.alloc(4); + } + + this._socket = socket; + + this._firstFragment = true; + this._compress = false; + + this._bufferedBytes = 0; + this._queue = []; + this._state = DEFAULT; + this.onerror = NOOP$2; + this[kWebSocket$2] = undefined; + } + + /** + * Frames a piece of data according to the HyBi WebSocket protocol. + * + * @param {(Buffer|String)} data The data to frame + * @param {Object} options Options object + * @param {Boolean} [options.fin=false] Specifies whether or not to set the + * FIN bit + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Buffer} [options.maskBuffer] The buffer used to store the masking + * key + * @param {Number} options.opcode The opcode + * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be + * modified + * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the + * RSV1 bit + * @return {(Buffer|String)[]} The framed data + * @public + */ + static frame(data, options) { + let mask; + let merge = false; + let offset = 2; + let skipMasking = false; + + if (options.mask) { + mask = options.maskBuffer || maskBuffer; + + if (options.generateMask) { + options.generateMask(mask); + } else { + if (randomPoolPointer === RANDOM_POOL_SIZE) { + /* istanbul ignore else */ + if (randomPool === undefined) { + // + // This is lazily initialized because server-sent frames must not + // be masked so it may never be used. + // + randomPool = Buffer.alloc(RANDOM_POOL_SIZE); + } + + randomFillSync(randomPool, 0, RANDOM_POOL_SIZE); + randomPoolPointer = 0; + } + + mask[0] = randomPool[randomPoolPointer++]; + mask[1] = randomPool[randomPoolPointer++]; + mask[2] = randomPool[randomPoolPointer++]; + mask[3] = randomPool[randomPoolPointer++]; + } + + skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0; + offset = 6; + } + + let dataLength; + + if (typeof data === 'string') { + if ( + (!options.mask || skipMasking) && + options[kByteLength] !== undefined + ) { + dataLength = options[kByteLength]; + } else { + data = Buffer.from(data); + dataLength = data.length; + } + } else { + dataLength = data.length; + merge = options.mask && options.readOnly && !skipMasking; + } + + let payloadLength = dataLength; + + if (dataLength >= 65536) { + offset += 8; + payloadLength = 127; + } else if (dataLength > 125) { + offset += 2; + payloadLength = 126; + } + + const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset); + + target[0] = options.fin ? options.opcode | 0x80 : options.opcode; + if (options.rsv1) target[0] |= 0x40; + + target[1] = payloadLength; + + if (payloadLength === 126) { + target.writeUInt16BE(dataLength, 2); + } else if (payloadLength === 127) { + target[2] = target[3] = 0; + target.writeUIntBE(dataLength, 4, 6); + } + + if (!options.mask) return [target, data]; + + target[1] |= 0x80; + target[offset - 4] = mask[0]; + target[offset - 3] = mask[1]; + target[offset - 2] = mask[2]; + target[offset - 1] = mask[3]; + + if (skipMasking) return [target, data]; + + if (merge) { + applyMask(data, mask, target, offset, dataLength); + return [target]; + } + + applyMask(data, mask, data, 0, dataLength); + return [target, data]; + } + + /** + * Sends a close message to the other peer. + * + * @param {Number} [code] The status code component of the body + * @param {(String|Buffer)} [data] The message component of the body + * @param {Boolean} [mask=false] Specifies whether or not to mask the message + * @param {Function} [cb] Callback + * @public + */ + close(code, data, mask, cb) { + let buf; + + if (code === undefined) { + buf = EMPTY_BUFFER$1; + } else if (typeof code !== 'number' || !isValidStatusCode(code)) { + throw new TypeError('First argument must be a valid error code number'); + } else if (data === undefined || !data.length) { + buf = Buffer.allocUnsafe(2); + buf.writeUInt16BE(code, 0); + } else { + const length = Buffer.byteLength(data); + + if (length > 123) { + throw new RangeError('The message must not be greater than 123 bytes'); + } + + buf = Buffer.allocUnsafe(2 + length); + buf.writeUInt16BE(code, 0); + + if (typeof data === 'string') { + buf.write(data, 2); + } else { + buf.set(data, 2); + } + } + + const options = { + [kByteLength]: buf.length, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 0x08, + readOnly: false, + rsv1: false + }; + + if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, buf, false, options, cb]); + } else { + this.sendFrame(Sender.frame(buf, options), cb); + } + } + + /** + * Sends a ping message to the other peer. + * + * @param {*} data The message to send + * @param {Boolean} [mask=false] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback + * @public + */ + ping(data, mask, cb) { + let byteLength; + let readOnly; + + if (typeof data === 'string') { + byteLength = Buffer.byteLength(data); + readOnly = false; + } else if (isBlob$1(data)) { + byteLength = data.size; + readOnly = false; + } else { + data = toBuffer$1(data); + byteLength = data.length; + readOnly = toBuffer$1.readOnly; + } + + if (byteLength > 125) { + throw new RangeError('The data size must not be greater than 125 bytes'); + } + + const options = { + [kByteLength]: byteLength, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 0x09, + readOnly, + rsv1: false + }; + + if (isBlob$1(data)) { + if (this._state !== DEFAULT) { + this.enqueue([this.getBlobData, data, false, options, cb]); + } else { + this.getBlobData(data, false, options, cb); + } + } else if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, data, false, options, cb]); + } else { + this.sendFrame(Sender.frame(data, options), cb); + } + } + + /** + * Sends a pong message to the other peer. + * + * @param {*} data The message to send + * @param {Boolean} [mask=false] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback + * @public + */ + pong(data, mask, cb) { + let byteLength; + let readOnly; + + if (typeof data === 'string') { + byteLength = Buffer.byteLength(data); + readOnly = false; + } else if (isBlob$1(data)) { + byteLength = data.size; + readOnly = false; + } else { + data = toBuffer$1(data); + byteLength = data.length; + readOnly = toBuffer$1.readOnly; + } + + if (byteLength > 125) { + throw new RangeError('The data size must not be greater than 125 bytes'); + } + + const options = { + [kByteLength]: byteLength, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 0x0a, + readOnly, + rsv1: false + }; + + if (isBlob$1(data)) { + if (this._state !== DEFAULT) { + this.enqueue([this.getBlobData, data, false, options, cb]); + } else { + this.getBlobData(data, false, options, cb); + } + } else if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, data, false, options, cb]); + } else { + this.sendFrame(Sender.frame(data, options), cb); + } + } + + /** + * Sends a data message to the other peer. + * + * @param {*} data The message to send + * @param {Object} options Options object + * @param {Boolean} [options.binary=false] Specifies whether `data` is binary + * or text + * @param {Boolean} [options.compress=false] Specifies whether or not to + * compress `data` + * @param {Boolean} [options.fin=false] Specifies whether the fragment is the + * last one + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Function} [cb] Callback + * @public + */ + send(data, options, cb) { + const perMessageDeflate = this._extensions[PerMessageDeflate$2.extensionName]; + let opcode = options.binary ? 2 : 1; + let rsv1 = options.compress; + + let byteLength; + let readOnly; + + if (typeof data === 'string') { + byteLength = Buffer.byteLength(data); + readOnly = false; + } else if (isBlob$1(data)) { + byteLength = data.size; + readOnly = false; + } else { + data = toBuffer$1(data); + byteLength = data.length; + readOnly = toBuffer$1.readOnly; + } + + if (this._firstFragment) { + this._firstFragment = false; + if ( + rsv1 && + perMessageDeflate && + perMessageDeflate.params[ + perMessageDeflate._isServer + ? 'server_no_context_takeover' + : 'client_no_context_takeover' + ] + ) { + rsv1 = byteLength >= perMessageDeflate._threshold; + } + this._compress = rsv1; + } else { + rsv1 = false; + opcode = 0; + } + + if (options.fin) this._firstFragment = true; + + const opts = { + [kByteLength]: byteLength, + fin: options.fin, + generateMask: this._generateMask, + mask: options.mask, + maskBuffer: this._maskBuffer, + opcode, + readOnly, + rsv1 + }; + + if (isBlob$1(data)) { + if (this._state !== DEFAULT) { + this.enqueue([this.getBlobData, data, this._compress, opts, cb]); + } else { + this.getBlobData(data, this._compress, opts, cb); + } + } else if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, data, this._compress, opts, cb]); + } else { + this.dispatch(data, this._compress, opts, cb); + } + } + + /** + * Gets the contents of a blob as binary data. + * + * @param {Blob} blob The blob + * @param {Boolean} [compress=false] Specifies whether or not to compress + * the data + * @param {Object} options Options object + * @param {Boolean} [options.fin=false] Specifies whether or not to set the + * FIN bit + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Buffer} [options.maskBuffer] The buffer used to store the masking + * key + * @param {Number} options.opcode The opcode + * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be + * modified + * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the + * RSV1 bit + * @param {Function} [cb] Callback + * @private + */ + getBlobData(blob, compress, options, cb) { + this._bufferedBytes += options[kByteLength]; + this._state = GET_BLOB_DATA; + + blob + .arrayBuffer() + .then((arrayBuffer) => { + if (this._socket.destroyed) { + const err = new Error( + 'The socket was closed while the blob was being read' + ); + + // + // `callCallbacks` is called in the next tick to ensure that errors + // that might be thrown in the callbacks behave like errors thrown + // outside the promise chain. + // + process.nextTick(callCallbacks, this, err, cb); + return; + } + + this._bufferedBytes -= options[kByteLength]; + const data = toBuffer$1(arrayBuffer); + + if (!compress) { + this._state = DEFAULT; + this.sendFrame(Sender.frame(data, options), cb); + this.dequeue(); + } else { + this.dispatch(data, compress, options, cb); + } + }) + .catch((err) => { + // + // `onError` is called in the next tick for the same reason that + // `callCallbacks` above is. + // + process.nextTick(onError, this, err, cb); + }); + } + + /** + * Dispatches a message. + * + * @param {(Buffer|String)} data The message to send + * @param {Boolean} [compress=false] Specifies whether or not to compress + * `data` + * @param {Object} options Options object + * @param {Boolean} [options.fin=false] Specifies whether or not to set the + * FIN bit + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Buffer} [options.maskBuffer] The buffer used to store the masking + * key + * @param {Number} options.opcode The opcode + * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be + * modified + * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the + * RSV1 bit + * @param {Function} [cb] Callback + * @private + */ + dispatch(data, compress, options, cb) { + if (!compress) { + this.sendFrame(Sender.frame(data, options), cb); + return; + } + + const perMessageDeflate = this._extensions[PerMessageDeflate$2.extensionName]; + + this._bufferedBytes += options[kByteLength]; + this._state = DEFLATING; + perMessageDeflate.compress(data, options.fin, (_, buf) => { + if (this._socket.destroyed) { + const err = new Error( + 'The socket was closed while data was being compressed' + ); + + callCallbacks(this, err, cb); + return; + } + + this._bufferedBytes -= options[kByteLength]; + this._state = DEFAULT; + options.readOnly = false; + this.sendFrame(Sender.frame(buf, options), cb); + this.dequeue(); + }); + } + + /** + * Executes queued send operations. + * + * @private + */ + dequeue() { + while (this._state === DEFAULT && this._queue.length) { + const params = this._queue.shift(); + + this._bufferedBytes -= params[3][kByteLength]; + Reflect.apply(params[0], this, params.slice(1)); + } + } + + /** + * Enqueues a send operation. + * + * @param {Array} params Send operation parameters. + * @private + */ + enqueue(params) { + this._bufferedBytes += params[3][kByteLength]; + this._queue.push(params); + } + + /** + * Sends a frame. + * + * @param {Buffer[]} list The frame to send + * @param {Function} [cb] Callback + * @private + */ + sendFrame(list, cb) { + if (list.length === 2) { + this._socket.cork(); + this._socket.write(list[0]); + this._socket.write(list[1], cb); + this._socket.uncork(); + } else { + this._socket.write(list[0], cb); + } + } +}; + +var sender = Sender$1; + +/** + * Calls queued callbacks with an error. + * + * @param {Sender} sender The `Sender` instance + * @param {Error} err The error to call the callbacks with + * @param {Function} [cb] The first callback + * @private + */ +function callCallbacks(sender, err, cb) { + if (typeof cb === 'function') cb(err); + + for (let i = 0; i < sender._queue.length; i++) { + const params = sender._queue[i]; + const callback = params[params.length - 1]; + + if (typeof callback === 'function') callback(err); + } +} + +/** + * Handles a `Sender` error. + * + * @param {Sender} sender The `Sender` instance + * @param {Error} err The error + * @param {Function} [cb] The first pending callback + * @private + */ +function onError(sender, err, cb) { + callCallbacks(sender, err, cb); + sender.onerror(err); +} + +const { kForOnEventAttribute: kForOnEventAttribute$1, kListener: kListener$1 } = constants; + +const kCode = Symbol('kCode'); +const kData = Symbol('kData'); +const kError = Symbol('kError'); +const kMessage = Symbol('kMessage'); +const kReason = Symbol('kReason'); +const kTarget = Symbol('kTarget'); +const kType = Symbol('kType'); +const kWasClean = Symbol('kWasClean'); + +/** + * Class representing an event. + */ +let Event$1 = class Event { + /** + * Create a new `Event`. + * + * @param {String} type The name of the event + * @throws {TypeError} If the `type` argument is not specified + */ + constructor(type) { + this[kTarget] = null; + this[kType] = type; + } + + /** + * @type {*} + */ + get target() { + return this[kTarget]; + } + + /** + * @type {String} + */ + get type() { + return this[kType]; + } +}; + +Object.defineProperty(Event$1.prototype, 'target', { enumerable: true }); +Object.defineProperty(Event$1.prototype, 'type', { enumerable: true }); + +/** + * Class representing a close event. + * + * @extends Event + */ +class CloseEvent extends Event$1 { + /** + * Create a new `CloseEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {Number} [options.code=0] The status code explaining why the + * connection was closed + * @param {String} [options.reason=''] A human-readable string explaining why + * the connection was closed + * @param {Boolean} [options.wasClean=false] Indicates whether or not the + * connection was cleanly closed + */ + constructor(type, options = {}) { + super(type); + + this[kCode] = options.code === undefined ? 0 : options.code; + this[kReason] = options.reason === undefined ? '' : options.reason; + this[kWasClean] = options.wasClean === undefined ? false : options.wasClean; + } + + /** + * @type {Number} + */ + get code() { + return this[kCode]; + } + + /** + * @type {String} + */ + get reason() { + return this[kReason]; + } + + /** + * @type {Boolean} + */ + get wasClean() { + return this[kWasClean]; + } +} + +Object.defineProperty(CloseEvent.prototype, 'code', { enumerable: true }); +Object.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true }); +Object.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true }); + +/** + * Class representing an error event. + * + * @extends Event + */ +class ErrorEvent extends Event$1 { + /** + * Create a new `ErrorEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {*} [options.error=null] The error that generated this event + * @param {String} [options.message=''] The error message + */ + constructor(type, options = {}) { + super(type); + + this[kError] = options.error === undefined ? null : options.error; + this[kMessage] = options.message === undefined ? '' : options.message; + } + + /** + * @type {*} + */ + get error() { + return this[kError]; + } + + /** + * @type {String} + */ + get message() { + return this[kMessage]; + } +} + +Object.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true }); +Object.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true }); + +/** + * Class representing a message event. + * + * @extends Event + */ +class MessageEvent extends Event$1 { + /** + * Create a new `MessageEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {*} [options.data=null] The message content + */ + constructor(type, options = {}) { + super(type); + + this[kData] = options.data === undefined ? null : options.data; + } + + /** + * @type {*} + */ + get data() { + return this[kData]; + } +} + +Object.defineProperty(MessageEvent.prototype, 'data', { enumerable: true }); + +/** + * This provides methods for emulating the `EventTarget` interface. It's not + * meant to be used directly. + * + * @mixin + */ +const EventTarget = { + /** + * Register an event listener. + * + * @param {String} type A string representing the event type to listen for + * @param {(Function|Object)} handler The listener to add + * @param {Object} [options] An options object specifies characteristics about + * the event listener + * @param {Boolean} [options.once=false] A `Boolean` indicating that the + * listener should be invoked at most once after being added. If `true`, + * the listener would be automatically removed when invoked. + * @public + */ + addEventListener(type, handler, options = {}) { + for (const listener of this.listeners(type)) { + if ( + !options[kForOnEventAttribute$1] && + listener[kListener$1] === handler && + !listener[kForOnEventAttribute$1] + ) { + return; + } + } + + let wrapper; + + if (type === 'message') { + wrapper = function onMessage(data, isBinary) { + const event = new MessageEvent('message', { + data: isBinary ? data : data.toString() + }); + + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === 'close') { + wrapper = function onClose(code, message) { + const event = new CloseEvent('close', { + code, + reason: message.toString(), + wasClean: this._closeFrameReceived && this._closeFrameSent + }); + + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === 'error') { + wrapper = function onError(error) { + const event = new ErrorEvent('error', { + error, + message: error.message + }); + + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === 'open') { + wrapper = function onOpen() { + const event = new Event$1('open'); + + event[kTarget] = this; + callListener(handler, this, event); + }; + } else { + return; + } + + wrapper[kForOnEventAttribute$1] = !!options[kForOnEventAttribute$1]; + wrapper[kListener$1] = handler; + + if (options.once) { + this.once(type, wrapper); + } else { + this.on(type, wrapper); + } + }, + + /** + * Remove an event listener. + * + * @param {String} type A string representing the event type to remove + * @param {(Function|Object)} handler The listener to remove + * @public + */ + removeEventListener(type, handler) { + for (const listener of this.listeners(type)) { + if (listener[kListener$1] === handler && !listener[kForOnEventAttribute$1]) { + this.removeListener(type, listener); + break; + } + } + } +}; + +var eventTarget = { + CloseEvent, + ErrorEvent, + Event: Event$1, + EventTarget, + MessageEvent +}; + +/** + * Call an event listener + * + * @param {(Function|Object)} listener The listener to call + * @param {*} thisArg The value to use as `this`` when calling the listener + * @param {Event} event The event to pass to the listener + * @private + */ +function callListener(listener, thisArg, event) { + if (typeof listener === 'object' && listener.handleEvent) { + listener.handleEvent.call(listener, event); + } else { + listener.call(thisArg, event); + } +} + +const { tokenChars: tokenChars$1 } = validationExports; + +/** + * Adds an offer to the map of extension offers or a parameter to the map of + * parameters. + * + * @param {Object} dest The map of extension offers or parameters + * @param {String} name The extension or parameter name + * @param {(Object|Boolean|String)} elem The extension parameters or the + * parameter value + * @private + */ +function push(dest, name, elem) { + if (dest[name] === undefined) dest[name] = [elem]; + else dest[name].push(elem); +} + +/** + * Parses the `Sec-WebSocket-Extensions` header into an object. + * + * @param {String} header The field value of the header + * @return {Object} The parsed object + * @public + */ +function parse$2(header) { + const offers = Object.create(null); + let params = Object.create(null); + let mustUnescape = false; + let isEscaping = false; + let inQuotes = false; + let extensionName; + let paramName; + let start = -1; + let code = -1; + let end = -1; + let i = 0; + + for (; i < header.length; i++) { + code = header.charCodeAt(i); + + if (extensionName === undefined) { + if (end === -1 && tokenChars$1[code] === 1) { + if (start === -1) start = i; + } else if ( + i !== 0 && + (code === 0x20 /* ' ' */ || code === 0x09) /* '\t' */ + ) { + if (end === -1 && start !== -1) end = i; + } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + + if (end === -1) end = i; + const name = header.slice(start, end); + if (code === 0x2c) { + push(offers, name, params); + params = Object.create(null); + } else { + extensionName = name; + } + + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else if (paramName === undefined) { + if (end === -1 && tokenChars$1[code] === 1) { + if (start === -1) start = i; + } else if (code === 0x20 || code === 0x09) { + if (end === -1 && start !== -1) end = i; + } else if (code === 0x3b || code === 0x2c) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + + if (end === -1) end = i; + push(params, header.slice(start, end), true); + if (code === 0x2c) { + push(offers, extensionName, params); + params = Object.create(null); + extensionName = undefined; + } + + start = end = -1; + } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) { + paramName = header.slice(start, i); + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else { + // + // The value of a quoted-string after unescaping must conform to the + // token ABNF, so only token characters are valid. + // Ref: https://tools.ietf.org/html/rfc6455#section-9.1 + // + if (isEscaping) { + if (tokenChars$1[code] !== 1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (start === -1) start = i; + else if (!mustUnescape) mustUnescape = true; + isEscaping = false; + } else if (inQuotes) { + if (tokenChars$1[code] === 1) { + if (start === -1) start = i; + } else if (code === 0x22 /* '"' */ && start !== -1) { + inQuotes = false; + end = i; + } else if (code === 0x5c /* '\' */) { + isEscaping = true; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) { + inQuotes = true; + } else if (end === -1 && tokenChars$1[code] === 1) { + if (start === -1) start = i; + } else if (start !== -1 && (code === 0x20 || code === 0x09)) { + if (end === -1) end = i; + } else if (code === 0x3b || code === 0x2c) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + + if (end === -1) end = i; + let value = header.slice(start, end); + if (mustUnescape) { + value = value.replace(/\\/g, ''); + mustUnescape = false; + } + push(params, paramName, value); + if (code === 0x2c) { + push(offers, extensionName, params); + params = Object.create(null); + extensionName = undefined; + } + + paramName = undefined; + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } + } + + if (start === -1 || inQuotes || code === 0x20 || code === 0x09) { + throw new SyntaxError('Unexpected end of input'); + } + + if (end === -1) end = i; + const token = header.slice(start, end); + if (extensionName === undefined) { + push(offers, token, params); + } else { + if (paramName === undefined) { + push(params, token, true); + } else if (mustUnescape) { + push(params, paramName, token.replace(/\\/g, '')); + } else { + push(params, paramName, token); + } + push(offers, extensionName, params); + } + + return offers; +} + +/** + * Builds the `Sec-WebSocket-Extensions` header field value. + * + * @param {Object} extensions The map of extensions and parameters to format + * @return {String} A string representing the given object + * @public + */ +function format$1(extensions) { + return Object.keys(extensions) + .map((extension) => { + let configurations = extensions[extension]; + if (!Array.isArray(configurations)) configurations = [configurations]; + return configurations + .map((params) => { + return [extension] + .concat( + Object.keys(params).map((k) => { + let values = params[k]; + if (!Array.isArray(values)) values = [values]; + return values + .map((v) => (v === true ? k : `${k}=${v}`)) + .join('; '); + }) + ) + .join('; '); + }) + .join(', '); + }) + .join(', '); +} + +var extension$1 = { format: format$1, parse: parse$2 }; + +/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^Duplex|Readable$", "caughtErrors": "none" }] */ + +const EventEmitter$1 = require$$0$7; +const https$2 = require$$1$1; +const http$3 = require$$1; +const net = require$$4$1; +const tls = require$$4$2; +const { randomBytes, createHash: createHash$1 } = require$$3$1; +const { URL: URL$2 } = require$$0$9; + +const PerMessageDeflate$1 = permessageDeflate; +const Receiver = receiver; +const Sender = sender; +const { isBlob } = validationExports; + +const { + BINARY_TYPES, + EMPTY_BUFFER, + GUID: GUID$1, + kForOnEventAttribute, + kListener, + kStatusCode, + kWebSocket: kWebSocket$1, + NOOP: NOOP$1 +} = constants; +const { + EventTarget: { addEventListener, removeEventListener } +} = eventTarget; +const { format, parse: parse$1 } = extension$1; +const { toBuffer } = bufferUtilExports; + +const closeTimeout = 30 * 1000; +const kAborted = Symbol('kAborted'); +const protocolVersions = [8, 13]; +const readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED']; +const subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/; + +/** + * Class representing a WebSocket. + * + * @extends EventEmitter + */ +let WebSocket$1 = class WebSocket extends EventEmitter$1 { + /** + * Create a new `WebSocket`. + * + * @param {(String|URL)} address The URL to which to connect + * @param {(String|String[])} [protocols] The subprotocols + * @param {Object} [options] Connection options + */ + constructor(address, protocols, options) { + super(); + + this._binaryType = BINARY_TYPES[0]; + this._closeCode = 1006; + this._closeFrameReceived = false; + this._closeFrameSent = false; + this._closeMessage = EMPTY_BUFFER; + this._closeTimer = null; + this._errorEmitted = false; + this._extensions = {}; + this._paused = false; + this._protocol = ''; + this._readyState = WebSocket.CONNECTING; + this._receiver = null; + this._sender = null; + this._socket = null; + + if (address !== null) { + this._bufferedAmount = 0; + this._isServer = false; + this._redirects = 0; + + if (protocols === undefined) { + protocols = []; + } else if (!Array.isArray(protocols)) { + if (typeof protocols === 'object' && protocols !== null) { + options = protocols; + protocols = []; + } else { + protocols = [protocols]; + } + } + + initAsClient(this, address, protocols, options); + } else { + this._autoPong = options.autoPong; + this._isServer = true; + } + } + + /** + * For historical reasons, the custom "nodebuffer" type is used by the default + * instead of "blob". + * + * @type {String} + */ + get binaryType() { + return this._binaryType; + } + + set binaryType(type) { + if (!BINARY_TYPES.includes(type)) return; + + this._binaryType = type; + + // + // Allow to change `binaryType` on the fly. + // + if (this._receiver) this._receiver._binaryType = type; + } + + /** + * @type {Number} + */ + get bufferedAmount() { + if (!this._socket) return this._bufferedAmount; + + return this._socket._writableState.length + this._sender._bufferedBytes; + } + + /** + * @type {String} + */ + get extensions() { + return Object.keys(this._extensions).join(); + } + + /** + * @type {Boolean} + */ + get isPaused() { + return this._paused; + } + + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onclose() { + return null; + } + + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onerror() { + return null; + } + + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onopen() { + return null; + } + + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onmessage() { + return null; + } + + /** + * @type {String} + */ + get protocol() { + return this._protocol; + } + + /** + * @type {Number} + */ + get readyState() { + return this._readyState; + } + + /** + * @type {String} + */ + get url() { + return this._url; + } + + /** + * Set up the socket and the internal resources. + * + * @param {Duplex} socket The network socket between the server and client + * @param {Buffer} head The first packet of the upgraded stream + * @param {Object} options Options object + * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether + * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted + * multiple times in the same tick + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Number} [options.maxPayload=0] The maximum allowed message size + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + * @private + */ + setSocket(socket, head, options) { + const receiver = new Receiver({ + allowSynchronousEvents: options.allowSynchronousEvents, + binaryType: this.binaryType, + extensions: this._extensions, + isServer: this._isServer, + maxPayload: options.maxPayload, + skipUTF8Validation: options.skipUTF8Validation + }); + + const sender = new Sender(socket, this._extensions, options.generateMask); + + this._receiver = receiver; + this._sender = sender; + this._socket = socket; + + receiver[kWebSocket$1] = this; + sender[kWebSocket$1] = this; + socket[kWebSocket$1] = this; + + receiver.on('conclude', receiverOnConclude); + receiver.on('drain', receiverOnDrain); + receiver.on('error', receiverOnError); + receiver.on('message', receiverOnMessage); + receiver.on('ping', receiverOnPing); + receiver.on('pong', receiverOnPong); + + sender.onerror = senderOnError; + + // + // These methods may not be available if `socket` is just a `Duplex`. + // + if (socket.setTimeout) socket.setTimeout(0); + if (socket.setNoDelay) socket.setNoDelay(); + + if (head.length > 0) socket.unshift(head); + + socket.on('close', socketOnClose); + socket.on('data', socketOnData); + socket.on('end', socketOnEnd); + socket.on('error', socketOnError$1); + + this._readyState = WebSocket.OPEN; + this.emit('open'); + } + + /** + * Emit the `'close'` event. + * + * @private + */ + emitClose() { + if (!this._socket) { + this._readyState = WebSocket.CLOSED; + this.emit('close', this._closeCode, this._closeMessage); + return; + } + + if (this._extensions[PerMessageDeflate$1.extensionName]) { + this._extensions[PerMessageDeflate$1.extensionName].cleanup(); + } + + this._receiver.removeAllListeners(); + this._readyState = WebSocket.CLOSED; + this.emit('close', this._closeCode, this._closeMessage); + } + + /** + * Start a closing handshake. + * + * +----------+ +-----------+ +----------+ + * - - -|ws.close()|-->|close frame|-->|ws.close()|- - - + * | +----------+ +-----------+ +----------+ | + * +----------+ +-----------+ | + * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING + * +----------+ +-----------+ | + * | | | +---+ | + * +------------------------+-->|fin| - - - - + * | +---+ | +---+ + * - - - - -|fin|<---------------------+ + * +---+ + * + * @param {Number} [code] Status code explaining why the connection is closing + * @param {(String|Buffer)} [data] The reason why the connection is + * closing + * @public + */ + close(code, data) { + if (this.readyState === WebSocket.CLOSED) return; + if (this.readyState === WebSocket.CONNECTING) { + const msg = 'WebSocket was closed before the connection was established'; + abortHandshake$1(this, this._req, msg); + return; + } + + if (this.readyState === WebSocket.CLOSING) { + if ( + this._closeFrameSent && + (this._closeFrameReceived || this._receiver._writableState.errorEmitted) + ) { + this._socket.end(); + } + + return; + } + + this._readyState = WebSocket.CLOSING; + this._sender.close(code, data, !this._isServer, (err) => { + // + // This error is handled by the `'error'` listener on the socket. We only + // want to know if the close frame has been sent here. + // + if (err) return; + + this._closeFrameSent = true; + + if ( + this._closeFrameReceived || + this._receiver._writableState.errorEmitted + ) { + this._socket.end(); + } + }); + + setCloseTimer(this); + } + + /** + * Pause the socket. + * + * @public + */ + pause() { + if ( + this.readyState === WebSocket.CONNECTING || + this.readyState === WebSocket.CLOSED + ) { + return; + } + + this._paused = true; + this._socket.pause(); + } + + /** + * Send a ping. + * + * @param {*} [data] The data to send + * @param {Boolean} [mask] Indicates whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when the ping is sent + * @public + */ + ping(data, mask, cb) { + if (this.readyState === WebSocket.CONNECTING) { + throw new Error('WebSocket is not open: readyState 0 (CONNECTING)'); + } + + if (typeof data === 'function') { + cb = data; + data = mask = undefined; + } else if (typeof mask === 'function') { + cb = mask; + mask = undefined; + } + + if (typeof data === 'number') data = data.toString(); + + if (this.readyState !== WebSocket.OPEN) { + sendAfterClose(this, data, cb); + return; + } + + if (mask === undefined) mask = !this._isServer; + this._sender.ping(data || EMPTY_BUFFER, mask, cb); + } + + /** + * Send a pong. + * + * @param {*} [data] The data to send + * @param {Boolean} [mask] Indicates whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when the pong is sent + * @public + */ + pong(data, mask, cb) { + if (this.readyState === WebSocket.CONNECTING) { + throw new Error('WebSocket is not open: readyState 0 (CONNECTING)'); + } + + if (typeof data === 'function') { + cb = data; + data = mask = undefined; + } else if (typeof mask === 'function') { + cb = mask; + mask = undefined; + } + + if (typeof data === 'number') data = data.toString(); + + if (this.readyState !== WebSocket.OPEN) { + sendAfterClose(this, data, cb); + return; + } + + if (mask === undefined) mask = !this._isServer; + this._sender.pong(data || EMPTY_BUFFER, mask, cb); + } + + /** + * Resume the socket. + * + * @public + */ + resume() { + if ( + this.readyState === WebSocket.CONNECTING || + this.readyState === WebSocket.CLOSED + ) { + return; + } + + this._paused = false; + if (!this._receiver._writableState.needDrain) this._socket.resume(); + } + + /** + * Send a data message. + * + * @param {*} data The message to send + * @param {Object} [options] Options object + * @param {Boolean} [options.binary] Specifies whether `data` is binary or + * text + * @param {Boolean} [options.compress] Specifies whether or not to compress + * `data` + * @param {Boolean} [options.fin=true] Specifies whether the fragment is the + * last one + * @param {Boolean} [options.mask] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when data is written out + * @public + */ + send(data, options, cb) { + if (this.readyState === WebSocket.CONNECTING) { + throw new Error('WebSocket is not open: readyState 0 (CONNECTING)'); + } + + if (typeof options === 'function') { + cb = options; + options = {}; + } + + if (typeof data === 'number') data = data.toString(); + + if (this.readyState !== WebSocket.OPEN) { + sendAfterClose(this, data, cb); + return; + } + + const opts = { + binary: typeof data !== 'string', + mask: !this._isServer, + compress: true, + fin: true, + ...options + }; + + if (!this._extensions[PerMessageDeflate$1.extensionName]) { + opts.compress = false; + } + + this._sender.send(data || EMPTY_BUFFER, opts, cb); + } + + /** + * Forcibly close the connection. + * + * @public + */ + terminate() { + if (this.readyState === WebSocket.CLOSED) return; + if (this.readyState === WebSocket.CONNECTING) { + const msg = 'WebSocket was closed before the connection was established'; + abortHandshake$1(this, this._req, msg); + return; + } + + if (this._socket) { + this._readyState = WebSocket.CLOSING; + this._socket.destroy(); + } + } +}; + +/** + * @constant {Number} CONNECTING + * @memberof WebSocket + */ +Object.defineProperty(WebSocket$1, 'CONNECTING', { + enumerable: true, + value: readyStates.indexOf('CONNECTING') +}); + +/** + * @constant {Number} CONNECTING + * @memberof WebSocket.prototype + */ +Object.defineProperty(WebSocket$1.prototype, 'CONNECTING', { + enumerable: true, + value: readyStates.indexOf('CONNECTING') +}); + +/** + * @constant {Number} OPEN + * @memberof WebSocket + */ +Object.defineProperty(WebSocket$1, 'OPEN', { + enumerable: true, + value: readyStates.indexOf('OPEN') +}); + +/** + * @constant {Number} OPEN + * @memberof WebSocket.prototype + */ +Object.defineProperty(WebSocket$1.prototype, 'OPEN', { + enumerable: true, + value: readyStates.indexOf('OPEN') +}); + +/** + * @constant {Number} CLOSING + * @memberof WebSocket + */ +Object.defineProperty(WebSocket$1, 'CLOSING', { + enumerable: true, + value: readyStates.indexOf('CLOSING') +}); + +/** + * @constant {Number} CLOSING + * @memberof WebSocket.prototype + */ +Object.defineProperty(WebSocket$1.prototype, 'CLOSING', { + enumerable: true, + value: readyStates.indexOf('CLOSING') +}); + +/** + * @constant {Number} CLOSED + * @memberof WebSocket + */ +Object.defineProperty(WebSocket$1, 'CLOSED', { + enumerable: true, + value: readyStates.indexOf('CLOSED') +}); + +/** + * @constant {Number} CLOSED + * @memberof WebSocket.prototype + */ +Object.defineProperty(WebSocket$1.prototype, 'CLOSED', { + enumerable: true, + value: readyStates.indexOf('CLOSED') +}); + +[ + 'binaryType', + 'bufferedAmount', + 'extensions', + 'isPaused', + 'protocol', + 'readyState', + 'url' +].forEach((property) => { + Object.defineProperty(WebSocket$1.prototype, property, { enumerable: true }); +}); + +// +// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes. +// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface +// +['open', 'error', 'close', 'message'].forEach((method) => { + Object.defineProperty(WebSocket$1.prototype, `on${method}`, { + enumerable: true, + get() { + for (const listener of this.listeners(method)) { + if (listener[kForOnEventAttribute]) return listener[kListener]; + } + + return null; + }, + set(handler) { + for (const listener of this.listeners(method)) { + if (listener[kForOnEventAttribute]) { + this.removeListener(method, listener); + break; + } + } + + if (typeof handler !== 'function') return; + + this.addEventListener(method, handler, { + [kForOnEventAttribute]: true + }); + } + }); +}); + +WebSocket$1.prototype.addEventListener = addEventListener; +WebSocket$1.prototype.removeEventListener = removeEventListener; + +var websocket = WebSocket$1; + +/** + * Initialize a WebSocket client. + * + * @param {WebSocket} websocket The client to initialize + * @param {(String|URL)} address The URL to which to connect + * @param {Array} protocols The subprotocols + * @param {Object} [options] Connection options + * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any + * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple + * times in the same tick + * @param {Boolean} [options.autoPong=true] Specifies whether or not to + * automatically send a pong in response to a ping + * @param {Function} [options.finishRequest] A function which can be used to + * customize the headers of each http request before it is sent + * @param {Boolean} [options.followRedirects=false] Whether or not to follow + * redirects + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the + * handshake request + * @param {Number} [options.maxPayload=104857600] The maximum allowed message + * size + * @param {Number} [options.maxRedirects=10] The maximum number of redirects + * allowed + * @param {String} [options.origin] Value of the `Origin` or + * `Sec-WebSocket-Origin` header + * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable + * permessage-deflate + * @param {Number} [options.protocolVersion=13] Value of the + * `Sec-WebSocket-Version` header + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + * @private + */ +function initAsClient(websocket, address, protocols, options) { + const opts = { + allowSynchronousEvents: true, + autoPong: true, + protocolVersion: protocolVersions[1], + maxPayload: 100 * 1024 * 1024, + skipUTF8Validation: false, + perMessageDeflate: true, + followRedirects: false, + maxRedirects: 10, + ...options, + socketPath: undefined, + hostname: undefined, + protocol: undefined, + timeout: undefined, + method: 'GET', + host: undefined, + path: undefined, + port: undefined + }; + + websocket._autoPong = opts.autoPong; + + if (!protocolVersions.includes(opts.protocolVersion)) { + throw new RangeError( + `Unsupported protocol version: ${opts.protocolVersion} ` + + `(supported versions: ${protocolVersions.join(', ')})` + ); + } + + let parsedUrl; + + if (address instanceof URL$2) { + parsedUrl = address; + } else { + try { + parsedUrl = new URL$2(address); + } catch (e) { + throw new SyntaxError(`Invalid URL: ${address}`); + } + } + + if (parsedUrl.protocol === 'http:') { + parsedUrl.protocol = 'ws:'; + } else if (parsedUrl.protocol === 'https:') { + parsedUrl.protocol = 'wss:'; + } + + websocket._url = parsedUrl.href; + + const isSecure = parsedUrl.protocol === 'wss:'; + const isIpcUrl = parsedUrl.protocol === 'ws+unix:'; + let invalidUrlMessage; + + if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) { + invalidUrlMessage = + 'The URL\'s protocol must be one of "ws:", "wss:", ' + + '"http:", "https", or "ws+unix:"'; + } else if (isIpcUrl && !parsedUrl.pathname) { + invalidUrlMessage = "The URL's pathname is empty"; + } else if (parsedUrl.hash) { + invalidUrlMessage = 'The URL contains a fragment identifier'; + } + + if (invalidUrlMessage) { + const err = new SyntaxError(invalidUrlMessage); + + if (websocket._redirects === 0) { + throw err; + } else { + emitErrorAndClose(websocket, err); + return; + } + } + + const defaultPort = isSecure ? 443 : 80; + const key = randomBytes(16).toString('base64'); + const request = isSecure ? https$2.request : http$3.request; + const protocolSet = new Set(); + let perMessageDeflate; + + opts.createConnection = + opts.createConnection || (isSecure ? tlsConnect : netConnect); + opts.defaultPort = opts.defaultPort || defaultPort; + opts.port = parsedUrl.port || defaultPort; + opts.host = parsedUrl.hostname.startsWith('[') + ? parsedUrl.hostname.slice(1, -1) + : parsedUrl.hostname; + opts.headers = { + ...opts.headers, + 'Sec-WebSocket-Version': opts.protocolVersion, + 'Sec-WebSocket-Key': key, + Connection: 'Upgrade', + Upgrade: 'websocket' + }; + opts.path = parsedUrl.pathname + parsedUrl.search; + opts.timeout = opts.handshakeTimeout; + + if (opts.perMessageDeflate) { + perMessageDeflate = new PerMessageDeflate$1( + opts.perMessageDeflate !== true ? opts.perMessageDeflate : {}, + false, + opts.maxPayload + ); + opts.headers['Sec-WebSocket-Extensions'] = format({ + [PerMessageDeflate$1.extensionName]: perMessageDeflate.offer() + }); + } + if (protocols.length) { + for (const protocol of protocols) { + if ( + typeof protocol !== 'string' || + !subprotocolRegex.test(protocol) || + protocolSet.has(protocol) + ) { + throw new SyntaxError( + 'An invalid or duplicated subprotocol was specified' + ); + } + + protocolSet.add(protocol); + } + + opts.headers['Sec-WebSocket-Protocol'] = protocols.join(','); + } + if (opts.origin) { + if (opts.protocolVersion < 13) { + opts.headers['Sec-WebSocket-Origin'] = opts.origin; + } else { + opts.headers.Origin = opts.origin; + } + } + if (parsedUrl.username || parsedUrl.password) { + opts.auth = `${parsedUrl.username}:${parsedUrl.password}`; + } + + if (isIpcUrl) { + const parts = opts.path.split(':'); + + opts.socketPath = parts[0]; + opts.path = parts[1]; + } + + let req; + + if (opts.followRedirects) { + if (websocket._redirects === 0) { + websocket._originalIpc = isIpcUrl; + websocket._originalSecure = isSecure; + websocket._originalHostOrSocketPath = isIpcUrl + ? opts.socketPath + : parsedUrl.host; + + const headers = options && options.headers; + + // + // Shallow copy the user provided options so that headers can be changed + // without mutating the original object. + // + options = { ...options, headers: {} }; + + if (headers) { + for (const [key, value] of Object.entries(headers)) { + options.headers[key.toLowerCase()] = value; + } + } + } else if (websocket.listenerCount('redirect') === 0) { + const isSameHost = isIpcUrl + ? websocket._originalIpc + ? opts.socketPath === websocket._originalHostOrSocketPath + : false + : websocket._originalIpc + ? false + : parsedUrl.host === websocket._originalHostOrSocketPath; + + if (!isSameHost || (websocket._originalSecure && !isSecure)) { + // + // Match curl 7.77.0 behavior and drop the following headers. These + // headers are also dropped when following a redirect to a subdomain. + // + delete opts.headers.authorization; + delete opts.headers.cookie; + + if (!isSameHost) delete opts.headers.host; + + opts.auth = undefined; + } + } + + // + // Match curl 7.77.0 behavior and make the first `Authorization` header win. + // If the `Authorization` header is set, then there is nothing to do as it + // will take precedence. + // + if (opts.auth && !options.headers.authorization) { + options.headers.authorization = + 'Basic ' + Buffer.from(opts.auth).toString('base64'); + } + + req = websocket._req = request(opts); + + if (websocket._redirects) { + // + // Unlike what is done for the `'upgrade'` event, no early exit is + // triggered here if the user calls `websocket.close()` or + // `websocket.terminate()` from a listener of the `'redirect'` event. This + // is because the user can also call `request.destroy()` with an error + // before calling `websocket.close()` or `websocket.terminate()` and this + // would result in an error being emitted on the `request` object with no + // `'error'` event listeners attached. + // + websocket.emit('redirect', websocket.url, req); + } + } else { + req = websocket._req = request(opts); + } + + if (opts.timeout) { + req.on('timeout', () => { + abortHandshake$1(websocket, req, 'Opening handshake has timed out'); + }); + } + + req.on('error', (err) => { + if (req === null || req[kAborted]) return; + + req = websocket._req = null; + emitErrorAndClose(websocket, err); + }); + + req.on('response', (res) => { + const location = res.headers.location; + const statusCode = res.statusCode; + + if ( + location && + opts.followRedirects && + statusCode >= 300 && + statusCode < 400 + ) { + if (++websocket._redirects > opts.maxRedirects) { + abortHandshake$1(websocket, req, 'Maximum redirects exceeded'); + return; + } + + req.abort(); + + let addr; + + try { + addr = new URL$2(location, address); + } catch (e) { + const err = new SyntaxError(`Invalid URL: ${location}`); + emitErrorAndClose(websocket, err); + return; + } + + initAsClient(websocket, addr, protocols, options); + } else if (!websocket.emit('unexpected-response', req, res)) { + abortHandshake$1( + websocket, + req, + `Unexpected server response: ${res.statusCode}` + ); + } + }); + + req.on('upgrade', (res, socket, head) => { + websocket.emit('upgrade', res); + + // + // The user may have closed the connection from a listener of the + // `'upgrade'` event. + // + if (websocket.readyState !== WebSocket$1.CONNECTING) return; + + req = websocket._req = null; + + const upgrade = res.headers.upgrade; + + if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') { + abortHandshake$1(websocket, socket, 'Invalid Upgrade header'); + return; + } + + const digest = createHash$1('sha1') + .update(key + GUID$1) + .digest('base64'); + + if (res.headers['sec-websocket-accept'] !== digest) { + abortHandshake$1(websocket, socket, 'Invalid Sec-WebSocket-Accept header'); + return; + } + + const serverProt = res.headers['sec-websocket-protocol']; + let protError; + + if (serverProt !== undefined) { + if (!protocolSet.size) { + protError = 'Server sent a subprotocol but none was requested'; + } else if (!protocolSet.has(serverProt)) { + protError = 'Server sent an invalid subprotocol'; + } + } else if (protocolSet.size) { + protError = 'Server sent no subprotocol'; + } + + if (protError) { + abortHandshake$1(websocket, socket, protError); + return; + } + + if (serverProt) websocket._protocol = serverProt; + + const secWebSocketExtensions = res.headers['sec-websocket-extensions']; + + if (secWebSocketExtensions !== undefined) { + if (!perMessageDeflate) { + const message = + 'Server sent a Sec-WebSocket-Extensions header but no extension ' + + 'was requested'; + abortHandshake$1(websocket, socket, message); + return; + } + + let extensions; + + try { + extensions = parse$1(secWebSocketExtensions); + } catch (err) { + const message = 'Invalid Sec-WebSocket-Extensions header'; + abortHandshake$1(websocket, socket, message); + return; + } + + const extensionNames = Object.keys(extensions); + + if ( + extensionNames.length !== 1 || + extensionNames[0] !== PerMessageDeflate$1.extensionName + ) { + const message = 'Server indicated an extension that was not requested'; + abortHandshake$1(websocket, socket, message); + return; + } + + try { + perMessageDeflate.accept(extensions[PerMessageDeflate$1.extensionName]); + } catch (err) { + const message = 'Invalid Sec-WebSocket-Extensions header'; + abortHandshake$1(websocket, socket, message); + return; + } + + websocket._extensions[PerMessageDeflate$1.extensionName] = + perMessageDeflate; + } + + websocket.setSocket(socket, head, { + allowSynchronousEvents: opts.allowSynchronousEvents, + generateMask: opts.generateMask, + maxPayload: opts.maxPayload, + skipUTF8Validation: opts.skipUTF8Validation + }); + }); + + if (opts.finishRequest) { + opts.finishRequest(req, websocket); + } else { + req.end(); + } +} + +/** + * Emit the `'error'` and `'close'` events. + * + * @param {WebSocket} websocket The WebSocket instance + * @param {Error} The error to emit + * @private + */ +function emitErrorAndClose(websocket, err) { + websocket._readyState = WebSocket$1.CLOSING; + // + // The following assignment is practically useless and is done only for + // consistency. + // + websocket._errorEmitted = true; + websocket.emit('error', err); + websocket.emitClose(); +} + +/** + * Create a `net.Socket` and initiate a connection. + * + * @param {Object} options Connection options + * @return {net.Socket} The newly created socket used to start the connection + * @private + */ +function netConnect(options) { + options.path = options.socketPath; + return net.connect(options); +} + +/** + * Create a `tls.TLSSocket` and initiate a connection. + * + * @param {Object} options Connection options + * @return {tls.TLSSocket} The newly created socket used to start the connection + * @private + */ +function tlsConnect(options) { + options.path = undefined; + + if (!options.servername && options.servername !== '') { + options.servername = net.isIP(options.host) ? '' : options.host; + } + + return tls.connect(options); +} + +/** + * Abort the handshake and emit an error. + * + * @param {WebSocket} websocket The WebSocket instance + * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to + * abort or the socket to destroy + * @param {String} message The error message + * @private + */ +function abortHandshake$1(websocket, stream, message) { + websocket._readyState = WebSocket$1.CLOSING; + + const err = new Error(message); + Error.captureStackTrace(err, abortHandshake$1); + + if (stream.setHeader) { + stream[kAborted] = true; + stream.abort(); + + if (stream.socket && !stream.socket.destroyed) { + // + // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if + // called after the request completed. See + // https://github.com/websockets/ws/issues/1869. + // + stream.socket.destroy(); + } + + process.nextTick(emitErrorAndClose, websocket, err); + } else { + stream.destroy(err); + stream.once('error', websocket.emit.bind(websocket, 'error')); + stream.once('close', websocket.emitClose.bind(websocket)); + } +} + +/** + * Handle cases where the `ping()`, `pong()`, or `send()` methods are called + * when the `readyState` attribute is `CLOSING` or `CLOSED`. + * + * @param {WebSocket} websocket The WebSocket instance + * @param {*} [data] The data to send + * @param {Function} [cb] Callback + * @private + */ +function sendAfterClose(websocket, data, cb) { + if (data) { + const length = isBlob(data) ? data.size : toBuffer(data).length; + + // + // The `_bufferedAmount` property is used only when the peer is a client and + // the opening handshake fails. Under these circumstances, in fact, the + // `setSocket()` method is not called, so the `_socket` and `_sender` + // properties are set to `null`. + // + if (websocket._socket) websocket._sender._bufferedBytes += length; + else websocket._bufferedAmount += length; + } + + if (cb) { + const err = new Error( + `WebSocket is not open: readyState ${websocket.readyState} ` + + `(${readyStates[websocket.readyState]})` + ); + process.nextTick(cb, err); + } +} + +/** + * The listener of the `Receiver` `'conclude'` event. + * + * @param {Number} code The status code + * @param {Buffer} reason The reason for closing + * @private + */ +function receiverOnConclude(code, reason) { + const websocket = this[kWebSocket$1]; + + websocket._closeFrameReceived = true; + websocket._closeMessage = reason; + websocket._closeCode = code; + + if (websocket._socket[kWebSocket$1] === undefined) return; + + websocket._socket.removeListener('data', socketOnData); + process.nextTick(resume, websocket._socket); + + if (code === 1005) websocket.close(); + else websocket.close(code, reason); +} + +/** + * The listener of the `Receiver` `'drain'` event. + * + * @private + */ +function receiverOnDrain() { + const websocket = this[kWebSocket$1]; + + if (!websocket.isPaused) websocket._socket.resume(); +} + +/** + * The listener of the `Receiver` `'error'` event. + * + * @param {(RangeError|Error)} err The emitted error + * @private + */ +function receiverOnError(err) { + const websocket = this[kWebSocket$1]; + + if (websocket._socket[kWebSocket$1] !== undefined) { + websocket._socket.removeListener('data', socketOnData); + + // + // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See + // https://github.com/websockets/ws/issues/1940. + // + process.nextTick(resume, websocket._socket); + + websocket.close(err[kStatusCode]); + } + + if (!websocket._errorEmitted) { + websocket._errorEmitted = true; + websocket.emit('error', err); + } +} + +/** + * The listener of the `Receiver` `'finish'` event. + * + * @private + */ +function receiverOnFinish() { + this[kWebSocket$1].emitClose(); +} + +/** + * The listener of the `Receiver` `'message'` event. + * + * @param {Buffer|ArrayBuffer|Buffer[])} data The message + * @param {Boolean} isBinary Specifies whether the message is binary or not + * @private + */ +function receiverOnMessage(data, isBinary) { + this[kWebSocket$1].emit('message', data, isBinary); +} + +/** + * The listener of the `Receiver` `'ping'` event. + * + * @param {Buffer} data The data included in the ping frame + * @private + */ +function receiverOnPing(data) { + const websocket = this[kWebSocket$1]; + + if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP$1); + websocket.emit('ping', data); +} + +/** + * The listener of the `Receiver` `'pong'` event. + * + * @param {Buffer} data The data included in the pong frame + * @private + */ +function receiverOnPong(data) { + this[kWebSocket$1].emit('pong', data); +} + +/** + * Resume a readable stream + * + * @param {Readable} stream The readable stream + * @private + */ +function resume(stream) { + stream.resume(); +} + +/** + * The `Sender` error event handler. + * + * @param {Error} The error + * @private + */ +function senderOnError(err) { + const websocket = this[kWebSocket$1]; + + if (websocket.readyState === WebSocket$1.CLOSED) return; + if (websocket.readyState === WebSocket$1.OPEN) { + websocket._readyState = WebSocket$1.CLOSING; + setCloseTimer(websocket); + } + + // + // `socket.end()` is used instead of `socket.destroy()` to allow the other + // peer to finish sending queued data. There is no need to set a timer here + // because `CLOSING` means that it is already set or not needed. + // + this._socket.end(); + + if (!websocket._errorEmitted) { + websocket._errorEmitted = true; + websocket.emit('error', err); + } +} + +/** + * Set a timer to destroy the underlying raw socket of a WebSocket. + * + * @param {WebSocket} websocket The WebSocket instance + * @private + */ +function setCloseTimer(websocket) { + websocket._closeTimer = setTimeout( + websocket._socket.destroy.bind(websocket._socket), + closeTimeout + ); +} + +/** + * The listener of the socket `'close'` event. + * + * @private + */ +function socketOnClose() { + const websocket = this[kWebSocket$1]; + + this.removeListener('close', socketOnClose); + this.removeListener('data', socketOnData); + this.removeListener('end', socketOnEnd); + + websocket._readyState = WebSocket$1.CLOSING; + + let chunk; + + // + // The close frame might not have been received or the `'end'` event emitted, + // for example, if the socket was destroyed due to an error. Ensure that the + // `receiver` stream is closed after writing any remaining buffered data to + // it. If the readable side of the socket is in flowing mode then there is no + // buffered data as everything has been already written and `readable.read()` + // will return `null`. If instead, the socket is paused, any possible buffered + // data will be read as a single chunk. + // + if ( + !this._readableState.endEmitted && + !websocket._closeFrameReceived && + !websocket._receiver._writableState.errorEmitted && + (chunk = websocket._socket.read()) !== null + ) { + websocket._receiver.write(chunk); + } + + websocket._receiver.end(); + + this[kWebSocket$1] = undefined; + + clearTimeout(websocket._closeTimer); + + if ( + websocket._receiver._writableState.finished || + websocket._receiver._writableState.errorEmitted + ) { + websocket.emitClose(); + } else { + websocket._receiver.on('error', receiverOnFinish); + websocket._receiver.on('finish', receiverOnFinish); + } +} + +/** + * The listener of the socket `'data'` event. + * + * @param {Buffer} chunk A chunk of data + * @private + */ +function socketOnData(chunk) { + if (!this[kWebSocket$1]._receiver.write(chunk)) { + this.pause(); + } +} + +/** + * The listener of the socket `'end'` event. + * + * @private + */ +function socketOnEnd() { + const websocket = this[kWebSocket$1]; + + websocket._readyState = WebSocket$1.CLOSING; + websocket._receiver.end(); + this.end(); +} + +/** + * The listener of the socket `'error'` event. + * + * @private + */ +function socketOnError$1() { + const websocket = this[kWebSocket$1]; + + this.removeListener('error', socketOnError$1); + this.on('error', NOOP$1); + + if (websocket) { + websocket._readyState = WebSocket$1.CLOSING; + this.destroy(); + } +} + +const { tokenChars } = validationExports; + +/** + * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names. + * + * @param {String} header The field value of the header + * @return {Set} The subprotocol names + * @public + */ +function parse(header) { + const protocols = new Set(); + let start = -1; + let end = -1; + let i = 0; + + for (i; i < header.length; i++) { + const code = header.charCodeAt(i); + + if (end === -1 && tokenChars[code] === 1) { + if (start === -1) start = i; + } else if ( + i !== 0 && + (code === 0x20 /* ' ' */ || code === 0x09) /* '\t' */ + ) { + if (end === -1 && start !== -1) end = i; + } else if (code === 0x2c /* ',' */) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + + if (end === -1) end = i; + + const protocol = header.slice(start, end); + + if (protocols.has(protocol)) { + throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`); + } + + protocols.add(protocol); + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } + + if (start === -1 || end !== -1) { + throw new SyntaxError('Unexpected end of input'); + } + + const protocol = header.slice(start, i); + + if (protocols.has(protocol)) { + throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`); + } + + protocols.add(protocol); + return protocols; +} + +var subprotocol$1 = { parse }; + +/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^Duplex$", "caughtErrors": "none" }] */ + +const EventEmitter = require$$0$7; +const http$2 = require$$1; +const { createHash } = require$$3$1; + +const extension = extension$1; +const PerMessageDeflate = permessageDeflate; +const subprotocol = subprotocol$1; +const WebSocket = websocket; +const { GUID, kWebSocket } = constants; + +const keyRegex = /^[+/0-9A-Za-z]{22}==$/; + +const RUNNING = 0; +const CLOSING = 1; +const CLOSED = 2; + +/** + * Class representing a WebSocket server. + * + * @extends EventEmitter + */ +class WebSocketServer extends EventEmitter { + /** + * Create a `WebSocketServer` instance. + * + * @param {Object} options Configuration options + * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether + * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted + * multiple times in the same tick + * @param {Boolean} [options.autoPong=true] Specifies whether or not to + * automatically send a pong in response to a ping + * @param {Number} [options.backlog=511] The maximum length of the queue of + * pending connections + * @param {Boolean} [options.clientTracking=true] Specifies whether or not to + * track clients + * @param {Function} [options.handleProtocols] A hook to handle protocols + * @param {String} [options.host] The hostname where to bind the server + * @param {Number} [options.maxPayload=104857600] The maximum allowed message + * size + * @param {Boolean} [options.noServer=false] Enable no server mode + * @param {String} [options.path] Accept only connections matching this path + * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable + * permessage-deflate + * @param {Number} [options.port] The port where to bind the server + * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S + * server to use + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + * @param {Function} [options.verifyClient] A hook to reject connections + * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket` + * class to use. It must be the `WebSocket` class or class that extends it + * @param {Function} [callback] A listener for the `listening` event + */ + constructor(options, callback) { + super(); + + options = { + allowSynchronousEvents: true, + autoPong: true, + maxPayload: 100 * 1024 * 1024, + skipUTF8Validation: false, + perMessageDeflate: false, + handleProtocols: null, + clientTracking: true, + verifyClient: null, + noServer: false, + backlog: null, // use default (511 as implemented in net.js) + server: null, + host: null, + path: null, + port: null, + WebSocket, + ...options + }; + + if ( + (options.port == null && !options.server && !options.noServer) || + (options.port != null && (options.server || options.noServer)) || + (options.server && options.noServer) + ) { + throw new TypeError( + 'One and only one of the "port", "server", or "noServer" options ' + + 'must be specified' + ); + } + + if (options.port != null) { + this._server = http$2.createServer((req, res) => { + const body = http$2.STATUS_CODES[426]; + + res.writeHead(426, { + 'Content-Length': body.length, + 'Content-Type': 'text/plain' + }); + res.end(body); + }); + this._server.listen( + options.port, + options.host, + options.backlog, + callback + ); + } else if (options.server) { + this._server = options.server; + } + + if (this._server) { + const emitConnection = this.emit.bind(this, 'connection'); + + this._removeListeners = addListeners(this._server, { + listening: this.emit.bind(this, 'listening'), + error: this.emit.bind(this, 'error'), + upgrade: (req, socket, head) => { + this.handleUpgrade(req, socket, head, emitConnection); + } + }); + } + + if (options.perMessageDeflate === true) options.perMessageDeflate = {}; + if (options.clientTracking) { + this.clients = new Set(); + this._shouldEmitClose = false; + } + + this.options = options; + this._state = RUNNING; + } + + /** + * Returns the bound address, the address family name, and port of the server + * as reported by the operating system if listening on an IP socket. + * If the server is listening on a pipe or UNIX domain socket, the name is + * returned as a string. + * + * @return {(Object|String|null)} The address of the server + * @public + */ + address() { + if (this.options.noServer) { + throw new Error('The server is operating in "noServer" mode'); + } + + if (!this._server) return null; + return this._server.address(); + } + + /** + * Stop the server from accepting new connections and emit the `'close'` event + * when all existing connections are closed. + * + * @param {Function} [cb] A one-time listener for the `'close'` event + * @public + */ + close(cb) { + if (this._state === CLOSED) { + if (cb) { + this.once('close', () => { + cb(new Error('The server is not running')); + }); + } + + process.nextTick(emitClose, this); + return; + } + + if (cb) this.once('close', cb); + + if (this._state === CLOSING) return; + this._state = CLOSING; + + if (this.options.noServer || this.options.server) { + if (this._server) { + this._removeListeners(); + this._removeListeners = this._server = null; + } + + if (this.clients) { + if (!this.clients.size) { + process.nextTick(emitClose, this); + } else { + this._shouldEmitClose = true; + } + } else { + process.nextTick(emitClose, this); + } + } else { + const server = this._server; + + this._removeListeners(); + this._removeListeners = this._server = null; + + // + // The HTTP/S server was created internally. Close it, and rely on its + // `'close'` event. + // + server.close(() => { + emitClose(this); + }); + } + } + + /** + * See if a given request should be handled by this server instance. + * + * @param {http.IncomingMessage} req Request object to inspect + * @return {Boolean} `true` if the request is valid, else `false` + * @public + */ + shouldHandle(req) { + if (this.options.path) { + const index = req.url.indexOf('?'); + const pathname = index !== -1 ? req.url.slice(0, index) : req.url; + + if (pathname !== this.options.path) return false; + } + + return true; + } + + /** + * Handle a HTTP Upgrade request. + * + * @param {http.IncomingMessage} req The request object + * @param {Duplex} socket The network socket between the server and client + * @param {Buffer} head The first packet of the upgraded stream + * @param {Function} cb Callback + * @public + */ + handleUpgrade(req, socket, head, cb) { + socket.on('error', socketOnError); + + const key = req.headers['sec-websocket-key']; + const upgrade = req.headers.upgrade; + const version = +req.headers['sec-websocket-version']; + + if (req.method !== 'GET') { + const message = 'Invalid HTTP method'; + abortHandshakeOrEmitwsClientError(this, req, socket, 405, message); + return; + } + + if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') { + const message = 'Invalid Upgrade header'; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + + if (key === undefined || !keyRegex.test(key)) { + const message = 'Missing or invalid Sec-WebSocket-Key header'; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + + if (version !== 8 && version !== 13) { + const message = 'Missing or invalid Sec-WebSocket-Version header'; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + + if (!this.shouldHandle(req)) { + abortHandshake(socket, 400); + return; + } + + const secWebSocketProtocol = req.headers['sec-websocket-protocol']; + let protocols = new Set(); + + if (secWebSocketProtocol !== undefined) { + try { + protocols = subprotocol.parse(secWebSocketProtocol); + } catch (err) { + const message = 'Invalid Sec-WebSocket-Protocol header'; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + } + + const secWebSocketExtensions = req.headers['sec-websocket-extensions']; + const extensions = {}; + + if ( + this.options.perMessageDeflate && + secWebSocketExtensions !== undefined + ) { + const perMessageDeflate = new PerMessageDeflate( + this.options.perMessageDeflate, + true, + this.options.maxPayload + ); + + try { + const offers = extension.parse(secWebSocketExtensions); + + if (offers[PerMessageDeflate.extensionName]) { + perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]); + extensions[PerMessageDeflate.extensionName] = perMessageDeflate; + } + } catch (err) { + const message = + 'Invalid or unacceptable Sec-WebSocket-Extensions header'; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + } + + // + // Optionally call external client verification handler. + // + if (this.options.verifyClient) { + const info = { + origin: + req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`], + secure: !!(req.socket.authorized || req.socket.encrypted), + req + }; + + if (this.options.verifyClient.length === 2) { + this.options.verifyClient(info, (verified, code, message, headers) => { + if (!verified) { + return abortHandshake(socket, code || 401, message, headers); + } + + this.completeUpgrade( + extensions, + key, + protocols, + req, + socket, + head, + cb + ); + }); + return; + } + + if (!this.options.verifyClient(info)) return abortHandshake(socket, 401); + } + + this.completeUpgrade(extensions, key, protocols, req, socket, head, cb); + } + + /** + * Upgrade the connection to WebSocket. + * + * @param {Object} extensions The accepted extensions + * @param {String} key The value of the `Sec-WebSocket-Key` header + * @param {Set} protocols The subprotocols + * @param {http.IncomingMessage} req The request object + * @param {Duplex} socket The network socket between the server and client + * @param {Buffer} head The first packet of the upgraded stream + * @param {Function} cb Callback + * @throws {Error} If called more than once with the same socket + * @private + */ + completeUpgrade(extensions, key, protocols, req, socket, head, cb) { + // + // Destroy the socket if the client has already sent a FIN packet. + // + if (!socket.readable || !socket.writable) return socket.destroy(); + + if (socket[kWebSocket]) { + throw new Error( + 'server.handleUpgrade() was called more than once with the same ' + + 'socket, possibly due to a misconfiguration' + ); + } + + if (this._state > RUNNING) return abortHandshake(socket, 503); + + const digest = createHash('sha1') + .update(key + GUID) + .digest('base64'); + + const headers = [ + 'HTTP/1.1 101 Switching Protocols', + 'Upgrade: websocket', + 'Connection: Upgrade', + `Sec-WebSocket-Accept: ${digest}` + ]; + + const ws = new this.options.WebSocket(null, undefined, this.options); + + if (protocols.size) { + // + // Optionally call external protocol selection handler. + // + const protocol = this.options.handleProtocols + ? this.options.handleProtocols(protocols, req) + : protocols.values().next().value; + + if (protocol) { + headers.push(`Sec-WebSocket-Protocol: ${protocol}`); + ws._protocol = protocol; + } + } + + if (extensions[PerMessageDeflate.extensionName]) { + const params = extensions[PerMessageDeflate.extensionName].params; + const value = extension.format({ + [PerMessageDeflate.extensionName]: [params] + }); + headers.push(`Sec-WebSocket-Extensions: ${value}`); + ws._extensions = extensions; + } + + // + // Allow external modification/inspection of handshake headers. + // + this.emit('headers', headers, req); + + socket.write(headers.concat('\r\n').join('\r\n')); + socket.removeListener('error', socketOnError); + + ws.setSocket(socket, head, { + allowSynchronousEvents: this.options.allowSynchronousEvents, + maxPayload: this.options.maxPayload, + skipUTF8Validation: this.options.skipUTF8Validation + }); + + if (this.clients) { + this.clients.add(ws); + ws.on('close', () => { + this.clients.delete(ws); + + if (this._shouldEmitClose && !this.clients.size) { + process.nextTick(emitClose, this); + } + }); + } + + cb(ws, req); + } +} + +var websocketServer = WebSocketServer; + +/** + * Add event listeners on an `EventEmitter` using a map of + * pairs. + * + * @param {EventEmitter} server The event emitter + * @param {Object.} map The listeners to add + * @return {Function} A function that will remove the added listeners when + * called + * @private + */ +function addListeners(server, map) { + for (const event of Object.keys(map)) server.on(event, map[event]); + + return function removeListeners() { + for (const event of Object.keys(map)) { + server.removeListener(event, map[event]); + } + }; +} + +/** + * Emit a `'close'` event on an `EventEmitter`. + * + * @param {EventEmitter} server The event emitter + * @private + */ +function emitClose(server) { + server._state = CLOSED; + server.emit('close'); +} + +/** + * Handle socket errors. + * + * @private + */ +function socketOnError() { + this.destroy(); +} + +/** + * Close the connection when preconditions are not fulfilled. + * + * @param {Duplex} socket The socket of the upgrade request + * @param {Number} code The HTTP response status code + * @param {String} [message] The HTTP response body + * @param {Object} [headers] Additional HTTP response headers + * @private + */ +function abortHandshake(socket, code, message, headers) { + // + // The socket is writable unless the user destroyed or ended it before calling + // `server.handleUpgrade()` or in the `verifyClient` function, which is a user + // error. Handling this does not make much sense as the worst that can happen + // is that some of the data written by the user might be discarded due to the + // call to `socket.end()` below, which triggers an `'error'` event that in + // turn causes the socket to be destroyed. + // + message = message || http$2.STATUS_CODES[code]; + headers = { + Connection: 'close', + 'Content-Type': 'text/html', + 'Content-Length': Buffer.byteLength(message), + ...headers + }; + + socket.once('finish', socket.destroy); + + socket.end( + `HTTP/1.1 ${code} ${http$2.STATUS_CODES[code]}\r\n` + + Object.keys(headers) + .map((h) => `${h}: ${headers[h]}`) + .join('\r\n') + + '\r\n\r\n' + + message + ); +} + +/** + * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least + * one listener for it, otherwise call `abortHandshake()`. + * + * @param {WebSocketServer} server The WebSocket server + * @param {http.IncomingMessage} req The request object + * @param {Duplex} socket The socket of the upgrade request + * @param {Number} code The HTTP response status code + * @param {String} message The HTTP response body + * @private + */ +function abortHandshakeOrEmitwsClientError(server, req, socket, code, message) { + if (server.listenerCount('wsClientError')) { + const err = new Error(message); + Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError); + + server.emit('wsClientError', err, socket, req); + } else { + abortHandshake(socket, code, message); + } +} + +var WebSocketServerRaw_ = /*@__PURE__*/getDefaultExportFromCjs(websocketServer); + +const allowedHostsServerCache = /* @__PURE__ */ new WeakMap(); +const allowedHostsPreviewCache = /* @__PURE__ */ new WeakMap(); +const isFileOrExtensionProtocolRE = /^(?:file|.+-extension):/i; +function getAdditionalAllowedHosts(resolvedServerOptions, resolvedPreviewOptions) { + const list = []; + if (typeof resolvedServerOptions.host === "string" && resolvedServerOptions.host) { + list.push(resolvedServerOptions.host); + } + if (typeof resolvedServerOptions.hmr === "object" && resolvedServerOptions.hmr.host) { + list.push(resolvedServerOptions.hmr.host); + } + if (typeof resolvedPreviewOptions.host === "string" && resolvedPreviewOptions.host) { + list.push(resolvedPreviewOptions.host); + } + if (resolvedServerOptions.origin) { + try { + const serverOriginUrl = new URL(resolvedServerOptions.origin); + list.push(serverOriginUrl.hostname); + } catch { + } + } + return list; +} +function isHostAllowedWithoutCache(allowedHosts, additionalAllowedHosts, host) { + if (isFileOrExtensionProtocolRE.test(host)) { + return true; + } + const trimmedHost = host.trim(); + if (trimmedHost[0] === "[") { + const endIpv6 = trimmedHost.indexOf("]"); + if (endIpv6 < 0) { + return false; + } + return net$1.isIP(trimmedHost.slice(1, endIpv6)) === 6; + } + const colonPos = trimmedHost.indexOf(":"); + const hostname = colonPos === -1 ? trimmedHost : trimmedHost.slice(0, colonPos); + if (net$1.isIP(hostname) === 4) { + return true; + } + if (hostname === "localhost" || hostname.endsWith(".localhost")) { + return true; + } + for (const additionalAllowedHost of additionalAllowedHosts) { + if (additionalAllowedHost === hostname) { + return true; + } + } + for (const allowedHost of allowedHosts) { + if (allowedHost === hostname) { + return true; + } + if (allowedHost[0] === "." && (allowedHost.slice(1) === hostname || hostname.endsWith(allowedHost))) { + return true; + } + } + return false; +} +function isHostAllowed(config, isPreview, host) { + const allowedHosts = isPreview ? config.preview.allowedHosts : config.server.allowedHosts; + if (allowedHosts === true) { + return true; + } + const cache = isPreview ? allowedHostsPreviewCache : allowedHostsServerCache; + if (!cache.has(config)) { + cache.set(config, /* @__PURE__ */ new Set()); + } + const cachedAllowedHosts = cache.get(config); + if (cachedAllowedHosts.has(host)) { + return true; + } + const result = isHostAllowedWithoutCache( + allowedHosts ?? [], + config.additionalAllowedHosts, + host + ); + if (result) { + cachedAllowedHosts.add(host); + } + return result; +} +function hostCheckMiddleware(config, isPreview) { + return function viteHostCheckMiddleware(req, res, next) { + const hostHeader = req.headers.host; + if (!hostHeader || !isHostAllowed(config, isPreview, hostHeader)) { + const hostname = hostHeader?.replace(/:\d+$/, ""); + const hostnameWithQuotes = JSON.stringify(hostname); + const optionName = `${isPreview ? "preview" : "server"}.allowedHosts`; + res.writeHead(403, { + "Content-Type": "text/plain" + }); + res.end( + `Blocked request. This host (${hostnameWithQuotes}) is not allowed. +To allow this host, add ${hostnameWithQuotes} to \`${optionName}\` in vite.config.js.` + ); + return; + } + return next(); + }; +} + +const WebSocketServerRaw = process.versions.bun ? ( + // @ts-expect-error: Bun defines `import.meta.require` + import.meta.require("ws").WebSocketServer +) : WebSocketServerRaw_; +const HMR_HEADER = "vite-hmr"; +const wsServerEvents = [ + "connection", + "error", + "headers", + "listening", + "message" +]; +function noop$1() { +} +function hasValidToken(config, url) { + const token = url.searchParams.get("token"); + if (!token) return false; + try { + const isValidToken = crypto$2.timingSafeEqual( + Buffer.from(token), + Buffer.from(config.webSocketToken) + ); + return isValidToken; + } catch { + } + return false; +} +function createWebSocketServer(server, config, httpsOptions) { + if (config.server.ws === false) { + return { + name: "ws", + get clients() { + return /* @__PURE__ */ new Set(); + }, + async close() { + }, + on: noop$1, + off: noop$1, + listen: noop$1, + send: noop$1 + }; + } + let wsHttpServer = void 0; + const hmr = isObject$1(config.server.hmr) && config.server.hmr; + const hmrServer = hmr && hmr.server; + const hmrPort = hmr && hmr.port; + const portsAreCompatible = !hmrPort || hmrPort === config.server.port; + const wsServer = hmrServer || portsAreCompatible && server; + let hmrServerWsListener; + const customListeners = /* @__PURE__ */ new Map(); + const clientsMap = /* @__PURE__ */ new WeakMap(); + const port = hmrPort || 24678; + const host = hmr && hmr.host || void 0; + const shouldHandle = (req) => { + const hostHeader = req.headers.host; + if (!hostHeader || !isHostAllowed(config, false, hostHeader)) { + return false; + } + if (config.legacy?.skipWebSocketTokenCheck) { + return true; + } + if (req.headers.origin) { + const parsedUrl = new URL(`http://example.com${req.url}`); + return hasValidToken(config, parsedUrl); + } + return true; + }; + const handleUpgrade = (req, socket, head, _isPing) => { + wss.handleUpgrade(req, socket, head, (ws) => { + wss.emit("connection", ws, req); + }); + }; + const wss = new WebSocketServerRaw({ noServer: true }); + wss.shouldHandle = shouldHandle; + if (wsServer) { + let hmrBase = config.base; + const hmrPath = hmr ? hmr.path : void 0; + if (hmrPath) { + hmrBase = path$n.posix.join(hmrBase, hmrPath); + } + hmrServerWsListener = (req, socket, head) => { + const parsedUrl = new URL(`http://example.com${req.url}`); + if (req.headers["sec-websocket-protocol"] === HMR_HEADER && parsedUrl.pathname === hmrBase) { + handleUpgrade(req, socket, head); + } + }; + wsServer.on("upgrade", hmrServerWsListener); + } else { + const route = (_, res) => { + const statusCode = 426; + const body = STATUS_CODES[statusCode]; + if (!body) + throw new Error(`No body text found for the ${statusCode} status code`); + res.writeHead(statusCode, { + "Content-Length": body.length, + "Content-Type": "text/plain" + }); + res.end(body); + }; + if (httpsOptions) { + wsHttpServer = createServer$2(httpsOptions, route); + } else { + wsHttpServer = createServer$3(route); + } + wsHttpServer.on("upgrade", (req, socket, head) => { + handleUpgrade(req, socket, head); + }); + wsHttpServer.on("error", (e) => { + if (e.code === "EADDRINUSE") { + config.logger.error( + colors$1.red(`WebSocket server error: Port is already in use`), + { error: e } + ); + } else { + config.logger.error( + colors$1.red(`WebSocket server error: +${e.stack || e.message}`), + { error: e } + ); + } + }); + } + wss.on("connection", (socket) => { + socket.on("message", (raw) => { + if (!customListeners.size) return; + let parsed; + try { + parsed = JSON.parse(String(raw)); + } catch { + } + if (!parsed || parsed.type !== "custom" || !parsed.event) return; + const listeners = customListeners.get(parsed.event); + if (!listeners?.size) return; + const client = getSocketClient(socket); + listeners.forEach((listener) => listener(parsed.data, client)); + }); + socket.on("error", (err) => { + config.logger.error(`${colors$1.red(`ws error:`)} +${err.stack}`, { + timestamp: true, + error: err + }); + }); + socket.send(JSON.stringify({ type: "connected" })); + if (bufferedError) { + socket.send(JSON.stringify(bufferedError)); + bufferedError = null; + } + }); + wss.on("error", (e) => { + if (e.code === "EADDRINUSE") { + config.logger.error( + colors$1.red(`WebSocket server error: Port is already in use`), + { error: e } + ); + } else { + config.logger.error( + colors$1.red(`WebSocket server error: +${e.stack || e.message}`), + { error: e } + ); + } + }); + function getSocketClient(socket) { + if (!clientsMap.has(socket)) { + clientsMap.set(socket, { + send: (...args) => { + let payload; + if (typeof args[0] === "string") { + payload = { + type: "custom", + event: args[0], + data: args[1] + }; + } else { + payload = args[0]; + } + socket.send(JSON.stringify(payload)); + }, + socket + }); + } + return clientsMap.get(socket); + } + let bufferedError = null; + return { + name: "ws", + listen: () => { + wsHttpServer?.listen(port, host); + }, + on: (event, fn) => { + if (wsServerEvents.includes(event)) wss.on(event, fn); + else { + if (!customListeners.has(event)) { + customListeners.set(event, /* @__PURE__ */ new Set()); + } + customListeners.get(event).add(fn); + } + }, + off: (event, fn) => { + if (wsServerEvents.includes(event)) { + wss.off(event, fn); + } else { + customListeners.get(event)?.delete(fn); + } + }, + get clients() { + return new Set(Array.from(wss.clients).map(getSocketClient)); + }, + send(...args) { + let payload; + if (typeof args[0] === "string") { + payload = { + type: "custom", + event: args[0], + data: args[1] + }; + } else { + payload = args[0]; + } + if (payload.type === "error" && !wss.clients.size) { + bufferedError = payload; + return; + } + const stringified = JSON.stringify(payload); + wss.clients.forEach((client) => { + if (client.readyState === 1) { + client.send(stringified); + } + }); + }, + close() { + if (hmrServerWsListener && wsServer) { + wsServer.off("upgrade", hmrServerWsListener); + } + return new Promise((resolve, reject) => { + wss.clients.forEach((client) => { + client.terminate(); + }); + wss.close((err) => { + if (err) { + reject(err); + } else { + if (wsHttpServer) { + wsHttpServer.close((err2) => { + if (err2) { + reject(err2); + } else { + resolve(); + } + }); + } else { + resolve(); + } + } + }); + }); + } + }; +} + +function baseMiddleware(rawBase, middlewareMode) { + return function viteBaseMiddleware(req, res, next) { + const url = req.url; + const pathname = cleanUrl(url); + const base = rawBase; + if (pathname.startsWith(base)) { + req.url = stripBase(url, base); + return next(); + } + if (middlewareMode) { + return next(); + } + if (pathname === "/" || pathname === "/index.html") { + res.writeHead(302, { + Location: base + url.slice(pathname.length) + }); + res.end(); + return; + } + const redirectPath = withTrailingSlash(url) !== base ? joinUrlSegments(base, url) : base; + if (req.headers.accept?.includes("text/html")) { + res.writeHead(404, { + "Content-Type": "text/html" + }); + res.end( + `The server is configured with a public base URL of ${base} - did you mean to visit ${redirectPath} instead?` + ); + return; + } else { + res.writeHead(404, { + "Content-Type": "text/plain" + }); + res.end( + `The server is configured with a public base URL of ${base} - did you mean to visit ${redirectPath} instead?` + ); + return; + } + }; +} + +var httpProxy$3 = {exports: {}}; + +var eventemitter3 = {exports: {}}; + +(function (module) { + + var has = Object.prototype.hasOwnProperty + , prefix = '~'; + + /** + * Constructor to create a storage for our `EE` objects. + * An `Events` instance is a plain object whose properties are event names. + * + * @constructor + * @private + */ + function Events() {} + + // + // We try to not inherit from `Object.prototype`. In some engines creating an + // instance in this way is faster than calling `Object.create(null)` directly. + // If `Object.create(null)` is not supported we prefix the event names with a + // character to make sure that the built-in object properties are not + // overridden or used as an attack vector. + // + if (Object.create) { + Events.prototype = Object.create(null); + + // + // This hack is needed because the `__proto__` property is still inherited in + // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5. + // + if (!new Events().__proto__) prefix = false; + } + + /** + * Representation of a single event listener. + * + * @param {Function} fn The listener function. + * @param {*} context The context to invoke the listener with. + * @param {Boolean} [once=false] Specify if the listener is a one-time listener. + * @constructor + * @private + */ + function EE(fn, context, once) { + this.fn = fn; + this.context = context; + this.once = once || false; + } + + /** + * Add a listener for a given event. + * + * @param {EventEmitter} emitter Reference to the `EventEmitter` instance. + * @param {(String|Symbol)} event The event name. + * @param {Function} fn The listener function. + * @param {*} context The context to invoke the listener with. + * @param {Boolean} once Specify if the listener is a one-time listener. + * @returns {EventEmitter} + * @private + */ + function addListener(emitter, event, fn, context, once) { + if (typeof fn !== 'function') { + throw new TypeError('The listener must be a function'); + } + + var listener = new EE(fn, context || emitter, once) + , evt = prefix ? prefix + event : event; + + if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++; + else if (!emitter._events[evt].fn) emitter._events[evt].push(listener); + else emitter._events[evt] = [emitter._events[evt], listener]; + + return emitter; + } + + /** + * Clear event by name. + * + * @param {EventEmitter} emitter Reference to the `EventEmitter` instance. + * @param {(String|Symbol)} evt The Event name. + * @private + */ + function clearEvent(emitter, evt) { + if (--emitter._eventsCount === 0) emitter._events = new Events(); + else delete emitter._events[evt]; + } + + /** + * Minimal `EventEmitter` interface that is molded against the Node.js + * `EventEmitter` interface. + * + * @constructor + * @public + */ + function EventEmitter() { + this._events = new Events(); + this._eventsCount = 0; + } + + /** + * Return an array listing the events for which the emitter has registered + * listeners. + * + * @returns {Array} + * @public + */ + EventEmitter.prototype.eventNames = function eventNames() { + var names = [] + , events + , name; + + if (this._eventsCount === 0) return names; + + for (name in (events = this._events)) { + if (has.call(events, name)) names.push(prefix ? name.slice(1) : name); + } + + if (Object.getOwnPropertySymbols) { + return names.concat(Object.getOwnPropertySymbols(events)); + } + + return names; + }; + + /** + * Return the listeners registered for a given event. + * + * @param {(String|Symbol)} event The event name. + * @returns {Array} The registered listeners. + * @public + */ + EventEmitter.prototype.listeners = function listeners(event) { + var evt = prefix ? prefix + event : event + , handlers = this._events[evt]; + + if (!handlers) return []; + if (handlers.fn) return [handlers.fn]; + + for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) { + ee[i] = handlers[i].fn; + } + + return ee; + }; + + /** + * Return the number of listeners listening to a given event. + * + * @param {(String|Symbol)} event The event name. + * @returns {Number} The number of listeners. + * @public + */ + EventEmitter.prototype.listenerCount = function listenerCount(event) { + var evt = prefix ? prefix + event : event + , listeners = this._events[evt]; + + if (!listeners) return 0; + if (listeners.fn) return 1; + return listeners.length; + }; + + /** + * Calls each of the listeners registered for a given event. + * + * @param {(String|Symbol)} event The event name. + * @returns {Boolean} `true` if the event had listeners, else `false`. + * @public + */ + EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return false; + + var listeners = this._events[evt] + , len = arguments.length + , args + , i; + + if (listeners.fn) { + if (listeners.once) this.removeListener(event, listeners.fn, undefined, true); + + switch (len) { + case 1: return listeners.fn.call(listeners.context), true; + case 2: return listeners.fn.call(listeners.context, a1), true; + case 3: return listeners.fn.call(listeners.context, a1, a2), true; + case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true; + case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; + case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; + } + + for (i = 1, args = new Array(len -1); i < len; i++) { + args[i - 1] = arguments[i]; + } + + listeners.fn.apply(listeners.context, args); + } else { + var length = listeners.length + , j; + + for (i = 0; i < length; i++) { + if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true); + + switch (len) { + case 1: listeners[i].fn.call(listeners[i].context); break; + case 2: listeners[i].fn.call(listeners[i].context, a1); break; + case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break; + case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break; + default: + if (!args) for (j = 1, args = new Array(len -1); j < len; j++) { + args[j - 1] = arguments[j]; + } + + listeners[i].fn.apply(listeners[i].context, args); + } + } + } + + return true; + }; + + /** + * Add a listener for a given event. + * + * @param {(String|Symbol)} event The event name. + * @param {Function} fn The listener function. + * @param {*} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @public + */ + EventEmitter.prototype.on = function on(event, fn, context) { + return addListener(this, event, fn, context, false); + }; + + /** + * Add a one-time listener for a given event. + * + * @param {(String|Symbol)} event The event name. + * @param {Function} fn The listener function. + * @param {*} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @public + */ + EventEmitter.prototype.once = function once(event, fn, context) { + return addListener(this, event, fn, context, true); + }; + + /** + * Remove the listeners of a given event. + * + * @param {(String|Symbol)} event The event name. + * @param {Function} fn Only remove the listeners that match this function. + * @param {*} context Only remove the listeners that have this context. + * @param {Boolean} once Only remove one-time listeners. + * @returns {EventEmitter} `this`. + * @public + */ + EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return this; + if (!fn) { + clearEvent(this, evt); + return this; + } + + var listeners = this._events[evt]; + + if (listeners.fn) { + if ( + listeners.fn === fn && + (!once || listeners.once) && + (!context || listeners.context === context) + ) { + clearEvent(this, evt); + } + } else { + for (var i = 0, events = [], length = listeners.length; i < length; i++) { + if ( + listeners[i].fn !== fn || + (once && !listeners[i].once) || + (context && listeners[i].context !== context) + ) { + events.push(listeners[i]); + } + } + + // + // Reset the array, or remove it completely if we have no more listeners. + // + if (events.length) this._events[evt] = events.length === 1 ? events[0] : events; + else clearEvent(this, evt); + } + + return this; + }; + + /** + * Remove all listeners, or those of the specified event. + * + * @param {(String|Symbol)} [event] The event name. + * @returns {EventEmitter} `this`. + * @public + */ + EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { + var evt; + + if (event) { + evt = prefix ? prefix + event : event; + if (this._events[evt]) clearEvent(this, evt); + } else { + this._events = new Events(); + this._eventsCount = 0; + } + + return this; + }; + + // + // Alias methods names because people roll like that. + // + EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + // + // Expose the prefix. + // + EventEmitter.prefixed = prefix; + + // + // Allow `EventEmitter` to be imported as module namespace. + // + EventEmitter.EventEmitter = EventEmitter; + + // + // Expose the module. + // + { + module.exports = EventEmitter; + } +} (eventemitter3)); + +var eventemitter3Exports = eventemitter3.exports; + +var common$3 = {}; + +/** + * Check if we're required to add a port number. + * + * @see https://url.spec.whatwg.org/#default-port + * @param {Number|String} port Port number we need to check + * @param {String} protocol Protocol we need to check against. + * @returns {Boolean} Is it a default port for the given protocol + * @api private + */ +var requiresPort = function required(port, protocol) { + protocol = protocol.split(':')[0]; + port = +port; + + if (!port) return false; + + switch (protocol) { + case 'http': + case 'ws': + return port !== 80; + + case 'https': + case 'wss': + return port !== 443; + + case 'ftp': + return port !== 21; + + case 'gopher': + return port !== 70; + + case 'file': + return false; + } + + return port !== 0; +}; + +(function (exports) { + var common = exports, + url = require$$0$9, + required = requiresPort; + + var upgradeHeader = /(^|,)\s*upgrade\s*($|,)/i, + isSSL = /^https|wss/; + + /** + * Simple Regex for testing if protocol is https + */ + common.isSSL = isSSL; + /** + * Copies the right headers from `options` and `req` to + * `outgoing` which is then used to fire the proxied + * request. + * + * Examples: + * + * common.setupOutgoing(outgoing, options, req) + * // => { host: ..., hostname: ...} + * + * @param {Object} Outgoing Base object to be filled with required properties + * @param {Object} Options Config object passed to the proxy + * @param {ClientRequest} Req Request Object + * @param {String} Forward String to select forward or target + *  + * @return {Object} Outgoing Object with all required properties set + * + * @api private + */ + + common.setupOutgoing = function(outgoing, options, req, forward) { + outgoing.port = options[forward || 'target'].port || + (isSSL.test(options[forward || 'target'].protocol) ? 443 : 80); + + ['host', 'hostname', 'socketPath', 'pfx', 'key', + 'passphrase', 'cert', 'ca', 'ciphers', 'secureProtocol'].forEach( + function(e) { outgoing[e] = options[forward || 'target'][e]; } + ); + + outgoing.method = options.method || req.method; + outgoing.headers = Object.assign({}, req.headers); + + if (options.headers){ + Object.assign(outgoing.headers, options.headers); + } + + if (options.auth) { + outgoing.auth = options.auth; + } + + if (options.ca) { + outgoing.ca = options.ca; + } + + if (isSSL.test(options[forward || 'target'].protocol)) { + outgoing.rejectUnauthorized = (typeof options.secure === "undefined") ? true : options.secure; + } + + + outgoing.agent = options.agent || false; + outgoing.localAddress = options.localAddress; + + // + // Remark: If we are false and not upgrading, set the connection: close. This is the right thing to do + // as node core doesn't handle this COMPLETELY properly yet. + // + if (!outgoing.agent) { + outgoing.headers = outgoing.headers || {}; + if (typeof outgoing.headers.connection !== 'string' + || !upgradeHeader.test(outgoing.headers.connection) + ) { outgoing.headers.connection = 'close'; } + } + + + // the final path is target path + relative path requested by user: + var target = options[forward || 'target']; + var targetPath = target && options.prependPath !== false + ? (target.path || '') + : ''; + + // + // Remark: Can we somehow not use url.parse as a perf optimization? + // + var outgoingPath = !options.toProxy + ? (url.parse(req.url).path || '') + : req.url; + + // + // Remark: ignorePath will just straight up ignore whatever the request's + // path is. This can be labeled as FOOT-GUN material if you do not know what + // you are doing and are using conflicting options. + // + outgoingPath = !options.ignorePath ? outgoingPath : ''; + + outgoing.path = common.urlJoin(targetPath, outgoingPath); + + if (options.changeOrigin) { + outgoing.headers.host = + required(outgoing.port, options[forward || 'target'].protocol) && !hasPort(outgoing.host) + ? outgoing.host + ':' + outgoing.port + : outgoing.host; + } + return outgoing; + }; + + /** + * Set the proper configuration for sockets, + * set no delay and set keep alive, also set + * the timeout to 0. + * + * Examples: + * + * common.setupSocket(socket) + * // => Socket + * + * @param {Socket} Socket instance to setup + *  + * @return {Socket} Return the configured socket. + * + * @api private + */ + + common.setupSocket = function(socket) { + socket.setTimeout(0); + socket.setNoDelay(true); + + socket.setKeepAlive(true, 0); + + return socket; + }; + + /** + * Get the port number from the host. Or guess it based on the connection type. + * + * @param {Request} req Incoming HTTP request. + * + * @return {String} The port number. + * + * @api private + */ + common.getPort = function(req) { + var res = req.headers.host ? req.headers.host.match(/:(\d+)/) : ''; + + return res ? + res[1] : + common.hasEncryptedConnection(req) ? '443' : '80'; + }; + + /** + * Check if the request has an encrypted connection. + * + * @param {Request} req Incoming HTTP request. + * + * @return {Boolean} Whether the connection is encrypted or not. + * + * @api private + */ + common.hasEncryptedConnection = function(req) { + return Boolean(req.connection.encrypted || req.connection.pair); + }; + + /** + * OS-agnostic join (doesn't break on URLs like path.join does on Windows)> + * + * @return {String} The generated path. + * + * @api private + */ + + common.urlJoin = function() { + // + // We do not want to mess with the query string. All we want to touch is the path. + // + var args = Array.prototype.slice.call(arguments), + lastIndex = args.length - 1, + last = args[lastIndex], + lastSegs = last.split('?'), + retSegs; + + args[lastIndex] = lastSegs.shift(); + + // + // Join all strings, but remove empty strings so we don't get extra slashes from + // joining e.g. ['', 'am'] + // + retSegs = [ + args.filter(Boolean).join('/') + .replace(/\/+/g, '/') + .replace('http:/', 'http://') + .replace('https:/', 'https://') + ]; + + // Only join the query string if it exists so we don't have trailing a '?' + // on every request + + // Handle case where there could be multiple ? in the URL. + retSegs.push.apply(retSegs, lastSegs); + + return retSegs.join('?') + }; + + /** + * Rewrites or removes the domain of a cookie header + * + * @param {String|Array} Header + * @param {Object} Config, mapping of domain to rewritten domain. + * '*' key to match any domain, null value to remove the domain. + * + * @api private + */ + common.rewriteCookieProperty = function rewriteCookieProperty(header, config, property) { + if (Array.isArray(header)) { + return header.map(function (headerElement) { + return rewriteCookieProperty(headerElement, config, property); + }); + } + return header.replace(new RegExp("(;\\s*" + property + "=)([^;]+)", 'i'), function(match, prefix, previousValue) { + var newValue; + if (previousValue in config) { + newValue = config[previousValue]; + } else if ('*' in config) { + newValue = config['*']; + } else { + //no match, return previous value + return match; + } + if (newValue) { + //replace value + return prefix + newValue; + } else { + //remove value + return ''; + } + }); + }; + + /** + * Check the host and see if it potentially has a port in it (keep it simple) + * + * @returns {Boolean} Whether we have one or not + * + * @api private + */ + function hasPort(host) { + return !!~host.indexOf(':'); + }} (common$3)); + +var url$1 = require$$0$9, + common$2 = common$3; + + +var redirectRegex = /^201|30(1|2|7|8)$/; + +/*! + * Array of passes. + * + * A `pass` is just a function that is executed on `req, res, options` + * so that you can easily add new checks while still keeping the base + * flexible. + */ + +var webOutgoing = { // <-- + + /** + * If is a HTTP 1.0 request, remove chunk headers + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {proxyResponse} Res Response object from the proxy request + * + * @api private + */ + removeChunked: function removeChunked(req, res, proxyRes) { + if (req.httpVersion === '1.0') { + delete proxyRes.headers['transfer-encoding']; + } + }, + + /** + * If is a HTTP 1.0 request, set the correct connection header + * or if connection header not present, then use `keep-alive` + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {proxyResponse} Res Response object from the proxy request + * + * @api private + */ + setConnection: function setConnection(req, res, proxyRes) { + if (req.httpVersion === '1.0') { + proxyRes.headers.connection = req.headers.connection || 'close'; + } else if (req.httpVersion !== '2.0' && !proxyRes.headers.connection) { + proxyRes.headers.connection = req.headers.connection || 'keep-alive'; + } + }, + + setRedirectHostRewrite: function setRedirectHostRewrite(req, res, proxyRes, options) { + if ((options.hostRewrite || options.autoRewrite || options.protocolRewrite) + && proxyRes.headers['location'] + && redirectRegex.test(proxyRes.statusCode)) { + var target = url$1.parse(options.target); + var u = url$1.parse(proxyRes.headers['location']); + + // make sure the redirected host matches the target host before rewriting + if (target.host != u.host) { + return; + } + + if (options.hostRewrite) { + u.host = options.hostRewrite; + } else if (options.autoRewrite) { + u.host = req.headers['host']; + } + if (options.protocolRewrite) { + u.protocol = options.protocolRewrite; + } + + proxyRes.headers['location'] = u.format(); + } + }, + /** + * Copy headers from proxyResponse to response + * set each header in response object. + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {proxyResponse} Res Response object from the proxy request + * @param {Object} Options options.cookieDomainRewrite: Config to rewrite cookie domain + * + * @api private + */ + writeHeaders: function writeHeaders(req, res, proxyRes, options) { + var rewriteCookieDomainConfig = options.cookieDomainRewrite, + rewriteCookiePathConfig = options.cookiePathRewrite, + preserveHeaderKeyCase = options.preserveHeaderKeyCase, + rawHeaderKeyMap, + setHeader = function(key, header) { + if (header == undefined) return; + if (rewriteCookieDomainConfig && key.toLowerCase() === 'set-cookie') { + header = common$2.rewriteCookieProperty(header, rewriteCookieDomainConfig, 'domain'); + } + if (rewriteCookiePathConfig && key.toLowerCase() === 'set-cookie') { + header = common$2.rewriteCookieProperty(header, rewriteCookiePathConfig, 'path'); + } + res.setHeader(String(key).trim(), header); + }; + + if (typeof rewriteCookieDomainConfig === 'string') { //also test for '' + rewriteCookieDomainConfig = { '*': rewriteCookieDomainConfig }; + } + + if (typeof rewriteCookiePathConfig === 'string') { //also test for '' + rewriteCookiePathConfig = { '*': rewriteCookiePathConfig }; + } + + // message.rawHeaders is added in: v0.11.6 + // https://nodejs.org/api/http.html#http_message_rawheaders + if (preserveHeaderKeyCase && proxyRes.rawHeaders != undefined) { + rawHeaderKeyMap = {}; + for (var i = 0; i < proxyRes.rawHeaders.length; i += 2) { + var key = proxyRes.rawHeaders[i]; + rawHeaderKeyMap[key.toLowerCase()] = key; + } + } + + Object.keys(proxyRes.headers).forEach(function(key) { + var header = proxyRes.headers[key]; + if (preserveHeaderKeyCase && rawHeaderKeyMap) { + key = rawHeaderKeyMap[key] || key; + } + setHeader(key, header); + }); + }, + + /** + * Set the statusCode from the proxyResponse + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {proxyResponse} Res Response object from the proxy request + * + * @api private + */ + writeStatusCode: function writeStatusCode(req, res, proxyRes) { + // From Node.js docs: response.writeHead(statusCode[, statusMessage][, headers]) + if(proxyRes.statusMessage) { + res.statusCode = proxyRes.statusCode; + res.statusMessage = proxyRes.statusMessage; + } else { + res.statusCode = proxyRes.statusCode; + } + } + +}; + +var followRedirects$1 = {exports: {}}; + +var debug$6; + +var debug_1 = function () { + if (!debug$6) { + try { + /* eslint global-require: off */ + debug$6 = srcExports$1("follow-redirects"); + } + catch (error) { /* */ } + if (typeof debug$6 !== "function") { + debug$6 = function () { /* */ }; + } + } + debug$6.apply(null, arguments); +}; + +var url = require$$0$9; +var URL$1 = url.URL; +var http$1 = require$$1; +var https$1 = require$$1$1; +var Writable = require$$0$6.Writable; +var assert = require$$4$3; +var debug$5 = debug_1; + +// Whether to use the native URL object or the legacy url module +var useNativeURL = false; +try { + assert(new URL$1()); +} +catch (error) { + useNativeURL = error.code === "ERR_INVALID_URL"; +} + +// URL fields to preserve in copy operations +var preservedUrlFields = [ + "auth", + "host", + "hostname", + "href", + "path", + "pathname", + "port", + "protocol", + "query", + "search", + "hash", +]; + +// Create handlers that pass events from native requests +var events = ["abort", "aborted", "connect", "error", "socket", "timeout"]; +var eventHandlers = Object.create(null); +events.forEach(function (event) { + eventHandlers[event] = function (arg1, arg2, arg3) { + this._redirectable.emit(event, arg1, arg2, arg3); + }; +}); + +// Error types with codes +var InvalidUrlError = createErrorType( + "ERR_INVALID_URL", + "Invalid URL", + TypeError +); +var RedirectionError = createErrorType( + "ERR_FR_REDIRECTION_FAILURE", + "Redirected request failed" +); +var TooManyRedirectsError = createErrorType( + "ERR_FR_TOO_MANY_REDIRECTS", + "Maximum number of redirects exceeded", + RedirectionError +); +var MaxBodyLengthExceededError = createErrorType( + "ERR_FR_MAX_BODY_LENGTH_EXCEEDED", + "Request body larger than maxBodyLength limit" +); +var WriteAfterEndError = createErrorType( + "ERR_STREAM_WRITE_AFTER_END", + "write after end" +); + +// istanbul ignore next +var destroy = Writable.prototype.destroy || noop; + +// An HTTP(S) request that can be redirected +function RedirectableRequest(options, responseCallback) { + // Initialize the request + Writable.call(this); + this._sanitizeOptions(options); + this._options = options; + this._ended = false; + this._ending = false; + this._redirectCount = 0; + this._redirects = []; + this._requestBodyLength = 0; + this._requestBodyBuffers = []; + + // Attach a callback if passed + if (responseCallback) { + this.on("response", responseCallback); + } + + // React to responses of native requests + var self = this; + this._onNativeResponse = function (response) { + try { + self._processResponse(response); + } + catch (cause) { + self.emit("error", cause instanceof RedirectionError ? + cause : new RedirectionError({ cause: cause })); + } + }; + + // Perform the first request + this._performRequest(); +} +RedirectableRequest.prototype = Object.create(Writable.prototype); + +RedirectableRequest.prototype.abort = function () { + destroyRequest(this._currentRequest); + this._currentRequest.abort(); + this.emit("abort"); +}; + +RedirectableRequest.prototype.destroy = function (error) { + destroyRequest(this._currentRequest, error); + destroy.call(this, error); + return this; +}; + +// Writes buffered data to the current native request +RedirectableRequest.prototype.write = function (data, encoding, callback) { + // Writing is not allowed if end has been called + if (this._ending) { + throw new WriteAfterEndError(); + } + + // Validate input and shift parameters if necessary + if (!isString(data) && !isBuffer(data)) { + throw new TypeError("data should be a string, Buffer or Uint8Array"); + } + if (isFunction(encoding)) { + callback = encoding; + encoding = null; + } + + // Ignore empty buffers, since writing them doesn't invoke the callback + // https://github.com/nodejs/node/issues/22066 + if (data.length === 0) { + if (callback) { + callback(); + } + return; + } + // Only write when we don't exceed the maximum body length + if (this._requestBodyLength + data.length <= this._options.maxBodyLength) { + this._requestBodyLength += data.length; + this._requestBodyBuffers.push({ data: data, encoding: encoding }); + this._currentRequest.write(data, encoding, callback); + } + // Error when we exceed the maximum body length + else { + this.emit("error", new MaxBodyLengthExceededError()); + this.abort(); + } +}; + +// Ends the current native request +RedirectableRequest.prototype.end = function (data, encoding, callback) { + // Shift parameters if necessary + if (isFunction(data)) { + callback = data; + data = encoding = null; + } + else if (isFunction(encoding)) { + callback = encoding; + encoding = null; + } + + // Write data if needed and end + if (!data) { + this._ended = this._ending = true; + this._currentRequest.end(null, null, callback); + } + else { + var self = this; + var currentRequest = this._currentRequest; + this.write(data, encoding, function () { + self._ended = true; + currentRequest.end(null, null, callback); + }); + this._ending = true; + } +}; + +// Sets a header value on the current native request +RedirectableRequest.prototype.setHeader = function (name, value) { + this._options.headers[name] = value; + this._currentRequest.setHeader(name, value); +}; + +// Clears a header value on the current native request +RedirectableRequest.prototype.removeHeader = function (name) { + delete this._options.headers[name]; + this._currentRequest.removeHeader(name); +}; + +// Global timeout for all underlying requests +RedirectableRequest.prototype.setTimeout = function (msecs, callback) { + var self = this; + + // Destroys the socket on timeout + function destroyOnTimeout(socket) { + socket.setTimeout(msecs); + socket.removeListener("timeout", socket.destroy); + socket.addListener("timeout", socket.destroy); + } + + // Sets up a timer to trigger a timeout event + function startTimer(socket) { + if (self._timeout) { + clearTimeout(self._timeout); + } + self._timeout = setTimeout(function () { + self.emit("timeout"); + clearTimer(); + }, msecs); + destroyOnTimeout(socket); + } + + // Stops a timeout from triggering + function clearTimer() { + // Clear the timeout + if (self._timeout) { + clearTimeout(self._timeout); + self._timeout = null; + } + + // Clean up all attached listeners + self.removeListener("abort", clearTimer); + self.removeListener("error", clearTimer); + self.removeListener("response", clearTimer); + self.removeListener("close", clearTimer); + if (callback) { + self.removeListener("timeout", callback); + } + if (!self.socket) { + self._currentRequest.removeListener("socket", startTimer); + } + } + + // Attach callback if passed + if (callback) { + this.on("timeout", callback); + } + + // Start the timer if or when the socket is opened + if (this.socket) { + startTimer(this.socket); + } + else { + this._currentRequest.once("socket", startTimer); + } + + // Clean up on events + this.on("socket", destroyOnTimeout); + this.on("abort", clearTimer); + this.on("error", clearTimer); + this.on("response", clearTimer); + this.on("close", clearTimer); + + return this; +}; + +// Proxy all other public ClientRequest methods +[ + "flushHeaders", "getHeader", + "setNoDelay", "setSocketKeepAlive", +].forEach(function (method) { + RedirectableRequest.prototype[method] = function (a, b) { + return this._currentRequest[method](a, b); + }; +}); + +// Proxy all public ClientRequest properties +["aborted", "connection", "socket"].forEach(function (property) { + Object.defineProperty(RedirectableRequest.prototype, property, { + get: function () { return this._currentRequest[property]; }, + }); +}); + +RedirectableRequest.prototype._sanitizeOptions = function (options) { + // Ensure headers are always present + if (!options.headers) { + options.headers = {}; + } + + // Since http.request treats host as an alias of hostname, + // but the url module interprets host as hostname plus port, + // eliminate the host property to avoid confusion. + if (options.host) { + // Use hostname if set, because it has precedence + if (!options.hostname) { + options.hostname = options.host; + } + delete options.host; + } + + // Complete the URL object when necessary + if (!options.pathname && options.path) { + var searchPos = options.path.indexOf("?"); + if (searchPos < 0) { + options.pathname = options.path; + } + else { + options.pathname = options.path.substring(0, searchPos); + options.search = options.path.substring(searchPos); + } + } +}; + + +// Executes the next native request (initial or redirect) +RedirectableRequest.prototype._performRequest = function () { + // Load the native protocol + var protocol = this._options.protocol; + var nativeProtocol = this._options.nativeProtocols[protocol]; + if (!nativeProtocol) { + throw new TypeError("Unsupported protocol " + protocol); + } + + // If specified, use the agent corresponding to the protocol + // (HTTP and HTTPS use different types of agents) + if (this._options.agents) { + var scheme = protocol.slice(0, -1); + this._options.agent = this._options.agents[scheme]; + } + + // Create the native request and set up its event handlers + var request = this._currentRequest = + nativeProtocol.request(this._options, this._onNativeResponse); + request._redirectable = this; + for (var event of events) { + request.on(event, eventHandlers[event]); + } + + // RFC7230§5.3.1: When making a request directly to an origin server, […] + // a client MUST send only the absolute path […] as the request-target. + this._currentUrl = /^\//.test(this._options.path) ? + url.format(this._options) : + // When making a request to a proxy, […] + // a client MUST send the target URI in absolute-form […]. + this._options.path; + + // End a redirected request + // (The first request must be ended explicitly with RedirectableRequest#end) + if (this._isRedirect) { + // Write the request entity and end + var i = 0; + var self = this; + var buffers = this._requestBodyBuffers; + (function writeNext(error) { + // Only write if this request has not been redirected yet + /* istanbul ignore else */ + if (request === self._currentRequest) { + // Report any write errors + /* istanbul ignore if */ + if (error) { + self.emit("error", error); + } + // Write the next buffer if there are still left + else if (i < buffers.length) { + var buffer = buffers[i++]; + /* istanbul ignore else */ + if (!request.finished) { + request.write(buffer.data, buffer.encoding, writeNext); + } + } + // End the request if `end` has been called on us + else if (self._ended) { + request.end(); + } + } + }()); + } +}; + +// Processes a response from the current native request +RedirectableRequest.prototype._processResponse = function (response) { + // Store the redirected response + var statusCode = response.statusCode; + if (this._options.trackRedirects) { + this._redirects.push({ + url: this._currentUrl, + headers: response.headers, + statusCode: statusCode, + }); + } + + // RFC7231§6.4: The 3xx (Redirection) class of status code indicates + // that further action needs to be taken by the user agent in order to + // fulfill the request. If a Location header field is provided, + // the user agent MAY automatically redirect its request to the URI + // referenced by the Location field value, + // even if the specific status code is not understood. + + // If the response is not a redirect; return it as-is + var location = response.headers.location; + if (!location || this._options.followRedirects === false || + statusCode < 300 || statusCode >= 400) { + response.responseUrl = this._currentUrl; + response.redirects = this._redirects; + this.emit("response", response); + + // Clean up + this._requestBodyBuffers = []; + return; + } + + // The response is a redirect, so abort the current request + destroyRequest(this._currentRequest); + // Discard the remainder of the response to avoid waiting for data + response.destroy(); + + // RFC7231§6.4: A client SHOULD detect and intervene + // in cyclical redirections (i.e., "infinite" redirection loops). + if (++this._redirectCount > this._options.maxRedirects) { + throw new TooManyRedirectsError(); + } + + // Store the request headers if applicable + var requestHeaders; + var beforeRedirect = this._options.beforeRedirect; + if (beforeRedirect) { + requestHeaders = Object.assign({ + // The Host header was set by nativeProtocol.request + Host: response.req.getHeader("host"), + }, this._options.headers); + } + + // RFC7231§6.4: Automatic redirection needs to done with + // care for methods not known to be safe, […] + // RFC7231§6.4.2–3: For historical reasons, a user agent MAY change + // the request method from POST to GET for the subsequent request. + var method = this._options.method; + if ((statusCode === 301 || statusCode === 302) && this._options.method === "POST" || + // RFC7231§6.4.4: The 303 (See Other) status code indicates that + // the server is redirecting the user agent to a different resource […] + // A user agent can perform a retrieval request targeting that URI + // (a GET or HEAD request if using HTTP) […] + (statusCode === 303) && !/^(?:GET|HEAD)$/.test(this._options.method)) { + this._options.method = "GET"; + // Drop a possible entity and headers related to it + this._requestBodyBuffers = []; + removeMatchingHeaders(/^content-/i, this._options.headers); + } + + // Drop the Host header, as the redirect might lead to a different host + var currentHostHeader = removeMatchingHeaders(/^host$/i, this._options.headers); + + // If the redirect is relative, carry over the host of the last request + var currentUrlParts = parseUrl(this._currentUrl); + var currentHost = currentHostHeader || currentUrlParts.host; + var currentUrl = /^\w+:/.test(location) ? this._currentUrl : + url.format(Object.assign(currentUrlParts, { host: currentHost })); + + // Create the redirected request + var redirectUrl = resolveUrl(location, currentUrl); + debug$5("redirecting to", redirectUrl.href); + this._isRedirect = true; + spreadUrlObject(redirectUrl, this._options); + + // Drop confidential headers when redirecting to a less secure protocol + // or to a different domain that is not a superdomain + if (redirectUrl.protocol !== currentUrlParts.protocol && + redirectUrl.protocol !== "https:" || + redirectUrl.host !== currentHost && + !isSubdomain(redirectUrl.host, currentHost)) { + removeMatchingHeaders(/^(?:(?:proxy-)?authorization|cookie)$/i, this._options.headers); + } + + // Evaluate the beforeRedirect callback + if (isFunction(beforeRedirect)) { + var responseDetails = { + headers: response.headers, + statusCode: statusCode, + }; + var requestDetails = { + url: currentUrl, + method: method, + headers: requestHeaders, + }; + beforeRedirect(this._options, responseDetails, requestDetails); + this._sanitizeOptions(this._options); + } + + // Perform the redirected request + this._performRequest(); +}; + +// Wraps the key/value object of protocols with redirect functionality +function wrap(protocols) { + // Default settings + var exports = { + maxRedirects: 21, + maxBodyLength: 10 * 1024 * 1024, + }; + + // Wrap each protocol + var nativeProtocols = {}; + Object.keys(protocols).forEach(function (scheme) { + var protocol = scheme + ":"; + var nativeProtocol = nativeProtocols[protocol] = protocols[scheme]; + var wrappedProtocol = exports[scheme] = Object.create(nativeProtocol); + + // Executes a request, following redirects + function request(input, options, callback) { + // Parse parameters, ensuring that input is an object + if (isURL(input)) { + input = spreadUrlObject(input); + } + else if (isString(input)) { + input = spreadUrlObject(parseUrl(input)); + } + else { + callback = options; + options = validateUrl(input); + input = { protocol: protocol }; + } + if (isFunction(options)) { + callback = options; + options = null; + } + + // Set defaults + options = Object.assign({ + maxRedirects: exports.maxRedirects, + maxBodyLength: exports.maxBodyLength, + }, input, options); + options.nativeProtocols = nativeProtocols; + if (!isString(options.host) && !isString(options.hostname)) { + options.hostname = "::1"; + } + + assert.equal(options.protocol, protocol, "protocol mismatch"); + debug$5("options", options); + return new RedirectableRequest(options, callback); + } + + // Executes a GET request, following redirects + function get(input, options, callback) { + var wrappedRequest = wrappedProtocol.request(input, options, callback); + wrappedRequest.end(); + return wrappedRequest; + } + + // Expose the properties on the wrapped protocol + Object.defineProperties(wrappedProtocol, { + request: { value: request, configurable: true, enumerable: true, writable: true }, + get: { value: get, configurable: true, enumerable: true, writable: true }, + }); + }); + return exports; +} + +function noop() { /* empty */ } + +function parseUrl(input) { + var parsed; + /* istanbul ignore else */ + if (useNativeURL) { + parsed = new URL$1(input); + } + else { + // Ensure the URL is valid and absolute + parsed = validateUrl(url.parse(input)); + if (!isString(parsed.protocol)) { + throw new InvalidUrlError({ input }); + } + } + return parsed; +} + +function resolveUrl(relative, base) { + /* istanbul ignore next */ + return useNativeURL ? new URL$1(relative, base) : parseUrl(url.resolve(base, relative)); +} + +function validateUrl(input) { + if (/^\[/.test(input.hostname) && !/^\[[:0-9a-f]+\]$/i.test(input.hostname)) { + throw new InvalidUrlError({ input: input.href || input }); + } + if (/^\[/.test(input.host) && !/^\[[:0-9a-f]+\](:\d+)?$/i.test(input.host)) { + throw new InvalidUrlError({ input: input.href || input }); + } + return input; +} + +function spreadUrlObject(urlObject, target) { + var spread = target || {}; + for (var key of preservedUrlFields) { + spread[key] = urlObject[key]; + } + + // Fix IPv6 hostname + if (spread.hostname.startsWith("[")) { + spread.hostname = spread.hostname.slice(1, -1); + } + // Ensure port is a number + if (spread.port !== "") { + spread.port = Number(spread.port); + } + // Concatenate path + spread.path = spread.search ? spread.pathname + spread.search : spread.pathname; + + return spread; +} + +function removeMatchingHeaders(regex, headers) { + var lastValue; + for (var header in headers) { + if (regex.test(header)) { + lastValue = headers[header]; + delete headers[header]; + } + } + return (lastValue === null || typeof lastValue === "undefined") ? + undefined : String(lastValue).trim(); +} + +function createErrorType(code, message, baseClass) { + // Create constructor + function CustomError(properties) { + Error.captureStackTrace(this, this.constructor); + Object.assign(this, properties || {}); + this.code = code; + this.message = this.cause ? message + ": " + this.cause.message : message; + } + + // Attach constructor and set default properties + CustomError.prototype = new (baseClass || Error)(); + Object.defineProperties(CustomError.prototype, { + constructor: { + value: CustomError, + enumerable: false, + }, + name: { + value: "Error [" + code + "]", + enumerable: false, + }, + }); + return CustomError; +} + +function destroyRequest(request, error) { + for (var event of events) { + request.removeListener(event, eventHandlers[event]); + } + request.on("error", noop); + request.destroy(error); +} + +function isSubdomain(subdomain, domain) { + assert(isString(subdomain) && isString(domain)); + var dot = subdomain.length - domain.length - 1; + return dot > 0 && subdomain[dot] === "." && subdomain.endsWith(domain); +} + +function isString(value) { + return typeof value === "string" || value instanceof String; +} + +function isFunction(value) { + return typeof value === "function"; +} + +function isBuffer(value) { + return typeof value === "object" && ("length" in value); +} + +function isURL(value) { + return URL$1 && value instanceof URL$1; +} + +// Exports +followRedirects$1.exports = wrap({ http: http$1, https: https$1 }); +followRedirects$1.exports.wrap = wrap; + +var followRedirectsExports = followRedirects$1.exports; + +var httpNative = require$$1, + httpsNative = require$$1$1, + web_o = webOutgoing, + common$1 = common$3, + followRedirects = followRedirectsExports; + +web_o = Object.keys(web_o).map(function(pass) { + return web_o[pass]; +}); + +var nativeAgents = { http: httpNative, https: httpsNative }; + +/*! + * Array of passes. + * + * A `pass` is just a function that is executed on `req, res, options` + * so that you can easily add new checks while still keeping the base + * flexible. + */ + + +var webIncoming = { + + /** + * Sets `content-length` to '0' if request is of DELETE type. + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {Object} Options Config object passed to the proxy + * + * @api private + */ + + deleteLength: function deleteLength(req, res, options) { + if((req.method === 'DELETE' || req.method === 'OPTIONS') + && !req.headers['content-length']) { + req.headers['content-length'] = '0'; + delete req.headers['transfer-encoding']; + } + }, + + /** + * Sets timeout in request socket if it was specified in options. + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {Object} Options Config object passed to the proxy + * + * @api private + */ + + timeout: function timeout(req, res, options) { + if(options.timeout) { + req.socket.setTimeout(options.timeout); + } + }, + + /** + * Sets `x-forwarded-*` headers if specified in config. + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {Object} Options Config object passed to the proxy + * + * @api private + */ + + XHeaders: function XHeaders(req, res, options) { + if(!options.xfwd) return; + + var encrypted = req.isSpdy || common$1.hasEncryptedConnection(req); + var values = { + for : req.connection.remoteAddress || req.socket.remoteAddress, + port : common$1.getPort(req), + proto: encrypted ? 'https' : 'http' + }; + + ['for', 'port', 'proto'].forEach(function(header) { + req.headers['x-forwarded-' + header] = + (req.headers['x-forwarded-' + header] || '') + + (req.headers['x-forwarded-' + header] ? ',' : '') + + values[header]; + }); + + req.headers['x-forwarded-host'] = req.headers['x-forwarded-host'] || req.headers['host'] || ''; + }, + + /** + * Does the actual proxying. If `forward` is enabled fires up + * a ForwardStream, same happens for ProxyStream. The request + * just dies otherwise. + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {Object} Options Config object passed to the proxy + * + * @api private + */ + + stream: function stream(req, res, options, _, server, clb) { + + // And we begin! + server.emit('start', req, res, options.target || options.forward); + + var agents = options.followRedirects ? followRedirects : nativeAgents; + var http = agents.http; + var https = agents.https; + + if(options.forward) { + // If forward enable, so just pipe the request + var forwardReq = (options.forward.protocol === 'https:' ? https : http).request( + common$1.setupOutgoing(options.ssl || {}, options, req, 'forward') + ); + + // error handler (e.g. ECONNRESET, ECONNREFUSED) + // Handle errors on incoming request as well as it makes sense to + var forwardError = createErrorHandler(forwardReq, options.forward); + req.on('error', forwardError); + forwardReq.on('error', forwardError); + + (options.buffer || req).pipe(forwardReq); + if(!options.target) { return res.end(); } + } + + // Request initalization + var proxyReq = (options.target.protocol === 'https:' ? https : http).request( + common$1.setupOutgoing(options.ssl || {}, options, req) + ); + + // Enable developers to modify the proxyReq before headers are sent + proxyReq.on('socket', function(socket) { + if(server && !proxyReq.getHeader('expect')) { + server.emit('proxyReq', proxyReq, req, res, options); + } + }); + + // allow outgoing socket to timeout so that we could + // show an error page at the initial request + if(options.proxyTimeout) { + proxyReq.setTimeout(options.proxyTimeout, function() { + proxyReq.abort(); + }); + } + + // Ensure we abort proxy if request is aborted + req.on('aborted', function () { + proxyReq.abort(); + }); + + // handle errors in proxy and incoming request, just like for forward proxy + var proxyError = createErrorHandler(proxyReq, options.target); + req.on('error', proxyError); + proxyReq.on('error', proxyError); + + function createErrorHandler(proxyReq, url) { + return function proxyError(err) { + if (req.socket.destroyed && err.code === 'ECONNRESET') { + server.emit('econnreset', err, req, res, url); + return proxyReq.abort(); + } + + if (clb) { + clb(err, req, res, url); + } else { + server.emit('error', err, req, res, url); + } + } + } + + (options.buffer || req).pipe(proxyReq); + + proxyReq.on('response', function(proxyRes) { + if(server) { server.emit('proxyRes', proxyRes, req, res); } + + if(!res.headersSent && !options.selfHandleResponse) { + for(var i=0; i < web_o.length; i++) { + if(web_o[i](req, res, proxyRes, options)) { break; } + } + } + + if (!res.finished) { + // Allow us to listen when the proxy has completed + proxyRes.on('end', function () { + if (server) server.emit('end', req, res, proxyRes); + }); + // We pipe to the response unless its expected to be handled by the user + if (!options.selfHandleResponse) proxyRes.pipe(res); + } else { + if (server) server.emit('end', req, res, proxyRes); + } + }); + } + +}; + +var http = require$$1, + https = require$$1$1, + common = common$3; + +/*! + * Array of passes. + * + * A `pass` is just a function that is executed on `req, socket, options` + * so that you can easily add new checks while still keeping the base + * flexible. + */ + +/* + * Websockets Passes + * + */ + + +var wsIncoming = { + /** + * WebSocket requests must have the `GET` method and + * the `upgrade:websocket` header + * + * @param {ClientRequest} Req Request object + * @param {Socket} Websocket + * + * @api private + */ + + checkMethodAndHeader : function checkMethodAndHeader(req, socket) { + if (req.method !== 'GET' || !req.headers.upgrade) { + socket.destroy(); + return true; + } + + if (req.headers.upgrade.toLowerCase() !== 'websocket') { + socket.destroy(); + return true; + } + }, + + /** + * Sets `x-forwarded-*` headers if specified in config. + * + * @param {ClientRequest} Req Request object + * @param {Socket} Websocket + * @param {Object} Options Config object passed to the proxy + * + * @api private + */ + + XHeaders : function XHeaders(req, socket, options) { + if(!options.xfwd) return; + + var values = { + for : req.connection.remoteAddress || req.socket.remoteAddress, + port : common.getPort(req), + proto: common.hasEncryptedConnection(req) ? 'wss' : 'ws' + }; + + ['for', 'port', 'proto'].forEach(function(header) { + req.headers['x-forwarded-' + header] = + (req.headers['x-forwarded-' + header] || '') + + (req.headers['x-forwarded-' + header] ? ',' : '') + + values[header]; + }); + }, + + /** + * Does the actual proxying. Make the request and upgrade it + * send the Switching Protocols request and pipe the sockets. + * + * @param {ClientRequest} Req Request object + * @param {Socket} Websocket + * @param {Object} Options Config object passed to the proxy + * + * @api private + */ + stream : function stream(req, socket, options, head, server, clb) { + + var createHttpHeader = function(line, headers) { + return Object.keys(headers).reduce(function (head, key) { + var value = headers[key]; + + if (!Array.isArray(value)) { + head.push(key + ': ' + value); + return head; + } + + for (var i = 0; i < value.length; i++) { + head.push(key + ': ' + value[i]); + } + return head; + }, [line]) + .join('\r\n') + '\r\n\r\n'; + }; + + common.setupSocket(socket); + + if (head && head.length) socket.unshift(head); + + + var proxyReq = (common.isSSL.test(options.target.protocol) ? https : http).request( + common.setupOutgoing(options.ssl || {}, options, req) + ); + + // Enable developers to modify the proxyReq before headers are sent + if (server) { server.emit('proxyReqWs', proxyReq, req, socket, options, head); } + + // Error Handler + proxyReq.on('error', onOutgoingError); + proxyReq.on('response', function (res) { + // if upgrade event isn't going to happen, close the socket + if (!res.upgrade) { + socket.write(createHttpHeader('HTTP/' + res.httpVersion + ' ' + res.statusCode + ' ' + res.statusMessage, res.headers)); + res.pipe(socket); + } + }); + + proxyReq.on('upgrade', function(proxyRes, proxySocket, proxyHead) { + proxySocket.on('error', onOutgoingError); + + // Allow us to listen when the websocket has completed + proxySocket.on('end', function () { + server.emit('close', proxyRes, proxySocket, proxyHead); + }); + + // The pipe below will end proxySocket if socket closes cleanly, but not + // if it errors (eg, vanishes from the net and starts returning + // EHOSTUNREACH). We need to do that explicitly. + socket.on('error', function () { + proxySocket.end(); + }); + + common.setupSocket(proxySocket); + + if (proxyHead && proxyHead.length) proxySocket.unshift(proxyHead); + + // + // Remark: Handle writing the headers to the socket when switching protocols + // Also handles when a header is an array + // + socket.write(createHttpHeader('HTTP/1.1 101 Switching Protocols', proxyRes.headers)); + + proxySocket.pipe(socket).pipe(proxySocket); + + server.emit('open', proxySocket); + server.emit('proxySocket', proxySocket); //DEPRECATED. + }); + + return proxyReq.end(); // XXX: CHECK IF THIS IS THIS CORRECT + + function onOutgoingError(err) { + if (clb) { + clb(err, req, socket); + } else { + server.emit('error', err, req, socket); + } + socket.end(); + } + } +}; + +(function (module) { + var httpProxy = module.exports, + parse_url = require$$0$9.parse, + EE3 = eventemitter3Exports, + http = require$$1, + https = require$$1$1, + web = webIncoming, + ws = wsIncoming; + + httpProxy.Server = ProxyServer; + + /** + * Returns a function that creates the loader for + * either `ws` or `web`'s passes. + * + * Examples: + * + * httpProxy.createRightProxy('ws') + * // => [Function] + * + * @param {String} Type Either 'ws' or 'web' + *  + * @return {Function} Loader Function that when called returns an iterator for the right passes + * + * @api private + */ + + function createRightProxy(type) { + + return function(options) { + return function(req, res /*, [head], [opts] */) { + var passes = (type === 'ws') ? this.wsPasses : this.webPasses, + args = [].slice.call(arguments), + cntr = args.length - 1, + head, cbl; + + /* optional args parse begin */ + if(typeof args[cntr] === 'function') { + cbl = args[cntr]; + + cntr--; + } + + var requestOptions = options; + if( + !(args[cntr] instanceof Buffer) && + args[cntr] !== res + ) { + //Copy global options + requestOptions = Object.assign({}, options); + //Overwrite with request options + Object.assign(requestOptions, args[cntr]); + + cntr--; + } + + if(args[cntr] instanceof Buffer) { + head = args[cntr]; + } + + /* optional args parse end */ + + ['target', 'forward'].forEach(function(e) { + if (typeof requestOptions[e] === 'string') + requestOptions[e] = parse_url(requestOptions[e]); + }); + + if (!requestOptions.target && !requestOptions.forward) { + return this.emit('error', new Error('Must provide a proper URL as target')); + } + + for(var i=0; i < passes.length; i++) { + /** + * Call of passes functions + * pass(req, res, options, head) + * + * In WebSockets case the `res` variable + * refer to the connection socket + * pass(req, socket, options, head) + */ + if(passes[i](req, res, requestOptions, head, this, cbl)) { // passes can return a truthy value to halt the loop + break; + } + } + }; + }; + } + httpProxy.createRightProxy = createRightProxy; + + function ProxyServer(options) { + EE3.call(this); + + options = options || {}; + options.prependPath = options.prependPath === false ? false : true; + + this.web = this.proxyRequest = createRightProxy('web')(options); + this.ws = this.proxyWebsocketRequest = createRightProxy('ws')(options); + this.options = options; + + this.webPasses = Object.keys(web).map(function(pass) { + return web[pass]; + }); + + this.wsPasses = Object.keys(ws).map(function(pass) { + return ws[pass]; + }); + + this.on('error', this.onError, this); + + } + + require$$0$5.inherits(ProxyServer, EE3); + + ProxyServer.prototype.onError = function (err) { + // + // Remark: Replicate node core behavior using EE3 + // so we force people to handle their own errors + // + if(this.listeners('error').length === 1) { + throw err; + } + }; + + ProxyServer.prototype.listen = function(port, hostname) { + var self = this, + closure = function(req, res) { self.web(req, res); }; + + this._server = this.options.ssl ? + https.createServer(this.options.ssl, closure) : + http.createServer(closure); + + if(this.options.ws) { + this._server.on('upgrade', function(req, socket, head) { self.ws(req, socket, head); }); + } + + this._server.listen(port, hostname); + + return this; + }; + + ProxyServer.prototype.close = function(callback) { + var self = this; + if (this._server) { + this._server.close(done); + } + + // Wrap callback to nullify server after all open connections are closed. + function done() { + self._server = null; + if (callback) { + callback.apply(null, arguments); + } + } }; + + ProxyServer.prototype.before = function(type, passName, callback) { + if (type !== 'ws' && type !== 'web') { + throw new Error('type must be `web` or `ws`'); + } + var passes = (type === 'ws') ? this.wsPasses : this.webPasses, + i = false; + + passes.forEach(function(v, idx) { + if(v.name === passName) i = idx; + }); + + if(i === false) throw new Error('No such pass'); + + passes.splice(i, 0, callback); + }; + ProxyServer.prototype.after = function(type, passName, callback) { + if (type !== 'ws' && type !== 'web') { + throw new Error('type must be `web` or `ws`'); + } + var passes = (type === 'ws') ? this.wsPasses : this.webPasses, + i = false; + + passes.forEach(function(v, idx) { + if(v.name === passName) i = idx; + }); + + if(i === false) throw new Error('No such pass'); + + passes.splice(i++, 0, callback); + }; +} (httpProxy$3)); + +var httpProxyExports = httpProxy$3.exports; + +// Use explicit /index.js to help browserify negociation in require '/lib/http-proxy' (!) +var ProxyServer = httpProxyExports.Server; + + +/** + * Creates the proxy server. + * + * Examples: + * + * httpProxy.createProxyServer({ .. }, 8000) + * // => '{ web: [Function], ws: [Function] ... }' + * + * @param {Object} Options Config object passed to the proxy + * + * @return {Object} Proxy Proxy object with handlers for `ws` and `web` requests + * + * @api public + */ + + +function createProxyServer(options) { + /* + * `options` is needed and it must have the following layout: + * + * { + * target : + * forward: + * agent : + * ssl : + * ws : + * xfwd : + * secure : + * toProxy: + * prependPath: + * ignorePath: + * localAddress : + * changeOrigin: + * preserveHeaderKeyCase: + * auth : Basic authentication i.e. 'user:password' to compute an Authorization header. + * hostRewrite: rewrites the location hostname on (201/301/302/307/308) redirects, Default: null. + * autoRewrite: rewrites the location host/port on (201/301/302/307/308) redirects based on requested host/port. Default: false. + * protocolRewrite: rewrites the location protocol on (201/301/302/307/308) redirects to 'http' or 'https'. Default: null. + * } + * + * NOTE: `options.ws` and `options.ssl` are optional. + * `options.target and `options.forward` cannot be + * both missing + * } + */ + + return new ProxyServer(options); +} + + +ProxyServer.createProxyServer = createProxyServer; +ProxyServer.createServer = createProxyServer; +ProxyServer.createProxy = createProxyServer; + + + + +/** + * Export the proxy "Server" as the main export. + */ +var httpProxy$2 = ProxyServer; + +/*! + * Caron dimonio, con occhi di bragia + * loro accennando, tutte le raccoglie; + * batte col remo qualunque s’adagia + * + * Charon the demon, with the eyes of glede, + * Beckoning to them, collects them all together, + * Beats with his oar whoever lags behind + * + * Dante - The Divine Comedy (Canto III) + */ + +var httpProxy = httpProxy$2; + +var httpProxy$1 = /*@__PURE__*/getDefaultExportFromCjs(httpProxy); + +const debug$4 = createDebugger("vite:proxy"); +const rewriteOriginHeader = (proxyReq, options, config) => { + if (options.rewriteWsOrigin) { + const { target } = options; + if (proxyReq.headersSent) { + config.logger.warn( + colors$1.yellow( + `Unable to rewrite Origin header as headers are already sent.` + ) + ); + return; + } + if (proxyReq.getHeader("origin") && target) { + const changedOrigin = typeof target === "object" ? `${target.protocol}//${target.host}` : target; + proxyReq.setHeader("origin", changedOrigin); + } + } +}; +function proxyMiddleware(httpServer, options, config) { + const proxies = {}; + Object.keys(options).forEach((context) => { + let opts = options[context]; + if (!opts) { + return; + } + if (typeof opts === "string") { + opts = { target: opts, changeOrigin: true }; + } + const proxy = httpProxy$1.createProxyServer(opts); + if (opts.configure) { + opts.configure(proxy, opts); + } + proxy.on("error", (err, req, originalRes) => { + const res = originalRes; + if (!res) { + config.logger.error( + `${colors$1.red(`http proxy error: ${err.message}`)} +${err.stack}`, + { + timestamp: true, + error: err + } + ); + } else if ("req" in res) { + config.logger.error( + `${colors$1.red(`http proxy error: ${originalRes.req.url}`)} +${err.stack}`, + { + timestamp: true, + error: err + } + ); + if (!res.headersSent && !res.writableEnded) { + res.writeHead(500, { + "Content-Type": "text/plain" + }).end(); + } + } else { + config.logger.error(`${colors$1.red(`ws proxy error:`)} +${err.stack}`, { + timestamp: true, + error: err + }); + res.end(); + } + }); + proxy.on("proxyReqWs", (proxyReq, req, socket, options2, head) => { + rewriteOriginHeader(proxyReq, options2, config); + socket.on("error", (err) => { + config.logger.error( + `${colors$1.red(`ws proxy socket error:`)} +${err.stack}`, + { + timestamp: true, + error: err + } + ); + }); + }); + proxy.on("proxyRes", (proxyRes, req, res) => { + res.on("close", () => { + if (!res.writableEnded) { + debug$4?.("destroying proxyRes in proxyRes close event"); + proxyRes.destroy(); + } + }); + }); + proxies[context] = [proxy, { ...opts }]; + }); + if (httpServer) { + httpServer.on("upgrade", (req, socket, head) => { + const url = req.url; + for (const context in proxies) { + if (doesProxyContextMatchUrl(context, url)) { + const [proxy, opts] = proxies[context]; + if (opts.ws || opts.target?.toString().startsWith("ws:") || opts.target?.toString().startsWith("wss:")) { + if (opts.rewrite) { + req.url = opts.rewrite(url); + } + debug$4?.(`${req.url} -> ws ${opts.target}`); + proxy.ws(req, socket, head); + return; + } + } + } + }); + } + return function viteProxyMiddleware(req, res, next) { + const url = req.url; + for (const context in proxies) { + if (doesProxyContextMatchUrl(context, url)) { + const [proxy, opts] = proxies[context]; + const options2 = {}; + if (opts.bypass) { + const bypassResult = opts.bypass(req, res, opts); + if (typeof bypassResult === "string") { + req.url = bypassResult; + debug$4?.(`bypass: ${req.url} -> ${bypassResult}`); + return next(); + } else if (bypassResult === false) { + debug$4?.(`bypass: ${req.url} -> 404`); + res.statusCode = 404; + return res.end(); + } + } + debug$4?.(`${req.url} -> ${opts.target || opts.forward}`); + if (opts.rewrite) { + req.url = opts.rewrite(req.url); + } + proxy.web(req, res, options2); + return; + } + } + next(); + }; +} +function doesProxyContextMatchUrl(context, url) { + return context[0] === "^" && new RegExp(context).test(url) || url.startsWith(context); +} + +const debug$3 = createDebugger("vite:html-fallback"); +function htmlFallbackMiddleware(root, spaFallback, fsUtils = commonFsUtils) { + return function viteHtmlFallbackMiddleware(req, res, next) { + if ( + // Only accept GET or HEAD + req.method !== "GET" && req.method !== "HEAD" || // Exclude default favicon requests + req.url === "/favicon.ico" || // Require Accept: text/html or */* + !(req.headers.accept === void 0 || // equivalent to `Accept: */*` + req.headers.accept === "" || // equivalent to `Accept: */*` + req.headers.accept.includes("text/html") || req.headers.accept.includes("*/*")) + ) { + return next(); + } + const url = cleanUrl(req.url); + const pathname = decodeURIComponent(url); + if (pathname.endsWith(".html")) { + const filePath = path$n.join(root, pathname); + if (fsUtils.existsSync(filePath)) { + debug$3?.(`Rewriting ${req.method} ${req.url} to ${url}`); + req.url = url; + return next(); + } + } else if (pathname[pathname.length - 1] === "/") { + const filePath = path$n.join(root, pathname, "index.html"); + if (fsUtils.existsSync(filePath)) { + const newUrl = url + "index.html"; + debug$3?.(`Rewriting ${req.method} ${req.url} to ${newUrl}`); + req.url = newUrl; + return next(); + } + } else { + const filePath = path$n.join(root, pathname + ".html"); + if (fsUtils.existsSync(filePath)) { + const newUrl = url + ".html"; + debug$3?.(`Rewriting ${req.method} ${req.url} to ${newUrl}`); + req.url = newUrl; + return next(); + } + } + if (spaFallback) { + debug$3?.(`Rewriting ${req.method} ${req.url} to /index.html`); + req.url = "/index.html"; + } + next(); + }; +} + +const debug$2 = createDebugger("vite:send", { + onlyWhenFocused: true +}); +const alias = { + js: "text/javascript", + css: "text/css", + html: "text/html", + json: "application/json" +}; +function send(req, res, content, type, options) { + const { + etag = getEtag(content, { weak: true }), + cacheControl = "no-cache", + headers, + map + } = options; + if (res.writableEnded) { + return; + } + if (req.headers["if-none-match"] === etag) { + res.statusCode = 304; + res.end(); + return; + } + res.setHeader("Content-Type", alias[type] || type); + res.setHeader("Cache-Control", cacheControl); + res.setHeader("Etag", etag); + if (headers) { + for (const name in headers) { + res.setHeader(name, headers[name]); + } + } + if (map && "version" in map && map.mappings) { + if (type === "js" || type === "css") { + content = getCodeWithSourcemap(type, content.toString(), map); + } + } else if (type === "js" && (!map || map.mappings !== "")) { + const code = content.toString(); + if (convertSourceMap.mapFileCommentRegex.test(code)) { + debug$2?.(`Skipped injecting fallback sourcemap for ${req.url}`); + } else { + const urlWithoutTimestamp = removeTimestampQuery(req.url); + const ms = new MagicString(code); + content = getCodeWithSourcemap( + type, + code, + ms.generateMap({ + source: path$n.basename(urlWithoutTimestamp), + hires: "boundary", + includeContent: true + }) + ); + } + } + res.statusCode = 200; + res.end(content); + return; +} + +const debugCache = createDebugger("vite:cache"); +const knownIgnoreList = /* @__PURE__ */ new Set(["/", "/favicon.ico"]); +const trailingQuerySeparatorsRE = /[?&]+$/; +const urlRE = /[?&]url\b/; +const rawRE = /[?&]raw\b/; +const inlineRE = /[?&]inline\b/; +const svgRE = /\.svg\b/; +function deniedServingAccessForTransform(url, server, res, next) { + if (rawRE.test(url) || urlRE.test(url) || inlineRE.test(url) || svgRE.test(url)) { + const servingAccessResult = checkServingAccess(url, server); + if (servingAccessResult === "denied") { + respondWithAccessDenied(url, server, res); + return true; + } + if (servingAccessResult === "fallback") { + next(); + return true; + } + } + return false; +} +function cachedTransformMiddleware(server) { + return function viteCachedTransformMiddleware(req, res, next) { + const ifNoneMatch = req.headers["if-none-match"]; + if (ifNoneMatch) { + const moduleByEtag = server.moduleGraph.getModuleByEtag(ifNoneMatch); + if (moduleByEtag?.transformResult?.etag === ifNoneMatch && moduleByEtag?.url === req.url) { + const maybeMixedEtag = isCSSRequest(req.url); + if (!maybeMixedEtag) { + debugCache?.(`[304] ${prettifyUrl(req.url, server.config.root)}`); + res.statusCode = 304; + return res.end(); + } + } + } + next(); + }; +} +function transformMiddleware(server) { + const { root, publicDir } = server.config; + const publicDirInRoot = publicDir.startsWith(withTrailingSlash(root)); + const publicPath = `${publicDir.slice(root.length)}/`; + return async function viteTransformMiddleware(req, res, next) { + if (req.method !== "GET" || knownIgnoreList.has(req.url)) { + return next(); + } + let url; + try { + url = decodeURI(removeTimestampQuery(req.url)).replace( + NULL_BYTE_PLACEHOLDER, + "\0" + ); + } catch (e) { + return next(e); + } + const withoutQuery = cleanUrl(url); + try { + const isSourceMap = withoutQuery.endsWith(".map"); + if (isSourceMap) { + const depsOptimizer = getDepsOptimizer(server.config, false); + if (depsOptimizer?.isOptimizedDepUrl(url)) { + const sourcemapPath = url.startsWith(FS_PREFIX) ? fsPathFromId(url) : normalizePath$3(path$n.resolve(server.config.root, url.slice(1))); + try { + const map = JSON.parse( + await fsp.readFile(sourcemapPath, "utf-8") + ); + applySourcemapIgnoreList( + map, + sourcemapPath, + server.config.server.sourcemapIgnoreList, + server.config.logger + ); + return send(req, res, JSON.stringify(map), "json", { + headers: server.config.server.headers + }); + } catch (e) { + const dummySourceMap = { + version: 3, + file: sourcemapPath.replace(/\.map$/, ""), + sources: [], + sourcesContent: [], + names: [], + mappings: ";;;;;;;;;" + }; + return send(req, res, JSON.stringify(dummySourceMap), "json", { + cacheControl: "no-cache", + headers: server.config.server.headers + }); + } + } else { + const originalUrl = url.replace(/\.map($|\?)/, "$1"); + const map = (await server.moduleGraph.getModuleByUrl(originalUrl, false))?.transformResult?.map; + if (map) { + return send(req, res, JSON.stringify(map), "json", { + headers: server.config.server.headers + }); + } else { + return next(); + } + } + } + if (publicDirInRoot && url.startsWith(publicPath)) { + warnAboutExplicitPublicPathInUrl(url); + } + const urlWithoutTrailingQuerySeparators = url.replace( + trailingQuerySeparatorsRE, + "" + ); + if (deniedServingAccessForTransform( + urlWithoutTrailingQuerySeparators, + server, + res, + next + )) { + return; + } + if (isJSRequest(url) || isImportRequest(url) || isCSSRequest(url) || isHTMLProxy(url)) { + url = removeImportQuery(url); + url = unwrapId$1(url); + if (isCSSRequest(url)) { + if (req.headers.accept?.includes("text/css") && !isDirectRequest(url)) { + url = injectQuery(url, "direct"); + } + const ifNoneMatch = req.headers["if-none-match"]; + if (ifNoneMatch && (await server.moduleGraph.getModuleByUrl(url, false))?.transformResult?.etag === ifNoneMatch) { + debugCache?.(`[304] ${prettifyUrl(url, server.config.root)}`); + res.statusCode = 304; + return res.end(); + } + } + const result = await transformRequest(url, server, { + html: req.headers.accept?.includes("text/html"), + allowId(id) { + return !deniedServingAccessForTransform(id, server, res, next); + } + }); + if (result) { + const depsOptimizer = getDepsOptimizer(server.config, false); + const type = isDirectCSSRequest(url) ? "css" : "js"; + const isDep = DEP_VERSION_RE.test(url) || depsOptimizer?.isOptimizedDepUrl(url); + return send(req, res, result.code, type, { + etag: result.etag, + // allow browser to cache npm deps! + cacheControl: isDep ? "max-age=31536000,immutable" : "no-cache", + headers: server.config.server.headers, + map: result.map + }); + } + } + } catch (e) { + if (e?.code === ERR_OPTIMIZE_DEPS_PROCESSING_ERROR) { + if (!res.writableEnded) { + res.statusCode = 504; + res.statusMessage = "Optimize Deps Processing Error"; + res.end(); + } + server.config.logger.error(e.message); + return; + } + if (e?.code === ERR_OUTDATED_OPTIMIZED_DEP) { + if (!res.writableEnded) { + res.statusCode = 504; + res.statusMessage = "Outdated Optimize Dep"; + res.end(); + } + return; + } + if (e?.code === ERR_CLOSED_SERVER) { + if (!res.writableEnded) { + res.statusCode = 504; + res.statusMessage = "Outdated Request"; + res.end(); + } + return; + } + if (e?.code === ERR_FILE_NOT_FOUND_IN_OPTIMIZED_DEP_DIR) { + if (!res.writableEnded) { + res.statusCode = 404; + res.end(); + } + server.config.logger.warn(colors$1.yellow(e.message)); + return; + } + if (e?.code === ERR_LOAD_URL) { + return next(); + } + if (e?.code === ERR_DENIED_ID) { + return; + } + return next(e); + } + next(); + }; + function warnAboutExplicitPublicPathInUrl(url) { + let warning; + if (isImportRequest(url)) { + const rawUrl = removeImportQuery(url); + if (urlRE.test(url)) { + warning = `Assets in the public directory are served at the root path. +Instead of ${colors$1.cyan(rawUrl)}, use ${colors$1.cyan( + rawUrl.replace(publicPath, "/") + )}.`; + } else { + warning = `Assets in public directory cannot be imported from JavaScript. +If you intend to import that asset, put the file in the src directory, and use ${colors$1.cyan( + rawUrl.replace(publicPath, "/src/") + )} instead of ${colors$1.cyan(rawUrl)}. +If you intend to use the URL of that asset, use ${colors$1.cyan( + injectQuery(rawUrl.replace(publicPath, "/"), "url") + )}.`; + } + } else { + warning = `Files in the public directory are served at the root path. +Instead of ${colors$1.cyan(url)}, use ${colors$1.cyan( + url.replace(publicPath, "/") + )}.`; + } + server.config.logger.warn(colors$1.yellow(warning)); + } +} + +function createDevHtmlTransformFn(config) { + const [preHooks, normalHooks, postHooks] = resolveHtmlTransforms( + config.plugins, + config.logger + ); + const transformHooks = [ + preImportMapHook(config), + injectCspNonceMetaTagHook(config), + ...preHooks, + htmlEnvHook(config), + devHtmlHook, + ...normalHooks, + ...postHooks, + injectNonceAttributeTagHook(config), + postImportMapHook() + ]; + return (server, url, html, originalUrl) => { + return applyHtmlTransforms(html, transformHooks, { + path: url, + filename: getHtmlFilename(url, server), + server, + originalUrl + }); + }; +} +function getHtmlFilename(url, server) { + if (url.startsWith(FS_PREFIX)) { + return decodeURIComponent(fsPathFromId(url)); + } else { + return decodeURIComponent( + normalizePath$3(path$n.join(server.config.root, url.slice(1))) + ); + } +} +function shouldPreTransform(url, config) { + return !checkPublicFile(url, config) && (isJSRequest(url) || isCSSRequest(url)); +} +const wordCharRE = /\w/; +function isBareRelative(url) { + return wordCharRE.test(url[0]) && !url.includes(":"); +} +const isSrcSet = (attr) => attr.name === "srcset" && attr.prefix === void 0; +const processNodeUrl = (url, useSrcSetReplacer, config, htmlPath, originalUrl, server, isClassicScriptLink) => { + const replacer = (url2) => { + if (server?.moduleGraph) { + const mod = server.moduleGraph.urlToModuleMap.get(url2); + if (mod && mod.lastHMRTimestamp > 0) { + url2 = injectQuery(url2, `t=${mod.lastHMRTimestamp}`); + } + } + if (url2[0] === "/" && url2[1] !== "/" || // #3230 if some request url (localhost:3000/a/b) return to fallback html, the relative assets + // path will add `/a/` prefix, it will caused 404. + // + // skip if url contains `:` as it implies a url protocol or Windows path that we don't want to replace. + // + // rewrite `./index.js` -> `localhost:5173/a/index.js`. + // rewrite `../index.js` -> `localhost:5173/index.js`. + // rewrite `relative/index.js` -> `localhost:5173/a/relative/index.js`. + (url2[0] === "." || isBareRelative(url2)) && originalUrl && originalUrl !== "/" && htmlPath === "/index.html") { + url2 = path$n.posix.join(config.base, url2); + } + if (server && !isClassicScriptLink && shouldPreTransform(url2, config)) { + let preTransformUrl; + if (url2[0] === "/" && url2[1] !== "/") { + preTransformUrl = url2; + } else if (url2[0] === "." || isBareRelative(url2)) { + preTransformUrl = path$n.posix.join( + config.base, + path$n.posix.dirname(htmlPath), + url2 + ); + } + if (preTransformUrl) { + try { + preTransformUrl = decodeURI(preTransformUrl); + } catch (err) { + return url2; + } + preTransformRequest(server, preTransformUrl, config.decodedBase); + } + } + return url2; + }; + const processedUrl = useSrcSetReplacer ? processSrcSetSync(url, ({ url: url2 }) => replacer(url2)) : replacer(url); + return processedUrl; +}; +const devHtmlHook = async (html, { path: htmlPath, filename, server, originalUrl }) => { + const { config, moduleGraph, watcher } = server; + const base = config.base || "/"; + const decodedBase = config.decodedBase || "/"; + let proxyModulePath; + let proxyModuleUrl; + const trailingSlash = htmlPath.endsWith("/"); + if (!trailingSlash && getFsUtils(config).existsSync(filename)) { + proxyModulePath = htmlPath; + proxyModuleUrl = proxyModulePath; + } else { + const validPath = `${htmlPath}${trailingSlash ? "index.html" : ""}`; + proxyModulePath = `\0${validPath}`; + proxyModuleUrl = wrapId$1(proxyModulePath); + } + proxyModuleUrl = joinUrlSegments(decodedBase, proxyModuleUrl); + const s = new MagicString(html); + let inlineModuleIndex = -1; + const proxyCacheUrl = decodeURI( + cleanUrl(proxyModulePath).replace(normalizePath$3(config.root), "") + ); + const styleUrl = []; + const inlineStyles = []; + const addInlineModule = (node, ext) => { + inlineModuleIndex++; + const contentNode = node.childNodes[0]; + const code = contentNode.value; + let map; + if (proxyModulePath[0] !== "\0") { + map = new MagicString(html).snip( + contentNode.sourceCodeLocation.startOffset, + contentNode.sourceCodeLocation.endOffset + ).generateMap({ hires: "boundary" }); + map.sources = [filename]; + map.file = filename; + } + addToHTMLProxyCache(config, proxyCacheUrl, inlineModuleIndex, { code, map }); + const modulePath = `${proxyModuleUrl}?html-proxy&index=${inlineModuleIndex}.${ext}`; + const module = server?.moduleGraph.getModuleById(modulePath); + if (module) { + server?.moduleGraph.invalidateModule(module); + } + s.update( + node.sourceCodeLocation.startOffset, + node.sourceCodeLocation.endOffset, + `