@planet-matrix/mobius-model 0.6.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/oxlint.config.ts +1 -2
- package/package.json +29 -17
- package/scripts/build.ts +2 -52
- package/src/ai/README.md +1 -0
- package/src/ai/ai.ts +107 -0
- package/src/ai/chat-completion-ai/aihubmix-chat-completion.ts +78 -0
- package/src/ai/chat-completion-ai/chat-completion-ai.ts +270 -0
- package/src/ai/chat-completion-ai/chat-completion.ts +189 -0
- package/src/ai/chat-completion-ai/index.ts +7 -0
- package/src/ai/chat-completion-ai/lingyiwanwu-chat-completion.ts +78 -0
- package/src/ai/chat-completion-ai/ohmygpt-chat-completion.ts +78 -0
- package/src/ai/chat-completion-ai/openai-next-chat-completion.ts +78 -0
- package/src/ai/embedding-ai/embedding-ai.ts +63 -0
- package/src/ai/embedding-ai/embedding.ts +50 -0
- package/src/ai/embedding-ai/index.ts +4 -0
- package/src/ai/embedding-ai/openai-next-embedding.ts +23 -0
- package/src/ai/index.ts +4 -0
- package/src/aio/README.md +100 -0
- package/src/aio/content.ts +141 -0
- package/src/aio/index.ts +3 -0
- package/src/aio/json.ts +127 -0
- package/src/aio/prompt.ts +246 -0
- package/src/basic/README.md +20 -15
- package/src/basic/error.ts +19 -5
- package/src/basic/function.ts +2 -2
- package/src/basic/index.ts +1 -0
- package/src/basic/promise.ts +141 -71
- package/src/basic/schedule.ts +111 -0
- package/src/basic/stream.ts +135 -25
- package/src/credential/README.md +107 -0
- package/src/credential/api-key.ts +158 -0
- package/src/credential/bearer.ts +73 -0
- package/src/credential/index.ts +4 -0
- package/src/credential/json-web-token.ts +96 -0
- package/src/credential/password.ts +170 -0
- package/src/cron/README.md +86 -0
- package/src/cron/cron.ts +87 -0
- package/src/cron/index.ts +1 -0
- package/src/drizzle/README.md +1 -0
- package/src/drizzle/drizzle.ts +1 -0
- package/src/drizzle/helper.ts +47 -0
- package/src/drizzle/index.ts +5 -0
- package/src/drizzle/infer.ts +52 -0
- package/src/drizzle/kysely.ts +8 -0
- package/src/drizzle/pagination.ts +198 -0
- package/src/email/README.md +1 -0
- package/src/email/index.ts +1 -0
- package/src/email/resend.ts +25 -0
- package/src/event/class-event-proxy.ts +5 -6
- package/src/event/common.ts +13 -3
- package/src/event/event-manager.ts +3 -3
- package/src/event/instance-event-proxy.ts +5 -6
- package/src/event/internal.ts +4 -4
- package/src/exception/README.md +28 -19
- package/src/exception/error/error.ts +123 -0
- package/src/exception/error/index.ts +2 -0
- package/src/exception/error/match.ts +38 -0
- package/src/exception/error/must-fix.ts +17 -0
- package/src/exception/index.ts +2 -0
- package/src/file-system/find.ts +53 -0
- package/src/file-system/index.ts +2 -0
- package/src/file-system/path.ts +76 -0
- package/src/file-system/resolve.ts +22 -0
- package/src/form/README.md +25 -0
- package/src/form/index.ts +1 -0
- package/src/form/inputor-controller/base.ts +861 -0
- package/src/form/inputor-controller/boolean.ts +39 -0
- package/src/form/inputor-controller/file.ts +39 -0
- package/src/form/inputor-controller/form.ts +179 -0
- package/src/form/inputor-controller/helper.ts +117 -0
- package/src/form/inputor-controller/index.ts +17 -0
- package/src/form/inputor-controller/multi-select.ts +99 -0
- package/src/form/inputor-controller/number.ts +116 -0
- package/src/form/inputor-controller/select.ts +109 -0
- package/src/form/inputor-controller/text.ts +82 -0
- package/src/http/READMD.md +1 -0
- package/src/http/api/api-core.ts +84 -0
- package/src/http/api/api-handler.ts +79 -0
- package/src/http/api/api-host.ts +47 -0
- package/src/http/api/api-result.ts +56 -0
- package/src/http/api/api-schema.ts +154 -0
- package/src/http/api/api-server.ts +130 -0
- package/src/http/api/api-test.ts +142 -0
- package/src/http/api/api-type.ts +34 -0
- package/src/http/api/api.ts +81 -0
- package/src/http/api/index.ts +11 -0
- package/src/http/api-adapter/api-core-node-http.ts +260 -0
- package/src/http/api-adapter/api-host-node-http.ts +156 -0
- package/src/http/api-adapter/api-result-arktype.ts +294 -0
- package/src/http/api-adapter/api-result-zod.ts +286 -0
- package/src/http/api-adapter/index.ts +5 -0
- package/src/http/bin/gen-api-list/gen-api-list.ts +126 -0
- package/src/http/bin/gen-api-list/index.ts +1 -0
- package/src/http/bin/gen-api-test/gen-api-test.ts +136 -0
- package/src/http/bin/gen-api-test/index.ts +1 -0
- package/src/http/bin/gen-api-type/calc-code.ts +25 -0
- package/src/http/bin/gen-api-type/gen-api-type.ts +127 -0
- package/src/http/bin/gen-api-type/index.ts +2 -0
- package/src/http/bin/index.ts +2 -0
- package/src/http/index.ts +3 -0
- package/src/huawei/README.md +1 -0
- package/src/huawei/index.ts +2 -0
- package/src/huawei/moderation/index.ts +1 -0
- package/src/huawei/moderation/moderation.ts +355 -0
- package/src/huawei/obs/esdk-obs-nodejs.d.ts +87 -0
- package/src/huawei/obs/index.ts +1 -0
- package/src/huawei/obs/obs.ts +42 -0
- package/src/index.ts +21 -2
- package/src/json/README.md +92 -0
- package/src/json/index.ts +1 -0
- package/src/json/repair.ts +18 -0
- package/src/log/logger.ts +15 -4
- package/src/openai/README.md +1 -0
- package/src/openai/index.ts +1 -0
- package/src/openai/openai.ts +509 -0
- package/src/orchestration/README.md +9 -7
- package/src/orchestration/dispatching/dispatcher.ts +83 -0
- package/src/orchestration/dispatching/index.ts +2 -0
- package/src/orchestration/dispatching/selector/base-selector.ts +39 -0
- package/src/orchestration/dispatching/selector/down-count-selector.ts +119 -0
- package/src/orchestration/dispatching/selector/index.ts +2 -0
- package/src/orchestration/index.ts +2 -0
- package/src/orchestration/scheduling/index.ts +2 -0
- package/src/orchestration/scheduling/scheduler.ts +103 -0
- package/src/orchestration/scheduling/task.ts +32 -0
- package/src/random/README.md +8 -7
- package/src/random/base.ts +66 -0
- package/src/random/index.ts +5 -1
- package/src/random/random-boolean.ts +40 -0
- package/src/random/random-integer.ts +60 -0
- package/src/random/random-number.ts +72 -0
- package/src/random/random-string.ts +66 -0
- package/src/request/README.md +108 -0
- package/src/request/fetch/base.ts +108 -0
- package/src/request/fetch/browser.ts +280 -0
- package/src/request/fetch/general.ts +20 -0
- package/src/request/fetch/index.ts +4 -0
- package/src/request/fetch/nodejs.ts +280 -0
- package/src/request/index.ts +2 -0
- package/src/request/request/base.ts +246 -0
- package/src/request/request/general.ts +63 -0
- package/src/request/request/index.ts +3 -0
- package/src/request/request/resource.ts +68 -0
- package/src/result/README.md +4 -0
- package/src/result/controller.ts +58 -0
- package/src/result/either.ts +363 -0
- package/src/result/generator.ts +168 -0
- package/src/result/index.ts +3 -0
- package/src/route/README.md +105 -0
- package/src/route/adapter/browser.ts +122 -0
- package/src/route/adapter/driver.ts +56 -0
- package/src/route/adapter/index.ts +2 -0
- package/src/route/index.ts +3 -0
- package/src/route/router/index.ts +2 -0
- package/src/route/router/route.ts +630 -0
- package/src/route/router/router.ts +1641 -0
- package/src/route/uri/hash.ts +307 -0
- package/src/route/uri/index.ts +7 -0
- package/src/route/uri/pathname.ts +376 -0
- package/src/route/uri/search.ts +412 -0
- package/src/service/README.md +1 -0
- package/src/service/index.ts +1 -0
- package/src/service/service.ts +110 -0
- package/src/socket/README.md +105 -0
- package/src/socket/client/index.ts +2 -0
- package/src/socket/client/socket-unit.ts +658 -0
- package/src/socket/client/socket.ts +203 -0
- package/src/socket/common/index.ts +2 -0
- package/src/socket/common/socket-unit-common.ts +23 -0
- package/src/socket/common/socket-unit-heartbeat.ts +427 -0
- package/src/socket/index.ts +3 -0
- package/src/socket/server/index.ts +3 -0
- package/src/socket/server/server.ts +183 -0
- package/src/socket/server/socket-unit.ts +448 -0
- package/src/socket/server/socket.ts +264 -0
- package/src/storage/table.ts +3 -3
- package/src/timer/expiration/expiration-manager.ts +3 -3
- package/src/timer/expiration/remaining-manager.ts +3 -3
- package/src/tube/README.md +99 -0
- package/src/tube/helper.ts +137 -0
- package/src/tube/index.ts +2 -0
- package/src/tube/tube.ts +880 -0
- package/src/weixin/README.md +1 -0
- package/src/weixin/index.ts +2 -0
- package/src/weixin/official-account/authorization.ts +157 -0
- package/src/weixin/official-account/index.ts +2 -0
- package/src/weixin/official-account/js-api.ts +132 -0
- package/src/weixin/open/index.ts +1 -0
- package/src/weixin/open/oauth2.ts +131 -0
- package/tests/unit/ai/ai.spec.ts +85 -0
- package/tests/unit/aio/content.spec.ts +105 -0
- package/tests/unit/aio/json.spec.ts +146 -0
- package/tests/unit/aio/prompt.spec.ts +111 -0
- package/tests/unit/basic/error.spec.ts +16 -4
- package/tests/unit/basic/promise.spec.ts +158 -50
- package/tests/unit/basic/schedule.spec.ts +74 -0
- package/tests/unit/basic/stream.spec.ts +90 -37
- package/tests/unit/credential/api-key.spec.ts +36 -0
- package/tests/unit/credential/bearer.spec.ts +23 -0
- package/tests/unit/credential/json-web-token.spec.ts +23 -0
- package/tests/unit/credential/password.spec.ts +40 -0
- package/tests/unit/cron/cron.spec.ts +84 -0
- package/tests/unit/event/class-event-proxy.spec.ts +3 -3
- package/tests/unit/event/event-manager.spec.ts +3 -3
- package/tests/unit/event/instance-event-proxy.spec.ts +3 -3
- package/tests/unit/exception/error/error.spec.ts +83 -0
- package/tests/unit/exception/error/match.spec.ts +81 -0
- package/tests/unit/form/inputor-controller/base.spec.ts +458 -0
- package/tests/unit/form/inputor-controller/boolean.spec.ts +30 -0
- package/tests/unit/form/inputor-controller/file.spec.ts +27 -0
- package/tests/unit/form/inputor-controller/form.spec.ts +120 -0
- package/tests/unit/form/inputor-controller/helper.spec.ts +67 -0
- package/tests/unit/form/inputor-controller/multi-select.spec.ts +34 -0
- package/tests/unit/form/inputor-controller/number.spec.ts +36 -0
- package/tests/unit/form/inputor-controller/select.spec.ts +49 -0
- package/tests/unit/form/inputor-controller/text.spec.ts +34 -0
- package/tests/unit/http/api/api-core-host.spec.ts +207 -0
- package/tests/unit/http/api/api-schema.spec.ts +120 -0
- package/tests/unit/http/api/api-server.spec.ts +363 -0
- package/tests/unit/http/api/api-test.spec.ts +117 -0
- package/tests/unit/http/api/api.spec.ts +121 -0
- package/tests/unit/http/api-adapter/node-http.spec.ts +187 -0
- package/tests/unit/identifier/uuid.spec.ts +0 -1
- package/tests/unit/json/repair.spec.ts +11 -0
- package/tests/unit/log/logger.spec.ts +19 -4
- package/tests/unit/openai/openai.spec.ts +64 -0
- package/tests/unit/orchestration/dispatching/dispatcher.spec.ts +41 -0
- package/tests/unit/orchestration/dispatching/selector/down-count-selector.spec.ts +81 -0
- package/tests/unit/orchestration/scheduling/scheduler.spec.ts +103 -0
- package/tests/unit/random/base.spec.ts +58 -0
- package/tests/unit/random/random-boolean.spec.ts +25 -0
- package/tests/unit/random/random-integer.spec.ts +32 -0
- package/tests/unit/random/random-number.spec.ts +33 -0
- package/tests/unit/random/random-string.spec.ts +22 -0
- package/tests/unit/request/fetch/browser.spec.ts +222 -0
- package/tests/unit/request/fetch/general.spec.ts +43 -0
- package/tests/unit/request/fetch/nodejs.spec.ts +225 -0
- package/tests/unit/request/request/base.spec.ts +382 -0
- package/tests/unit/request/request/general.spec.ts +160 -0
- package/tests/unit/result/controller.spec.ts +82 -0
- package/tests/unit/result/either.spec.ts +377 -0
- package/tests/unit/result/generator.spec.ts +273 -0
- package/tests/unit/route/router/route.spec.ts +430 -0
- package/tests/unit/route/router/router.spec.ts +407 -0
- package/tests/unit/route/uri/hash.spec.ts +72 -0
- package/tests/unit/route/uri/pathname.spec.ts +146 -0
- package/tests/unit/route/uri/search.spec.ts +107 -0
- package/tests/unit/socket/client.spec.ts +208 -0
- package/tests/unit/socket/server.spec.ts +133 -0
- package/tests/unit/socket/socket-unit-heartbeat.spec.ts +214 -0
- package/tests/unit/tube/helper.spec.ts +139 -0
- package/tests/unit/tube/tube.spec.ts +501 -0
- package/vite.config.ts +2 -1
- package/dist/index.js +0 -50
- package/dist/index.js.map +0 -209
- package/src/random/string.ts +0 -35
- package/tests/unit/random/string.spec.ts +0 -11
package/dist/index.js.map
DELETED
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\packageJson.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\colorDepth.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\shared\\colors.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\shared\\logger.js", "..\\..\\..\\node_modules\\.bun\\picomatch@4.0.3\\node_modules\\picomatch\\lib\\constants.js", "..\\..\\..\\node_modules\\.bun\\picomatch@4.0.3\\node_modules\\picomatch\\lib\\utils.js", "..\\..\\..\\node_modules\\.bun\\picomatch@4.0.3\\node_modules\\picomatch\\lib\\scan.js", "..\\..\\..\\node_modules\\.bun\\picomatch@4.0.3\\node_modules\\picomatch\\lib\\parse.js", "..\\..\\..\\node_modules\\.bun\\picomatch@4.0.3\\node_modules\\picomatch\\lib\\picomatch.js", "..\\..\\..\\node_modules\\.bun\\picomatch@4.0.3\\node_modules\\picomatch\\index.js", "..\\..\\..\\node_modules\\.bun\\fdir@6.5.0+a185e370e160e74e\\node_modules\\fdir\\dist\\index.cjs", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\services\\ls.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\fsx.js", "..\\..\\..\\node_modules\\.bun\\dotenv@17.3.1\\node_modules\\dotenv\\lib\\main.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\parseEncryptionKeyFromDotenvKey.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\decrypt.js", "..\\..\\..\\node_modules\\.bun\\@noble+ciphers@1.3.0\\node_modules\\@noble\\ciphers\\utils.js", "..\\..\\..\\node_modules\\.bun\\eciesjs@0.4.17\\node_modules\\eciesjs\\dist\\consts.js", "..\\..\\..\\node_modules\\.bun\\eciesjs@0.4.17\\node_modules\\eciesjs\\dist\\config.js", "..\\..\\..\\node_modules\\.bun\\@noble+ciphers@1.3.0\\node_modules\\@noble\\ciphers\\cryptoNode.js", "..\\..\\..\\node_modules\\.bun\\@noble+ciphers@1.3.0\\node_modules\\@noble\\ciphers\\webcrypto.js", "..\\..\\..\\node_modules\\.bun\\@noble+hashes@1.8.0\\node_modules\\@noble\\hashes\\cryptoNode.js", "..\\..\\..\\node_modules\\.bun\\@noble+hashes@1.8.0\\node_modules\\@noble\\hashes\\utils.js", "..\\..\\..\\node_modules\\.bun\\@noble+hashes@1.8.0\\node_modules\\@noble\\hashes\\_md.js", "..\\..\\..\\node_modules\\.bun\\@noble+hashes@1.8.0\\node_modules\\@noble\\hashes\\_u64.js", "..\\..\\..\\node_modules\\.bun\\@noble+hashes@1.8.0\\node_modules\\@noble\\hashes\\sha2.js", "..\\..\\..\\node_modules\\.bun\\@noble+curves@1.9.7\\node_modules\\@noble\\curves\\utils.js", "..\\..\\..\\node_modules\\.bun\\@noble+curves@1.9.7\\node_modules\\@noble\\curves\\abstract\\modular.js", "..\\..\\..\\node_modules\\.bun\\@noble+curves@1.9.7\\node_modules\\@noble\\curves\\abstract\\curve.js", "..\\..\\..\\node_modules\\.bun\\@noble+curves@1.9.7\\node_modules\\@noble\\curves\\abstract\\edwards.js", "..\\..\\..\\node_modules\\.bun\\@noble+curves@1.9.7\\node_modules\\@noble\\curves\\abstract\\hash-to-curve.js", "..\\..\\..\\node_modules\\.bun\\@noble+curves@1.9.7\\node_modules\\@noble\\curves\\abstract\\montgomery.js", "..\\..\\..\\node_modules\\.bun\\@noble+curves@1.9.7\\node_modules\\@noble\\curves\\ed25519.js", "..\\..\\..\\node_modules\\.bun\\@noble+hashes@1.8.0\\node_modules\\@noble\\hashes\\hmac.js", "..\\..\\..\\node_modules\\.bun\\@noble+curves@1.9.7\\node_modules\\@noble\\curves\\abstract\\weierstrass.js", "..\\..\\..\\node_modules\\.bun\\@noble+curves@1.9.7\\node_modules\\@noble\\curves\\_shortw_utils.js", "..\\..\\..\\node_modules\\.bun\\@noble+curves@1.9.7\\node_modules\\@noble\\curves\\secp256k1.js", "..\\..\\..\\node_modules\\.bun\\eciesjs@0.4.17\\node_modules\\eciesjs\\dist\\utils\\hex.js", "..\\..\\..\\node_modules\\.bun\\eciesjs@0.4.17\\node_modules\\eciesjs\\dist\\utils\\elliptic.js", "..\\..\\..\\node_modules\\.bun\\@noble+hashes@1.8.0\\node_modules\\@noble\\hashes\\hkdf.js", "..\\..\\..\\node_modules\\.bun\\eciesjs@0.4.17\\node_modules\\eciesjs\\dist\\utils\\hash.js", "..\\..\\..\\node_modules\\.bun\\@ecies+ciphers@0.2.5+5ddec49a6244fee4\\node_modules\\@ecies\\ciphers\\dist\\_node\\compat.js", "..\\..\\..\\node_modules\\.bun\\@ecies+ciphers@0.2.5+5ddec49a6244fee4\\node_modules\\@ecies\\ciphers\\dist\\aes\\node.js", "..\\..\\..\\node_modules\\.bun\\@noble+ciphers@1.3.0\\node_modules\\@noble\\ciphers\\_arx.js", "..\\..\\..\\node_modules\\.bun\\@noble+ciphers@1.3.0\\node_modules\\@noble\\ciphers\\_poly1305.js", "..\\..\\..\\node_modules\\.bun\\@noble+ciphers@1.3.0\\node_modules\\@noble\\ciphers\\chacha.js", "..\\..\\..\\node_modules\\.bun\\@ecies+ciphers@0.2.5+5ddec49a6244fee4\\node_modules\\@ecies\\ciphers\\dist\\chacha\\noble.js", "..\\..\\..\\node_modules\\.bun\\eciesjs@0.4.17\\node_modules\\eciesjs\\dist\\utils\\symmetric.js", "..\\..\\..\\node_modules\\.bun\\eciesjs@0.4.17\\node_modules\\eciesjs\\dist\\utils\\index.js", "..\\..\\..\\node_modules\\.bun\\eciesjs@0.4.17\\node_modules\\eciesjs\\dist\\keys\\PublicKey.js", "..\\..\\..\\node_modules\\.bun\\eciesjs@0.4.17\\node_modules\\eciesjs\\dist\\keys\\PrivateKey.js", "..\\..\\..\\node_modules\\.bun\\eciesjs@0.4.17\\node_modules\\eciesjs\\dist\\keys\\index.js", "..\\..\\..\\node_modules\\.bun\\eciesjs@0.4.17\\node_modules\\eciesjs\\dist\\index.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\truncate.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\errors.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\decryptKeyValue.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\chomp.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\evalKeyValue.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\resolveEscapeSequences.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\parse.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\dotenvParse.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\parseEnvironmentFromDotenvKey.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\detectEncoding.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\guessEnvironment.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\guessPrivateKeyName.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\guessPublicKeyName.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\proKeypair.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\smartDotenvPublicKey.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\smartDotenvPrivateKey.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\services\\keypair.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\findPrivateKey.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\dotenvPrivateKeyNames.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\guessPrivateKeyFilename.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\determineEnvs.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\services\\run.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\encryptValue.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\quotes.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\escapeForRegex.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\escapeDollarSigns.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\replace.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\findPublicKey.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\keypair.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\isEncrypted.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\services\\sets.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\services\\get.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\findEnvFiles.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\services\\genexample.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\conventions.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\resolveHome.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\dotenvOptionPaths.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\deprecationNotice.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\buildEnvs.js", "..\\..\\..\\node_modules\\.bun\\ignore@5.3.2\\node_modules\\ignore\\index.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\helpers\\isIgnoringDotenvKeys.js", "..\\..\\..\\node_modules\\.bun\\@dotenvx+dotenvx@1.54.1\\node_modules\\@dotenvx\\dotenvx\\src\\lib\\main.js", "..\\src\\basic\\is.ts", "..\\src\\basic\\boolean.ts", "..\\src\\basic\\helper.ts", "..\\src\\basic\\string.ts", "..\\src\\basic\\number.ts", "..\\src\\basic\\bigint.ts", "..\\src\\basic\\symbol.ts", "..\\src\\basic\\array.ts", "..\\src\\basic\\object.ts", "..\\src\\basic\\function.ts", "..\\src\\basic\\temporal.ts", "..\\src\\basic\\error.ts", "..\\src\\basic\\regexp.ts", "..\\src\\basic\\promise.ts", "..\\src\\basic\\stream.ts", "..\\src\\basic\\enhance.ts", "..\\src\\environment\\basic.ts", "..\\src\\environment\\geo.ts", "..\\..\\..\\node_modules\\.bun\\ua-parser-js@2.0.9\\node_modules\\ua-parser-js\\src\\main\\ua-parser.mjs", "..\\..\\..\\node_modules\\.bun\\ua-parser-js@2.0.9\\node_modules\\ua-parser-js\\src\\enums\\ua-parser-enums.mjs", "..\\..\\..\\node_modules\\.bun\\ua-parser-js@2.0.9\\node_modules\\ua-parser-js\\src\\device-detection\\device-detection.mjs", "..\\..\\..\\node_modules\\.bun\\ua-parser-js@2.0.9\\node_modules\\ua-parser-js\\src\\extensions\\ua-parser-extensions.mjs", "..\\..\\..\\node_modules\\.bun\\ua-parser-js@2.0.9\\node_modules\\ua-parser-js\\src\\bot-detection\\bot-detection.mjs", "..\\..\\..\\node_modules\\.bun\\is-standalone-pwa@0.1.1\\node_modules\\is-standalone-pwa\\dist\\esm\\index.js", "..\\..\\..\\node_modules\\.bun\\detect-europe-js@0.1.2\\node_modules\\detect-europe-js\\dist\\esm\\index.js", "..\\..\\..\\node_modules\\.bun\\ua-parser-js@2.0.9\\node_modules\\ua-parser-js\\src\\browser-detection\\browser-detection.mjs", "..\\..\\..\\node_modules\\.bun\\ua-is-frozen@0.1.2\\node_modules\\ua-is-frozen\\dist\\esm\\index.js", "..\\src\\environment\\device.ts", "..\\src\\environment\\runtime.ts", "..\\src\\environment\\feature.ts", "..\\src\\environment\\variable.ts", "..\\src\\environment\\snapshot.ts", "..\\src\\exception\\normalize.ts", "..\\src\\exception\\browser.ts", "..\\src\\exception\\nodejs.ts", "..\\src\\event\\event-manager.ts", "..\\src\\event\\instance-event-proxy.ts", "..\\src\\event\\class-event-proxy.ts", "..\\src\\singleton\\factory.ts", "..\\src\\singleton\\manager.ts", "..\\src\\log\\log-type.ts", "..\\src\\log\\log-emitter.ts", "..\\src\\log\\log-scheduler.ts", "..\\src\\identifier\\uuid.ts", "..\\src\\identifier\\id.ts", "..\\src\\log\\logger.ts", "..\\src\\abort\\abort-signal-listener-manager.ts", "..\\src\\abort\\abort-manager.ts", "..\\src\\reactor\\reactor-core\\flags.ts", "..\\src\\reactor\\reactor-core\\reactive-system.ts", "..\\src\\reactor\\reactor-core\\primitive.ts", "..\\src\\reactor\\reactor-operators\\utility.ts", "..\\src\\reactor\\reactor-operators\\convert.ts", "..\\src\\reactor\\reactor-operators\\create.ts", "..\\src\\reactor\\reactor-operators\\join.ts", "..\\src\\reactor\\reactor-operators\\branch.ts", "..\\src\\reactor\\reactor-operators\\map.ts", "..\\src\\reactor\\reactor-operators\\filter.ts", "..\\src\\timer\\expiration\\min-heap.ts", "..\\src\\timer\\expiration\\remaining-manager.ts", "..\\src\\timer\\expiration\\expiration-manager.ts", "..\\src\\orchestration\\coordination\\errors.ts", "..\\src\\orchestration\\coordination\\internal\\wait-queue.ts", "..\\src\\orchestration\\coordination\\internal\\wait-constraints.ts", "..\\src\\orchestration\\coordination\\barrier.ts", "..\\src\\orchestration\\coordination\\count-down-latch.ts", "..\\src\\orchestration\\coordination\\permit.ts", "..\\src\\orchestration\\coordination\\mutex.ts", "..\\src\\orchestration\\coordination\\semaphore.ts", "..\\src\\orchestration\\coordination\\keyed-lock.ts", "..\\src\\orchestration\\coordination\\read-write-lock.ts", "..\\src\\encoding\\base64.ts", "..\\src\\random\\string.ts", "..\\src\\color\\internal.ts", "..\\src\\color\\xyz\\internal.ts", "..\\src\\color\\xyz\\construct.ts", "..\\src\\color\\xyz\\convert.ts", "..\\src\\color\\xyz\\analyze.ts", "..\\src\\color\\rgb\\internal.ts", "..\\src\\color\\rgb\\convert.ts", "..\\src\\color\\rgb\\construct.ts", "..\\src\\color\\rgb\\parse.ts", "..\\src\\color\\rgb\\serialize.ts", "..\\src\\color\\rgb\\analyze.ts", "..\\src\\color\\rgb\\derive.ts", "..\\src\\web\\location.ts", "..\\src\\web\\event.ts", "..\\src\\web\\local-storage.ts", "..\\src\\web\\dom.ts", "..\\src\\web\\permission.ts", "..\\src\\web\\clipboard.ts", "..\\..\\..\\node_modules\\.bun\\html-to-image@1.11.13\\node_modules\\html-to-image\\es\\util.js", "..\\..\\..\\node_modules\\.bun\\html-to-image@1.11.13\\node_modules\\html-to-image\\es\\clone-pseudos.js", "..\\..\\..\\node_modules\\.bun\\html-to-image@1.11.13\\node_modules\\html-to-image\\es\\mimes.js", "..\\..\\..\\node_modules\\.bun\\html-to-image@1.11.13\\node_modules\\html-to-image\\es\\dataurl.js", "..\\..\\..\\node_modules\\.bun\\html-to-image@1.11.13\\node_modules\\html-to-image\\es\\clone-node.js", "..\\..\\..\\node_modules\\.bun\\html-to-image@1.11.13\\node_modules\\html-to-image\\es\\embed-resources.js", "..\\..\\..\\node_modules\\.bun\\html-to-image@1.11.13\\node_modules\\html-to-image\\es\\embed-images.js", "..\\..\\..\\node_modules\\.bun\\html-to-image@1.11.13\\node_modules\\html-to-image\\es\\apply-style.js", "..\\..\\..\\node_modules\\.bun\\html-to-image@1.11.13\\node_modules\\html-to-image\\es\\embed-webfonts.js", "..\\..\\..\\node_modules\\.bun\\html-to-image@1.11.13\\node_modules\\html-to-image\\es\\index.js", "..\\src\\web\\capture.ts", "..\\src\\web\\download.ts", "..\\src\\web\\script-loader.ts", "..\\src\\css\\class.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"const { name, version, description } = require('../../../package.json')\n\nmodule.exports = { name, version, description }\n",
|
|
6
|
-
"const { WriteStream } = require('tty')\n\nconst getColorDepth = () => {\n try {\n return WriteStream.prototype.getColorDepth()\n } catch (error) {\n const term = process.env.TERM\n\n if (term && (term.includes('256color') || term.includes('xterm'))) {\n return 8 // 256 colors\n }\n\n return 4\n }\n}\n\nmodule.exports = { getColorDepth }\n",
|
|
7
|
-
"const depth = require('../lib/helpers/colorDepth')\n\nconst colors16 = new Map([\n ['blue', 34],\n ['gray', 37],\n ['green', 32],\n ['olive', 33],\n ['orangered', 31], // mapped to red\n ['plum', 35], // mapped to magenta\n ['red', 31],\n ['electricblue', 36],\n ['dodgerblue', 36]\n])\n\nconst colors256 = new Map([\n ['blue', 21],\n ['gray', 244],\n ['green', 34],\n ['olive', 142],\n ['orangered', 202],\n ['plum', 182],\n ['red', 196],\n ['electricblue', 45],\n ['dodgerblue', 33]\n])\n\nfunction getColor (color) {\n const colorDepth = depth.getColorDepth()\n if (!colors256.has(color)) {\n throw new Error(`Invalid color ${color}`)\n }\n if (colorDepth >= 8) {\n const code = colors256.get(color)\n return (message) => `\\x1b[38;5;${code}m${message}\\x1b[39m`\n }\n if (colorDepth >= 4) {\n const code = colors16.get(color)\n return (message) => `\\x1b[${code}m${message}\\x1b[39m`\n }\n return (message) => message\n}\n\nfunction bold (message) {\n if (depth.getColorDepth() >= 4) {\n return `\\x1b[1m${message}\\x1b[22m`\n }\n\n return message\n}\n\nmodule.exports = {\n getColor,\n bold\n}\n",
|
|
8
|
-
"const packageJson = require('../lib/helpers/packageJson')\nconst { getColor, bold } = require('./colors')\n\nconst levels = {\n error: 0,\n warn: 1,\n success: 2,\n successv: 2,\n info: 2,\n help: 2,\n verbose: 4,\n debug: 5,\n silly: 6\n}\n\nconst error = (m) => bold(getColor('red')(m))\nconst warn = getColor('orangered')\nconst success = getColor('green')\nconst successv = getColor('olive') // yellow-ish tint that 'looks' like dotenv\nconst help = getColor('dodgerblue')\nconst verbose = getColor('plum')\nconst debug = getColor('plum')\n\nlet currentLevel = levels.info // default log level\nlet currentName = 'dotenvx' // default logger name\nlet currentVersion = packageJson.version // default logger version\n\nfunction stderr (level, message) {\n const formattedMessage = formatMessage(level, message)\n console.error(formattedMessage)\n}\n\nfunction stdout (level, message) {\n if (levels[level] === undefined) {\n throw new Error(`MISSING_LOG_LEVEL: '${level}'. implement in logger.`)\n }\n\n if (levels[level] <= currentLevel) {\n const formattedMessage = formatMessage(level, message)\n console.log(formattedMessage)\n }\n}\n\nfunction formatMessage (level, message) {\n const formattedMessage = typeof message === 'object' ? JSON.stringify(message) : message\n\n switch (level.toLowerCase()) {\n // errors\n case 'error':\n return error(formattedMessage)\n // warns\n case 'warn':\n return warn(formattedMessage)\n // successes\n case 'success':\n return success(formattedMessage)\n case 'successv': // success with 'version'\n return successv(`[${currentName}@${currentVersion}] ${formattedMessage}`)\n // info\n case 'info':\n return formattedMessage\n // help\n case 'help':\n return help(formattedMessage)\n // verbose\n case 'verbose':\n return verbose(formattedMessage)\n // debug\n case 'debug':\n return debug(formattedMessage)\n }\n}\n\nconst logger = {\n // track level\n level: 'info',\n\n // errors\n error: (msg) => stderr('error', msg),\n // warns\n warn: (msg) => stdout('warn', msg),\n // success\n success: (msg) => stdout('success', msg),\n successv: (msg) => stdout('successv', msg),\n // info\n info: (msg) => stdout('info', msg),\n // help\n help: (msg) => stdout('help', msg),\n // verbose\n verbose: (msg) => stdout('verbose', msg),\n // debug\n debug: (msg) => stdout('debug', msg),\n setLevel: (level) => {\n if (levels[level] !== undefined) {\n currentLevel = levels[level]\n logger.level = level\n }\n },\n setName: (name) => {\n currentName = name\n logger.name = name\n },\n setVersion: (version) => {\n currentVersion = version\n logger.version = version\n }\n}\n\nfunction setLogLevel (options) {\n const logLevel = options.debug\n ? 'debug'\n : options.verbose\n ? 'verbose'\n : options.quiet\n ? 'error'\n : options.logLevel\n\n if (!logLevel) return\n logger.setLevel(logLevel)\n // Only log which level it's setting if it's not set to quiet mode\n if (!options.quiet || (options.quiet && logLevel !== 'error')) {\n logger.debug(`Setting log level to ${logLevel}`)\n }\n}\n\nfunction setLogName (options) {\n const logName = options.logName\n if (!logName) return\n logger.setName(logName)\n}\n\nfunction setLogVersion (options) {\n const logVersion = options.logVersion\n if (!logVersion) return\n logger.setVersion(logVersion)\n}\n\nmodule.exports = {\n logger,\n getColor,\n setLogLevel,\n setLogName,\n setLogVersion,\n levels\n}\n",
|
|
9
|
-
"'use strict';\n\nconst WIN_SLASH = '\\\\\\\\/';\nconst WIN_NO_SLASH = `[^${WIN_SLASH}]`;\n\n/**\n * Posix glob regex\n */\n\nconst DOT_LITERAL = '\\\\.';\nconst PLUS_LITERAL = '\\\\+';\nconst QMARK_LITERAL = '\\\\?';\nconst SLASH_LITERAL = '\\\\/';\nconst ONE_CHAR = '(?=.)';\nconst QMARK = '[^/]';\nconst END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;\nconst START_ANCHOR = `(?:^|${SLASH_LITERAL})`;\nconst DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;\nconst NO_DOT = `(?!${DOT_LITERAL})`;\nconst NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;\nconst NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;\nconst NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;\nconst QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;\nconst STAR = `${QMARK}*?`;\nconst SEP = '/';\n\nconst POSIX_CHARS = {\n DOT_LITERAL,\n PLUS_LITERAL,\n QMARK_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n QMARK,\n END_ANCHOR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR,\n SEP\n};\n\n/**\n * Windows glob regex\n */\n\nconst WINDOWS_CHARS = {\n ...POSIX_CHARS,\n\n SLASH_LITERAL: `[${WIN_SLASH}]`,\n QMARK: WIN_NO_SLASH,\n STAR: `${WIN_NO_SLASH}*?`,\n DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,\n NO_DOT: `(?!${DOT_LITERAL})`,\n NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,\n NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n QMARK_NO_DOT: `[^.${WIN_SLASH}]`,\n START_ANCHOR: `(?:^|[${WIN_SLASH}])`,\n END_ANCHOR: `(?:[${WIN_SLASH}]|$)`,\n SEP: '\\\\'\n};\n\n/**\n * POSIX Bracket Regex\n */\n\nconst POSIX_REGEX_SOURCE = {\n alnum: 'a-zA-Z0-9',\n alpha: 'a-zA-Z',\n ascii: '\\\\x00-\\\\x7F',\n blank: ' \\\\t',\n cntrl: '\\\\x00-\\\\x1F\\\\x7F',\n digit: '0-9',\n graph: '\\\\x21-\\\\x7E',\n lower: 'a-z',\n print: '\\\\x20-\\\\x7E ',\n punct: '\\\\-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\n space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\n upper: 'A-Z',\n word: 'A-Za-z0-9_',\n xdigit: 'A-Fa-f0-9'\n};\n\nmodule.exports = {\n MAX_LENGTH: 1024 * 64,\n POSIX_REGEX_SOURCE,\n\n // regular expressions\n REGEX_BACKSLASH: /\\\\(?![*+?^${}(|)[\\]])/g,\n REGEX_NON_SPECIAL_CHARS: /^[^@![\\].,$*+?^{}()|\\\\/]+/,\n REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\\]]/,\n REGEX_SPECIAL_CHARS_BACKREF: /(\\\\?)((\\W)(\\3*))/g,\n REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\\]])/g,\n REGEX_REMOVE_BACKSLASH: /(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,\n\n // Replace globs with equivalent patterns to reduce parsing time.\n REPLACEMENTS: {\n __proto__: null,\n '***': '*',\n '**/**': '**',\n '**/**/**': '**'\n },\n\n // Digits\n CHAR_0: 48, /* 0 */\n CHAR_9: 57, /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 65, /* A */\n CHAR_LOWERCASE_A: 97, /* a */\n CHAR_UPPERCASE_Z: 90, /* Z */\n CHAR_LOWERCASE_Z: 122, /* z */\n\n CHAR_LEFT_PARENTHESES: 40, /* ( */\n CHAR_RIGHT_PARENTHESES: 41, /* ) */\n\n CHAR_ASTERISK: 42, /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: 38, /* & */\n CHAR_AT: 64, /* @ */\n CHAR_BACKWARD_SLASH: 92, /* \\ */\n CHAR_CARRIAGE_RETURN: 13, /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */\n CHAR_COLON: 58, /* : */\n CHAR_COMMA: 44, /* , */\n CHAR_DOT: 46, /* . */\n CHAR_DOUBLE_QUOTE: 34, /* \" */\n CHAR_EQUAL: 61, /* = */\n CHAR_EXCLAMATION_MARK: 33, /* ! */\n CHAR_FORM_FEED: 12, /* \\f */\n CHAR_FORWARD_SLASH: 47, /* / */\n CHAR_GRAVE_ACCENT: 96, /* ` */\n CHAR_HASH: 35, /* # */\n CHAR_HYPHEN_MINUS: 45, /* - */\n CHAR_LEFT_ANGLE_BRACKET: 60, /* < */\n CHAR_LEFT_CURLY_BRACE: 123, /* { */\n CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */\n CHAR_LINE_FEED: 10, /* \\n */\n CHAR_NO_BREAK_SPACE: 160, /* \\u00A0 */\n CHAR_PERCENT: 37, /* % */\n CHAR_PLUS: 43, /* + */\n CHAR_QUESTION_MARK: 63, /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */\n CHAR_RIGHT_CURLY_BRACE: 125, /* } */\n CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */\n CHAR_SEMICOLON: 59, /* ; */\n CHAR_SINGLE_QUOTE: 39, /* ' */\n CHAR_SPACE: 32, /* */\n CHAR_TAB: 9, /* \\t */\n CHAR_UNDERSCORE: 95, /* _ */\n CHAR_VERTICAL_LINE: 124, /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \\uFEFF */\n\n /**\n * Create EXTGLOB_CHARS\n */\n\n extglobChars(chars) {\n return {\n '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },\n '?': { type: 'qmark', open: '(?:', close: ')?' },\n '+': { type: 'plus', open: '(?:', close: ')+' },\n '*': { type: 'star', open: '(?:', close: ')*' },\n '@': { type: 'at', open: '(?:', close: ')' }\n };\n },\n\n /**\n * Create GLOB_CHARS\n */\n\n globChars(win32) {\n return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;\n }\n};\n",
|
|
10
|
-
"/*global navigator*/\n'use strict';\n\nconst {\n REGEX_BACKSLASH,\n REGEX_REMOVE_BACKSLASH,\n REGEX_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_GLOBAL\n} = require('./constants');\n\nexports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\nexports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);\nexports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);\nexports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\\\$1');\nexports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');\n\nexports.isWindows = () => {\n if (typeof navigator !== 'undefined' && navigator.platform) {\n const platform = navigator.platform.toLowerCase();\n return platform === 'win32' || platform === 'windows';\n }\n\n if (typeof process !== 'undefined' && process.platform) {\n return process.platform === 'win32';\n }\n\n return false;\n};\n\nexports.removeBackslashes = str => {\n return str.replace(REGEX_REMOVE_BACKSLASH, match => {\n return match === '\\\\' ? '' : match;\n });\n};\n\nexports.escapeLast = (input, char, lastIdx) => {\n const idx = input.lastIndexOf(char, lastIdx);\n if (idx === -1) return input;\n if (input[idx - 1] === '\\\\') return exports.escapeLast(input, char, idx - 1);\n return `${input.slice(0, idx)}\\\\${input.slice(idx)}`;\n};\n\nexports.removePrefix = (input, state = {}) => {\n let output = input;\n if (output.startsWith('./')) {\n output = output.slice(2);\n state.prefix = './';\n }\n return output;\n};\n\nexports.wrapOutput = (input, state = {}, options = {}) => {\n const prepend = options.contains ? '' : '^';\n const append = options.contains ? '' : '$';\n\n let output = `${prepend}(?:${input})${append}`;\n if (state.negated === true) {\n output = `(?:^(?!${output}).*$)`;\n }\n return output;\n};\n\nexports.basename = (path, { windows } = {}) => {\n const segs = path.split(windows ? /[\\\\/]/ : '/');\n const last = segs[segs.length - 1];\n\n if (last === '') {\n return segs[segs.length - 2];\n }\n\n return last;\n};\n",
|
|
11
|
-
"'use strict';\n\nconst utils = require('./utils');\nconst {\n CHAR_ASTERISK, /* * */\n CHAR_AT, /* @ */\n CHAR_BACKWARD_SLASH, /* \\ */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_EXCLAMATION_MARK, /* ! */\n CHAR_FORWARD_SLASH, /* / */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_PLUS, /* + */\n CHAR_QUESTION_MARK, /* ? */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_RIGHT_SQUARE_BRACKET /* ] */\n} = require('./constants');\n\nconst isPathSeparator = code => {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n};\n\nconst depth = token => {\n if (token.isPrefix !== true) {\n token.depth = token.isGlobstar ? Infinity : 1;\n }\n};\n\n/**\n * Quickly scans a glob pattern and returns an object with a handful of\n * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),\n * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not\n * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).\n *\n * ```js\n * const pm = require('picomatch');\n * console.log(pm.scan('foo/bar/*.js'));\n * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an object with tokens and regex source string.\n * @api public\n */\n\nconst scan = (input, options) => {\n const opts = options || {};\n\n const length = input.length - 1;\n const scanToEnd = opts.parts === true || opts.scanToEnd === true;\n const slashes = [];\n const tokens = [];\n const parts = [];\n\n let str = input;\n let index = -1;\n let start = 0;\n let lastIndex = 0;\n let isBrace = false;\n let isBracket = false;\n let isGlob = false;\n let isExtglob = false;\n let isGlobstar = false;\n let braceEscaped = false;\n let backslashes = false;\n let negated = false;\n let negatedExtglob = false;\n let finished = false;\n let braces = 0;\n let prev;\n let code;\n let token = { value: '', depth: 0, isGlob: false };\n\n const eos = () => index >= length;\n const peek = () => str.charCodeAt(index + 1);\n const advance = () => {\n prev = code;\n return str.charCodeAt(++index);\n };\n\n while (index < length) {\n code = advance();\n let next;\n\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braceEscaped = true;\n }\n continue;\n }\n\n if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n continue;\n }\n\n if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (braceEscaped !== true && code === CHAR_COMMA) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_RIGHT_CURLY_BRACE) {\n braces--;\n\n if (braces === 0) {\n braceEscaped = false;\n isBrace = token.isBrace = true;\n finished = true;\n break;\n }\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_FORWARD_SLASH) {\n slashes.push(index);\n tokens.push(token);\n token = { value: '', depth: 0, isGlob: false };\n\n if (finished === true) continue;\n if (prev === CHAR_DOT && index === (start + 1)) {\n start += 2;\n continue;\n }\n\n lastIndex = index + 1;\n continue;\n }\n\n if (opts.noext !== true) {\n const isExtglobChar = code === CHAR_PLUS\n || code === CHAR_AT\n || code === CHAR_ASTERISK\n || code === CHAR_QUESTION_MARK\n || code === CHAR_EXCLAMATION_MARK;\n\n if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n isExtglob = token.isExtglob = true;\n finished = true;\n if (code === CHAR_EXCLAMATION_MARK && index === start) {\n negatedExtglob = true;\n }\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n }\n\n if (code === CHAR_ASTERISK) {\n if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_QUESTION_MARK) {\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_LEFT_SQUARE_BRACKET) {\n while (eos() !== true && (next = advance())) {\n if (next === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n isBracket = token.isBracket = true;\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {\n negated = token.negated = true;\n start++;\n continue;\n }\n\n if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_LEFT_PARENTHESES) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n\n if (isGlob === true) {\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n }\n\n if (opts.noext === true) {\n isExtglob = false;\n isGlob = false;\n }\n\n let base = str;\n let prefix = '';\n let glob = '';\n\n if (start > 0) {\n prefix = str.slice(0, start);\n str = str.slice(start);\n lastIndex -= start;\n }\n\n if (base && isGlob === true && lastIndex > 0) {\n base = str.slice(0, lastIndex);\n glob = str.slice(lastIndex);\n } else if (isGlob === true) {\n base = '';\n glob = str;\n } else {\n base = str;\n }\n\n if (base && base !== '' && base !== '/' && base !== str) {\n if (isPathSeparator(base.charCodeAt(base.length - 1))) {\n base = base.slice(0, -1);\n }\n }\n\n if (opts.unescape === true) {\n if (glob) glob = utils.removeBackslashes(glob);\n\n if (base && backslashes === true) {\n base = utils.removeBackslashes(base);\n }\n }\n\n const state = {\n prefix,\n input,\n start,\n base,\n glob,\n isBrace,\n isBracket,\n isGlob,\n isExtglob,\n isGlobstar,\n negated,\n negatedExtglob\n };\n\n if (opts.tokens === true) {\n state.maxDepth = 0;\n if (!isPathSeparator(code)) {\n tokens.push(token);\n }\n state.tokens = tokens;\n }\n\n if (opts.parts === true || opts.tokens === true) {\n let prevIndex;\n\n for (let idx = 0; idx < slashes.length; idx++) {\n const n = prevIndex ? prevIndex + 1 : start;\n const i = slashes[idx];\n const value = input.slice(n, i);\n if (opts.tokens) {\n if (idx === 0 && start !== 0) {\n tokens[idx].isPrefix = true;\n tokens[idx].value = prefix;\n } else {\n tokens[idx].value = value;\n }\n depth(tokens[idx]);\n state.maxDepth += tokens[idx].depth;\n }\n if (idx !== 0 || value !== '') {\n parts.push(value);\n }\n prevIndex = i;\n }\n\n if (prevIndex && prevIndex + 1 < input.length) {\n const value = input.slice(prevIndex + 1);\n parts.push(value);\n\n if (opts.tokens) {\n tokens[tokens.length - 1].value = value;\n depth(tokens[tokens.length - 1]);\n state.maxDepth += tokens[tokens.length - 1].depth;\n }\n }\n\n state.slashes = slashes;\n state.parts = parts;\n }\n\n return state;\n};\n\nmodule.exports = scan;\n",
|
|
12
|
-
"'use strict';\n\nconst constants = require('./constants');\nconst utils = require('./utils');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n POSIX_REGEX_SOURCE,\n REGEX_NON_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_BACKREF,\n REPLACEMENTS\n} = constants;\n\n/**\n * Helpers\n */\n\nconst expandRange = (args, options) => {\n if (typeof options.expandRange === 'function') {\n return options.expandRange(...args, options);\n }\n\n args.sort();\n const value = `[${args.join('-')}]`;\n\n try {\n /* eslint-disable-next-line no-new */\n new RegExp(value);\n } catch (ex) {\n return args.map(v => utils.escapeRegex(v)).join('..');\n }\n\n return value;\n};\n\n/**\n * Create the message for a syntax error\n */\n\nconst syntaxError = (type, char) => {\n return `Missing ${type}: \"${char}\" - use \"\\\\\\\\${char}\" to match literal characters`;\n};\n\n/**\n * Parse the given input string.\n * @param {String} input\n * @param {Object} options\n * @return {Object}\n */\n\nconst parse = (input, options) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n input = REPLACEMENTS[input] || input;\n\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n\n let len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n const bos = { type: 'bos', value: '', output: opts.prepend || '' };\n const tokens = [bos];\n\n const capture = opts.capture ? '' : '?:';\n\n // create constants based on platform, for windows or posix\n const PLATFORM_CHARS = constants.globChars(opts.windows);\n const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);\n\n const {\n DOT_LITERAL,\n PLUS_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n } = PLATFORM_CHARS;\n\n const globstar = opts => {\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const nodot = opts.dot ? '' : NO_DOT;\n const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;\n let star = opts.bash === true ? globstar(opts) : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n // minimatch options support\n if (typeof opts.noext === 'boolean') {\n opts.noextglob = opts.noext;\n }\n\n const state = {\n input,\n index: -1,\n start: 0,\n dot: opts.dot === true,\n consumed: '',\n output: '',\n prefix: '',\n backtrack: false,\n negated: false,\n brackets: 0,\n braces: 0,\n parens: 0,\n quotes: 0,\n globstar: false,\n tokens\n };\n\n input = utils.removePrefix(input, state);\n len = input.length;\n\n const extglobs = [];\n const braces = [];\n const stack = [];\n let prev = bos;\n let value;\n\n /**\n * Tokenizing helpers\n */\n\n const eos = () => state.index === len - 1;\n const peek = state.peek = (n = 1) => input[state.index + n];\n const advance = state.advance = () => input[++state.index] || '';\n const remaining = () => input.slice(state.index + 1);\n const consume = (value = '', num = 0) => {\n state.consumed += value;\n state.index += num;\n };\n\n const append = token => {\n state.output += token.output != null ? token.output : token.value;\n consume(token.value);\n };\n\n const negate = () => {\n let count = 1;\n\n while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {\n advance();\n state.start++;\n count++;\n }\n\n if (count % 2 === 0) {\n return false;\n }\n\n state.negated = true;\n state.start++;\n return true;\n };\n\n const increment = type => {\n state[type]++;\n stack.push(type);\n };\n\n const decrement = type => {\n state[type]--;\n stack.pop();\n };\n\n /**\n * Push tokens onto the tokens array. This helper speeds up\n * tokenizing by 1) helping us avoid backtracking as much as possible,\n * and 2) helping us avoid creating extra tokens when consecutive\n * characters are plain text. This improves performance and simplifies\n * lookbehinds.\n */\n\n const push = tok => {\n if (prev.type === 'globstar') {\n const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');\n const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));\n\n if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {\n state.output = state.output.slice(0, -prev.output.length);\n prev.type = 'star';\n prev.value = '*';\n prev.output = star;\n state.output += prev.output;\n }\n }\n\n if (extglobs.length && tok.type !== 'paren') {\n extglobs[extglobs.length - 1].inner += tok.value;\n }\n\n if (tok.value || tok.output) append(tok);\n if (prev && prev.type === 'text' && tok.type === 'text') {\n prev.output = (prev.output || prev.value) + tok.value;\n prev.value += tok.value;\n return;\n }\n\n tok.prev = prev;\n tokens.push(tok);\n prev = tok;\n };\n\n const extglobOpen = (type, value) => {\n const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };\n\n token.prev = prev;\n token.parens = state.parens;\n token.output = state.output;\n const output = (opts.capture ? '(' : '') + token.open;\n\n increment('parens');\n push({ type, value, output: state.output ? '' : ONE_CHAR });\n push({ type: 'paren', extglob: true, value: advance(), output });\n extglobs.push(token);\n };\n\n const extglobClose = token => {\n let output = token.close + (opts.capture ? ')' : '');\n let rest;\n\n if (token.type === 'negate') {\n let extglobStar = star;\n\n if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {\n extglobStar = globstar(opts);\n }\n\n if (extglobStar !== star || eos() || /^\\)+$/.test(remaining())) {\n output = token.close = `)$))${extglobStar}`;\n }\n\n if (token.inner.includes('*') && (rest = remaining()) && /^\\.[^\\\\/.]+$/.test(rest)) {\n // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis.\n // In this case, we need to parse the string and use it in the output of the original pattern.\n // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`.\n //\n // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`.\n const expression = parse(rest, { ...options, fastpaths: false }).output;\n\n output = token.close = `)${expression})${extglobStar})`;\n }\n\n if (token.prev.type === 'bos') {\n state.negatedExtglob = true;\n }\n }\n\n push({ type: 'paren', extglob: true, value, output });\n decrement('parens');\n };\n\n /**\n * Fast paths\n */\n\n if (opts.fastpaths !== false && !/(^[*!]|[/()[\\]{}\"])/.test(input)) {\n let backslashes = false;\n\n let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {\n if (first === '\\\\') {\n backslashes = true;\n return m;\n }\n\n if (first === '?') {\n if (esc) {\n return esc + first + (rest ? QMARK.repeat(rest.length) : '');\n }\n if (index === 0) {\n return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');\n }\n return QMARK.repeat(chars.length);\n }\n\n if (first === '.') {\n return DOT_LITERAL.repeat(chars.length);\n }\n\n if (first === '*') {\n if (esc) {\n return esc + first + (rest ? star : '');\n }\n return star;\n }\n return esc ? m : `\\\\${m}`;\n });\n\n if (backslashes === true) {\n if (opts.unescape === true) {\n output = output.replace(/\\\\/g, '');\n } else {\n output = output.replace(/\\\\+/g, m => {\n return m.length % 2 === 0 ? '\\\\\\\\' : (m ? '\\\\' : '');\n });\n }\n }\n\n if (output === input && opts.contains === true) {\n state.output = input;\n return state;\n }\n\n state.output = utils.wrapOutput(output, state, options);\n return state;\n }\n\n /**\n * Tokenize input until we reach end-of-string\n */\n\n while (!eos()) {\n value = advance();\n\n if (value === '\\u0000') {\n continue;\n }\n\n /**\n * Escaped characters\n */\n\n if (value === '\\\\') {\n const next = peek();\n\n if (next === '/' && opts.bash !== true) {\n continue;\n }\n\n if (next === '.' || next === ';') {\n continue;\n }\n\n if (!next) {\n value += '\\\\';\n push({ type: 'text', value });\n continue;\n }\n\n // collapse slashes to reduce potential for exploits\n const match = /^\\\\+/.exec(remaining());\n let slashes = 0;\n\n if (match && match[0].length > 2) {\n slashes = match[0].length;\n state.index += slashes;\n if (slashes % 2 !== 0) {\n value += '\\\\';\n }\n }\n\n if (opts.unescape === true) {\n value = advance();\n } else {\n value += advance();\n }\n\n if (state.brackets === 0) {\n push({ type: 'text', value });\n continue;\n }\n }\n\n /**\n * If we're inside a regex character class, continue\n * until we reach the closing bracket.\n */\n\n if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {\n if (opts.posix !== false && value === ':') {\n const inner = prev.value.slice(1);\n if (inner.includes('[')) {\n prev.posix = true;\n\n if (inner.includes(':')) {\n const idx = prev.value.lastIndexOf('[');\n const pre = prev.value.slice(0, idx);\n const rest = prev.value.slice(idx + 2);\n const posix = POSIX_REGEX_SOURCE[rest];\n if (posix) {\n prev.value = pre + posix;\n state.backtrack = true;\n advance();\n\n if (!bos.output && tokens.indexOf(prev) === 1) {\n bos.output = ONE_CHAR;\n }\n continue;\n }\n }\n }\n }\n\n if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {\n value = `\\\\${value}`;\n }\n\n if (value === ']' && (prev.value === '[' || prev.value === '[^')) {\n value = `\\\\${value}`;\n }\n\n if (opts.posix === true && value === '!' && prev.value === '[') {\n value = '^';\n }\n\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * If we're inside a quoted string, continue\n * until we reach the closing double quote.\n */\n\n if (state.quotes === 1 && value !== '\"') {\n value = utils.escapeRegex(value);\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * Double quotes\n */\n\n if (value === '\"') {\n state.quotes = state.quotes === 1 ? 0 : 1;\n if (opts.keepQuotes === true) {\n push({ type: 'text', value });\n }\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === '(') {\n increment('parens');\n push({ type: 'paren', value });\n continue;\n }\n\n if (value === ')') {\n if (state.parens === 0 && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '('));\n }\n\n const extglob = extglobs[extglobs.length - 1];\n if (extglob && state.parens === extglob.parens + 1) {\n extglobClose(extglobs.pop());\n continue;\n }\n\n push({ type: 'paren', value, output: state.parens ? ')' : '\\\\)' });\n decrement('parens');\n continue;\n }\n\n /**\n * Square brackets\n */\n\n if (value === '[') {\n if (opts.nobracket === true || !remaining().includes(']')) {\n if (opts.nobracket !== true && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('closing', ']'));\n }\n\n value = `\\\\${value}`;\n } else {\n increment('brackets');\n }\n\n push({ type: 'bracket', value });\n continue;\n }\n\n if (value === ']') {\n if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n if (state.brackets === 0) {\n if (opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '['));\n }\n\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n decrement('brackets');\n\n const prevValue = prev.value.slice(1);\n if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {\n value = `/${value}`;\n }\n\n prev.value += value;\n append({ value });\n\n // when literal brackets are explicitly disabled\n // assume we should match with a regex character class\n if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {\n continue;\n }\n\n const escaped = utils.escapeRegex(prev.value);\n state.output = state.output.slice(0, -prev.value.length);\n\n // when literal brackets are explicitly enabled\n // assume we should escape the brackets to match literal characters\n if (opts.literalBrackets === true) {\n state.output += escaped;\n prev.value = escaped;\n continue;\n }\n\n // when the user specifies nothing, try to match both\n prev.value = `(${capture}${escaped}|${prev.value})`;\n state.output += prev.value;\n continue;\n }\n\n /**\n * Braces\n */\n\n if (value === '{' && opts.nobrace !== true) {\n increment('braces');\n\n const open = {\n type: 'brace',\n value,\n output: '(',\n outputIndex: state.output.length,\n tokensIndex: state.tokens.length\n };\n\n braces.push(open);\n push(open);\n continue;\n }\n\n if (value === '}') {\n const brace = braces[braces.length - 1];\n\n if (opts.nobrace === true || !brace) {\n push({ type: 'text', value, output: value });\n continue;\n }\n\n let output = ')';\n\n if (brace.dots === true) {\n const arr = tokens.slice();\n const range = [];\n\n for (let i = arr.length - 1; i >= 0; i--) {\n tokens.pop();\n if (arr[i].type === 'brace') {\n break;\n }\n if (arr[i].type !== 'dots') {\n range.unshift(arr[i].value);\n }\n }\n\n output = expandRange(range, opts);\n state.backtrack = true;\n }\n\n if (brace.comma !== true && brace.dots !== true) {\n const out = state.output.slice(0, brace.outputIndex);\n const toks = state.tokens.slice(brace.tokensIndex);\n brace.value = brace.output = '\\\\{';\n value = output = '\\\\}';\n state.output = out;\n for (const t of toks) {\n state.output += (t.output || t.value);\n }\n }\n\n push({ type: 'brace', value, output });\n decrement('braces');\n braces.pop();\n continue;\n }\n\n /**\n * Pipes\n */\n\n if (value === '|') {\n if (extglobs.length > 0) {\n extglobs[extglobs.length - 1].conditions++;\n }\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Commas\n */\n\n if (value === ',') {\n let output = value;\n\n const brace = braces[braces.length - 1];\n if (brace && stack[stack.length - 1] === 'braces') {\n brace.comma = true;\n output = '|';\n }\n\n push({ type: 'comma', value, output });\n continue;\n }\n\n /**\n * Slashes\n */\n\n if (value === '/') {\n // if the beginning of the glob is \"./\", advance the start\n // to the current index, and don't add the \"./\" characters\n // to the state. This greatly simplifies lookbehinds when\n // checking for BOS characters like \"!\" and \".\" (not \"./\")\n if (prev.type === 'dot' && state.index === state.start + 1) {\n state.start = state.index + 1;\n state.consumed = '';\n state.output = '';\n tokens.pop();\n prev = bos; // reset \"prev\" to the first token\n continue;\n }\n\n push({ type: 'slash', value, output: SLASH_LITERAL });\n continue;\n }\n\n /**\n * Dots\n */\n\n if (value === '.') {\n if (state.braces > 0 && prev.type === 'dot') {\n if (prev.value === '.') prev.output = DOT_LITERAL;\n const brace = braces[braces.length - 1];\n prev.type = 'dots';\n prev.output += value;\n prev.value += value;\n brace.dots = true;\n continue;\n }\n\n if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {\n push({ type: 'text', value, output: DOT_LITERAL });\n continue;\n }\n\n push({ type: 'dot', value, output: DOT_LITERAL });\n continue;\n }\n\n /**\n * Question marks\n */\n\n if (value === '?') {\n const isGroup = prev && prev.value === '(';\n if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('qmark', value);\n continue;\n }\n\n if (prev && prev.type === 'paren') {\n const next = peek();\n let output = value;\n\n if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\\w+>)/.test(remaining()))) {\n output = `\\\\${value}`;\n }\n\n push({ type: 'text', value, output });\n continue;\n }\n\n if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {\n push({ type: 'qmark', value, output: QMARK_NO_DOT });\n continue;\n }\n\n push({ type: 'qmark', value, output: QMARK });\n continue;\n }\n\n /**\n * Exclamation\n */\n\n if (value === '!') {\n if (opts.noextglob !== true && peek() === '(') {\n if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {\n extglobOpen('negate', value);\n continue;\n }\n }\n\n if (opts.nonegate !== true && state.index === 0) {\n negate();\n continue;\n }\n }\n\n /**\n * Plus\n */\n\n if (value === '+') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('plus', value);\n continue;\n }\n\n if ((prev && prev.value === '(') || opts.regex === false) {\n push({ type: 'plus', value, output: PLUS_LITERAL });\n continue;\n }\n\n if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {\n push({ type: 'plus', value });\n continue;\n }\n\n push({ type: 'plus', value: PLUS_LITERAL });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value === '@') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n push({ type: 'at', extglob: true, value, output: '' });\n continue;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value !== '*') {\n if (value === '$' || value === '^') {\n value = `\\\\${value}`;\n }\n\n const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());\n if (match) {\n value += match[0];\n state.index += match[0].length;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Stars\n */\n\n if (prev && (prev.type === 'globstar' || prev.star === true)) {\n prev.type = 'star';\n prev.star = true;\n prev.value += value;\n prev.output = star;\n state.backtrack = true;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n let rest = remaining();\n if (opts.noextglob !== true && /^\\([^?]/.test(rest)) {\n extglobOpen('star', value);\n continue;\n }\n\n if (prev.type === 'star') {\n if (opts.noglobstar === true) {\n consume(value);\n continue;\n }\n\n const prior = prev.prev;\n const before = prior.prev;\n const isStart = prior.type === 'slash' || prior.type === 'bos';\n const afterStar = before && (before.type === 'star' || before.type === 'globstar');\n\n if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');\n const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');\n if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n // strip consecutive `/**/`\n while (rest.slice(0, 3) === '/**') {\n const after = input[state.index + 4];\n if (after && after !== '/') {\n break;\n }\n rest = rest.slice(3);\n consume('/**', 3);\n }\n\n if (prior.type === 'bos' && eos()) {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = globstar(opts);\n state.output = prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');\n prev.value += value;\n state.globstar = true;\n state.output += prior.output + prev.output;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {\n const end = rest[1] !== void 0 ? '|$' : '';\n\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;\n prev.value += value;\n\n state.output += prior.output + prev.output;\n state.globstar = true;\n\n consume(value + advance());\n\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n if (prior.type === 'bos' && rest[0] === '/') {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;\n state.output = prev.output;\n state.globstar = true;\n consume(value + advance());\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n // remove single star from output\n state.output = state.output.slice(0, -prev.output.length);\n\n // reset previous token to globstar\n prev.type = 'globstar';\n prev.output = globstar(opts);\n prev.value += value;\n\n // reset output with globstar\n state.output += prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n const token = { type: 'star', value, output: star };\n\n if (opts.bash === true) {\n token.output = '.*?';\n if (prev.type === 'bos' || prev.type === 'slash') {\n token.output = nodot + token.output;\n }\n push(token);\n continue;\n }\n\n if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {\n token.output = value;\n push(token);\n continue;\n }\n\n if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {\n if (prev.type === 'dot') {\n state.output += NO_DOT_SLASH;\n prev.output += NO_DOT_SLASH;\n\n } else if (opts.dot === true) {\n state.output += NO_DOTS_SLASH;\n prev.output += NO_DOTS_SLASH;\n\n } else {\n state.output += nodot;\n prev.output += nodot;\n }\n\n if (peek() !== '*') {\n state.output += ONE_CHAR;\n prev.output += ONE_CHAR;\n }\n }\n\n push(token);\n }\n\n while (state.brackets > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']'));\n state.output = utils.escapeLast(state.output, '[');\n decrement('brackets');\n }\n\n while (state.parens > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')'));\n state.output = utils.escapeLast(state.output, '(');\n decrement('parens');\n }\n\n while (state.braces > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}'));\n state.output = utils.escapeLast(state.output, '{');\n decrement('braces');\n }\n\n if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {\n push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });\n }\n\n // rebuild the output if we had to backtrack at any point\n if (state.backtrack === true) {\n state.output = '';\n\n for (const token of state.tokens) {\n state.output += token.output != null ? token.output : token.value;\n\n if (token.suffix) {\n state.output += token.suffix;\n }\n }\n }\n\n return state;\n};\n\n/**\n * Fast paths for creating regular expressions for common glob patterns.\n * This can significantly speed up processing and has very little downside\n * impact when none of the fast paths match.\n */\n\nparse.fastpaths = (input, options) => {\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n const len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n input = REPLACEMENTS[input] || input;\n\n // create constants based on platform, for windows or posix\n const {\n DOT_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOTS_SLASH,\n STAR,\n START_ANCHOR\n } = constants.globChars(opts.windows);\n\n const nodot = opts.dot ? NO_DOTS : NO_DOT;\n const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;\n const capture = opts.capture ? '' : '?:';\n const state = { negated: false, prefix: '' };\n let star = opts.bash === true ? '.*?' : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n const globstar = opts => {\n if (opts.noglobstar === true) return star;\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const create = str => {\n switch (str) {\n case '*':\n return `${nodot}${ONE_CHAR}${star}`;\n\n case '.*':\n return `${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*.*':\n return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*/*':\n return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;\n\n case '**':\n return nodot + globstar(opts);\n\n case '**/*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;\n\n case '**/*.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '**/.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n default: {\n const match = /^(.*?)\\.(\\w+)$/.exec(str);\n if (!match) return;\n\n const source = create(match[1]);\n if (!source) return;\n\n return source + DOT_LITERAL + match[2];\n }\n }\n };\n\n const output = utils.removePrefix(input, state);\n let source = create(output);\n\n if (source && opts.strictSlashes !== true) {\n source += `${SLASH_LITERAL}?`;\n }\n\n return source;\n};\n\nmodule.exports = parse;\n",
|
|
13
|
-
"'use strict';\n\nconst scan = require('./scan');\nconst parse = require('./parse');\nconst utils = require('./utils');\nconst constants = require('./constants');\nconst isObject = val => val && typeof val === 'object' && !Array.isArray(val);\n\n/**\n * Creates a matcher function from one or more glob patterns. The\n * returned function takes a string to match as its first argument,\n * and returns true if the string is a match. The returned matcher\n * function also takes a boolean as the second argument that, when true,\n * returns an object with additional information.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch(glob[, options]);\n *\n * const isMatch = picomatch('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @name picomatch\n * @param {String|Array} `globs` One or more glob patterns.\n * @param {Object=} `options`\n * @return {Function=} Returns a matcher function.\n * @api public\n */\n\nconst picomatch = (glob, options, returnState = false) => {\n if (Array.isArray(glob)) {\n const fns = glob.map(input => picomatch(input, options, returnState));\n const arrayMatcher = str => {\n for (const isMatch of fns) {\n const state = isMatch(str);\n if (state) return state;\n }\n return false;\n };\n return arrayMatcher;\n }\n\n const isState = isObject(glob) && glob.tokens && glob.input;\n\n if (glob === '' || (typeof glob !== 'string' && !isState)) {\n throw new TypeError('Expected pattern to be a non-empty string');\n }\n\n const opts = options || {};\n const posix = opts.windows;\n const regex = isState\n ? picomatch.compileRe(glob, options)\n : picomatch.makeRe(glob, options, false, true);\n\n const state = regex.state;\n delete regex.state;\n\n let isIgnored = () => false;\n if (opts.ignore) {\n const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };\n isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);\n }\n\n const matcher = (input, returnObject = false) => {\n const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });\n const result = { glob, state, regex, posix, input, output, match, isMatch };\n\n if (typeof opts.onResult === 'function') {\n opts.onResult(result);\n }\n\n if (isMatch === false) {\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (isIgnored(input)) {\n if (typeof opts.onIgnore === 'function') {\n opts.onIgnore(result);\n }\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (typeof opts.onMatch === 'function') {\n opts.onMatch(result);\n }\n return returnObject ? result : true;\n };\n\n if (returnState) {\n matcher.state = state;\n }\n\n return matcher;\n};\n\n/**\n * Test `input` with the given `regex`. This is used by the main\n * `picomatch()` function to test the input string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.test(input, regex[, options]);\n *\n * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\\/([^/]*?))$/));\n * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp} `regex`\n * @return {Object} Returns an object with matching info.\n * @api public\n */\n\npicomatch.test = (input, regex, options, { glob, posix } = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected input to be a string');\n }\n\n if (input === '') {\n return { isMatch: false, output: '' };\n }\n\n const opts = options || {};\n const format = opts.format || (posix ? utils.toPosixSlashes : null);\n let match = input === glob;\n let output = (match && format) ? format(input) : input;\n\n if (match === false) {\n output = format ? format(input) : input;\n match = output === glob;\n }\n\n if (match === false || opts.capture === true) {\n if (opts.matchBase === true || opts.basename === true) {\n match = picomatch.matchBase(input, regex, options, posix);\n } else {\n match = regex.exec(output);\n }\n }\n\n return { isMatch: Boolean(match), match, output };\n};\n\n/**\n * Match the basename of a filepath.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.matchBase(input, glob[, options]);\n * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).\n * @return {Boolean}\n * @api public\n */\n\npicomatch.matchBase = (input, glob, options) => {\n const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);\n return regex.test(utils.basename(input));\n};\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.isMatch(string, patterns[, options]);\n *\n * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String|Array} str The string to test.\n * @param {String|Array} patterns One or more glob patterns to use for matching.\n * @param {Object} [options] See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\npicomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const result = picomatch.parse(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as a regex source string.\n * @api public\n */\n\npicomatch.parse = (pattern, options) => {\n if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));\n return parse(pattern, { ...options, fastpaths: false });\n};\n\n/**\n * Scan a glob pattern to separate the pattern into segments.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.scan(input[, options]);\n *\n * const result = picomatch.scan('!./foo/*.js');\n * console.log(result);\n * { prefix: '!./',\n * input: '!./foo/*.js',\n * start: 3,\n * base: 'foo',\n * glob: '*.js',\n * isBrace: false,\n * isBracket: false,\n * isGlob: true,\n * isExtglob: false,\n * isGlobstar: false,\n * negated: true }\n * ```\n * @param {String} `input` Glob pattern to scan.\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\npicomatch.scan = (input, options) => scan(input, options);\n\n/**\n * Compile a regular expression from the `state` object returned by the\n * [parse()](#parse) method.\n *\n * @param {Object} `state`\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.\n * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.\n * @return {RegExp}\n * @api public\n */\n\npicomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {\n if (returnOutput === true) {\n return state.output;\n }\n\n const opts = options || {};\n const prepend = opts.contains ? '' : '^';\n const append = opts.contains ? '' : '$';\n\n let source = `${prepend}(?:${state.output})${append}`;\n if (state && state.negated === true) {\n source = `^(?!${source}).*$`;\n }\n\n const regex = picomatch.toRegex(source, options);\n if (returnState === true) {\n regex.state = state;\n }\n\n return regex;\n};\n\n/**\n * Create a regular expression from a parsed glob pattern.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const state = picomatch.parse('*.js');\n * // picomatch.compileRe(state[, options]);\n *\n * console.log(picomatch.compileRe(state));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `state` The object returned from the `.parse` method.\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.\n * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\npicomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {\n if (!input || typeof input !== 'string') {\n throw new TypeError('Expected a non-empty string');\n }\n\n let parsed = { negated: false, fastpaths: true };\n\n if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {\n parsed.output = parse.fastpaths(input, options);\n }\n\n if (!parsed.output) {\n parsed = parse(input, options);\n }\n\n return picomatch.compileRe(parsed, options, returnOutput, returnState);\n};\n\n/**\n * Create a regular expression from the given regex source string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.toRegex(source[, options]);\n *\n * const { output } = picomatch.parse('*.js');\n * console.log(picomatch.toRegex(output));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `source` Regular expression source string.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\npicomatch.toRegex = (source, options) => {\n try {\n const opts = options || {};\n return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));\n } catch (err) {\n if (options && options.debug === true) throw err;\n return /$^/;\n }\n};\n\n/**\n * Picomatch constants.\n * @return {Object}\n */\n\npicomatch.constants = constants;\n\n/**\n * Expose \"picomatch\"\n */\n\nmodule.exports = picomatch;\n",
|
|
14
|
-
"'use strict';\n\nconst pico = require('./lib/picomatch');\nconst utils = require('./lib/utils');\n\nfunction picomatch(glob, options, returnState = false) {\n // default to os.platform()\n if (options && (options.windows === null || options.windows === undefined)) {\n // don't mutate the original options object\n options = { ...options, windows: utils.isWindows() };\n }\n\n return pico(glob, options, returnState);\n}\n\nObject.assign(picomatch, pico);\nmodule.exports = picomatch;\n",
|
|
15
|
-
"//#region rolldown:runtime\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __copyProps = (to, from, except, desc) => {\n\tif (from && typeof from === \"object\" || typeof from === \"function\") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {\n\t\tkey = keys[i];\n\t\tif (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n\t\t\tget: ((k) => from[k]).bind(null, key),\n\t\t\tenumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n\t\t});\n\t}\n\treturn to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", {\n\tvalue: mod,\n\tenumerable: true\n}) : target, mod));\n\n//#endregion\nconst path = __toESM(require(\"path\"));\nconst fs = __toESM(require(\"fs\"));\n\n//#region src/utils.ts\nfunction cleanPath(path$1) {\n\tlet normalized = (0, path.normalize)(path$1);\n\tif (normalized.length > 1 && normalized[normalized.length - 1] === path.sep) normalized = normalized.substring(0, normalized.length - 1);\n\treturn normalized;\n}\nconst SLASHES_REGEX = /[\\\\/]/g;\nfunction convertSlashes(path$1, separator) {\n\treturn path$1.replace(SLASHES_REGEX, separator);\n}\nconst WINDOWS_ROOT_DIR_REGEX = /^[a-z]:[\\\\/]$/i;\nfunction isRootDirectory(path$1) {\n\treturn path$1 === \"/\" || WINDOWS_ROOT_DIR_REGEX.test(path$1);\n}\nfunction normalizePath(path$1, options) {\n\tconst { resolvePaths, normalizePath: normalizePath$1, pathSeparator } = options;\n\tconst pathNeedsCleaning = process.platform === \"win32\" && path$1.includes(\"/\") || path$1.startsWith(\".\");\n\tif (resolvePaths) path$1 = (0, path.resolve)(path$1);\n\tif (normalizePath$1 || pathNeedsCleaning) path$1 = cleanPath(path$1);\n\tif (path$1 === \".\") return \"\";\n\tconst needsSeperator = path$1[path$1.length - 1] !== pathSeparator;\n\treturn convertSlashes(needsSeperator ? path$1 + pathSeparator : path$1, pathSeparator);\n}\n\n//#endregion\n//#region src/api/functions/join-path.ts\nfunction joinPathWithBasePath(filename, directoryPath) {\n\treturn directoryPath + filename;\n}\nfunction joinPathWithRelativePath(root, options) {\n\treturn function(filename, directoryPath) {\n\t\tconst sameRoot = directoryPath.startsWith(root);\n\t\tif (sameRoot) return directoryPath.slice(root.length) + filename;\n\t\telse return convertSlashes((0, path.relative)(root, directoryPath), options.pathSeparator) + options.pathSeparator + filename;\n\t};\n}\nfunction joinPath(filename) {\n\treturn filename;\n}\nfunction joinDirectoryPath(filename, directoryPath, separator) {\n\treturn directoryPath + filename + separator;\n}\nfunction build$7(root, options) {\n\tconst { relativePaths, includeBasePath } = options;\n\treturn relativePaths && root ? joinPathWithRelativePath(root, options) : includeBasePath ? joinPathWithBasePath : joinPath;\n}\n\n//#endregion\n//#region src/api/functions/push-directory.ts\nfunction pushDirectoryWithRelativePath(root) {\n\treturn function(directoryPath, paths) {\n\t\tpaths.push(directoryPath.substring(root.length) || \".\");\n\t};\n}\nfunction pushDirectoryFilterWithRelativePath(root) {\n\treturn function(directoryPath, paths, filters) {\n\t\tconst relativePath = directoryPath.substring(root.length) || \".\";\n\t\tif (filters.every((filter) => filter(relativePath, true))) paths.push(relativePath);\n\t};\n}\nconst pushDirectory = (directoryPath, paths) => {\n\tpaths.push(directoryPath || \".\");\n};\nconst pushDirectoryFilter = (directoryPath, paths, filters) => {\n\tconst path$1 = directoryPath || \".\";\n\tif (filters.every((filter) => filter(path$1, true))) paths.push(path$1);\n};\nconst empty$2 = () => {};\nfunction build$6(root, options) {\n\tconst { includeDirs, filters, relativePaths } = options;\n\tif (!includeDirs) return empty$2;\n\tif (relativePaths) return filters && filters.length ? pushDirectoryFilterWithRelativePath(root) : pushDirectoryWithRelativePath(root);\n\treturn filters && filters.length ? pushDirectoryFilter : pushDirectory;\n}\n\n//#endregion\n//#region src/api/functions/push-file.ts\nconst pushFileFilterAndCount = (filename, _paths, counts, filters) => {\n\tif (filters.every((filter) => filter(filename, false))) counts.files++;\n};\nconst pushFileFilter = (filename, paths, _counts, filters) => {\n\tif (filters.every((filter) => filter(filename, false))) paths.push(filename);\n};\nconst pushFileCount = (_filename, _paths, counts, _filters) => {\n\tcounts.files++;\n};\nconst pushFile = (filename, paths) => {\n\tpaths.push(filename);\n};\nconst empty$1 = () => {};\nfunction build$5(options) {\n\tconst { excludeFiles, filters, onlyCounts } = options;\n\tif (excludeFiles) return empty$1;\n\tif (filters && filters.length) return onlyCounts ? pushFileFilterAndCount : pushFileFilter;\n\telse if (onlyCounts) return pushFileCount;\n\telse return pushFile;\n}\n\n//#endregion\n//#region src/api/functions/get-array.ts\nconst getArray = (paths) => {\n\treturn paths;\n};\nconst getArrayGroup = () => {\n\treturn [\"\"].slice(0, 0);\n};\nfunction build$4(options) {\n\treturn options.group ? getArrayGroup : getArray;\n}\n\n//#endregion\n//#region src/api/functions/group-files.ts\nconst groupFiles = (groups, directory, files) => {\n\tgroups.push({\n\t\tdirectory,\n\t\tfiles,\n\t\tdir: directory\n\t});\n};\nconst empty = () => {};\nfunction build$3(options) {\n\treturn options.group ? groupFiles : empty;\n}\n\n//#endregion\n//#region src/api/functions/resolve-symlink.ts\nconst resolveSymlinksAsync = function(path$1, state, callback$1) {\n\tconst { queue, fs: fs$1, options: { suppressErrors } } = state;\n\tqueue.enqueue();\n\tfs$1.realpath(path$1, (error, resolvedPath) => {\n\t\tif (error) return queue.dequeue(suppressErrors ? null : error, state);\n\t\tfs$1.stat(resolvedPath, (error$1, stat) => {\n\t\t\tif (error$1) return queue.dequeue(suppressErrors ? null : error$1, state);\n\t\t\tif (stat.isDirectory() && isRecursive(path$1, resolvedPath, state)) return queue.dequeue(null, state);\n\t\t\tcallback$1(stat, resolvedPath);\n\t\t\tqueue.dequeue(null, state);\n\t\t});\n\t});\n};\nconst resolveSymlinks = function(path$1, state, callback$1) {\n\tconst { queue, fs: fs$1, options: { suppressErrors } } = state;\n\tqueue.enqueue();\n\ttry {\n\t\tconst resolvedPath = fs$1.realpathSync(path$1);\n\t\tconst stat = fs$1.statSync(resolvedPath);\n\t\tif (stat.isDirectory() && isRecursive(path$1, resolvedPath, state)) return;\n\t\tcallback$1(stat, resolvedPath);\n\t} catch (e) {\n\t\tif (!suppressErrors) throw e;\n\t}\n};\nfunction build$2(options, isSynchronous) {\n\tif (!options.resolveSymlinks || options.excludeSymlinks) return null;\n\treturn isSynchronous ? resolveSymlinks : resolveSymlinksAsync;\n}\nfunction isRecursive(path$1, resolved, state) {\n\tif (state.options.useRealPaths) return isRecursiveUsingRealPaths(resolved, state);\n\tlet parent = (0, path.dirname)(path$1);\n\tlet depth = 1;\n\twhile (parent !== state.root && depth < 2) {\n\t\tconst resolvedPath = state.symlinks.get(parent);\n\t\tconst isSameRoot = !!resolvedPath && (resolvedPath === resolved || resolvedPath.startsWith(resolved) || resolved.startsWith(resolvedPath));\n\t\tif (isSameRoot) depth++;\n\t\telse parent = (0, path.dirname)(parent);\n\t}\n\tstate.symlinks.set(path$1, resolved);\n\treturn depth > 1;\n}\nfunction isRecursiveUsingRealPaths(resolved, state) {\n\treturn state.visited.includes(resolved + state.options.pathSeparator);\n}\n\n//#endregion\n//#region src/api/functions/invoke-callback.ts\nconst onlyCountsSync = (state) => {\n\treturn state.counts;\n};\nconst groupsSync = (state) => {\n\treturn state.groups;\n};\nconst defaultSync = (state) => {\n\treturn state.paths;\n};\nconst limitFilesSync = (state) => {\n\treturn state.paths.slice(0, state.options.maxFiles);\n};\nconst onlyCountsAsync = (state, error, callback$1) => {\n\treport(error, callback$1, state.counts, state.options.suppressErrors);\n\treturn null;\n};\nconst defaultAsync = (state, error, callback$1) => {\n\treport(error, callback$1, state.paths, state.options.suppressErrors);\n\treturn null;\n};\nconst limitFilesAsync = (state, error, callback$1) => {\n\treport(error, callback$1, state.paths.slice(0, state.options.maxFiles), state.options.suppressErrors);\n\treturn null;\n};\nconst groupsAsync = (state, error, callback$1) => {\n\treport(error, callback$1, state.groups, state.options.suppressErrors);\n\treturn null;\n};\nfunction report(error, callback$1, output, suppressErrors) {\n\tif (error && !suppressErrors) callback$1(error, output);\n\telse callback$1(null, output);\n}\nfunction build$1(options, isSynchronous) {\n\tconst { onlyCounts, group, maxFiles } = options;\n\tif (onlyCounts) return isSynchronous ? onlyCountsSync : onlyCountsAsync;\n\telse if (group) return isSynchronous ? groupsSync : groupsAsync;\n\telse if (maxFiles) return isSynchronous ? limitFilesSync : limitFilesAsync;\n\telse return isSynchronous ? defaultSync : defaultAsync;\n}\n\n//#endregion\n//#region src/api/functions/walk-directory.ts\nconst readdirOpts = { withFileTypes: true };\nconst walkAsync = (state, crawlPath, directoryPath, currentDepth, callback$1) => {\n\tstate.queue.enqueue();\n\tif (currentDepth < 0) return state.queue.dequeue(null, state);\n\tconst { fs: fs$1 } = state;\n\tstate.visited.push(crawlPath);\n\tstate.counts.directories++;\n\tfs$1.readdir(crawlPath || \".\", readdirOpts, (error, entries = []) => {\n\t\tcallback$1(entries, directoryPath, currentDepth);\n\t\tstate.queue.dequeue(state.options.suppressErrors ? null : error, state);\n\t});\n};\nconst walkSync = (state, crawlPath, directoryPath, currentDepth, callback$1) => {\n\tconst { fs: fs$1 } = state;\n\tif (currentDepth < 0) return;\n\tstate.visited.push(crawlPath);\n\tstate.counts.directories++;\n\tlet entries = [];\n\ttry {\n\t\tentries = fs$1.readdirSync(crawlPath || \".\", readdirOpts);\n\t} catch (e) {\n\t\tif (!state.options.suppressErrors) throw e;\n\t}\n\tcallback$1(entries, directoryPath, currentDepth);\n};\nfunction build(isSynchronous) {\n\treturn isSynchronous ? walkSync : walkAsync;\n}\n\n//#endregion\n//#region src/api/queue.ts\n/**\n* This is a custom stateless queue to track concurrent async fs calls.\n* It increments a counter whenever a call is queued and decrements it\n* as soon as it completes. When the counter hits 0, it calls onQueueEmpty.\n*/\nvar Queue = class {\n\tcount = 0;\n\tconstructor(onQueueEmpty) {\n\t\tthis.onQueueEmpty = onQueueEmpty;\n\t}\n\tenqueue() {\n\t\tthis.count++;\n\t\treturn this.count;\n\t}\n\tdequeue(error, output) {\n\t\tif (this.onQueueEmpty && (--this.count <= 0 || error)) {\n\t\t\tthis.onQueueEmpty(error, output);\n\t\t\tif (error) {\n\t\t\t\toutput.controller.abort();\n\t\t\t\tthis.onQueueEmpty = void 0;\n\t\t\t}\n\t\t}\n\t}\n};\n\n//#endregion\n//#region src/api/counter.ts\nvar Counter = class {\n\t_files = 0;\n\t_directories = 0;\n\tset files(num) {\n\t\tthis._files = num;\n\t}\n\tget files() {\n\t\treturn this._files;\n\t}\n\tset directories(num) {\n\t\tthis._directories = num;\n\t}\n\tget directories() {\n\t\treturn this._directories;\n\t}\n\t/**\n\t* @deprecated use `directories` instead\n\t*/\n\t/* c8 ignore next 3 */\n\tget dirs() {\n\t\treturn this._directories;\n\t}\n};\n\n//#endregion\n//#region src/api/aborter.ts\n/**\n* AbortController is not supported on Node 14 so we use this until we can drop\n* support for Node 14.\n*/\nvar Aborter = class {\n\taborted = false;\n\tabort() {\n\t\tthis.aborted = true;\n\t}\n};\n\n//#endregion\n//#region src/api/walker.ts\nvar Walker = class {\n\troot;\n\tisSynchronous;\n\tstate;\n\tjoinPath;\n\tpushDirectory;\n\tpushFile;\n\tgetArray;\n\tgroupFiles;\n\tresolveSymlink;\n\twalkDirectory;\n\tcallbackInvoker;\n\tconstructor(root, options, callback$1) {\n\t\tthis.isSynchronous = !callback$1;\n\t\tthis.callbackInvoker = build$1(options, this.isSynchronous);\n\t\tthis.root = normalizePath(root, options);\n\t\tthis.state = {\n\t\t\troot: isRootDirectory(this.root) ? this.root : this.root.slice(0, -1),\n\t\t\tpaths: [\"\"].slice(0, 0),\n\t\t\tgroups: [],\n\t\t\tcounts: new Counter(),\n\t\t\toptions,\n\t\t\tqueue: new Queue((error, state) => this.callbackInvoker(state, error, callback$1)),\n\t\t\tsymlinks: /* @__PURE__ */ new Map(),\n\t\t\tvisited: [\"\"].slice(0, 0),\n\t\t\tcontroller: new Aborter(),\n\t\t\tfs: options.fs || fs\n\t\t};\n\t\tthis.joinPath = build$7(this.root, options);\n\t\tthis.pushDirectory = build$6(this.root, options);\n\t\tthis.pushFile = build$5(options);\n\t\tthis.getArray = build$4(options);\n\t\tthis.groupFiles = build$3(options);\n\t\tthis.resolveSymlink = build$2(options, this.isSynchronous);\n\t\tthis.walkDirectory = build(this.isSynchronous);\n\t}\n\tstart() {\n\t\tthis.pushDirectory(this.root, this.state.paths, this.state.options.filters);\n\t\tthis.walkDirectory(this.state, this.root, this.root, this.state.options.maxDepth, this.walk);\n\t\treturn this.isSynchronous ? this.callbackInvoker(this.state, null) : null;\n\t}\n\twalk = (entries, directoryPath, depth) => {\n\t\tconst { paths, options: { filters, resolveSymlinks: resolveSymlinks$1, excludeSymlinks, exclude, maxFiles, signal, useRealPaths, pathSeparator }, controller } = this.state;\n\t\tif (controller.aborted || signal && signal.aborted || maxFiles && paths.length > maxFiles) return;\n\t\tconst files = this.getArray(this.state.paths);\n\t\tfor (let i = 0; i < entries.length; ++i) {\n\t\t\tconst entry = entries[i];\n\t\t\tif (entry.isFile() || entry.isSymbolicLink() && !resolveSymlinks$1 && !excludeSymlinks) {\n\t\t\t\tconst filename = this.joinPath(entry.name, directoryPath);\n\t\t\t\tthis.pushFile(filename, files, this.state.counts, filters);\n\t\t\t} else if (entry.isDirectory()) {\n\t\t\t\tlet path$1 = joinDirectoryPath(entry.name, directoryPath, this.state.options.pathSeparator);\n\t\t\t\tif (exclude && exclude(entry.name, path$1)) continue;\n\t\t\t\tthis.pushDirectory(path$1, paths, filters);\n\t\t\t\tthis.walkDirectory(this.state, path$1, path$1, depth - 1, this.walk);\n\t\t\t} else if (this.resolveSymlink && entry.isSymbolicLink()) {\n\t\t\t\tlet path$1 = joinPathWithBasePath(entry.name, directoryPath);\n\t\t\t\tthis.resolveSymlink(path$1, this.state, (stat, resolvedPath) => {\n\t\t\t\t\tif (stat.isDirectory()) {\n\t\t\t\t\t\tresolvedPath = normalizePath(resolvedPath, this.state.options);\n\t\t\t\t\t\tif (exclude && exclude(entry.name, useRealPaths ? resolvedPath : path$1 + pathSeparator)) return;\n\t\t\t\t\t\tthis.walkDirectory(this.state, resolvedPath, useRealPaths ? resolvedPath : path$1 + pathSeparator, depth - 1, this.walk);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolvedPath = useRealPaths ? resolvedPath : path$1;\n\t\t\t\t\t\tconst filename = (0, path.basename)(resolvedPath);\n\t\t\t\t\t\tconst directoryPath$1 = normalizePath((0, path.dirname)(resolvedPath), this.state.options);\n\t\t\t\t\t\tresolvedPath = this.joinPath(filename, directoryPath$1);\n\t\t\t\t\t\tthis.pushFile(resolvedPath, files, this.state.counts, filters);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthis.groupFiles(this.state.groups, directoryPath, files);\n\t};\n};\n\n//#endregion\n//#region src/api/async.ts\nfunction promise(root, options) {\n\treturn new Promise((resolve$1, reject) => {\n\t\tcallback(root, options, (err, output) => {\n\t\t\tif (err) return reject(err);\n\t\t\tresolve$1(output);\n\t\t});\n\t});\n}\nfunction callback(root, options, callback$1) {\n\tlet walker = new Walker(root, options, callback$1);\n\twalker.start();\n}\n\n//#endregion\n//#region src/api/sync.ts\nfunction sync(root, options) {\n\tconst walker = new Walker(root, options);\n\treturn walker.start();\n}\n\n//#endregion\n//#region src/builder/api-builder.ts\nvar APIBuilder = class {\n\tconstructor(root, options) {\n\t\tthis.root = root;\n\t\tthis.options = options;\n\t}\n\twithPromise() {\n\t\treturn promise(this.root, this.options);\n\t}\n\twithCallback(cb) {\n\t\tcallback(this.root, this.options, cb);\n\t}\n\tsync() {\n\t\treturn sync(this.root, this.options);\n\t}\n};\n\n//#endregion\n//#region src/builder/index.ts\nlet pm = null;\n/* c8 ignore next 6 */\ntry {\n\trequire.resolve(\"picomatch\");\n\tpm = require(\"picomatch\");\n} catch {}\nvar Builder = class {\n\tglobCache = {};\n\toptions = {\n\t\tmaxDepth: Infinity,\n\t\tsuppressErrors: true,\n\t\tpathSeparator: path.sep,\n\t\tfilters: []\n\t};\n\tglobFunction;\n\tconstructor(options) {\n\t\tthis.options = {\n\t\t\t...this.options,\n\t\t\t...options\n\t\t};\n\t\tthis.globFunction = this.options.globFunction;\n\t}\n\tgroup() {\n\t\tthis.options.group = true;\n\t\treturn this;\n\t}\n\twithPathSeparator(separator) {\n\t\tthis.options.pathSeparator = separator;\n\t\treturn this;\n\t}\n\twithBasePath() {\n\t\tthis.options.includeBasePath = true;\n\t\treturn this;\n\t}\n\twithRelativePaths() {\n\t\tthis.options.relativePaths = true;\n\t\treturn this;\n\t}\n\twithDirs() {\n\t\tthis.options.includeDirs = true;\n\t\treturn this;\n\t}\n\twithMaxDepth(depth) {\n\t\tthis.options.maxDepth = depth;\n\t\treturn this;\n\t}\n\twithMaxFiles(limit) {\n\t\tthis.options.maxFiles = limit;\n\t\treturn this;\n\t}\n\twithFullPaths() {\n\t\tthis.options.resolvePaths = true;\n\t\tthis.options.includeBasePath = true;\n\t\treturn this;\n\t}\n\twithErrors() {\n\t\tthis.options.suppressErrors = false;\n\t\treturn this;\n\t}\n\twithSymlinks({ resolvePaths = true } = {}) {\n\t\tthis.options.resolveSymlinks = true;\n\t\tthis.options.useRealPaths = resolvePaths;\n\t\treturn this.withFullPaths();\n\t}\n\twithAbortSignal(signal) {\n\t\tthis.options.signal = signal;\n\t\treturn this;\n\t}\n\tnormalize() {\n\t\tthis.options.normalizePath = true;\n\t\treturn this;\n\t}\n\tfilter(predicate) {\n\t\tthis.options.filters.push(predicate);\n\t\treturn this;\n\t}\n\tonlyDirs() {\n\t\tthis.options.excludeFiles = true;\n\t\tthis.options.includeDirs = true;\n\t\treturn this;\n\t}\n\texclude(predicate) {\n\t\tthis.options.exclude = predicate;\n\t\treturn this;\n\t}\n\tonlyCounts() {\n\t\tthis.options.onlyCounts = true;\n\t\treturn this;\n\t}\n\tcrawl(root) {\n\t\treturn new APIBuilder(root || \".\", this.options);\n\t}\n\twithGlobFunction(fn) {\n\t\tthis.globFunction = fn;\n\t\treturn this;\n\t}\n\t/**\n\t* @deprecated Pass options using the constructor instead:\n\t* ```ts\n\t* new fdir(options).crawl(\"/path/to/root\");\n\t* ```\n\t* This method will be removed in v7.0\n\t*/\n\t/* c8 ignore next 4 */\n\tcrawlWithOptions(root, options) {\n\t\tthis.options = {\n\t\t\t...this.options,\n\t\t\t...options\n\t\t};\n\t\treturn new APIBuilder(root || \".\", this.options);\n\t}\n\tglob(...patterns) {\n\t\tif (this.globFunction) return this.globWithOptions(patterns);\n\t\treturn this.globWithOptions(patterns, ...[{ dot: true }]);\n\t}\n\tglobWithOptions(patterns, ...options) {\n\t\tconst globFn = this.globFunction || pm;\n\t\t/* c8 ignore next 5 */\n\t\tif (!globFn) throw new Error(\"Please specify a glob function to use glob matching.\");\n\t\tvar isMatch = this.globCache[patterns.join(\"\\0\")];\n\t\tif (!isMatch) {\n\t\t\tisMatch = globFn(patterns, ...options);\n\t\t\tthis.globCache[patterns.join(\"\\0\")] = isMatch;\n\t\t}\n\t\tthis.options.filters.push((path$1) => isMatch(path$1));\n\t\treturn this;\n\t}\n};\n\n//#endregion\nexports.fdir = Builder;",
|
|
16
|
-
"const { fdir: Fdir } = require('fdir')\nconst path = require('path')\nconst picomatch = require('picomatch')\n\nclass Ls {\n constructor (directory = './', envFile = ['.env*'], excludeEnvFile = []) {\n this.ignore = ['node_modules/**', '.git/**']\n\n this.cwd = path.resolve(directory)\n this.envFile = envFile\n this.excludeEnvFile = excludeEnvFile\n }\n\n run () {\n return this._filepaths()\n }\n\n _filepaths () {\n const exclude = picomatch(this._exclude())\n const include = picomatch(this._patterns(), {\n ignore: this._exclude()\n })\n\n return new Fdir()\n .withRelativePaths()\n .exclude((dir, path) => exclude(path))\n .filter((path) => include(path))\n .crawl(this.cwd)\n .sync()\n }\n\n _patterns () {\n if (!Array.isArray(this.envFile)) {\n return [`**/${this.envFile}`]\n }\n\n return this.envFile.map(part => `**/${part}`)\n }\n\n _excludePatterns () {\n if (!Array.isArray(this.excludeEnvFile)) {\n return [`**/${this.excludeEnvFile}`]\n }\n\n return this.excludeEnvFile.map(part => `**/${part}`)\n }\n\n _exclude () {\n if (this._excludePatterns().length > 0) {\n return this.ignore.concat(this._excludePatterns())\n } else {\n return this.ignore\n }\n }\n}\n\nmodule.exports = Ls\n",
|
|
17
|
-
"const fs = require('fs')\n\nconst ENCODING = 'utf8'\n\nfunction readFileX (filepath, encoding = null) {\n if (!encoding) {\n encoding = ENCODING\n }\n\n return fs.readFileSync(filepath, encoding) // utf8 default so it returns a string\n}\n\nfunction writeFileX (filepath, str) {\n return fs.writeFileSync(filepath, str, ENCODING) // utf8 always\n}\n\nconst fsx = {\n chmodSync: fs.chmodSync,\n existsSync: fs.existsSync,\n readdirSync: fs.readdirSync,\n readFileSync: fs.readFileSync,\n writeFileSync: fs.writeFileSync,\n appendFileSync: fs.appendFileSync,\n\n // fsx special commands\n readFileX,\n writeFileX\n}\n\nmodule.exports = fsx\n",
|
|
18
|
-
"const fs = require('fs')\nconst path = require('path')\nconst os = require('os')\nconst crypto = require('crypto')\nconst packageJson = require('../package.json')\n\nconst version = packageJson.version\n\n// Array of tips to display randomly\nconst TIPS = [\n '🔐 encrypt with Dotenvx: https://dotenvx.com',\n '🔐 prevent committing .env to code: https://dotenvx.com/precommit',\n '🔐 prevent building .env in docker: https://dotenvx.com/prebuild',\n '🤖 agentic secret storage: https://dotenvx.com/as2',\n '⚡️ secrets for agents: https://dotenvx.com/as2',\n '🛡️ auth for agents: https://vestauth.com',\n '🛠️ run anywhere with `dotenvx run -- yourcommand`',\n '⚙️ specify custom .env file path with { path: \\'/custom/path/.env\\' }',\n '⚙️ enable debug logging with { debug: true }',\n '⚙️ override existing env vars with { override: true }',\n '⚙️ suppress all logs with { quiet: true }',\n '⚙️ write to custom object with { processEnv: myObject }',\n '⚙️ load multiple .env files with { path: [\\'.env.local\\', \\'.env\\'] }'\n]\n\n// Get a random tip from the tips array\nfunction _getRandomTip () {\n return TIPS[Math.floor(Math.random() * TIPS.length)]\n}\n\nfunction parseBoolean (value) {\n if (typeof value === 'string') {\n return !['false', '0', 'no', 'off', ''].includes(value.toLowerCase())\n }\n return Boolean(value)\n}\n\nfunction supportsAnsi () {\n return process.stdout.isTTY // && process.env.TERM !== 'dumb'\n}\n\nfunction dim (text) {\n return supportsAnsi() ? `\\x1b[2m${text}\\x1b[0m` : text\n}\n\nconst LINE = /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg\n\n// Parse src into an Object\nfunction parse (src) {\n const obj = {}\n\n // Convert buffer to string\n let lines = src.toString()\n\n // Convert line breaks to same format\n lines = lines.replace(/\\r\\n?/mg, '\\n')\n\n let match\n while ((match = LINE.exec(lines)) != null) {\n const key = match[1]\n\n // Default undefined or null to empty string\n let value = (match[2] || '')\n\n // Remove whitespace\n value = value.trim()\n\n // Check if double quoted\n const maybeQuote = value[0]\n\n // Remove surrounding quotes\n value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/mg, '$2')\n\n // Expand newlines if double quoted\n if (maybeQuote === '\"') {\n value = value.replace(/\\\\n/g, '\\n')\n value = value.replace(/\\\\r/g, '\\r')\n }\n\n // Add to object\n obj[key] = value\n }\n\n return obj\n}\n\nfunction _parseVault (options) {\n options = options || {}\n\n const vaultPath = _vaultPath(options)\n options.path = vaultPath // parse .env.vault\n const result = DotenvModule.configDotenv(options)\n if (!result.parsed) {\n const err = new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`)\n err.code = 'MISSING_DATA'\n throw err\n }\n\n // handle scenario for comma separated keys - for use with key rotation\n // example: DOTENV_KEY=\"dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=prod,dotenv://:key_7890@dotenvx.com/vault/.env.vault?environment=prod\"\n const keys = _dotenvKey(options).split(',')\n const length = keys.length\n\n let decrypted\n for (let i = 0; i < length; i++) {\n try {\n // Get full key\n const key = keys[i].trim()\n\n // Get instructions for decrypt\n const attrs = _instructions(result, key)\n\n // Decrypt\n decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key)\n\n break\n } catch (error) {\n // last key\n if (i + 1 >= length) {\n throw error\n }\n // try next key\n }\n }\n\n // Parse decrypted .env string\n return DotenvModule.parse(decrypted)\n}\n\nfunction _warn (message) {\n console.error(`[dotenv@${version}][WARN] ${message}`)\n}\n\nfunction _debug (message) {\n console.log(`[dotenv@${version}][DEBUG] ${message}`)\n}\n\nfunction _log (message) {\n console.log(`[dotenv@${version}] ${message}`)\n}\n\nfunction _dotenvKey (options) {\n // prioritize developer directly setting options.DOTENV_KEY\n if (options && options.DOTENV_KEY && options.DOTENV_KEY.length > 0) {\n return options.DOTENV_KEY\n }\n\n // secondary infra already contains a DOTENV_KEY environment variable\n if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) {\n return process.env.DOTENV_KEY\n }\n\n // fallback to empty string\n return ''\n}\n\nfunction _instructions (result, dotenvKey) {\n // Parse DOTENV_KEY. Format is a URI\n let uri\n try {\n uri = new URL(dotenvKey)\n } catch (error) {\n if (error.code === 'ERR_INVALID_URL') {\n const err = new Error('INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n throw error\n }\n\n // Get decrypt key\n const key = uri.password\n if (!key) {\n const err = new Error('INVALID_DOTENV_KEY: Missing key part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get environment\n const environment = uri.searchParams.get('environment')\n if (!environment) {\n const err = new Error('INVALID_DOTENV_KEY: Missing environment part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get ciphertext payload\n const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`\n const ciphertext = result.parsed[environmentKey] // DOTENV_VAULT_PRODUCTION\n if (!ciphertext) {\n const err = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`)\n err.code = 'NOT_FOUND_DOTENV_ENVIRONMENT'\n throw err\n }\n\n return { ciphertext, key }\n}\n\nfunction _vaultPath (options) {\n let possibleVaultPath = null\n\n if (options && options.path && options.path.length > 0) {\n if (Array.isArray(options.path)) {\n for (const filepath of options.path) {\n if (fs.existsSync(filepath)) {\n possibleVaultPath = filepath.endsWith('.vault') ? filepath : `${filepath}.vault`\n }\n }\n } else {\n possibleVaultPath = options.path.endsWith('.vault') ? options.path : `${options.path}.vault`\n }\n } else {\n possibleVaultPath = path.resolve(process.cwd(), '.env.vault')\n }\n\n if (fs.existsSync(possibleVaultPath)) {\n return possibleVaultPath\n }\n\n return null\n}\n\nfunction _resolveHome (envPath) {\n return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath\n}\n\nfunction _configVault (options) {\n const debug = parseBoolean(process.env.DOTENV_CONFIG_DEBUG || (options && options.debug))\n const quiet = parseBoolean(process.env.DOTENV_CONFIG_QUIET || (options && options.quiet))\n\n if (debug || !quiet) {\n _log('Loading env from encrypted .env.vault')\n }\n\n const parsed = DotenvModule._parseVault(options)\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsed, options)\n\n return { parsed }\n}\n\nfunction configDotenv (options) {\n const dotenvPath = path.resolve(process.cwd(), '.env')\n let encoding = 'utf8'\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n let debug = parseBoolean(processEnv.DOTENV_CONFIG_DEBUG || (options && options.debug))\n let quiet = parseBoolean(processEnv.DOTENV_CONFIG_QUIET || (options && options.quiet))\n\n if (options && options.encoding) {\n encoding = options.encoding\n } else {\n if (debug) {\n _debug('No encoding is specified. UTF-8 is used by default')\n }\n }\n\n let optionPaths = [dotenvPath] // default, look for .env\n if (options && options.path) {\n if (!Array.isArray(options.path)) {\n optionPaths = [_resolveHome(options.path)]\n } else {\n optionPaths = [] // reset default\n for (const filepath of options.path) {\n optionPaths.push(_resolveHome(filepath))\n }\n }\n }\n\n // Build the parsed data in a temporary object (because we need to return it). Once we have the final\n // parsed data, we will combine it with process.env (or options.processEnv if provided).\n let lastError\n const parsedAll = {}\n for (const path of optionPaths) {\n try {\n // Specifying an encoding returns a string instead of a buffer\n const parsed = DotenvModule.parse(fs.readFileSync(path, { encoding }))\n\n DotenvModule.populate(parsedAll, parsed, options)\n } catch (e) {\n if (debug) {\n _debug(`Failed to load ${path} ${e.message}`)\n }\n lastError = e\n }\n }\n\n const populated = DotenvModule.populate(processEnv, parsedAll, options)\n\n // handle user settings DOTENV_CONFIG_ options inside .env file(s)\n debug = parseBoolean(processEnv.DOTENV_CONFIG_DEBUG || debug)\n quiet = parseBoolean(processEnv.DOTENV_CONFIG_QUIET || quiet)\n\n if (debug || !quiet) {\n const keysCount = Object.keys(populated).length\n const shortPaths = []\n for (const filePath of optionPaths) {\n try {\n const relative = path.relative(process.cwd(), filePath)\n shortPaths.push(relative)\n } catch (e) {\n if (debug) {\n _debug(`Failed to load ${filePath} ${e.message}`)\n }\n lastError = e\n }\n }\n\n _log(`injecting env (${keysCount}) from ${shortPaths.join(',')} ${dim(`-- tip: ${_getRandomTip()}`)}`)\n }\n\n if (lastError) {\n return { parsed: parsedAll, error: lastError }\n } else {\n return { parsed: parsedAll }\n }\n}\n\n// Populates process.env from .env file\nfunction config (options) {\n // fallback to original dotenv if DOTENV_KEY is not set\n if (_dotenvKey(options).length === 0) {\n return DotenvModule.configDotenv(options)\n }\n\n const vaultPath = _vaultPath(options)\n\n // dotenvKey exists but .env.vault file does not exist\n if (!vaultPath) {\n _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`)\n\n return DotenvModule.configDotenv(options)\n }\n\n return DotenvModule._configVault(options)\n}\n\nfunction decrypt (encrypted, keyStr) {\n const key = Buffer.from(keyStr.slice(-64), 'hex')\n let ciphertext = Buffer.from(encrypted, 'base64')\n\n const nonce = ciphertext.subarray(0, 12)\n const authTag = ciphertext.subarray(-16)\n ciphertext = ciphertext.subarray(12, -16)\n\n try {\n const aesgcm = crypto.createDecipheriv('aes-256-gcm', key, nonce)\n aesgcm.setAuthTag(authTag)\n return `${aesgcm.update(ciphertext)}${aesgcm.final()}`\n } catch (error) {\n const isRange = error instanceof RangeError\n const invalidKeyLength = error.message === 'Invalid key length'\n const decryptionFailed = error.message === 'Unsupported state or unable to authenticate data'\n\n if (isRange || invalidKeyLength) {\n const err = new Error('INVALID_DOTENV_KEY: It must be 64 characters long (or more)')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n } else if (decryptionFailed) {\n const err = new Error('DECRYPTION_FAILED: Please check your DOTENV_KEY')\n err.code = 'DECRYPTION_FAILED'\n throw err\n } else {\n throw error\n }\n }\n}\n\n// Populate process.env with parsed values\nfunction populate (processEnv, parsed, options = {}) {\n const debug = Boolean(options && options.debug)\n const override = Boolean(options && options.override)\n const populated = {}\n\n if (typeof parsed !== 'object') {\n const err = new Error('OBJECT_REQUIRED: Please check the processEnv argument being passed to populate')\n err.code = 'OBJECT_REQUIRED'\n throw err\n }\n\n // Set process.env\n for (const key of Object.keys(parsed)) {\n if (Object.prototype.hasOwnProperty.call(processEnv, key)) {\n if (override === true) {\n processEnv[key] = parsed[key]\n populated[key] = parsed[key]\n }\n\n if (debug) {\n if (override === true) {\n _debug(`\"${key}\" is already defined and WAS overwritten`)\n } else {\n _debug(`\"${key}\" is already defined and was NOT overwritten`)\n }\n }\n } else {\n processEnv[key] = parsed[key]\n populated[key] = parsed[key]\n }\n }\n\n return populated\n}\n\nconst DotenvModule = {\n configDotenv,\n _configVault,\n _parseVault,\n config,\n decrypt,\n parse,\n populate\n}\n\nmodule.exports.configDotenv = DotenvModule.configDotenv\nmodule.exports._configVault = DotenvModule._configVault\nmodule.exports._parseVault = DotenvModule._parseVault\nmodule.exports.config = DotenvModule.config\nmodule.exports.decrypt = DotenvModule.decrypt\nmodule.exports.parse = DotenvModule.parse\nmodule.exports.populate = DotenvModule.populate\n\nmodule.exports = DotenvModule\n",
|
|
19
|
-
"function parseEncryptionKeyFromDotenvKey (dotenvKey) {\n // Parse DOTENV_KEY. Format is a URI\n let uri\n try {\n uri = new URL(dotenvKey)\n } catch (e) {\n throw new Error('INVALID_DOTENV_KEY: Incomplete format. It should be a dotenv uri. (dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development)')\n }\n\n // Get decrypt key\n const key = uri.password\n if (!key) {\n throw new Error('INVALID_DOTENV_KEY: Missing key part')\n }\n\n return Buffer.from(key.slice(-64), 'hex')\n}\n\nmodule.exports = parseEncryptionKeyFromDotenvKey\n",
|
|
20
|
-
"const dotenv = require('dotenv')\n\nconst parseEncryptionKeyFromDotenvKey = require('./parseEncryptionKeyFromDotenvKey')\n\nfunction decrypt (ciphertext, dotenvKey) {\n const key = parseEncryptionKeyFromDotenvKey(dotenvKey)\n\n try {\n return dotenv.decrypt(ciphertext, key)\n } catch (e) {\n if (e.code === 'DECRYPTION_FAILED') {\n const error = new Error('[DECRYPTION_FAILED] Unable to decrypt .env.vault with DOTENV_KEY.')\n error.code = 'DECRYPTION_FAILED'\n error.help = '[DECRYPTION_FAILED] Run with debug flag [dotenvx run --debug -- yourcommand] or manually run [echo $DOTENV_KEY] to compare it to the one in .env.keys.'\n error.debug = `[DECRYPTION_FAILED] DOTENV_KEY is ${dotenvKey}`\n throw error\n }\n\n if (e.code === 'ERR_CRYPTO_INVALID_AUTH_TAG') {\n const error = new Error('[INVALID_CIPHERTEXT] Unable to decrypt what appears to be invalid ciphertext.')\n error.code = 'INVALID_CIPHERTEXT'\n error.help = '[INVALID_CIPHERTEXT] Run with debug flag [dotenvx run --debug -- yourcommand] or manually check .env.vault.'\n error.debug = `[INVALID_CIPHERTEXT] ciphertext is '${ciphertext}'`\n throw error\n }\n\n throw e\n }\n}\n\nmodule.exports = decrypt\n",
|
|
21
|
-
"\"use strict\";\n/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wrapCipher = exports.Hash = exports.nextTick = exports.isLE = void 0;\nexports.isBytes = isBytes;\nexports.abool = abool;\nexports.anumber = anumber;\nexports.abytes = abytes;\nexports.ahash = ahash;\nexports.aexists = aexists;\nexports.aoutput = aoutput;\nexports.u8 = u8;\nexports.u32 = u32;\nexports.clean = clean;\nexports.createView = createView;\nexports.bytesToHex = bytesToHex;\nexports.hexToBytes = hexToBytes;\nexports.hexToNumber = hexToNumber;\nexports.bytesToNumberBE = bytesToNumberBE;\nexports.numberToBytesBE = numberToBytesBE;\nexports.utf8ToBytes = utf8ToBytes;\nexports.bytesToUtf8 = bytesToUtf8;\nexports.toBytes = toBytes;\nexports.overlapBytes = overlapBytes;\nexports.complexOverlapBytes = complexOverlapBytes;\nexports.concatBytes = concatBytes;\nexports.checkOpts = checkOpts;\nexports.equalBytes = equalBytes;\nexports.getOutput = getOutput;\nexports.setBigUint64 = setBigUint64;\nexports.u64Lengths = u64Lengths;\nexports.isAligned32 = isAligned32;\nexports.copyBytes = copyBytes;\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nfunction isBytes(a) {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is boolean. */\nfunction abool(b) {\n if (typeof b !== 'boolean')\n throw new Error(`boolean expected, not ${b}`);\n}\n/** Asserts something is positive integer. */\nfunction anumber(n) {\n if (!Number.isSafeInteger(n) || n < 0)\n throw new Error('positive integer expected, got ' + n);\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b, ...lengths) {\n if (!isBytes(b))\n throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n/**\n * Asserts something is hash\n * TODO: remove\n * @deprecated\n */\nfunction ahash(h) {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n/** Asserts a hash instance has not been destroyed / finished */\nfunction aexists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\n/** Asserts output is properly-sized byte array */\nfunction aoutput(out, instance) {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n/** Cast u8 / u16 / u32 to u8. */\nfunction u8(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Cast u8 / u16 / u32 to u32. */\nfunction u32(arr) {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nfunction clean(...arrays) {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n/** Create DataView of an array for easy byte-level manipulation. */\nfunction createView(arr) {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexports.isLE = (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nfunction bytesToHex(bytes) {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin)\n return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction asciiToBase16(ch) {\n if (ch >= asciis._0 && ch <= asciis._9)\n return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F)\n return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f)\n return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nfunction hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin)\n return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n// Used in micro\nfunction hexToNumber(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n return BigInt(hex === '' ? '0' : '0x' + hex); // Big Endian\n}\n// Used in ff1\n// BE: Big Endian, LE: Little Endian\nfunction bytesToNumberBE(bytes) {\n return hexToNumber(bytesToHex(bytes));\n}\n// Used in micro, ff1\nfunction numberToBytesBE(n, len) {\n return hexToBytes(n.toString(16).padStart(len * 2, '0'));\n}\n// TODO: remove\n// There is no setImmediate in browser and setTimeout is slow.\n// call of async fn will return Promise, which will be fullfiled only on\n// next scheduler queue processing step and this is exactly what we need.\nconst nextTick = async () => { };\nexports.nextTick = nextTick;\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nfunction utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(new Uint8Array([97, 98, 99])) // 'abc'\n */\nfunction bytesToUtf8(bytes) {\n return new TextDecoder().decode(bytes);\n}\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nfunction toBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n else if (isBytes(data))\n data = copyBytes(data);\n else\n throw new Error('Uint8Array expected, got ' + typeof data);\n return data;\n}\n/**\n * Checks if two U8A use same underlying buffer and overlaps.\n * This is invalid and can corrupt data.\n */\nfunction overlapBytes(a, b) {\n return (a.buffer === b.buffer && // best we can do, may fail with an obscure Proxy\n a.byteOffset < b.byteOffset + b.byteLength && // a starts before b end\n b.byteOffset < a.byteOffset + a.byteLength // b starts before a end\n );\n}\n/**\n * If input and output overlap and input starts before output, we will overwrite end of input before\n * we start processing it, so this is not supported for most ciphers (except chacha/salse, which designed with this)\n */\nfunction complexOverlapBytes(input, output) {\n // This is very cursed. It works somehow, but I'm completely unsure,\n // reasoning about overlapping aligned windows is very hard.\n if (overlapBytes(input, output) && input.byteOffset < output.byteOffset)\n throw new Error('complex overlap of input and output is not supported');\n}\n/**\n * Copies several Uint8Arrays into one.\n */\nfunction concatBytes(...arrays) {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\nfunction checkOpts(defaults, opts) {\n if (opts == null || typeof opts !== 'object')\n throw new Error('options must be defined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\n/** Compares 2 uint8array-s in kinda constant time. */\nfunction equalBytes(a, b) {\n if (a.length !== b.length)\n return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++)\n diff |= a[i] ^ b[i];\n return diff === 0;\n}\n// TODO: remove\n/** For runtime check if class implements interface. */\nclass Hash {\n}\nexports.Hash = Hash;\n/**\n * Wraps a cipher: validates args, ensures encrypt() can only be called once.\n * @__NO_SIDE_EFFECTS__\n */\nconst wrapCipher = (params, constructor) => {\n function wrappedCipher(key, ...args) {\n // Validate key\n abytes(key);\n // Big-Endian hardware is rare. Just in case someone still decides to run ciphers:\n if (!exports.isLE)\n throw new Error('Non little-endian hardware is not yet supported');\n // Validate nonce if nonceLength is present\n if (params.nonceLength !== undefined) {\n const nonce = args[0];\n if (!nonce)\n throw new Error('nonce / iv required');\n if (params.varSizeNonce)\n abytes(nonce);\n else\n abytes(nonce, params.nonceLength);\n }\n // Validate AAD if tagLength present\n const tagl = params.tagLength;\n if (tagl && args[1] !== undefined) {\n abytes(args[1]);\n }\n const cipher = constructor(key, ...args);\n const checkOutput = (fnLength, output) => {\n if (output !== undefined) {\n if (fnLength !== 2)\n throw new Error('cipher output not supported');\n abytes(output);\n }\n };\n // Create wrapped cipher with validation and single-use encryption\n let called = false;\n const wrCipher = {\n encrypt(data, output) {\n if (called)\n throw new Error('cannot encrypt() twice with same key + nonce');\n called = true;\n abytes(data);\n checkOutput(cipher.encrypt.length, output);\n return cipher.encrypt(data, output);\n },\n decrypt(data, output) {\n abytes(data);\n if (tagl && data.length < tagl)\n throw new Error('invalid ciphertext length: smaller than tagLength=' + tagl);\n checkOutput(cipher.decrypt.length, output);\n return cipher.decrypt(data, output);\n },\n };\n return wrCipher;\n }\n Object.assign(wrappedCipher, params);\n return wrappedCipher;\n};\nexports.wrapCipher = wrapCipher;\n/**\n * By default, returns u8a of length.\n * When out is available, it checks it for validity and uses it.\n */\nfunction getOutput(expectedLength, out, onlyAligned = true) {\n if (out === undefined)\n return new Uint8Array(expectedLength);\n if (out.length !== expectedLength)\n throw new Error('invalid output length, expected ' + expectedLength + ', got: ' + out.length);\n if (onlyAligned && !isAligned32(out))\n throw new Error('invalid output, must be aligned');\n return out;\n}\n/** Polyfill for Safari 14. */\nfunction setBigUint64(view, byteOffset, value, isLE) {\n if (typeof view.setBigUint64 === 'function')\n return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\nfunction u64Lengths(dataLength, aadLength, isLE) {\n abool(isLE);\n const num = new Uint8Array(16);\n const view = createView(num);\n setBigUint64(view, 0, BigInt(aadLength), isLE);\n setBigUint64(view, 8, BigInt(dataLength), isLE);\n return num;\n}\n// Is byte array aligned to 4 byte offset (u32)?\nfunction isAligned32(bytes) {\n return bytes.byteOffset % 4 === 0;\n}\n// copy bytes to new u8a (aligned). Because Buffer.slice is broken.\nfunction copyBytes(bytes) {\n return Uint8Array.from(bytes);\n}\n//# sourceMappingURL=utils.js.map",
|
|
22
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AEAD_TAG_LENGTH = exports.XCHACHA20_NONCE_LENGTH = exports.CURVE25519_PUBLIC_KEY_SIZE = exports.ETH_PUBLIC_KEY_SIZE = exports.UNCOMPRESSED_PUBLIC_KEY_SIZE = exports.COMPRESSED_PUBLIC_KEY_SIZE = exports.SECRET_KEY_LENGTH = void 0;\n// elliptic\nexports.SECRET_KEY_LENGTH = 32;\nexports.COMPRESSED_PUBLIC_KEY_SIZE = 33;\nexports.UNCOMPRESSED_PUBLIC_KEY_SIZE = 65;\nexports.ETH_PUBLIC_KEY_SIZE = 64;\nexports.CURVE25519_PUBLIC_KEY_SIZE = 32;\n// symmetric\nexports.XCHACHA20_NONCE_LENGTH = 24;\nexports.AEAD_TAG_LENGTH = 16;\n",
|
|
23
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ephemeralKeySize = exports.symmetricNonceLength = exports.symmetricAlgorithm = exports.isHkdfKeyCompressed = exports.isEphemeralKeyCompressed = exports.ellipticCurve = exports.ECIES_CONFIG = exports.Config = void 0;\nvar consts_js_1 = require(\"./consts.js\");\nvar Config = /** @class */ (function () {\n function Config() {\n this.ellipticCurve = \"secp256k1\";\n this.isEphemeralKeyCompressed = false; // secp256k1 only\n this.isHkdfKeyCompressed = false; // secp256k1 only\n this.symmetricAlgorithm = \"aes-256-gcm\";\n this.symmetricNonceLength = 16; // aes-256-gcm only\n }\n Object.defineProperty(Config.prototype, \"ephemeralKeySize\", {\n get: function () {\n var mapping = {\n secp256k1: this.isEphemeralKeyCompressed\n ? consts_js_1.COMPRESSED_PUBLIC_KEY_SIZE\n : consts_js_1.UNCOMPRESSED_PUBLIC_KEY_SIZE,\n x25519: consts_js_1.CURVE25519_PUBLIC_KEY_SIZE,\n ed25519: consts_js_1.CURVE25519_PUBLIC_KEY_SIZE,\n };\n /* v8 ignore else -- @preserve */\n if (this.ellipticCurve in mapping) {\n return mapping[this.ellipticCurve];\n }\n else {\n throw new Error(\"Not implemented\");\n }\n },\n enumerable: false,\n configurable: true\n });\n return Config;\n}());\nexports.Config = Config;\nexports.ECIES_CONFIG = new Config();\n// TODO: remove these after 0.5.0\n/** @deprecated - use individual attribute instead */\nvar ellipticCurve = function () { return exports.ECIES_CONFIG.ellipticCurve; };\nexports.ellipticCurve = ellipticCurve;\n/** @deprecated - use individual attribute instead */\nvar isEphemeralKeyCompressed = function () { return exports.ECIES_CONFIG.isEphemeralKeyCompressed; };\nexports.isEphemeralKeyCompressed = isEphemeralKeyCompressed;\n/** @deprecated - use individual attribute instead */\nvar isHkdfKeyCompressed = function () { return exports.ECIES_CONFIG.isHkdfKeyCompressed; };\nexports.isHkdfKeyCompressed = isHkdfKeyCompressed;\n/** @deprecated - use individual attribute instead */\nvar symmetricAlgorithm = function () { return exports.ECIES_CONFIG.symmetricAlgorithm; };\nexports.symmetricAlgorithm = symmetricAlgorithm;\n/** @deprecated - use individual attribute instead */\nvar symmetricNonceLength = function () { return exports.ECIES_CONFIG.symmetricNonceLength; };\nexports.symmetricNonceLength = symmetricNonceLength;\n/** @deprecated - use individual attribute instead */\nvar ephemeralKeySize = function () { return exports.ECIES_CONFIG.ephemeralKeySize; };\nexports.ephemeralKeySize = ephemeralKeySize;\n",
|
|
24
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.crypto = void 0;\n/**\n * Internal webcrypto alias.\n * We prefer WebCrypto aka globalThis.crypto, which exists in node.js 16+.\n * Falls back to Node.js built-in crypto for Node.js <=v14.\n * See utils.ts for details.\n * @module\n */\n// @ts-ignore\nconst nc = require(\"node:crypto\");\nexports.crypto = nc && typeof nc === 'object' && 'webcrypto' in nc\n ? nc.webcrypto\n : nc && typeof nc === 'object' && 'randomBytes' in nc\n ? nc\n : undefined;\n//# sourceMappingURL=cryptoNode.js.map",
|
|
25
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.gcm = exports.ctr = exports.cbc = exports.utils = void 0;\nexports.randomBytes = randomBytes;\nexports.getWebcryptoSubtle = getWebcryptoSubtle;\nexports.managedNonce = managedNonce;\n/**\n * WebCrypto-based AES gcm/ctr/cbc, `managedNonce` and `randomBytes`.\n * We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n * node.js versions earlier than v19 don't declare it in global scope.\n * For node.js, package.js on#exports field mapping rewrites import\n * from `crypto` to `cryptoNode`, which imports native module.\n * Makes the utils un-importable in browsers without a bundler.\n * Once node.js 18 is deprecated, we can just drop the import.\n * @module\n */\n// Use full path so that Node.js can rewrite it to `cryptoNode.js`.\nconst crypto_1 = require(\"@noble/ciphers/crypto\");\nconst utils_ts_1 = require(\"./utils.js\");\n/**\n * Secure PRNG. Uses `crypto.getRandomValues`, which defers to OS.\n */\nfunction randomBytes(bytesLength = 32) {\n if (crypto_1.crypto && typeof crypto_1.crypto.getRandomValues === 'function') {\n return crypto_1.crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto_1.crypto && typeof crypto_1.crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto_1.crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\nfunction getWebcryptoSubtle() {\n if (crypto_1.crypto && typeof crypto_1.crypto.subtle === 'object' && crypto_1.crypto.subtle != null)\n return crypto_1.crypto.subtle;\n throw new Error('crypto.subtle must be defined');\n}\n/**\n * Uses CSPRG for nonce, nonce injected in ciphertext.\n * @example\n * const gcm = managedNonce(aes.gcm);\n * const ciphr = gcm(key).encrypt(data);\n * const plain = gcm(key).decrypt(ciph);\n */\nfunction managedNonce(fn) {\n const { nonceLength } = fn;\n (0, utils_ts_1.anumber)(nonceLength);\n return ((key, ...args) => ({\n encrypt(plaintext, ...argsEnc) {\n const nonce = randomBytes(nonceLength);\n const ciphertext = fn(key, nonce, ...args).encrypt(plaintext, ...argsEnc);\n const out = (0, utils_ts_1.concatBytes)(nonce, ciphertext);\n ciphertext.fill(0);\n return out;\n },\n decrypt(ciphertext, ...argsDec) {\n const nonce = ciphertext.subarray(0, nonceLength);\n const data = ciphertext.subarray(nonceLength);\n return fn(key, nonce, ...args).decrypt(data, ...argsDec);\n },\n }));\n}\n// Overridable\n// @TODO\nexports.utils = {\n async encrypt(key, keyParams, cryptParams, plaintext) {\n const cr = getWebcryptoSubtle();\n const iKey = await cr.importKey('raw', key, keyParams, true, ['encrypt']);\n const ciphertext = await cr.encrypt(cryptParams, iKey, plaintext);\n return new Uint8Array(ciphertext);\n },\n async decrypt(key, keyParams, cryptParams, ciphertext) {\n const cr = getWebcryptoSubtle();\n const iKey = await cr.importKey('raw', key, keyParams, true, ['decrypt']);\n const plaintext = await cr.decrypt(cryptParams, iKey, ciphertext);\n return new Uint8Array(plaintext);\n },\n};\nconst mode = {\n CBC: 'AES-CBC',\n CTR: 'AES-CTR',\n GCM: 'AES-GCM',\n};\nfunction getCryptParams(algo, nonce, AAD) {\n if (algo === mode.CBC)\n return { name: mode.CBC, iv: nonce };\n if (algo === mode.CTR)\n return { name: mode.CTR, counter: nonce, length: 64 };\n if (algo === mode.GCM) {\n if (AAD)\n return { name: mode.GCM, iv: nonce, additionalData: AAD };\n else\n return { name: mode.GCM, iv: nonce };\n }\n throw new Error('unknown aes block mode');\n}\nfunction generate(algo) {\n return (key, nonce, AAD) => {\n (0, utils_ts_1.abytes)(key);\n (0, utils_ts_1.abytes)(nonce);\n const keyParams = { name: algo, length: key.length * 8 };\n const cryptParams = getCryptParams(algo, nonce, AAD);\n let consumed = false;\n return {\n // keyLength,\n encrypt(plaintext) {\n (0, utils_ts_1.abytes)(plaintext);\n if (consumed)\n throw new Error('Cannot encrypt() twice with same key / nonce');\n consumed = true;\n return exports.utils.encrypt(key, keyParams, cryptParams, plaintext);\n },\n decrypt(ciphertext) {\n (0, utils_ts_1.abytes)(ciphertext);\n return exports.utils.decrypt(key, keyParams, cryptParams, ciphertext);\n },\n };\n };\n}\n/** AES-CBC, native webcrypto version */\nexports.cbc = (() => generate(mode.CBC))();\n/** AES-CTR, native webcrypto version */\nexports.ctr = (() => generate(mode.CTR))();\n/** AES-GCM, native webcrypto version */\nexports.gcm = \n/* @__PURE__ */ (() => generate(mode.GCM))();\n// // Type tests\n// import { siv, gcm, ctr, ecb, cbc } from '../aes.ts';\n// import { xsalsa20poly1305 } from '../salsa.ts';\n// import { chacha20poly1305, xchacha20poly1305 } from '../chacha.ts';\n// const wsiv = managedNonce(siv);\n// const wgcm = managedNonce(gcm);\n// const wctr = managedNonce(ctr);\n// const wcbc = managedNonce(cbc);\n// const wsalsapoly = managedNonce(xsalsa20poly1305);\n// const wchacha = managedNonce(chacha20poly1305);\n// const wxchacha = managedNonce(xchacha20poly1305);\n// // should fail\n// const wcbc2 = managedNonce(managedNonce(cbc));\n// const wctr = managedNonce(ctr);\n//# sourceMappingURL=webcrypto.js.map",
|
|
26
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.crypto = void 0;\n/**\n * Internal webcrypto alias.\n * We prefer WebCrypto aka globalThis.crypto, which exists in node.js 16+.\n * Falls back to Node.js built-in crypto for Node.js <=v14.\n * See utils.ts for details.\n * @module\n */\n// @ts-ignore\nconst nc = require(\"node:crypto\");\nexports.crypto = nc && typeof nc === 'object' && 'webcrypto' in nc\n ? nc.webcrypto\n : nc && typeof nc === 'object' && 'randomBytes' in nc\n ? nc\n : undefined;\n//# sourceMappingURL=cryptoNode.js.map",
|
|
27
|
-
"\"use strict\";\n/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wrapXOFConstructorWithOpts = exports.wrapConstructorWithOpts = exports.wrapConstructor = exports.Hash = exports.nextTick = exports.swap32IfBE = exports.byteSwapIfBE = exports.swap8IfBE = exports.isLE = void 0;\nexports.isBytes = isBytes;\nexports.anumber = anumber;\nexports.abytes = abytes;\nexports.ahash = ahash;\nexports.aexists = aexists;\nexports.aoutput = aoutput;\nexports.u8 = u8;\nexports.u32 = u32;\nexports.clean = clean;\nexports.createView = createView;\nexports.rotr = rotr;\nexports.rotl = rotl;\nexports.byteSwap = byteSwap;\nexports.byteSwap32 = byteSwap32;\nexports.bytesToHex = bytesToHex;\nexports.hexToBytes = hexToBytes;\nexports.asyncLoop = asyncLoop;\nexports.utf8ToBytes = utf8ToBytes;\nexports.bytesToUtf8 = bytesToUtf8;\nexports.toBytes = toBytes;\nexports.kdfInputToBytes = kdfInputToBytes;\nexports.concatBytes = concatBytes;\nexports.checkOpts = checkOpts;\nexports.createHasher = createHasher;\nexports.createOptHasher = createOptHasher;\nexports.createXOFer = createXOFer;\nexports.randomBytes = randomBytes;\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nconst crypto_1 = require(\"@noble/hashes/crypto\");\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nfunction isBytes(a) {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is positive integer. */\nfunction anumber(n) {\n if (!Number.isSafeInteger(n) || n < 0)\n throw new Error('positive integer expected, got ' + n);\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b, ...lengths) {\n if (!isBytes(b))\n throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n/** Asserts something is hash */\nfunction ahash(h) {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n/** Asserts a hash instance has not been destroyed / finished */\nfunction aexists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\n/** Asserts output is properly-sized byte array */\nfunction aoutput(out, instance) {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n/** Cast u8 / u16 / u32 to u8. */\nfunction u8(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Cast u8 / u16 / u32 to u32. */\nfunction u32(arr) {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nfunction clean(...arrays) {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n/** Create DataView of an array for easy byte-level manipulation. */\nfunction createView(arr) {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** The rotate right (circular right shift) operation for uint32 */\nfunction rotr(word, shift) {\n return (word << (32 - shift)) | (word >>> shift);\n}\n/** The rotate left (circular left shift) operation for uint32 */\nfunction rotl(word, shift) {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexports.isLE = (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n/** The byte swap operation for uint32 */\nfunction byteSwap(word) {\n return (((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff));\n}\n/** Conditionally byte swap if on a big-endian platform */\nexports.swap8IfBE = exports.isLE\n ? (n) => n\n : (n) => byteSwap(n);\n/** @deprecated */\nexports.byteSwapIfBE = exports.swap8IfBE;\n/** In place byte swap for Uint32Array */\nfunction byteSwap32(arr) {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\nexports.swap32IfBE = exports.isLE\n ? (u) => u\n : byteSwap32;\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nfunction bytesToHex(bytes) {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin)\n return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction asciiToBase16(ch) {\n if (ch >= asciis._0 && ch <= asciis._9)\n return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F)\n return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f)\n return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nfunction hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin)\n return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nconst nextTick = async () => { };\nexports.nextTick = nextTick;\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nasync function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await (0, exports.nextTick)();\n ts += diff;\n }\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nfunction utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nfunction bytesToUtf8(bytes) {\n return new TextDecoder().decode(bytes);\n}\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nfunction toBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nfunction kdfInputToBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n/** Copies several Uint8Arrays into one. */\nfunction concatBytes(...arrays) {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\nfunction checkOpts(defaults, opts) {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\n/** For runtime check if class implements interface */\nclass Hash {\n}\nexports.Hash = Hash;\n/** Wraps hash function, creating an interface on top of it */\nfunction createHasher(hashCons) {\n const hashC = (msg) => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\nfunction createOptHasher(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nfunction createXOFer(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexports.wrapConstructor = createHasher;\nexports.wrapConstructorWithOpts = createOptHasher;\nexports.wrapXOFConstructorWithOpts = createXOFer;\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nfunction randomBytes(bytesLength = 32) {\n if (crypto_1.crypto && typeof crypto_1.crypto.getRandomValues === 'function') {\n return crypto_1.crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto_1.crypto && typeof crypto_1.crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto_1.crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n//# sourceMappingURL=utils.js.map",
|
|
28
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SHA512_IV = exports.SHA384_IV = exports.SHA224_IV = exports.SHA256_IV = exports.HashMD = void 0;\nexports.setBigUint64 = setBigUint64;\nexports.Chi = Chi;\nexports.Maj = Maj;\n/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nconst utils_ts_1 = require(\"./utils.js\");\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nfunction setBigUint64(view, byteOffset, value, isLE) {\n if (typeof view.setBigUint64 === 'function')\n return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\n/** Choice: a ? b : c */\nfunction Chi(a, b, c) {\n return (a & b) ^ (~a & c);\n}\n/** Majority function, true if any two inputs is true. */\nfunction Maj(a, b, c) {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nclass HashMD extends utils_ts_1.Hash {\n constructor(blockLen, outputLen, padOffset, isLE) {\n super();\n this.finished = false;\n this.length = 0;\n this.pos = 0;\n this.destroyed = false;\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = (0, utils_ts_1.createView)(this.buffer);\n }\n update(data) {\n (0, utils_ts_1.aexists)(this);\n data = (0, utils_ts_1.toBytes)(data);\n (0, utils_ts_1.abytes)(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = (0, utils_ts_1.createView)(data);\n for (; blockLen <= len - pos; pos += blockLen)\n this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out) {\n (0, utils_ts_1.aexists)(this);\n (0, utils_ts_1.aoutput)(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n (0, utils_ts_1.clean)(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++)\n buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = (0, utils_ts_1.createView)(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n if (len % 4)\n throw new Error('_sha2: outputLen should be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length)\n throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++)\n oview.setUint32(4 * i, state[i], isLE);\n }\n digest() {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to) {\n to || (to = new this.constructor());\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen)\n to.buffer.set(buffer);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n}\nexports.HashMD = HashMD;\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexports.SHA256_IV = Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexports.SHA224_IV = Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexports.SHA384_IV = Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexports.SHA512_IV = Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n//# sourceMappingURL=_md.js.map",
|
|
29
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toBig = exports.shrSL = exports.shrSH = exports.rotrSL = exports.rotrSH = exports.rotrBL = exports.rotrBH = exports.rotr32L = exports.rotr32H = exports.rotlSL = exports.rotlSH = exports.rotlBL = exports.rotlBH = exports.add5L = exports.add5H = exports.add4L = exports.add4H = exports.add3L = exports.add3H = void 0;\nexports.add = add;\nexports.fromBig = fromBig;\nexports.split = split;\n/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\nfunction fromBig(n, le = false) {\n if (le)\n return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\nfunction split(lst, le = false) {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\nexports.toBig = toBig;\n// for Shift in [0, 32)\nconst shrSH = (h, _l, s) => h >>> s;\nexports.shrSH = shrSH;\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\nexports.shrSL = shrSL;\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\nexports.rotrSH = rotrSH;\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\nexports.rotrSL = rotrSL;\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\nexports.rotrBH = rotrBH;\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\nexports.rotrBL = rotrBL;\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h, l) => l;\nexports.rotr32H = rotr32H;\nconst rotr32L = (h, _l) => h;\nexports.rotr32L = rotr32L;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));\nexports.rotlSH = rotlSH;\nconst rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));\nexports.rotlSL = rotlSL;\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));\nexports.rotlBH = rotlBH;\nconst rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));\nexports.rotlBL = rotlBL;\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah, Al, Bh, Bl) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nexports.add3L = add3L;\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nexports.add3H = add3H;\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nexports.add4L = add4L;\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nexports.add4H = add4H;\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nexports.add5L = add5L;\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\nexports.add5H = add5H;\n// prettier-ignore\nconst u64 = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexports.default = u64;\n//# sourceMappingURL=_u64.js.map",
|
|
30
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sha512_224 = exports.sha512_256 = exports.sha384 = exports.sha512 = exports.sha224 = exports.sha256 = exports.SHA512_256 = exports.SHA512_224 = exports.SHA384 = exports.SHA512 = exports.SHA224 = exports.SHA256 = void 0;\n/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nconst _md_ts_1 = require(\"./_md.js\");\nconst u64 = require(\"./_u64.js\");\nconst utils_ts_1 = require(\"./utils.js\");\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\nclass SHA256 extends _md_ts_1.HashMD {\n constructor(outputLen = 32) {\n super(64, outputLen, 8, false);\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n this.A = _md_ts_1.SHA256_IV[0] | 0;\n this.B = _md_ts_1.SHA256_IV[1] | 0;\n this.C = _md_ts_1.SHA256_IV[2] | 0;\n this.D = _md_ts_1.SHA256_IV[3] | 0;\n this.E = _md_ts_1.SHA256_IV[4] | 0;\n this.F = _md_ts_1.SHA256_IV[5] | 0;\n this.G = _md_ts_1.SHA256_IV[6] | 0;\n this.H = _md_ts_1.SHA256_IV[7] | 0;\n }\n get() {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n set(A, B, C, D, E, F, G, H) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4)\n SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = (0, utils_ts_1.rotr)(W15, 7) ^ (0, utils_ts_1.rotr)(W15, 18) ^ (W15 >>> 3);\n const s1 = (0, utils_ts_1.rotr)(W2, 17) ^ (0, utils_ts_1.rotr)(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = (0, utils_ts_1.rotr)(E, 6) ^ (0, utils_ts_1.rotr)(E, 11) ^ (0, utils_ts_1.rotr)(E, 25);\n const T1 = (H + sigma1 + (0, _md_ts_1.Chi)(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = (0, utils_ts_1.rotr)(A, 2) ^ (0, utils_ts_1.rotr)(A, 13) ^ (0, utils_ts_1.rotr)(A, 22);\n const T2 = (sigma0 + (0, _md_ts_1.Maj)(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n roundClean() {\n (0, utils_ts_1.clean)(SHA256_W);\n }\n destroy() {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n (0, utils_ts_1.clean)(this.buffer);\n }\n}\nexports.SHA256 = SHA256;\nclass SHA224 extends SHA256 {\n constructor() {\n super(28);\n this.A = _md_ts_1.SHA224_IV[0] | 0;\n this.B = _md_ts_1.SHA224_IV[1] | 0;\n this.C = _md_ts_1.SHA224_IV[2] | 0;\n this.D = _md_ts_1.SHA224_IV[3] | 0;\n this.E = _md_ts_1.SHA224_IV[4] | 0;\n this.F = _md_ts_1.SHA224_IV[5] | 0;\n this.G = _md_ts_1.SHA224_IV[6] | 0;\n this.H = _md_ts_1.SHA224_IV[7] | 0;\n }\n}\nexports.SHA224 = SHA224;\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\nclass SHA512 extends _md_ts_1.HashMD {\n constructor(outputLen = 64) {\n super(128, outputLen, 16, false);\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n this.Ah = _md_ts_1.SHA512_IV[0] | 0;\n this.Al = _md_ts_1.SHA512_IV[1] | 0;\n this.Bh = _md_ts_1.SHA512_IV[2] | 0;\n this.Bl = _md_ts_1.SHA512_IV[3] | 0;\n this.Ch = _md_ts_1.SHA512_IV[4] | 0;\n this.Cl = _md_ts_1.SHA512_IV[5] | 0;\n this.Dh = _md_ts_1.SHA512_IV[6] | 0;\n this.Dl = _md_ts_1.SHA512_IV[7] | 0;\n this.Eh = _md_ts_1.SHA512_IV[8] | 0;\n this.El = _md_ts_1.SHA512_IV[9] | 0;\n this.Fh = _md_ts_1.SHA512_IV[10] | 0;\n this.Fl = _md_ts_1.SHA512_IV[11] | 0;\n this.Gh = _md_ts_1.SHA512_IV[12] | 0;\n this.Gl = _md_ts_1.SHA512_IV[13] | 0;\n this.Hh = _md_ts_1.SHA512_IV[14] | 0;\n this.Hl = _md_ts_1.SHA512_IV[15] | 0;\n }\n // prettier-ignore\n get() {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n roundClean() {\n (0, utils_ts_1.clean)(SHA512_W_H, SHA512_W_L);\n }\n destroy() {\n (0, utils_ts_1.clean)(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\nexports.SHA512 = SHA512;\nclass SHA384 extends SHA512 {\n constructor() {\n super(48);\n this.Ah = _md_ts_1.SHA384_IV[0] | 0;\n this.Al = _md_ts_1.SHA384_IV[1] | 0;\n this.Bh = _md_ts_1.SHA384_IV[2] | 0;\n this.Bl = _md_ts_1.SHA384_IV[3] | 0;\n this.Ch = _md_ts_1.SHA384_IV[4] | 0;\n this.Cl = _md_ts_1.SHA384_IV[5] | 0;\n this.Dh = _md_ts_1.SHA384_IV[6] | 0;\n this.Dl = _md_ts_1.SHA384_IV[7] | 0;\n this.Eh = _md_ts_1.SHA384_IV[8] | 0;\n this.El = _md_ts_1.SHA384_IV[9] | 0;\n this.Fh = _md_ts_1.SHA384_IV[10] | 0;\n this.Fl = _md_ts_1.SHA384_IV[11] | 0;\n this.Gh = _md_ts_1.SHA384_IV[12] | 0;\n this.Gl = _md_ts_1.SHA384_IV[13] | 0;\n this.Hh = _md_ts_1.SHA384_IV[14] | 0;\n this.Hl = _md_ts_1.SHA384_IV[15] | 0;\n }\n}\nexports.SHA384 = SHA384;\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\nclass SHA512_224 extends SHA512 {\n constructor() {\n super(28);\n this.Ah = T224_IV[0] | 0;\n this.Al = T224_IV[1] | 0;\n this.Bh = T224_IV[2] | 0;\n this.Bl = T224_IV[3] | 0;\n this.Ch = T224_IV[4] | 0;\n this.Cl = T224_IV[5] | 0;\n this.Dh = T224_IV[6] | 0;\n this.Dl = T224_IV[7] | 0;\n this.Eh = T224_IV[8] | 0;\n this.El = T224_IV[9] | 0;\n this.Fh = T224_IV[10] | 0;\n this.Fl = T224_IV[11] | 0;\n this.Gh = T224_IV[12] | 0;\n this.Gl = T224_IV[13] | 0;\n this.Hh = T224_IV[14] | 0;\n this.Hl = T224_IV[15] | 0;\n }\n}\nexports.SHA512_224 = SHA512_224;\nclass SHA512_256 extends SHA512 {\n constructor() {\n super(32);\n this.Ah = T256_IV[0] | 0;\n this.Al = T256_IV[1] | 0;\n this.Bh = T256_IV[2] | 0;\n this.Bl = T256_IV[3] | 0;\n this.Ch = T256_IV[4] | 0;\n this.Cl = T256_IV[5] | 0;\n this.Dh = T256_IV[6] | 0;\n this.Dl = T256_IV[7] | 0;\n this.Eh = T256_IV[8] | 0;\n this.El = T256_IV[9] | 0;\n this.Fh = T256_IV[10] | 0;\n this.Fl = T256_IV[11] | 0;\n this.Gh = T256_IV[12] | 0;\n this.Gl = T256_IV[13] | 0;\n this.Hh = T256_IV[14] | 0;\n this.Hl = T256_IV[15] | 0;\n }\n}\nexports.SHA512_256 = SHA512_256;\n/**\n * SHA2-256 hash function from RFC 4634.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nexports.sha256 = (0, utils_ts_1.createHasher)(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nexports.sha224 = (0, utils_ts_1.createHasher)(() => new SHA224());\n/** SHA2-512 hash function from RFC 4634. */\nexports.sha512 = (0, utils_ts_1.createHasher)(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nexports.sha384 = (0, utils_ts_1.createHasher)(() => new SHA384());\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexports.sha512_256 = (0, utils_ts_1.createHasher)(() => new SHA512_256());\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexports.sha512_224 = (0, utils_ts_1.createHasher)(() => new SHA512_224());\n//# sourceMappingURL=sha2.js.map",
|
|
31
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.notImplemented = exports.bitMask = exports.utf8ToBytes = exports.randomBytes = exports.isBytes = exports.hexToBytes = exports.concatBytes = exports.bytesToUtf8 = exports.bytesToHex = exports.anumber = exports.abytes = void 0;\nexports.abool = abool;\nexports._abool2 = _abool2;\nexports._abytes2 = _abytes2;\nexports.numberToHexUnpadded = numberToHexUnpadded;\nexports.hexToNumber = hexToNumber;\nexports.bytesToNumberBE = bytesToNumberBE;\nexports.bytesToNumberLE = bytesToNumberLE;\nexports.numberToBytesBE = numberToBytesBE;\nexports.numberToBytesLE = numberToBytesLE;\nexports.numberToVarBytesBE = numberToVarBytesBE;\nexports.ensureBytes = ensureBytes;\nexports.equalBytes = equalBytes;\nexports.copyBytes = copyBytes;\nexports.asciiToBytes = asciiToBytes;\nexports.inRange = inRange;\nexports.aInRange = aInRange;\nexports.bitLen = bitLen;\nexports.bitGet = bitGet;\nexports.bitSet = bitSet;\nexports.createHmacDrbg = createHmacDrbg;\nexports.validateObject = validateObject;\nexports.isHash = isHash;\nexports._validateObject = _validateObject;\nexports.memoized = memoized;\n/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst utils_js_1 = require(\"@noble/hashes/utils.js\");\nvar utils_js_2 = require(\"@noble/hashes/utils.js\");\nObject.defineProperty(exports, \"abytes\", { enumerable: true, get: function () { return utils_js_2.abytes; } });\nObject.defineProperty(exports, \"anumber\", { enumerable: true, get: function () { return utils_js_2.anumber; } });\nObject.defineProperty(exports, \"bytesToHex\", { enumerable: true, get: function () { return utils_js_2.bytesToHex; } });\nObject.defineProperty(exports, \"bytesToUtf8\", { enumerable: true, get: function () { return utils_js_2.bytesToUtf8; } });\nObject.defineProperty(exports, \"concatBytes\", { enumerable: true, get: function () { return utils_js_2.concatBytes; } });\nObject.defineProperty(exports, \"hexToBytes\", { enumerable: true, get: function () { return utils_js_2.hexToBytes; } });\nObject.defineProperty(exports, \"isBytes\", { enumerable: true, get: function () { return utils_js_2.isBytes; } });\nObject.defineProperty(exports, \"randomBytes\", { enumerable: true, get: function () { return utils_js_2.randomBytes; } });\nObject.defineProperty(exports, \"utf8ToBytes\", { enumerable: true, get: function () { return utils_js_2.utf8ToBytes; } });\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nfunction abool(title, value) {\n if (typeof value !== 'boolean')\n throw new Error(title + ' boolean expected, got ' + value);\n}\n// tmp name until v2\nfunction _abool2(value, title = '') {\n if (typeof value !== 'boolean') {\n const prefix = title && `\"${title}\"`;\n throw new Error(prefix + 'expected boolean, got type=' + typeof value);\n }\n return value;\n}\n// tmp name until v2\n/** Asserts something is Uint8Array. */\nfunction _abytes2(value, length, title = '') {\n const bytes = (0, utils_js_1.isBytes)(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n// Used in weierstrass, der\nfunction numberToHexUnpadded(num) {\n const hex = num.toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\nfunction hexToNumber(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n// BE: Big Endian, LE: Little Endian\nfunction bytesToNumberBE(bytes) {\n return hexToNumber((0, utils_js_1.bytesToHex)(bytes));\n}\nfunction bytesToNumberLE(bytes) {\n (0, utils_js_1.abytes)(bytes);\n return hexToNumber((0, utils_js_1.bytesToHex)(Uint8Array.from(bytes).reverse()));\n}\nfunction numberToBytesBE(n, len) {\n return (0, utils_js_1.hexToBytes)(n.toString(16).padStart(len * 2, '0'));\n}\nfunction numberToBytesLE(n, len) {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nfunction numberToVarBytesBE(n) {\n return (0, utils_js_1.hexToBytes)(numberToHexUnpadded(n));\n}\n/**\n * Takes hex string or Uint8Array, converts to Uint8Array.\n * Validates output length.\n * Will throw error for other types.\n * @param title descriptive title for an error e.g. 'secret key'\n * @param hex hex string or Uint8Array\n * @param expectedLength optional, will compare to result array's length\n * @returns\n */\nfunction ensureBytes(title, hex, expectedLength) {\n let res;\n if (typeof hex === 'string') {\n try {\n res = (0, utils_js_1.hexToBytes)(hex);\n }\n catch (e) {\n throw new Error(title + ' must be hex string or Uint8Array, cause: ' + e);\n }\n }\n else if ((0, utils_js_1.isBytes)(hex)) {\n // Uint8Array.from() instead of hash.slice() because node.js Buffer\n // is instance of Uint8Array, and its slice() creates **mutable** copy\n res = Uint8Array.from(hex);\n }\n else {\n throw new Error(title + ' must be hex string or Uint8Array');\n }\n const len = res.length;\n if (typeof expectedLength === 'number' && len !== expectedLength)\n throw new Error(title + ' of length ' + expectedLength + ' expected, got ' + len);\n return res;\n}\n// Compares 2 u8a-s in kinda constant time\nfunction equalBytes(a, b) {\n if (a.length !== b.length)\n return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++)\n diff |= a[i] ^ b[i];\n return diff === 0;\n}\n/**\n * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer,\n * and Buffer#slice creates mutable copy. Never use Buffers!\n */\nfunction copyBytes(bytes) {\n return Uint8Array.from(bytes);\n}\n/**\n * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols\n * Should be safe to use for things expected to be ASCII.\n * Returns exact same result as utf8ToBytes for ASCII or throws.\n */\nfunction asciiToBytes(ascii) {\n return Uint8Array.from(ascii, (c, i) => {\n const charCode = c.charCodeAt(0);\n if (c.length !== 1 || charCode > 127) {\n throw new Error(`string contains non-ASCII character \"${ascii[i]}\" with code ${charCode} at position ${i}`);\n }\n return charCode;\n });\n}\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\n// export const utf8ToBytes: typeof utf8ToBytes_ = utf8ToBytes_;\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\n// export const bytesToUtf8: typeof bytesToUtf8_ = bytesToUtf8_;\n// Is positive bigint\nconst isPosBig = (n) => typeof n === 'bigint' && _0n <= n;\nfunction inRange(n, min, max) {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nfunction aInRange(title, n, min, max) {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n// Bit operations\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nfunction bitLen(n) {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1)\n ;\n return len;\n}\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nfunction bitGet(n, pos) {\n return (n >> BigInt(pos)) & _1n;\n}\n/**\n * Sets single bit at position.\n */\nfunction bitSet(n, pos, value) {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nconst bitMask = (n) => (_1n << BigInt(n)) - _1n;\nexports.bitMask = bitMask;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG<Key>(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nfunction createHmacDrbg(hashLen, qByteLen, hmacFn) {\n if (typeof hashLen !== 'number' || hashLen < 2)\n throw new Error('hashLen must be a number');\n if (typeof qByteLen !== 'number' || qByteLen < 2)\n throw new Error('qByteLen must be a number');\n if (typeof hmacFn !== 'function')\n throw new Error('hmacFn must be a function');\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n const u8n = (len) => new Uint8Array(len); // creates Uint8Array\n const u8of = (byte) => Uint8Array.of(byte); // another shortcut\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...b) => hmacFn(k, v, ...b); // hmac(k)(v, ...values)\n const reseed = (seed = u8n(0)) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(u8of(0x00), seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0)\n return;\n k = h(u8of(0x01), seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= 1000)\n throw new Error('drbg: tried 1000 values');\n let len = 0;\n const out = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return (0, utils_js_1.concatBytes)(...out);\n };\n const genUntil = (seed, pred) => {\n reset();\n reseed(seed); // Steps D-G\n let res = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen())))\n reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n// Validating curves and fields\nconst validatorFns = {\n bigint: (val) => typeof val === 'bigint',\n function: (val) => typeof val === 'function',\n boolean: (val) => typeof val === 'boolean',\n string: (val) => typeof val === 'string',\n stringOrUint8Array: (val) => typeof val === 'string' || (0, utils_js_1.isBytes)(val),\n isSafeInteger: (val) => Number.isSafeInteger(val),\n array: (val) => Array.isArray(val),\n field: (val, object) => object.Fp.isValid(val),\n hash: (val) => typeof val === 'function' && Number.isSafeInteger(val.outputLen),\n};\n// type Record<K extends string | number | symbol, T> = { [P in K]: T; }\nfunction validateObject(object, validators, optValidators = {}) {\n const checkField = (fieldName, type, isOptional) => {\n const checkVal = validatorFns[type];\n if (typeof checkVal !== 'function')\n throw new Error('invalid validator function');\n const val = object[fieldName];\n if (isOptional && val === undefined)\n return;\n if (!checkVal(val, object)) {\n throw new Error('param ' + String(fieldName) + ' is invalid. Expected ' + type + ', got ' + val);\n }\n };\n for (const [fieldName, type] of Object.entries(validators))\n checkField(fieldName, type, false);\n for (const [fieldName, type] of Object.entries(optValidators))\n checkField(fieldName, type, true);\n return object;\n}\n// validate type tests\n// const o: { a: number; b: number; c: number } = { a: 1, b: 5, c: 6 };\n// const z0 = validateObject(o, { a: 'isSafeInteger' }, { c: 'bigint' }); // Ok!\n// // Should fail type-check\n// const z1 = validateObject(o, { a: 'tmp' }, { c: 'zz' });\n// const z2 = validateObject(o, { a: 'isSafeInteger' }, { c: 'zz' });\n// const z3 = validateObject(o, { test: 'boolean', z: 'bug' });\n// const z4 = validateObject(o, { a: 'boolean', z: 'bug' });\nfunction isHash(val) {\n return typeof val === 'function' && Number.isSafeInteger(val.outputLen);\n}\nfunction _validateObject(object, fields, optFields = {}) {\n if (!object || typeof object !== 'object')\n throw new Error('expected valid options object');\n function checkField(fieldName, expectedType, isOpt) {\n const val = object[fieldName];\n if (isOpt && val === undefined)\n return;\n const current = typeof val;\n if (current !== expectedType || val === null)\n throw new Error(`param \"${fieldName}\" is invalid: expected ${expectedType}, got ${current}`);\n }\n Object.entries(fields).forEach(([k, v]) => checkField(k, v, false));\n Object.entries(optFields).forEach(([k, v]) => checkField(k, v, true));\n}\n/**\n * throws not implemented error\n */\nconst notImplemented = () => {\n throw new Error('not implemented');\n};\nexports.notImplemented = notImplemented;\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nfunction memoized(fn) {\n const map = new WeakMap();\n return (arg, ...args) => {\n const val = map.get(arg);\n if (val !== undefined)\n return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n//# sourceMappingURL=utils.js.map",
|
|
32
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isNegativeLE = void 0;\nexports.mod = mod;\nexports.pow = pow;\nexports.pow2 = pow2;\nexports.invert = invert;\nexports.tonelliShanks = tonelliShanks;\nexports.FpSqrt = FpSqrt;\nexports.validateField = validateField;\nexports.FpPow = FpPow;\nexports.FpInvertBatch = FpInvertBatch;\nexports.FpDiv = FpDiv;\nexports.FpLegendre = FpLegendre;\nexports.FpIsSquare = FpIsSquare;\nexports.nLength = nLength;\nexports.Field = Field;\nexports.FpSqrtOdd = FpSqrtOdd;\nexports.FpSqrtEven = FpSqrtEven;\nexports.hashToPrivateScalar = hashToPrivateScalar;\nexports.getFieldBytesLength = getFieldBytesLength;\nexports.getMinHashLength = getMinHashLength;\nexports.mapHashToField = mapHashToField;\n/**\n * Utils for modular division and fields.\n * Field over 11 is a finite (Galois) field is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst utils_ts_1 = require(\"../utils.js\");\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = /* @__PURE__ */ BigInt(2), _3n = /* @__PURE__ */ BigInt(3);\n// prettier-ignore\nconst _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5), _7n = /* @__PURE__ */ BigInt(7);\n// prettier-ignore\nconst _8n = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9), _16n = /* @__PURE__ */ BigInt(16);\n// Calculates a modulo b\nfunction mod(a, b) {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nfunction pow(num, power, modulo) {\n return FpPow(Field(modulo), num, power);\n}\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nfunction pow2(x, power, modulo) {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nfunction invert(number, modulo) {\n if (number === _0n)\n throw new Error('invert: expected non-zero number');\n if (modulo <= _0n)\n throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n)\n throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\nfunction assertIsSquare(Fp, root, n) {\n if (!Fp.eql(Fp.sqr(root), n))\n throw new Error('Cannot find square root');\n}\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4(Fp, n) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n assertIsSquare(Fp, root, n);\n return root;\n}\nfunction sqrt5mod8(Fp, n) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n assertIsSquare(Fp, root, n);\n return root;\n}\n// Based on RFC9380, Kong algorithm\n// prettier-ignore\nfunction sqrt9mod16(P) {\n const Fp_ = Field(P);\n const tn = tonelliShanks(P);\n const c1 = tn(Fp_, Fp_.neg(Fp_.ONE)); // 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n const c2 = tn(Fp_, c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n const c3 = tn(Fp_, Fp_.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n return (Fp, n) => {\n let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n let tv2 = Fp.mul(tv1, c1); // 2. tv2 = c1 * tv1\n const tv3 = Fp.mul(tv1, c2); // 3. tv3 = c2 * tv1\n const tv4 = Fp.mul(tv1, c3); // 4. tv4 = c3 * tv1\n const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n const root = Fp.cmov(tv1, tv2, e3); // 10. z = CMOV(tv1, tv2, e3) # Select sqrt from tv1 & tv2\n assertIsSquare(Fp, root, n);\n return root;\n };\n}\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nfunction tonelliShanks(P) {\n // Initialization (precomputation).\n // Caching initialization could boost perf by 7%.\n if (P < _3n)\n throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000)\n throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1)\n return sqrt3mod4;\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow(Fp, n) {\n if (Fp.is0(n))\n return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1)\n throw new Error('Cannot find square root');\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t))\n return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M)\n throw new Error('Cannot find square root');\n }\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. P ≡ 9 (mod 16)\n * 4. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nfunction FpSqrt(P) {\n // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n if (P % _4n === _3n)\n return sqrt3mod4;\n // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n)\n return sqrt5mod8;\n // P ≡ 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4)\n if (P % _16n === _9n)\n return sqrt9mod16(P);\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n// Little-endian check for first LE bit (last BE bit);\nconst isNegativeLE = (num, modulo) => (mod(num, modulo) & _1n) === _1n;\nexports.isNegativeLE = isNegativeLE;\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n];\nfunction validateField(field) {\n const initial = {\n ORDER: 'bigint',\n MASK: 'bigint',\n BYTES: 'number',\n BITS: 'number',\n };\n const opts = FIELD_FIELDS.reduce((map, val) => {\n map[val] = 'function';\n return map;\n }, initial);\n (0, utils_ts_1._validateObject)(field, opts);\n // const max = 16384;\n // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');\n // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');\n return field;\n}\n// Generic field functions\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nfunction FpPow(Fp, num, power) {\n if (power < _0n)\n throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n)\n return Fp.ONE;\n if (power === _1n)\n return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n)\n p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nfunction FpInvertBatch(Fp, nums, passZero = false) {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num))\n return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num))\n return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n// TODO: remove\nfunction FpDiv(Fp, lhs, rhs) {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1 if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0 if a ≡ 0 (mod p)\n */\nfunction FpLegendre(Fp, n) {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no)\n throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n// This function returns True whenever the value x is a square in the field F.\nfunction FpIsSquare(Fp, n) {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n// CURVE.n lengths\nfunction nLength(n, nBitLength) {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined)\n (0, utils_ts_1.anumber)(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n/**\n * Creates a finite field. Major performance optimizations:\n * * 1. Denormalized operations like mulN instead of mul.\n * * 2. Identical object shape: never add or remove keys.\n * * 3. `Object.freeze`.\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n *\n * Note about field properties:\n * * CHARACTERISTIC p = prime number, number of elements in main subgroup.\n * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.\n *\n * @param ORDER field order, probably prime, or could be composite\n * @param bitLen how many bits the field consumes\n * @param isLE (default: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nfunction Field(ORDER, bitLenOrOpts, // TODO: use opts only in v2?\nisLE = false, opts = {}) {\n if (ORDER <= _0n)\n throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n let _nbitLength = undefined;\n let _sqrt = undefined;\n let modFromBytes = false;\n let allowedLengths = undefined;\n if (typeof bitLenOrOpts === 'object' && bitLenOrOpts != null) {\n if (opts.sqrt || isLE)\n throw new Error('cannot specify opts in two arguments');\n const _opts = bitLenOrOpts;\n if (_opts.BITS)\n _nbitLength = _opts.BITS;\n if (_opts.sqrt)\n _sqrt = _opts.sqrt;\n if (typeof _opts.isLE === 'boolean')\n isLE = _opts.isLE;\n if (typeof _opts.modFromBytes === 'boolean')\n modFromBytes = _opts.modFromBytes;\n allowedLengths = _opts.allowedLengths;\n }\n else {\n if (typeof bitLenOrOpts === 'number')\n _nbitLength = bitLenOrOpts;\n if (opts.sqrt)\n _sqrt = opts.sqrt;\n }\n const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, _nbitLength);\n if (BYTES > 2048)\n throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n let sqrtP; // cached sqrtP\n const f = Object.freeze({\n ORDER,\n isLE,\n BITS,\n BYTES,\n MASK: (0, utils_ts_1.bitMask)(BITS),\n ZERO: _0n,\n ONE: _1n,\n allowedLengths: allowedLengths,\n create: (num) => mod(num, ORDER),\n isValid: (num) => {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < ORDER; // 0 is valid element, but it's not invertible\n },\n is0: (num) => num === _0n,\n // is valid and invertible\n isValidNot0: (num) => !f.is0(num) && f.isValid(num),\n isOdd: (num) => (num & _1n) === _1n,\n neg: (num) => mod(-num, ORDER),\n eql: (lhs, rhs) => lhs === rhs,\n sqr: (num) => mod(num * num, ORDER),\n add: (lhs, rhs) => mod(lhs + rhs, ORDER),\n sub: (lhs, rhs) => mod(lhs - rhs, ORDER),\n mul: (lhs, rhs) => mod(lhs * rhs, ORDER),\n pow: (num, power) => FpPow(f, num, power),\n div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER),\n // Same as above, but doesn't normalize\n sqrN: (num) => num * num,\n addN: (lhs, rhs) => lhs + rhs,\n subN: (lhs, rhs) => lhs - rhs,\n mulN: (lhs, rhs) => lhs * rhs,\n inv: (num) => invert(num, ORDER),\n sqrt: _sqrt ||\n ((n) => {\n if (!sqrtP)\n sqrtP = FpSqrt(ORDER);\n return sqrtP(f, n);\n }),\n toBytes: (num) => (isLE ? (0, utils_ts_1.numberToBytesLE)(num, BYTES) : (0, utils_ts_1.numberToBytesBE)(num, BYTES)),\n fromBytes: (bytes, skipValidation = true) => {\n if (allowedLengths) {\n if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) {\n throw new Error('Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length);\n }\n const padded = new Uint8Array(BYTES);\n // isLE add 0 to right, !isLE to the left.\n padded.set(bytes, isLE ? 0 : padded.length - bytes.length);\n bytes = padded;\n }\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n let scalar = isLE ? (0, utils_ts_1.bytesToNumberLE)(bytes) : (0, utils_ts_1.bytesToNumberBE)(bytes);\n if (modFromBytes)\n scalar = mod(scalar, ORDER);\n if (!skipValidation)\n if (!f.isValid(scalar))\n throw new Error('invalid field element: outside of range 0..ORDER');\n // NOTE: we don't validate scalar here, please use isValid. This done such way because some\n // protocol may allow non-reduced scalar that reduced later or changed some other way.\n return scalar;\n },\n // TODO: we don't need it here, move out to separate fn\n invertBatch: (lst) => FpInvertBatch(f, lst),\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov: (a, b, c) => (c ? b : a),\n });\n return Object.freeze(f);\n}\n// Generic random scalar, we can do same for other fields if via Fp2.mul(Fp2.ONE, Fp2.random)?\n// This allows unsafe methods like ignore bias or zero. These unsafe, but often used in different protocols (if deterministic RNG).\n// which mean we cannot force this via opts.\n// Not sure what to do with randomBytes, we can accept it inside opts if wanted.\n// Probably need to export getMinHashLength somewhere?\n// random(bytes?: Uint8Array, unsafeAllowZero = false, unsafeAllowBias = false) {\n// const LEN = !unsafeAllowBias ? getMinHashLength(ORDER) : BYTES;\n// if (bytes === undefined) bytes = randomBytes(LEN); // _opts.randomBytes?\n// const num = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n// // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n// const reduced = unsafeAllowZero ? mod(num, ORDER) : mod(num, ORDER - _1n) + _1n;\n// return reduced;\n// },\nfunction FpSqrtOdd(Fp, elm) {\n if (!Fp.isOdd)\n throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\nfunction FpSqrtEven(Fp, elm) {\n if (!Fp.isOdd)\n throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n/**\n * \"Constant-time\" private key generation utility.\n * Same as mapKeyToField, but accepts less bytes (40 instead of 48 for 32-byte field).\n * Which makes it slightly more biased, less secure.\n * @deprecated use `mapKeyToField` instead\n */\nfunction hashToPrivateScalar(hash, groupOrder, isLE = false) {\n hash = (0, utils_ts_1.ensureBytes)('privateHash', hash);\n const hashLen = hash.length;\n const minLen = nLength(groupOrder).nByteLength + 8;\n if (minLen < 24 || hashLen < minLen || hashLen > 1024)\n throw new Error('hashToPrivateScalar: expected ' + minLen + '-1024 bytes of input, got ' + hashLen);\n const num = isLE ? (0, utils_ts_1.bytesToNumberLE)(hash) : (0, utils_ts_1.bytesToNumberBE)(hash);\n return mod(num, groupOrder - _1n) + _1n;\n}\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nfunction getFieldBytesLength(fieldOrder) {\n if (typeof fieldOrder !== 'bigint')\n throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nfunction getMinHashLength(fieldOrder) {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.CURVE.n)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nfunction mapHashToField(key, fieldOrder, isLE = false) {\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? (0, utils_ts_1.bytesToNumberLE)(key) : (0, utils_ts_1.bytesToNumberBE)(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? (0, utils_ts_1.numberToBytesLE)(reduced, fieldLen) : (0, utils_ts_1.numberToBytesBE)(reduced, fieldLen);\n}\n//# sourceMappingURL=modular.js.map",
|
|
33
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wNAF = void 0;\nexports.negateCt = negateCt;\nexports.normalizeZ = normalizeZ;\nexports.mulEndoUnsafe = mulEndoUnsafe;\nexports.pippenger = pippenger;\nexports.precomputeMSMUnsafe = precomputeMSMUnsafe;\nexports.validateBasic = validateBasic;\nexports._createCurveFields = _createCurveFields;\n/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst utils_ts_1 = require(\"../utils.js\");\nconst modular_ts_1 = require(\"./modular.js\");\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nfunction negateCt(condition, item) {\n const neg = item.negate();\n return condition ? neg : item;\n}\n/**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\nfunction normalizeZ(c, points) {\n const invertedZs = (0, modular_ts_1.FpInvertBatch)(c.Fp, points.map((p) => p.Z));\n return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));\n}\nfunction validateW(W, bits) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\nfunction calcWOpts(W, scalarBits) {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = (0, utils_ts_1.bitMask)(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\nfunction calcOffsets(n, window, wOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\nfunction validateMSMPoints(points, c) {\n if (!Array.isArray(points))\n throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c))\n throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars, field) {\n if (!Array.isArray(scalars))\n throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s))\n throw new Error('invalid scalar at index ' + i);\n });\n}\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap();\nconst pointWindowSizes = new WeakMap();\nfunction getW(P) {\n // To disable precomputes:\n // return 1;\n return pointWindowSizes.get(P) || 1;\n}\nfunction assert0(n) {\n if (n !== _0n)\n throw new Error('invalid wNAF');\n}\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Table generation takes **30MB of ram and 10ms on high-end CPU**,\n * but may take much longer on slow devices. Actual generation will happen on\n * first call of `multiply()`. By default, `BASE` point is precomputed.\n *\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nclass wNAF {\n // Parametrized with a given Point class (not individual point)\n constructor(Point, bits) {\n this.BASE = Point.BASE;\n this.ZERO = Point.ZERO;\n this.Fn = Point.Fn;\n this.bits = bits;\n }\n // non-const time multiplication ladder\n _unsafeLadder(elm, n, p = this.ZERO) {\n let d = elm;\n while (n > _0n) {\n if (n & _1n)\n p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n }\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param point Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n precomputeWindow(point, W) {\n const { windows, windowSize } = calcWOpts(W, this.bits);\n const points = [];\n let p = point;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n }\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * More compact implementation:\n * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n * @returns real and fake (for const-time) points\n */\n wNAF(W, precomputes, n) {\n // Scalar should be smaller than field order\n if (!this.Fn.isValid(n))\n throw new Error('invalid scalar');\n // Accumulators\n let p = this.ZERO;\n let f = this.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(negateCt(isNegF, precomputes[offsetF]));\n }\n else {\n // bits are 1: add to result point\n p = p.add(negateCt(isNeg, precomputes[offset]));\n }\n }\n assert0(n);\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n }\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n wNAFUnsafe(W, precomputes, n, acc = this.ZERO) {\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n)\n break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n }\n else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n assert0(n);\n return acc;\n }\n getPrecomputes(W, point, transform) {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(point);\n if (!comp) {\n comp = this.precomputeWindow(point, W);\n if (W !== 1) {\n // Doing transform outside of if brings 15% perf hit\n if (typeof transform === 'function')\n comp = transform(comp);\n pointPrecomputes.set(point, comp);\n }\n }\n return comp;\n }\n cached(point, scalar, transform) {\n const W = getW(point);\n return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar);\n }\n unsafe(point, scalar, transform, prev) {\n const W = getW(point);\n if (W === 1)\n return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev);\n }\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n createCache(P, W) {\n validateW(W, this.bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n }\n hasCache(elm) {\n return getW(elm) !== 1;\n }\n}\nexports.wNAF = wNAF;\n/**\n * Endomorphism-specific multiplication for Koblitz curves.\n * Cost: 128 dbl, 0-256 adds.\n */\nfunction mulEndoUnsafe(Point, point, k1, k2) {\n let acc = point;\n let p1 = Point.ZERO;\n let p2 = Point.ZERO;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n)\n p1 = p1.add(acc);\n if (k2 & _1n)\n p2 = p2.add(acc);\n acc = acc.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n return { p1, p2 };\n}\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka secret keys / bigints)\n */\nfunction pippenger(c, fieldN, points, scalars) {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength)\n throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = (0, utils_ts_1.bitLen)(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12)\n windowSize = wbits - 3;\n else if (wbits > 4)\n windowSize = wbits - 2;\n else if (wbits > 0)\n windowSize = 2;\n const MASK = (0, utils_ts_1.bitMask)(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0)\n for (let j = 0; j < windowSize; j++)\n sum = sum.double();\n }\n return sum;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nfunction precomputeMSMUnsafe(c, fieldN, points, windowSize) {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar × 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 × 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 × 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = (0, utils_ts_1.bitMask)(windowSize);\n const tables = points.map((p) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars) => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero)\n for (let j = 0; j < windowSize; j++)\n res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr)\n continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n// TODO: remove\n/** @deprecated */\nfunction validateBasic(curve) {\n (0, modular_ts_1.validateField)(curve.Fp);\n (0, utils_ts_1.validateObject)(curve, {\n n: 'bigint',\n h: 'bigint',\n Gx: 'field',\n Gy: 'field',\n }, {\n nBitLength: 'isSafeInteger',\n nByteLength: 'isSafeInteger',\n });\n // Set defaults\n return Object.freeze({\n ...(0, modular_ts_1.nLength)(curve.n, curve.nBitLength),\n ...curve,\n ...{ p: curve.Fp.ORDER },\n });\n}\nfunction createField(order, field, isLE) {\n if (field) {\n if (field.ORDER !== order)\n throw new Error('Field.ORDER must match order: Fp == p, Fn == n');\n (0, modular_ts_1.validateField)(field);\n return field;\n }\n else {\n return (0, modular_ts_1.Field)(order, { isLE });\n }\n}\n/** Validates CURVE opts and creates fields */\nfunction _createCurveFields(type, CURVE, curveOpts = {}, FpFnLE) {\n if (FpFnLE === undefined)\n FpFnLE = type === 'edwards';\n if (!CURVE || typeof CURVE !== 'object')\n throw new Error(`expected valid ${type} CURVE object`);\n for (const p of ['p', 'n', 'h']) {\n const val = CURVE[p];\n if (!(typeof val === 'bigint' && val > _0n))\n throw new Error(`CURVE.${p} must be positive bigint`);\n }\n const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE);\n const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE);\n const _b = type === 'weierstrass' ? 'b' : 'd';\n const params = ['Gx', 'Gy', 'a', _b];\n for (const p of params) {\n // @ts-ignore\n if (!Fp.isValid(CURVE[p]))\n throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);\n }\n CURVE = Object.freeze(Object.assign({}, CURVE));\n return { CURVE, Fp, Fn };\n}\n//# sourceMappingURL=curve.js.map",
|
|
34
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PrimeEdwardsPoint = void 0;\nexports.edwards = edwards;\nexports.eddsa = eddsa;\nexports.twistedEdwards = twistedEdwards;\n/**\n * Twisted Edwards curve. The formula is: ax² + y² = 1 + dx²y².\n * For design rationale of types / exports, see weierstrass module documentation.\n * Untwisted Edwards curves exist, but they aren't used in real-world protocols.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst utils_ts_1 = require(\"../utils.js\");\nconst curve_ts_1 = require(\"./curve.js\");\nconst modular_ts_1 = require(\"./modular.js\");\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _8n = BigInt(8);\nfunction isEdValidXY(Fp, CURVE, x, y) {\n const x2 = Fp.sqr(x);\n const y2 = Fp.sqr(y);\n const left = Fp.add(Fp.mul(CURVE.a, x2), y2);\n const right = Fp.add(Fp.ONE, Fp.mul(CURVE.d, Fp.mul(x2, y2)));\n return Fp.eql(left, right);\n}\nfunction edwards(params, extraOpts = {}) {\n const validated = (0, curve_ts_1._createCurveFields)('edwards', params, extraOpts, extraOpts.FpFnLE);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE;\n const { h: cofactor } = CURVE;\n (0, utils_ts_1._validateObject)(extraOpts, {}, { uvRatio: 'function' });\n // Important:\n // There are some places where Fp.BYTES is used instead of nByteLength.\n // So far, everything has been tested with curves of Fp.BYTES == nByteLength.\n // TODO: test and find curves which behave otherwise.\n const MASK = _2n << (BigInt(Fn.BYTES * 8) - _1n);\n const modP = (n) => Fp.create(n); // Function overrides\n // sqrt(u/v)\n const uvRatio = extraOpts.uvRatio ||\n ((u, v) => {\n try {\n return { isValid: true, value: Fp.sqrt(Fp.div(u, v)) };\n }\n catch (e) {\n return { isValid: false, value: _0n };\n }\n });\n // Validate whether the passed curve params are valid.\n // equation ax² + y² = 1 + dx²y² should work for generator point.\n if (!isEdValidXY(Fp, CURVE, CURVE.Gx, CURVE.Gy))\n throw new Error('bad curve params: generator point');\n /**\n * Asserts coordinate is valid: 0 <= n < MASK.\n * Coordinates >= Fp.ORDER are allowed for zip215.\n */\n function acoord(title, n, banZero = false) {\n const min = banZero ? _1n : _0n;\n (0, utils_ts_1.aInRange)('coordinate ' + title, n, min, MASK);\n return n;\n }\n function aextpoint(other) {\n if (!(other instanceof Point))\n throw new Error('ExtendedPoint expected');\n }\n // Converts Extended point to default (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n const toAffineMemo = (0, utils_ts_1.memoized)((p, iz) => {\n const { X, Y, Z } = p;\n const is0 = p.is0();\n if (iz == null)\n iz = is0 ? _8n : Fp.inv(Z); // 8 was chosen arbitrarily\n const x = modP(X * iz);\n const y = modP(Y * iz);\n const zz = Fp.mul(Z, iz);\n if (is0)\n return { x: _0n, y: _1n };\n if (zz !== _1n)\n throw new Error('invZ was invalid');\n return { x, y };\n });\n const assertValidMemo = (0, utils_ts_1.memoized)((p) => {\n const { a, d } = CURVE;\n if (p.is0())\n throw new Error('bad point: ZERO'); // TODO: optimize, with vars below?\n // Equation in affine coordinates: ax² + y² = 1 + dx²y²\n // Equation in projective coordinates (X/Z, Y/Z, Z): (aX² + Y²)Z² = Z⁴ + dX²Y²\n const { X, Y, Z, T } = p;\n const X2 = modP(X * X); // X²\n const Y2 = modP(Y * Y); // Y²\n const Z2 = modP(Z * Z); // Z²\n const Z4 = modP(Z2 * Z2); // Z⁴\n const aX2 = modP(X2 * a); // aX²\n const left = modP(Z2 * modP(aX2 + Y2)); // (aX² + Y²)Z²\n const right = modP(Z4 + modP(d * modP(X2 * Y2))); // Z⁴ + dX²Y²\n if (left !== right)\n throw new Error('bad point: equation left != right (1)');\n // In Extended coordinates we also have T, which is x*y=T/Z: check X*Y == Z*T\n const XY = modP(X * Y);\n const ZT = modP(Z * T);\n if (XY !== ZT)\n throw new Error('bad point: equation left != right (2)');\n return true;\n });\n // Extended Point works in extended coordinates: (X, Y, Z, T) ∋ (x=X/Z, y=Y/Z, T=xy).\n // https://en.wikipedia.org/wiki/Twisted_Edwards_curve#Extended_coordinates\n class Point {\n constructor(X, Y, Z, T) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y);\n this.Z = acoord('z', Z, true);\n this.T = acoord('t', T);\n Object.freeze(this);\n }\n static CURVE() {\n return CURVE;\n }\n static fromAffine(p) {\n if (p instanceof Point)\n throw new Error('extended point not allowed');\n const { x, y } = p || {};\n acoord('x', x);\n acoord('y', y);\n return new Point(x, y, _1n, modP(x * y));\n }\n // Uses algo from RFC8032 5.1.3.\n static fromBytes(bytes, zip215 = false) {\n const len = Fp.BYTES;\n const { a, d } = CURVE;\n bytes = (0, utils_ts_1.copyBytes)((0, utils_ts_1._abytes2)(bytes, len, 'point'));\n (0, utils_ts_1._abool2)(zip215, 'zip215');\n const normed = (0, utils_ts_1.copyBytes)(bytes); // copy again, we'll manipulate it\n const lastByte = bytes[len - 1]; // select last byte\n normed[len - 1] = lastByte & ~0x80; // clear last bit\n const y = (0, utils_ts_1.bytesToNumberLE)(normed);\n // zip215=true is good for consensus-critical apps. =false follows RFC8032 / NIST186-5.\n // RFC8032 prohibits >= p, but ZIP215 doesn't\n // zip215=true: 0 <= y < MASK (2^256 for ed25519)\n // zip215=false: 0 <= y < P (2^255-19 for ed25519)\n const max = zip215 ? MASK : Fp.ORDER;\n (0, utils_ts_1.aInRange)('point.y', y, _0n, max);\n // Ed25519: x² = (y²-1)/(dy²+1) mod p. Ed448: x² = (y²-1)/(dy²-1) mod p. Generic case:\n // ax²+y²=1+dx²y² => y²-1=dx²y²-ax² => y²-1=x²(dy²-a) => x²=(y²-1)/(dy²-a)\n const y2 = modP(y * y); // denominator is always non-0 mod p.\n const u = modP(y2 - _1n); // u = y² - 1\n const v = modP(d * y2 - a); // v = d y² + 1.\n let { isValid, value: x } = uvRatio(u, v); // √(u/v)\n if (!isValid)\n throw new Error('bad point: invalid y coordinate');\n const isXOdd = (x & _1n) === _1n; // There are 2 square roots. Use x_0 bit to select proper\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (!zip215 && x === _0n && isLastByteOdd)\n // if x=0 and x_0 = 1, fail\n throw new Error('bad point: x=0 and x_0=1');\n if (isLastByteOdd !== isXOdd)\n x = modP(-x); // if x_0 != x mod 2, set x = p-x\n return Point.fromAffine({ x, y });\n }\n static fromHex(bytes, zip215 = false) {\n return Point.fromBytes((0, utils_ts_1.ensureBytes)('point', bytes), zip215);\n }\n get x() {\n return this.toAffine().x;\n }\n get y() {\n return this.toAffine().y;\n }\n precompute(windowSize = 8, isLazy = true) {\n wnaf.createCache(this, windowSize);\n if (!isLazy)\n this.multiply(_2n); // random number\n return this;\n }\n // Useful in fromAffine() - not for fromBytes(), which always created valid points.\n assertValidity() {\n assertValidMemo(this);\n }\n // Compare one point to another.\n equals(other) {\n aextpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const X1Z2 = modP(X1 * Z2);\n const X2Z1 = modP(X2 * Z1);\n const Y1Z2 = modP(Y1 * Z2);\n const Y2Z1 = modP(Y2 * Z1);\n return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;\n }\n is0() {\n return this.equals(Point.ZERO);\n }\n negate() {\n // Flips point sign to a negative one (-x, y in affine coords)\n return new Point(modP(-this.X), this.Y, this.Z, modP(-this.T));\n }\n // Fast algo for doubling Extended Point.\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd\n // Cost: 4M + 4S + 1*a + 6add + 1*2.\n double() {\n const { a } = CURVE;\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const A = modP(X1 * X1); // A = X12\n const B = modP(Y1 * Y1); // B = Y12\n const C = modP(_2n * modP(Z1 * Z1)); // C = 2*Z12\n const D = modP(a * A); // D = a*A\n const x1y1 = X1 + Y1;\n const E = modP(modP(x1y1 * x1y1) - A - B); // E = (X1+Y1)2-A-B\n const G = D + B; // G = D+B\n const F = G - C; // F = G-C\n const H = D - B; // H = D-B\n const X3 = modP(E * F); // X3 = E*F\n const Y3 = modP(G * H); // Y3 = G*H\n const T3 = modP(E * H); // T3 = E*H\n const Z3 = modP(F * G); // Z3 = F*G\n return new Point(X3, Y3, Z3, T3);\n }\n // Fast algo for adding 2 Extended Points.\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd\n // Cost: 9M + 1*a + 1*d + 7add.\n add(other) {\n aextpoint(other);\n const { a, d } = CURVE;\n const { X: X1, Y: Y1, Z: Z1, T: T1 } = this;\n const { X: X2, Y: Y2, Z: Z2, T: T2 } = other;\n const A = modP(X1 * X2); // A = X1*X2\n const B = modP(Y1 * Y2); // B = Y1*Y2\n const C = modP(T1 * d * T2); // C = T1*d*T2\n const D = modP(Z1 * Z2); // D = Z1*Z2\n const E = modP((X1 + Y1) * (X2 + Y2) - A - B); // E = (X1+Y1)*(X2+Y2)-A-B\n const F = D - C; // F = D-C\n const G = D + C; // G = D+C\n const H = modP(B - a * A); // H = B-a*A\n const X3 = modP(E * F); // X3 = E*F\n const Y3 = modP(G * H); // Y3 = G*H\n const T3 = modP(E * H); // T3 = E*H\n const Z3 = modP(F * G); // Z3 = F*G\n return new Point(X3, Y3, Z3, T3);\n }\n subtract(other) {\n return this.add(other.negate());\n }\n // Constant-time multiplication.\n multiply(scalar) {\n // 1 <= scalar < L\n if (!Fn.isValidNot0(scalar))\n throw new Error('invalid scalar: expected 1 <= sc < curve.n');\n const { p, f } = wnaf.cached(this, scalar, (p) => (0, curve_ts_1.normalizeZ)(Point, p));\n return (0, curve_ts_1.normalizeZ)(Point, [p, f])[0];\n }\n // Non-constant-time multiplication. Uses double-and-add algorithm.\n // It's faster, but should only be used when you don't care about\n // an exposed private key e.g. sig verification.\n // Does NOT allow scalars higher than CURVE.n.\n // Accepts optional accumulator to merge with multiply (important for sparse scalars)\n multiplyUnsafe(scalar, acc = Point.ZERO) {\n // 0 <= scalar < L\n if (!Fn.isValid(scalar))\n throw new Error('invalid scalar: expected 0 <= sc < curve.n');\n if (scalar === _0n)\n return Point.ZERO;\n if (this.is0() || scalar === _1n)\n return this;\n return wnaf.unsafe(this, scalar, (p) => (0, curve_ts_1.normalizeZ)(Point, p), acc);\n }\n // Checks if point is of small order.\n // If you add something to small order point, you will have \"dirty\"\n // point with torsion component.\n // Multiplies point by cofactor and checks if the result is 0.\n isSmallOrder() {\n return this.multiplyUnsafe(cofactor).is0();\n }\n // Multiplies point by curve order and checks if the result is 0.\n // Returns `false` is the point is dirty.\n isTorsionFree() {\n return wnaf.unsafe(this, CURVE.n).is0();\n }\n // Converts Extended point to default (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n toAffine(invertedZ) {\n return toAffineMemo(this, invertedZ);\n }\n clearCofactor() {\n if (cofactor === _1n)\n return this;\n return this.multiplyUnsafe(cofactor);\n }\n toBytes() {\n const { x, y } = this.toAffine();\n // Fp.toBytes() allows non-canonical encoding of y (>= p).\n const bytes = Fp.toBytes(y);\n // Each y has 2 valid points: (x, y), (x,-y).\n // When compressing, it's enough to store y and use the last byte to encode sign of x\n bytes[bytes.length - 1] |= x & _1n ? 0x80 : 0;\n return bytes;\n }\n toHex() {\n return (0, utils_ts_1.bytesToHex)(this.toBytes());\n }\n toString() {\n return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n }\n // TODO: remove\n get ex() {\n return this.X;\n }\n get ey() {\n return this.Y;\n }\n get ez() {\n return this.Z;\n }\n get et() {\n return this.T;\n }\n static normalizeZ(points) {\n return (0, curve_ts_1.normalizeZ)(Point, points);\n }\n static msm(points, scalars) {\n return (0, curve_ts_1.pippenger)(Point, Fn, points, scalars);\n }\n _setWindowSize(windowSize) {\n this.precompute(windowSize);\n }\n toRawBytes() {\n return this.toBytes();\n }\n }\n // base / generator point\n Point.BASE = new Point(CURVE.Gx, CURVE.Gy, _1n, modP(CURVE.Gx * CURVE.Gy));\n // zero / infinity / identity point\n Point.ZERO = new Point(_0n, _1n, _1n, _0n); // 0, 1, 1, 0\n // math field\n Point.Fp = Fp;\n // scalar field\n Point.Fn = Fn;\n const wnaf = new curve_ts_1.wNAF(Point, Fn.BITS);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n/**\n * Base class for prime-order points like Ristretto255 and Decaf448.\n * These points eliminate cofactor issues by representing equivalence classes\n * of Edwards curve points.\n */\nclass PrimeEdwardsPoint {\n constructor(ep) {\n this.ep = ep;\n }\n // Static methods that must be implemented by subclasses\n static fromBytes(_bytes) {\n (0, utils_ts_1.notImplemented)();\n }\n static fromHex(_hex) {\n (0, utils_ts_1.notImplemented)();\n }\n get x() {\n return this.toAffine().x;\n }\n get y() {\n return this.toAffine().y;\n }\n // Common implementations\n clearCofactor() {\n // no-op for prime-order groups\n return this;\n }\n assertValidity() {\n this.ep.assertValidity();\n }\n toAffine(invertedZ) {\n return this.ep.toAffine(invertedZ);\n }\n toHex() {\n return (0, utils_ts_1.bytesToHex)(this.toBytes());\n }\n toString() {\n return this.toHex();\n }\n isTorsionFree() {\n return true;\n }\n isSmallOrder() {\n return false;\n }\n add(other) {\n this.assertSame(other);\n return this.init(this.ep.add(other.ep));\n }\n subtract(other) {\n this.assertSame(other);\n return this.init(this.ep.subtract(other.ep));\n }\n multiply(scalar) {\n return this.init(this.ep.multiply(scalar));\n }\n multiplyUnsafe(scalar) {\n return this.init(this.ep.multiplyUnsafe(scalar));\n }\n double() {\n return this.init(this.ep.double());\n }\n negate() {\n return this.init(this.ep.negate());\n }\n precompute(windowSize, isLazy) {\n return this.init(this.ep.precompute(windowSize, isLazy));\n }\n /** @deprecated use `toBytes` */\n toRawBytes() {\n return this.toBytes();\n }\n}\nexports.PrimeEdwardsPoint = PrimeEdwardsPoint;\n/**\n * Initializes EdDSA signatures over given Edwards curve.\n */\nfunction eddsa(Point, cHash, eddsaOpts = {}) {\n if (typeof cHash !== 'function')\n throw new Error('\"hash\" function param is required');\n (0, utils_ts_1._validateObject)(eddsaOpts, {}, {\n adjustScalarBytes: 'function',\n randomBytes: 'function',\n domain: 'function',\n prehash: 'function',\n mapToCurve: 'function',\n });\n const { prehash } = eddsaOpts;\n const { BASE, Fp, Fn } = Point;\n const randomBytes = eddsaOpts.randomBytes || utils_ts_1.randomBytes;\n const adjustScalarBytes = eddsaOpts.adjustScalarBytes || ((bytes) => bytes);\n const domain = eddsaOpts.domain ||\n ((data, ctx, phflag) => {\n (0, utils_ts_1._abool2)(phflag, 'phflag');\n if (ctx.length || phflag)\n throw new Error('Contexts/pre-hash are not supported');\n return data;\n }); // NOOP\n // Little-endian SHA512 with modulo n\n function modN_LE(hash) {\n return Fn.create((0, utils_ts_1.bytesToNumberLE)(hash)); // Not Fn.fromBytes: it has length limit\n }\n // Get the hashed private scalar per RFC8032 5.1.5\n function getPrivateScalar(key) {\n const len = lengths.secretKey;\n key = (0, utils_ts_1.ensureBytes)('private key', key, len);\n // Hash private key with curve's hash function to produce uniformingly random input\n // Check byte lengths: ensure(64, h(ensure(32, key)))\n const hashed = (0, utils_ts_1.ensureBytes)('hashed private key', cHash(key), 2 * len);\n const head = adjustScalarBytes(hashed.slice(0, len)); // clear first half bits, produce FE\n const prefix = hashed.slice(len, 2 * len); // second half is called key prefix (5.1.6)\n const scalar = modN_LE(head); // The actual private scalar\n return { head, prefix, scalar };\n }\n /** Convenience method that creates public key from scalar. RFC8032 5.1.5 */\n function getExtendedPublicKey(secretKey) {\n const { head, prefix, scalar } = getPrivateScalar(secretKey);\n const point = BASE.multiply(scalar); // Point on Edwards curve aka public key\n const pointBytes = point.toBytes();\n return { head, prefix, scalar, point, pointBytes };\n }\n /** Calculates EdDSA pub key. RFC8032 5.1.5. */\n function getPublicKey(secretKey) {\n return getExtendedPublicKey(secretKey).pointBytes;\n }\n // int('LE', SHA512(dom2(F, C) || msgs)) mod N\n function hashDomainToScalar(context = Uint8Array.of(), ...msgs) {\n const msg = (0, utils_ts_1.concatBytes)(...msgs);\n return modN_LE(cHash(domain(msg, (0, utils_ts_1.ensureBytes)('context', context), !!prehash)));\n }\n /** Signs message with privateKey. RFC8032 5.1.6 */\n function sign(msg, secretKey, options = {}) {\n msg = (0, utils_ts_1.ensureBytes)('message', msg);\n if (prehash)\n msg = prehash(msg); // for ed25519ph etc.\n const { prefix, scalar, pointBytes } = getExtendedPublicKey(secretKey);\n const r = hashDomainToScalar(options.context, prefix, msg); // r = dom2(F, C) || prefix || PH(M)\n const R = BASE.multiply(r).toBytes(); // R = rG\n const k = hashDomainToScalar(options.context, R, pointBytes, msg); // R || A || PH(M)\n const s = Fn.create(r + k * scalar); // S = (r + k * s) mod L\n if (!Fn.isValid(s))\n throw new Error('sign failed: invalid s'); // 0 <= s < L\n const rs = (0, utils_ts_1.concatBytes)(R, Fn.toBytes(s));\n return (0, utils_ts_1._abytes2)(rs, lengths.signature, 'result');\n }\n // verification rule is either zip215 or rfc8032 / nist186-5. Consult fromHex:\n const verifyOpts = { zip215: true };\n /**\n * Verifies EdDSA signature against message and public key. RFC8032 5.1.7.\n * An extended group equation is checked.\n */\n function verify(sig, msg, publicKey, options = verifyOpts) {\n const { context, zip215 } = options;\n const len = lengths.signature;\n sig = (0, utils_ts_1.ensureBytes)('signature', sig, len);\n msg = (0, utils_ts_1.ensureBytes)('message', msg);\n publicKey = (0, utils_ts_1.ensureBytes)('publicKey', publicKey, lengths.publicKey);\n if (zip215 !== undefined)\n (0, utils_ts_1._abool2)(zip215, 'zip215');\n if (prehash)\n msg = prehash(msg); // for ed25519ph, etc\n const mid = len / 2;\n const r = sig.subarray(0, mid);\n const s = (0, utils_ts_1.bytesToNumberLE)(sig.subarray(mid, len));\n let A, R, SB;\n try {\n // zip215=true is good for consensus-critical apps. =false follows RFC8032 / NIST186-5.\n // zip215=true: 0 <= y < MASK (2^256 for ed25519)\n // zip215=false: 0 <= y < P (2^255-19 for ed25519)\n A = Point.fromBytes(publicKey, zip215);\n R = Point.fromBytes(r, zip215);\n SB = BASE.multiplyUnsafe(s); // 0 <= s < l is done inside\n }\n catch (error) {\n return false;\n }\n if (!zip215 && A.isSmallOrder())\n return false; // zip215 allows public keys of small order\n const k = hashDomainToScalar(context, R.toBytes(), A.toBytes(), msg);\n const RkA = R.add(A.multiplyUnsafe(k));\n // Extended group equation\n // [8][S]B = [8]R + [8][k]A'\n return RkA.subtract(SB).clearCofactor().is0();\n }\n const _size = Fp.BYTES; // 32 for ed25519, 57 for ed448\n const lengths = {\n secretKey: _size,\n publicKey: _size,\n signature: 2 * _size,\n seed: _size,\n };\n function randomSecretKey(seed = randomBytes(lengths.seed)) {\n return (0, utils_ts_1._abytes2)(seed, lengths.seed, 'seed');\n }\n function keygen(seed) {\n const secretKey = utils.randomSecretKey(seed);\n return { secretKey, publicKey: getPublicKey(secretKey) };\n }\n function isValidSecretKey(key) {\n return (0, utils_ts_1.isBytes)(key) && key.length === Fn.BYTES;\n }\n function isValidPublicKey(key, zip215) {\n try {\n return !!Point.fromBytes(key, zip215);\n }\n catch (error) {\n return false;\n }\n }\n const utils = {\n getExtendedPublicKey,\n randomSecretKey,\n isValidSecretKey,\n isValidPublicKey,\n /**\n * Converts ed public key to x public key. Uses formula:\n * - ed25519:\n * - `(u, v) = ((1+y)/(1-y), sqrt(-486664)*u/x)`\n * - `(x, y) = (sqrt(-486664)*u/v, (u-1)/(u+1))`\n * - ed448:\n * - `(u, v) = ((y-1)/(y+1), sqrt(156324)*u/x)`\n * - `(x, y) = (sqrt(156324)*u/v, (1+u)/(1-u))`\n */\n toMontgomery(publicKey) {\n const { y } = Point.fromBytes(publicKey);\n const size = lengths.publicKey;\n const is25519 = size === 32;\n if (!is25519 && size !== 57)\n throw new Error('only defined for 25519 and 448');\n const u = is25519 ? Fp.div(_1n + y, _1n - y) : Fp.div(y - _1n, y + _1n);\n return Fp.toBytes(u);\n },\n toMontgomerySecret(secretKey) {\n const size = lengths.secretKey;\n (0, utils_ts_1._abytes2)(secretKey, size);\n const hashed = cHash(secretKey.subarray(0, size));\n return adjustScalarBytes(hashed).subarray(0, size);\n },\n /** @deprecated */\n randomPrivateKey: randomSecretKey,\n /** @deprecated */\n precompute(windowSize = 8, point = Point.BASE) {\n return point.precompute(windowSize, false);\n },\n };\n return Object.freeze({\n keygen,\n getPublicKey,\n sign,\n verify,\n utils,\n Point,\n lengths,\n });\n}\nfunction _eddsa_legacy_opts_to_new(c) {\n const CURVE = {\n a: c.a,\n d: c.d,\n p: c.Fp.ORDER,\n n: c.n,\n h: c.h,\n Gx: c.Gx,\n Gy: c.Gy,\n };\n const Fp = c.Fp;\n const Fn = (0, modular_ts_1.Field)(CURVE.n, c.nBitLength, true);\n const curveOpts = { Fp, Fn, uvRatio: c.uvRatio };\n const eddsaOpts = {\n randomBytes: c.randomBytes,\n adjustScalarBytes: c.adjustScalarBytes,\n domain: c.domain,\n prehash: c.prehash,\n mapToCurve: c.mapToCurve,\n };\n return { CURVE, curveOpts, hash: c.hash, eddsaOpts };\n}\nfunction _eddsa_new_output_to_legacy(c, eddsa) {\n const Point = eddsa.Point;\n const legacy = Object.assign({}, eddsa, {\n ExtendedPoint: Point,\n CURVE: c,\n nBitLength: Point.Fn.BITS,\n nByteLength: Point.Fn.BYTES,\n });\n return legacy;\n}\n// TODO: remove. Use eddsa\nfunction twistedEdwards(c) {\n const { CURVE, curveOpts, hash, eddsaOpts } = _eddsa_legacy_opts_to_new(c);\n const Point = edwards(CURVE, curveOpts);\n const EDDSA = eddsa(Point, hash, eddsaOpts);\n return _eddsa_new_output_to_legacy(c, EDDSA);\n}\n//# sourceMappingURL=edwards.js.map",
|
|
35
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports._DST_scalar = void 0;\nexports.expand_message_xmd = expand_message_xmd;\nexports.expand_message_xof = expand_message_xof;\nexports.hash_to_field = hash_to_field;\nexports.isogenyMap = isogenyMap;\nexports.createHasher = createHasher;\nconst utils_ts_1 = require(\"../utils.js\");\nconst modular_ts_1 = require(\"./modular.js\");\n// Octet Stream to Integer. \"spec\" implementation of os2ip is 2.5x slower vs bytesToNumberBE.\nconst os2ip = utils_ts_1.bytesToNumberBE;\n// Integer to Octet Stream (numberToBytesBE)\nfunction i2osp(value, length) {\n anum(value);\n anum(length);\n if (value < 0 || value >= 1 << (8 * length))\n throw new Error('invalid I2OSP input: ' + value);\n const res = Array.from({ length }).fill(0);\n for (let i = length - 1; i >= 0; i--) {\n res[i] = value & 0xff;\n value >>>= 8;\n }\n return new Uint8Array(res);\n}\nfunction strxor(a, b) {\n const arr = new Uint8Array(a.length);\n for (let i = 0; i < a.length; i++) {\n arr[i] = a[i] ^ b[i];\n }\n return arr;\n}\nfunction anum(item) {\n if (!Number.isSafeInteger(item))\n throw new Error('number expected');\n}\nfunction normDST(DST) {\n if (!(0, utils_ts_1.isBytes)(DST) && typeof DST !== 'string')\n throw new Error('DST must be Uint8Array or string');\n return typeof DST === 'string' ? (0, utils_ts_1.utf8ToBytes)(DST) : DST;\n}\n/**\n * Produces a uniformly random byte string using a cryptographic hash function H that outputs b bits.\n * [RFC 9380 5.3.1](https://www.rfc-editor.org/rfc/rfc9380#section-5.3.1).\n */\nfunction expand_message_xmd(msg, DST, lenInBytes, H) {\n (0, utils_ts_1.abytes)(msg);\n anum(lenInBytes);\n DST = normDST(DST);\n // https://www.rfc-editor.org/rfc/rfc9380#section-5.3.3\n if (DST.length > 255)\n DST = H((0, utils_ts_1.concatBytes)((0, utils_ts_1.utf8ToBytes)('H2C-OVERSIZE-DST-'), DST));\n const { outputLen: b_in_bytes, blockLen: r_in_bytes } = H;\n const ell = Math.ceil(lenInBytes / b_in_bytes);\n if (lenInBytes > 65535 || ell > 255)\n throw new Error('expand_message_xmd: invalid lenInBytes');\n const DST_prime = (0, utils_ts_1.concatBytes)(DST, i2osp(DST.length, 1));\n const Z_pad = i2osp(0, r_in_bytes);\n const l_i_b_str = i2osp(lenInBytes, 2); // len_in_bytes_str\n const b = new Array(ell);\n const b_0 = H((0, utils_ts_1.concatBytes)(Z_pad, msg, l_i_b_str, i2osp(0, 1), DST_prime));\n b[0] = H((0, utils_ts_1.concatBytes)(b_0, i2osp(1, 1), DST_prime));\n for (let i = 1; i <= ell; i++) {\n const args = [strxor(b_0, b[i - 1]), i2osp(i + 1, 1), DST_prime];\n b[i] = H((0, utils_ts_1.concatBytes)(...args));\n }\n const pseudo_random_bytes = (0, utils_ts_1.concatBytes)(...b);\n return pseudo_random_bytes.slice(0, lenInBytes);\n}\n/**\n * Produces a uniformly random byte string using an extendable-output function (XOF) H.\n * 1. The collision resistance of H MUST be at least k bits.\n * 2. H MUST be an XOF that has been proved indifferentiable from\n * a random oracle under a reasonable cryptographic assumption.\n * [RFC 9380 5.3.2](https://www.rfc-editor.org/rfc/rfc9380#section-5.3.2).\n */\nfunction expand_message_xof(msg, DST, lenInBytes, k, H) {\n (0, utils_ts_1.abytes)(msg);\n anum(lenInBytes);\n DST = normDST(DST);\n // https://www.rfc-editor.org/rfc/rfc9380#section-5.3.3\n // DST = H('H2C-OVERSIZE-DST-' || a_very_long_DST, Math.ceil((lenInBytes * k) / 8));\n if (DST.length > 255) {\n const dkLen = Math.ceil((2 * k) / 8);\n DST = H.create({ dkLen }).update((0, utils_ts_1.utf8ToBytes)('H2C-OVERSIZE-DST-')).update(DST).digest();\n }\n if (lenInBytes > 65535 || DST.length > 255)\n throw new Error('expand_message_xof: invalid lenInBytes');\n return (H.create({ dkLen: lenInBytes })\n .update(msg)\n .update(i2osp(lenInBytes, 2))\n // 2. DST_prime = DST || I2OSP(len(DST), 1)\n .update(DST)\n .update(i2osp(DST.length, 1))\n .digest());\n}\n/**\n * Hashes arbitrary-length byte strings to a list of one or more elements of a finite field F.\n * [RFC 9380 5.2](https://www.rfc-editor.org/rfc/rfc9380#section-5.2).\n * @param msg a byte string containing the message to hash\n * @param count the number of elements of F to output\n * @param options `{DST: string, p: bigint, m: number, k: number, expand: 'xmd' | 'xof', hash: H}`, see above\n * @returns [u_0, ..., u_(count - 1)], a list of field elements.\n */\nfunction hash_to_field(msg, count, options) {\n (0, utils_ts_1._validateObject)(options, {\n p: 'bigint',\n m: 'number',\n k: 'number',\n hash: 'function',\n });\n const { p, k, m, hash, expand, DST } = options;\n if (!(0, utils_ts_1.isHash)(options.hash))\n throw new Error('expected valid hash');\n (0, utils_ts_1.abytes)(msg);\n anum(count);\n const log2p = p.toString(2).length;\n const L = Math.ceil((log2p + k) / 8); // section 5.1 of ietf draft link above\n const len_in_bytes = count * m * L;\n let prb; // pseudo_random_bytes\n if (expand === 'xmd') {\n prb = expand_message_xmd(msg, DST, len_in_bytes, hash);\n }\n else if (expand === 'xof') {\n prb = expand_message_xof(msg, DST, len_in_bytes, k, hash);\n }\n else if (expand === '_internal_pass') {\n // for internal tests only\n prb = msg;\n }\n else {\n throw new Error('expand must be \"xmd\" or \"xof\"');\n }\n const u = new Array(count);\n for (let i = 0; i < count; i++) {\n const e = new Array(m);\n for (let j = 0; j < m; j++) {\n const elm_offset = L * (j + i * m);\n const tv = prb.subarray(elm_offset, elm_offset + L);\n e[j] = (0, modular_ts_1.mod)(os2ip(tv), p);\n }\n u[i] = e;\n }\n return u;\n}\nfunction isogenyMap(field, map) {\n // Make same order as in spec\n const coeff = map.map((i) => Array.from(i).reverse());\n return (x, y) => {\n const [xn, xd, yn, yd] = coeff.map((val) => val.reduce((acc, i) => field.add(field.mul(acc, x), i)));\n // 6.6.3\n // Exceptional cases of iso_map are inputs that cause the denominator of\n // either rational function to evaluate to zero; such cases MUST return\n // the identity point on E.\n const [xd_inv, yd_inv] = (0, modular_ts_1.FpInvertBatch)(field, [xd, yd], true);\n x = field.mul(xn, xd_inv); // xNum / xDen\n y = field.mul(y, field.mul(yn, yd_inv)); // y * (yNum / yDev)\n return { x, y };\n };\n}\nexports._DST_scalar = (0, utils_ts_1.utf8ToBytes)('HashToScalar-');\n/** Creates hash-to-curve methods from EC Point and mapToCurve function. See {@link H2CHasher}. */\nfunction createHasher(Point, mapToCurve, defaults) {\n if (typeof mapToCurve !== 'function')\n throw new Error('mapToCurve() must be defined');\n function map(num) {\n return Point.fromAffine(mapToCurve(num));\n }\n function clear(initial) {\n const P = initial.clearCofactor();\n if (P.equals(Point.ZERO))\n return Point.ZERO; // zero will throw in assert\n P.assertValidity();\n return P;\n }\n return {\n defaults,\n hashToCurve(msg, options) {\n const opts = Object.assign({}, defaults, options);\n const u = hash_to_field(msg, 2, opts);\n const u0 = map(u[0]);\n const u1 = map(u[1]);\n return clear(u0.add(u1));\n },\n encodeToCurve(msg, options) {\n const optsDst = defaults.encodeDST ? { DST: defaults.encodeDST } : {};\n const opts = Object.assign({}, defaults, optsDst, options);\n const u = hash_to_field(msg, 1, opts);\n const u0 = map(u[0]);\n return clear(u0);\n },\n /** See {@link H2CHasher} */\n mapToCurve(scalars) {\n if (!Array.isArray(scalars))\n throw new Error('expected array of bigints');\n for (const i of scalars)\n if (typeof i !== 'bigint')\n throw new Error('expected array of bigints');\n return clear(map(scalars));\n },\n // hash_to_scalar can produce 0: https://www.rfc-editor.org/errata/eid8393\n // RFC 9380, draft-irtf-cfrg-bbs-signatures-08\n hashToScalar(msg, options) {\n // @ts-ignore\n const N = Point.Fn.ORDER;\n const opts = Object.assign({}, defaults, { p: N, m: 1, DST: exports._DST_scalar }, options);\n return hash_to_field(msg, 1, opts)[0][0];\n },\n };\n}\n//# sourceMappingURL=hash-to-curve.js.map",
|
|
36
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.montgomery = montgomery;\n/**\n * Montgomery curve methods. It's not really whole montgomery curve,\n * just bunch of very specific methods for X25519 / X448 from\n * [RFC 7748](https://www.rfc-editor.org/rfc/rfc7748)\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst utils_ts_1 = require(\"../utils.js\");\nconst modular_ts_1 = require(\"./modular.js\");\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nfunction validateOpts(curve) {\n (0, utils_ts_1._validateObject)(curve, {\n adjustScalarBytes: 'function',\n powPminus2: 'function',\n });\n return Object.freeze({ ...curve });\n}\nfunction montgomery(curveDef) {\n const CURVE = validateOpts(curveDef);\n const { P, type, adjustScalarBytes, powPminus2, randomBytes: rand } = CURVE;\n const is25519 = type === 'x25519';\n if (!is25519 && type !== 'x448')\n throw new Error('invalid type');\n const randomBytes_ = rand || utils_ts_1.randomBytes;\n const montgomeryBits = is25519 ? 255 : 448;\n const fieldLen = is25519 ? 32 : 56;\n const Gu = is25519 ? BigInt(9) : BigInt(5);\n // RFC 7748 #5:\n // The constant a24 is (486662 - 2) / 4 = 121665 for curve25519/X25519 and\n // (156326 - 2) / 4 = 39081 for curve448/X448\n // const a = is25519 ? 156326n : 486662n;\n const a24 = is25519 ? BigInt(121665) : BigInt(39081);\n // RFC: x25519 \"the resulting integer is of the form 2^254 plus\n // eight times a value between 0 and 2^251 - 1 (inclusive)\"\n // x448: \"2^447 plus four times a value between 0 and 2^445 - 1 (inclusive)\"\n const minScalar = is25519 ? _2n ** BigInt(254) : _2n ** BigInt(447);\n const maxAdded = is25519\n ? BigInt(8) * _2n ** BigInt(251) - _1n\n : BigInt(4) * _2n ** BigInt(445) - _1n;\n const maxScalar = minScalar + maxAdded + _1n; // (inclusive)\n const modP = (n) => (0, modular_ts_1.mod)(n, P);\n const GuBytes = encodeU(Gu);\n function encodeU(u) {\n return (0, utils_ts_1.numberToBytesLE)(modP(u), fieldLen);\n }\n function decodeU(u) {\n const _u = (0, utils_ts_1.ensureBytes)('u coordinate', u, fieldLen);\n // RFC: When receiving such an array, implementations of X25519\n // (but not X448) MUST mask the most significant bit in the final byte.\n if (is25519)\n _u[31] &= 127; // 0b0111_1111\n // RFC: Implementations MUST accept non-canonical values and process them as\n // if they had been reduced modulo the field prime. The non-canonical\n // values are 2^255 - 19 through 2^255 - 1 for X25519 and 2^448 - 2^224\n // - 1 through 2^448 - 1 for X448.\n return modP((0, utils_ts_1.bytesToNumberLE)(_u));\n }\n function decodeScalar(scalar) {\n return (0, utils_ts_1.bytesToNumberLE)(adjustScalarBytes((0, utils_ts_1.ensureBytes)('scalar', scalar, fieldLen)));\n }\n function scalarMult(scalar, u) {\n const pu = montgomeryLadder(decodeU(u), decodeScalar(scalar));\n // Some public keys are useless, of low-order. Curve author doesn't think\n // it needs to be validated, but we do it nonetheless.\n // https://cr.yp.to/ecdh.html#validate\n if (pu === _0n)\n throw new Error('invalid private or public key received');\n return encodeU(pu);\n }\n // Computes public key from private. By doing scalar multiplication of base point.\n function scalarMultBase(scalar) {\n return scalarMult(scalar, GuBytes);\n }\n // cswap from RFC7748 \"example code\"\n function cswap(swap, x_2, x_3) {\n // dummy = mask(swap) AND (x_2 XOR x_3)\n // Where mask(swap) is the all-1 or all-0 word of the same length as x_2\n // and x_3, computed, e.g., as mask(swap) = 0 - swap.\n const dummy = modP(swap * (x_2 - x_3));\n x_2 = modP(x_2 - dummy); // x_2 = x_2 XOR dummy\n x_3 = modP(x_3 + dummy); // x_3 = x_3 XOR dummy\n return { x_2, x_3 };\n }\n /**\n * Montgomery x-only multiplication ladder.\n * @param pointU u coordinate (x) on Montgomery Curve 25519\n * @param scalar by which the point would be multiplied\n * @returns new Point on Montgomery curve\n */\n function montgomeryLadder(u, scalar) {\n (0, utils_ts_1.aInRange)('u', u, _0n, P);\n (0, utils_ts_1.aInRange)('scalar', scalar, minScalar, maxScalar);\n const k = scalar;\n const x_1 = u;\n let x_2 = _1n;\n let z_2 = _0n;\n let x_3 = u;\n let z_3 = _1n;\n let swap = _0n;\n for (let t = BigInt(montgomeryBits - 1); t >= _0n; t--) {\n const k_t = (k >> t) & _1n;\n swap ^= k_t;\n ({ x_2, x_3 } = cswap(swap, x_2, x_3));\n ({ x_2: z_2, x_3: z_3 } = cswap(swap, z_2, z_3));\n swap = k_t;\n const A = x_2 + z_2;\n const AA = modP(A * A);\n const B = x_2 - z_2;\n const BB = modP(B * B);\n const E = AA - BB;\n const C = x_3 + z_3;\n const D = x_3 - z_3;\n const DA = modP(D * A);\n const CB = modP(C * B);\n const dacb = DA + CB;\n const da_cb = DA - CB;\n x_3 = modP(dacb * dacb);\n z_3 = modP(x_1 * modP(da_cb * da_cb));\n x_2 = modP(AA * BB);\n z_2 = modP(E * (AA + modP(a24 * E)));\n }\n ({ x_2, x_3 } = cswap(swap, x_2, x_3));\n ({ x_2: z_2, x_3: z_3 } = cswap(swap, z_2, z_3));\n const z2 = powPminus2(z_2); // `Fp.pow(x, P - _2n)` is much slower equivalent\n return modP(x_2 * z2); // Return x_2 * (z_2^(p - 2))\n }\n const lengths = {\n secretKey: fieldLen,\n publicKey: fieldLen,\n seed: fieldLen,\n };\n const randomSecretKey = (seed = randomBytes_(fieldLen)) => {\n (0, utils_ts_1.abytes)(seed, lengths.seed);\n return seed;\n };\n function keygen(seed) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: scalarMultBase(secretKey) };\n }\n const utils = {\n randomSecretKey,\n randomPrivateKey: randomSecretKey,\n };\n return {\n keygen,\n getSharedSecret: (secretKey, publicKey) => scalarMult(secretKey, publicKey),\n getPublicKey: (secretKey) => scalarMultBase(secretKey),\n scalarMult,\n scalarMultBase,\n utils,\n GuBytes: GuBytes.slice(),\n lengths,\n };\n}\n//# sourceMappingURL=montgomery.js.map",
|
|
37
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hash_to_ristretto255 = exports.hashToRistretto255 = exports.encodeToCurve = exports.hashToCurve = exports.RistrettoPoint = exports.edwardsToMontgomery = exports.ED25519_TORSION_SUBGROUP = exports.ristretto255_hasher = exports.ristretto255 = exports.ed25519_hasher = exports.x25519 = exports.ed25519ph = exports.ed25519ctx = exports.ed25519 = void 0;\nexports.edwardsToMontgomeryPub = edwardsToMontgomeryPub;\nexports.edwardsToMontgomeryPriv = edwardsToMontgomeryPriv;\n/**\n * ed25519 Twisted Edwards curve with following addons:\n * - X25519 ECDH\n * - Ristretto cofactor elimination\n * - Elligator hash-to-group / point indistinguishability\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst sha2_js_1 = require(\"@noble/hashes/sha2.js\");\nconst utils_js_1 = require(\"@noble/hashes/utils.js\");\nconst curve_ts_1 = require(\"./abstract/curve.js\");\nconst edwards_ts_1 = require(\"./abstract/edwards.js\");\nconst hash_to_curve_ts_1 = require(\"./abstract/hash-to-curve.js\");\nconst modular_ts_1 = require(\"./abstract/modular.js\");\nconst montgomery_ts_1 = require(\"./abstract/montgomery.js\");\nconst utils_ts_1 = require(\"./utils.js\");\n// prettier-ignore\nconst _0n = /* @__PURE__ */ BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3);\n// prettier-ignore\nconst _5n = BigInt(5), _8n = BigInt(8);\n// P = 2n**255n-19n\nconst ed25519_CURVE_p = BigInt('0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed');\n// N = 2n**252n + 27742317777372353535851937790883648493n\n// a = Fp.create(BigInt(-1))\n// d = -121665/121666 a.k.a. Fp.neg(121665 * Fp.inv(121666))\nconst ed25519_CURVE = /* @__PURE__ */ (() => ({\n p: ed25519_CURVE_p,\n n: BigInt('0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed'),\n h: _8n,\n a: BigInt('0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec'),\n d: BigInt('0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3'),\n Gx: BigInt('0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a'),\n Gy: BigInt('0x6666666666666666666666666666666666666666666666666666666666666658'),\n}))();\nfunction ed25519_pow_2_252_3(x) {\n // prettier-ignore\n const _10n = BigInt(10), _20n = BigInt(20), _40n = BigInt(40), _80n = BigInt(80);\n const P = ed25519_CURVE_p;\n const x2 = (x * x) % P;\n const b2 = (x2 * x) % P; // x^3, 11\n const b4 = ((0, modular_ts_1.pow2)(b2, _2n, P) * b2) % P; // x^15, 1111\n const b5 = ((0, modular_ts_1.pow2)(b4, _1n, P) * x) % P; // x^31\n const b10 = ((0, modular_ts_1.pow2)(b5, _5n, P) * b5) % P;\n const b20 = ((0, modular_ts_1.pow2)(b10, _10n, P) * b10) % P;\n const b40 = ((0, modular_ts_1.pow2)(b20, _20n, P) * b20) % P;\n const b80 = ((0, modular_ts_1.pow2)(b40, _40n, P) * b40) % P;\n const b160 = ((0, modular_ts_1.pow2)(b80, _80n, P) * b80) % P;\n const b240 = ((0, modular_ts_1.pow2)(b160, _80n, P) * b80) % P;\n const b250 = ((0, modular_ts_1.pow2)(b240, _10n, P) * b10) % P;\n const pow_p_5_8 = ((0, modular_ts_1.pow2)(b250, _2n, P) * x) % P;\n // ^ To pow to (p+3)/8, multiply it by x.\n return { pow_p_5_8, b2 };\n}\nfunction adjustScalarBytes(bytes) {\n // Section 5: For X25519, in order to decode 32 random bytes as an integer scalar,\n // set the three least significant bits of the first byte\n bytes[0] &= 248; // 0b1111_1000\n // and the most significant bit of the last to zero,\n bytes[31] &= 127; // 0b0111_1111\n // set the second most significant bit of the last byte to 1\n bytes[31] |= 64; // 0b0100_0000\n return bytes;\n}\n// √(-1) aka √(a) aka 2^((p-1)/4)\n// Fp.sqrt(Fp.neg(1))\nconst ED25519_SQRT_M1 = /* @__PURE__ */ BigInt('19681161376707505956807079304988542015446066515923890162744021073123829784752');\n// sqrt(u/v)\nfunction uvRatio(u, v) {\n const P = ed25519_CURVE_p;\n const v3 = (0, modular_ts_1.mod)(v * v * v, P); // v³\n const v7 = (0, modular_ts_1.mod)(v3 * v3 * v, P); // v⁷\n // (p+3)/8 and (p-5)/8\n const pow = ed25519_pow_2_252_3(u * v7).pow_p_5_8;\n let x = (0, modular_ts_1.mod)(u * v3 * pow, P); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = (0, modular_ts_1.mod)(v * x * x, P); // vx²\n const root1 = x; // First root candidate\n const root2 = (0, modular_ts_1.mod)(x * ED25519_SQRT_M1, P); // Second root candidate\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === (0, modular_ts_1.mod)(-u, P); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === (0, modular_ts_1.mod)(-u * ED25519_SQRT_M1, P); // There is no valid root, vx² = -u√(-1)\n if (useRoot1)\n x = root1;\n if (useRoot2 || noRoot)\n x = root2; // We return root2 anyway, for const-time\n if ((0, modular_ts_1.isNegativeLE)(x, P))\n x = (0, modular_ts_1.mod)(-x, P);\n return { isValid: useRoot1 || useRoot2, value: x };\n}\nconst Fp = /* @__PURE__ */ (() => (0, modular_ts_1.Field)(ed25519_CURVE.p, { isLE: true }))();\nconst Fn = /* @__PURE__ */ (() => (0, modular_ts_1.Field)(ed25519_CURVE.n, { isLE: true }))();\nconst ed25519Defaults = /* @__PURE__ */ (() => ({\n ...ed25519_CURVE,\n Fp,\n hash: sha2_js_1.sha512,\n adjustScalarBytes,\n // dom2\n // Ratio of u to v. Allows us to combine inversion and square root. Uses algo from RFC8032 5.1.3.\n // Constant-time, u/√v\n uvRatio,\n}))();\n/**\n * ed25519 curve with EdDSA signatures.\n * @example\n * import { ed25519 } from '@noble/curves/ed25519';\n * const { secretKey, publicKey } = ed25519.keygen();\n * const msg = new TextEncoder().encode('hello');\n * const sig = ed25519.sign(msg, priv);\n * ed25519.verify(sig, msg, pub); // Default mode: follows ZIP215\n * ed25519.verify(sig, msg, pub, { zip215: false }); // RFC8032 / FIPS 186-5\n */\nexports.ed25519 = (() => (0, edwards_ts_1.twistedEdwards)(ed25519Defaults))();\nfunction ed25519_domain(data, ctx, phflag) {\n if (ctx.length > 255)\n throw new Error('Context is too big');\n return (0, utils_js_1.concatBytes)((0, utils_js_1.utf8ToBytes)('SigEd25519 no Ed25519 collisions'), new Uint8Array([phflag ? 1 : 0, ctx.length]), ctx, data);\n}\n/** Context of ed25519. Uses context for domain separation. */\nexports.ed25519ctx = (() => (0, edwards_ts_1.twistedEdwards)({\n ...ed25519Defaults,\n domain: ed25519_domain,\n}))();\n/** Prehashed version of ed25519. Accepts already-hashed messages in sign() and verify(). */\nexports.ed25519ph = (() => (0, edwards_ts_1.twistedEdwards)(Object.assign({}, ed25519Defaults, {\n domain: ed25519_domain,\n prehash: sha2_js_1.sha512,\n})))();\n/**\n * ECDH using curve25519 aka x25519.\n * @example\n * import { x25519 } from '@noble/curves/ed25519';\n * const priv = 'a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4';\n * const pub = 'e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c';\n * x25519.getSharedSecret(priv, pub) === x25519.scalarMult(priv, pub); // aliases\n * x25519.getPublicKey(priv) === x25519.scalarMultBase(priv);\n * x25519.getPublicKey(x25519.utils.randomSecretKey());\n */\nexports.x25519 = (() => {\n const P = Fp.ORDER;\n return (0, montgomery_ts_1.montgomery)({\n P,\n type: 'x25519',\n powPminus2: (x) => {\n // x^(p-2) aka x^(2^255-21)\n const { pow_p_5_8, b2 } = ed25519_pow_2_252_3(x);\n return (0, modular_ts_1.mod)((0, modular_ts_1.pow2)(pow_p_5_8, _3n, P) * b2, P);\n },\n adjustScalarBytes,\n });\n})();\n// Hash To Curve Elligator2 Map (NOTE: different from ristretto255 elligator)\n// NOTE: very important part is usage of FpSqrtEven for ELL2_C1_EDWARDS, since\n// SageMath returns different root first and everything falls apart\nconst ELL2_C1 = /* @__PURE__ */ (() => (ed25519_CURVE_p + _3n) / _8n)(); // 1. c1 = (q + 3) / 8 # Integer arithmetic\nconst ELL2_C2 = /* @__PURE__ */ (() => Fp.pow(_2n, ELL2_C1))(); // 2. c2 = 2^c1\nconst ELL2_C3 = /* @__PURE__ */ (() => Fp.sqrt(Fp.neg(Fp.ONE)))(); // 3. c3 = sqrt(-1)\n// prettier-ignore\nfunction map_to_curve_elligator2_curve25519(u) {\n const ELL2_C4 = (ed25519_CURVE_p - _5n) / _8n; // 4. c4 = (q - 5) / 8 # Integer arithmetic\n const ELL2_J = BigInt(486662);\n let tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, _2n); // 2. tv1 = 2 * tv1\n let xd = Fp.add(tv1, Fp.ONE); // 3. xd = tv1 + 1 # Nonzero: -1 is square (mod p), tv1 is not\n let x1n = Fp.neg(ELL2_J); // 4. x1n = -J # x1 = x1n / xd = -J / (1 + 2 * u^2)\n let tv2 = Fp.sqr(xd); // 5. tv2 = xd^2\n let gxd = Fp.mul(tv2, xd); // 6. gxd = tv2 * xd # gxd = xd^3\n let gx1 = Fp.mul(tv1, ELL2_J); // 7. gx1 = J * tv1 # x1n + J * xd\n gx1 = Fp.mul(gx1, x1n); // 8. gx1 = gx1 * x1n # x1n^2 + J * x1n * xd\n gx1 = Fp.add(gx1, tv2); // 9. gx1 = gx1 + tv2 # x1n^2 + J * x1n * xd + xd^2\n gx1 = Fp.mul(gx1, x1n); // 10. gx1 = gx1 * x1n # x1n^3 + J * x1n^2 * xd + x1n * xd^2\n let tv3 = Fp.sqr(gxd); // 11. tv3 = gxd^2\n tv2 = Fp.sqr(tv3); // 12. tv2 = tv3^2 # gxd^4\n tv3 = Fp.mul(tv3, gxd); // 13. tv3 = tv3 * gxd # gxd^3\n tv3 = Fp.mul(tv3, gx1); // 14. tv3 = tv3 * gx1 # gx1 * gxd^3\n tv2 = Fp.mul(tv2, tv3); // 15. tv2 = tv2 * tv3 # gx1 * gxd^7\n let y11 = Fp.pow(tv2, ELL2_C4); // 16. y11 = tv2^c4 # (gx1 * gxd^7)^((p - 5) / 8)\n y11 = Fp.mul(y11, tv3); // 17. y11 = y11 * tv3 # gx1*gxd^3*(gx1*gxd^7)^((p-5)/8)\n let y12 = Fp.mul(y11, ELL2_C3); // 18. y12 = y11 * c3\n tv2 = Fp.sqr(y11); // 19. tv2 = y11^2\n tv2 = Fp.mul(tv2, gxd); // 20. tv2 = tv2 * gxd\n let e1 = Fp.eql(tv2, gx1); // 21. e1 = tv2 == gx1\n let y1 = Fp.cmov(y12, y11, e1); // 22. y1 = CMOV(y12, y11, e1) # If g(x1) is square, this is its sqrt\n let x2n = Fp.mul(x1n, tv1); // 23. x2n = x1n * tv1 # x2 = x2n / xd = 2 * u^2 * x1n / xd\n let y21 = Fp.mul(y11, u); // 24. y21 = y11 * u\n y21 = Fp.mul(y21, ELL2_C2); // 25. y21 = y21 * c2\n let y22 = Fp.mul(y21, ELL2_C3); // 26. y22 = y21 * c3\n let gx2 = Fp.mul(gx1, tv1); // 27. gx2 = gx1 * tv1 # g(x2) = gx2 / gxd = 2 * u^2 * g(x1)\n tv2 = Fp.sqr(y21); // 28. tv2 = y21^2\n tv2 = Fp.mul(tv2, gxd); // 29. tv2 = tv2 * gxd\n let e2 = Fp.eql(tv2, gx2); // 30. e2 = tv2 == gx2\n let y2 = Fp.cmov(y22, y21, e2); // 31. y2 = CMOV(y22, y21, e2) # If g(x2) is square, this is its sqrt\n tv2 = Fp.sqr(y1); // 32. tv2 = y1^2\n tv2 = Fp.mul(tv2, gxd); // 33. tv2 = tv2 * gxd\n let e3 = Fp.eql(tv2, gx1); // 34. e3 = tv2 == gx1\n let xn = Fp.cmov(x2n, x1n, e3); // 35. xn = CMOV(x2n, x1n, e3) # If e3, x = x1, else x = x2\n let y = Fp.cmov(y2, y1, e3); // 36. y = CMOV(y2, y1, e3) # If e3, y = y1, else y = y2\n let e4 = Fp.isOdd(y); // 37. e4 = sgn0(y) == 1 # Fix sign of y\n y = Fp.cmov(y, Fp.neg(y), e3 !== e4); // 38. y = CMOV(y, -y, e3 XOR e4)\n return { xMn: xn, xMd: xd, yMn: y, yMd: _1n }; // 39. return (xn, xd, y, 1)\n}\nconst ELL2_C1_EDWARDS = /* @__PURE__ */ (() => (0, modular_ts_1.FpSqrtEven)(Fp, Fp.neg(BigInt(486664))))(); // sgn0(c1) MUST equal 0\nfunction map_to_curve_elligator2_edwards25519(u) {\n const { xMn, xMd, yMn, yMd } = map_to_curve_elligator2_curve25519(u); // 1. (xMn, xMd, yMn, yMd) =\n // map_to_curve_elligator2_curve25519(u)\n let xn = Fp.mul(xMn, yMd); // 2. xn = xMn * yMd\n xn = Fp.mul(xn, ELL2_C1_EDWARDS); // 3. xn = xn * c1\n let xd = Fp.mul(xMd, yMn); // 4. xd = xMd * yMn # xn / xd = c1 * xM / yM\n let yn = Fp.sub(xMn, xMd); // 5. yn = xMn - xMd\n let yd = Fp.add(xMn, xMd); // 6. yd = xMn + xMd # (n / d - 1) / (n / d + 1) = (n - d) / (n + d)\n let tv1 = Fp.mul(xd, yd); // 7. tv1 = xd * yd\n let e = Fp.eql(tv1, Fp.ZERO); // 8. e = tv1 == 0\n xn = Fp.cmov(xn, Fp.ZERO, e); // 9. xn = CMOV(xn, 0, e)\n xd = Fp.cmov(xd, Fp.ONE, e); // 10. xd = CMOV(xd, 1, e)\n yn = Fp.cmov(yn, Fp.ONE, e); // 11. yn = CMOV(yn, 1, e)\n yd = Fp.cmov(yd, Fp.ONE, e); // 12. yd = CMOV(yd, 1, e)\n const [xd_inv, yd_inv] = (0, modular_ts_1.FpInvertBatch)(Fp, [xd, yd], true); // batch division\n return { x: Fp.mul(xn, xd_inv), y: Fp.mul(yn, yd_inv) }; // 13. return (xn, xd, yn, yd)\n}\n/** Hashing to ed25519 points / field. RFC 9380 methods. */\nexports.ed25519_hasher = (() => (0, hash_to_curve_ts_1.createHasher)(exports.ed25519.Point, (scalars) => map_to_curve_elligator2_edwards25519(scalars[0]), {\n DST: 'edwards25519_XMD:SHA-512_ELL2_RO_',\n encodeDST: 'edwards25519_XMD:SHA-512_ELL2_NU_',\n p: ed25519_CURVE_p,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha2_js_1.sha512,\n}))();\n// √(-1) aka √(a) aka 2^((p-1)/4)\nconst SQRT_M1 = ED25519_SQRT_M1;\n// √(ad - 1)\nconst SQRT_AD_MINUS_ONE = /* @__PURE__ */ BigInt('25063068953384623474111414158702152701244531502492656460079210482610430750235');\n// 1 / √(a-d)\nconst INVSQRT_A_MINUS_D = /* @__PURE__ */ BigInt('54469307008909316920995813868745141605393597292927456921205312896311721017578');\n// 1-d²\nconst ONE_MINUS_D_SQ = /* @__PURE__ */ BigInt('1159843021668779879193775521855586647937357759715417654439879720876111806838');\n// (d-1)²\nconst D_MINUS_ONE_SQ = /* @__PURE__ */ BigInt('40440834346308536858101042469323190826248399146238708352240133220865137265952');\n// Calculates 1/√(number)\nconst invertSqrt = (number) => uvRatio(_1n, number);\nconst MAX_255B = /* @__PURE__ */ BigInt('0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff');\nconst bytes255ToNumberLE = (bytes) => exports.ed25519.Point.Fp.create((0, utils_ts_1.bytesToNumberLE)(bytes) & MAX_255B);\n/**\n * Computes Elligator map for Ristretto255.\n * Described in [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#appendix-B) and on\n * the [website](https://ristretto.group/formulas/elligator.html).\n */\nfunction calcElligatorRistrettoMap(r0) {\n const { d } = ed25519_CURVE;\n const P = ed25519_CURVE_p;\n const mod = (n) => Fp.create(n);\n const r = mod(SQRT_M1 * r0 * r0); // 1\n const Ns = mod((r + _1n) * ONE_MINUS_D_SQ); // 2\n let c = BigInt(-1); // 3\n const D = mod((c - d * r) * mod(r + d)); // 4\n let { isValid: Ns_D_is_sq, value: s } = uvRatio(Ns, D); // 5\n let s_ = mod(s * r0); // 6\n if (!(0, modular_ts_1.isNegativeLE)(s_, P))\n s_ = mod(-s_);\n if (!Ns_D_is_sq)\n s = s_; // 7\n if (!Ns_D_is_sq)\n c = r; // 8\n const Nt = mod(c * (r - _1n) * D_MINUS_ONE_SQ - D); // 9\n const s2 = s * s;\n const W0 = mod((s + s) * D); // 10\n const W1 = mod(Nt * SQRT_AD_MINUS_ONE); // 11\n const W2 = mod(_1n - s2); // 12\n const W3 = mod(_1n + s2); // 13\n return new exports.ed25519.Point(mod(W0 * W3), mod(W2 * W1), mod(W1 * W3), mod(W0 * W2));\n}\nfunction ristretto255_map(bytes) {\n (0, utils_js_1.abytes)(bytes, 64);\n const r1 = bytes255ToNumberLE(bytes.subarray(0, 32));\n const R1 = calcElligatorRistrettoMap(r1);\n const r2 = bytes255ToNumberLE(bytes.subarray(32, 64));\n const R2 = calcElligatorRistrettoMap(r2);\n return new _RistrettoPoint(R1.add(R2));\n}\n/**\n * Wrapper over Edwards Point for ristretto255.\n *\n * Each ed25519/ExtendedPoint has 8 different equivalent points. This can be\n * a source of bugs for protocols like ring signatures. Ristretto was created to solve this.\n * Ristretto point operates in X:Y:Z:T extended coordinates like ExtendedPoint,\n * but it should work in its own namespace: do not combine those two.\n * See [RFC9496](https://www.rfc-editor.org/rfc/rfc9496).\n */\nclass _RistrettoPoint extends edwards_ts_1.PrimeEdwardsPoint {\n constructor(ep) {\n super(ep);\n }\n static fromAffine(ap) {\n return new _RistrettoPoint(exports.ed25519.Point.fromAffine(ap));\n }\n assertSame(other) {\n if (!(other instanceof _RistrettoPoint))\n throw new Error('RistrettoPoint expected');\n }\n init(ep) {\n return new _RistrettoPoint(ep);\n }\n /** @deprecated use `import { ristretto255_hasher } from '@noble/curves/ed25519.js';` */\n static hashToCurve(hex) {\n return ristretto255_map((0, utils_ts_1.ensureBytes)('ristrettoHash', hex, 64));\n }\n static fromBytes(bytes) {\n (0, utils_js_1.abytes)(bytes, 32);\n const { a, d } = ed25519_CURVE;\n const P = ed25519_CURVE_p;\n const mod = (n) => Fp.create(n);\n const s = bytes255ToNumberLE(bytes);\n // 1. Check that s_bytes is the canonical encoding of a field element, or else abort.\n // 3. Check that s is non-negative, or else abort\n if (!(0, utils_ts_1.equalBytes)(Fp.toBytes(s), bytes) || (0, modular_ts_1.isNegativeLE)(s, P))\n throw new Error('invalid ristretto255 encoding 1');\n const s2 = mod(s * s);\n const u1 = mod(_1n + a * s2); // 4 (a is -1)\n const u2 = mod(_1n - a * s2); // 5\n const u1_2 = mod(u1 * u1);\n const u2_2 = mod(u2 * u2);\n const v = mod(a * d * u1_2 - u2_2); // 6\n const { isValid, value: I } = invertSqrt(mod(v * u2_2)); // 7\n const Dx = mod(I * u2); // 8\n const Dy = mod(I * Dx * v); // 9\n let x = mod((s + s) * Dx); // 10\n if ((0, modular_ts_1.isNegativeLE)(x, P))\n x = mod(-x); // 10\n const y = mod(u1 * Dy); // 11\n const t = mod(x * y); // 12\n if (!isValid || (0, modular_ts_1.isNegativeLE)(t, P) || y === _0n)\n throw new Error('invalid ristretto255 encoding 2');\n return new _RistrettoPoint(new exports.ed25519.Point(x, y, _1n, t));\n }\n /**\n * Converts ristretto-encoded string to ristretto point.\n * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-decode).\n * @param hex Ristretto-encoded 32 bytes. Not every 32-byte string is valid ristretto encoding\n */\n static fromHex(hex) {\n return _RistrettoPoint.fromBytes((0, utils_ts_1.ensureBytes)('ristrettoHex', hex, 32));\n }\n static msm(points, scalars) {\n return (0, curve_ts_1.pippenger)(_RistrettoPoint, exports.ed25519.Point.Fn, points, scalars);\n }\n /**\n * Encodes ristretto point to Uint8Array.\n * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-encode).\n */\n toBytes() {\n let { X, Y, Z, T } = this.ep;\n const P = ed25519_CURVE_p;\n const mod = (n) => Fp.create(n);\n const u1 = mod(mod(Z + Y) * mod(Z - Y)); // 1\n const u2 = mod(X * Y); // 2\n // Square root always exists\n const u2sq = mod(u2 * u2);\n const { value: invsqrt } = invertSqrt(mod(u1 * u2sq)); // 3\n const D1 = mod(invsqrt * u1); // 4\n const D2 = mod(invsqrt * u2); // 5\n const zInv = mod(D1 * D2 * T); // 6\n let D; // 7\n if ((0, modular_ts_1.isNegativeLE)(T * zInv, P)) {\n let _x = mod(Y * SQRT_M1);\n let _y = mod(X * SQRT_M1);\n X = _x;\n Y = _y;\n D = mod(D1 * INVSQRT_A_MINUS_D);\n }\n else {\n D = D2; // 8\n }\n if ((0, modular_ts_1.isNegativeLE)(X * zInv, P))\n Y = mod(-Y); // 9\n let s = mod((Z - Y) * D); // 10 (check footer's note, no sqrt(-a))\n if ((0, modular_ts_1.isNegativeLE)(s, P))\n s = mod(-s);\n return Fp.toBytes(s); // 11\n }\n /**\n * Compares two Ristretto points.\n * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-equals).\n */\n equals(other) {\n this.assertSame(other);\n const { X: X1, Y: Y1 } = this.ep;\n const { X: X2, Y: Y2 } = other.ep;\n const mod = (n) => Fp.create(n);\n // (x1 * y2 == y1 * x2) | (y1 * y2 == x1 * x2)\n const one = mod(X1 * Y2) === mod(Y1 * X2);\n const two = mod(Y1 * Y2) === mod(X1 * X2);\n return one || two;\n }\n is0() {\n return this.equals(_RistrettoPoint.ZERO);\n }\n}\n// Do NOT change syntax: the following gymnastics is done,\n// because typescript strips comments, which makes bundlers disable tree-shaking.\n// prettier-ignore\n_RistrettoPoint.BASE = \n/* @__PURE__ */ (() => new _RistrettoPoint(exports.ed25519.Point.BASE))();\n// prettier-ignore\n_RistrettoPoint.ZERO = \n/* @__PURE__ */ (() => new _RistrettoPoint(exports.ed25519.Point.ZERO))();\n// prettier-ignore\n_RistrettoPoint.Fp = \n/* @__PURE__ */ (() => Fp)();\n// prettier-ignore\n_RistrettoPoint.Fn = \n/* @__PURE__ */ (() => Fn)();\nexports.ristretto255 = { Point: _RistrettoPoint };\n/** Hashing to ristretto255 points / field. RFC 9380 methods. */\nexports.ristretto255_hasher = {\n hashToCurve(msg, options) {\n const DST = options?.DST || 'ristretto255_XMD:SHA-512_R255MAP_RO_';\n const xmd = (0, hash_to_curve_ts_1.expand_message_xmd)(msg, DST, 64, sha2_js_1.sha512);\n return ristretto255_map(xmd);\n },\n hashToScalar(msg, options = { DST: hash_to_curve_ts_1._DST_scalar }) {\n const xmd = (0, hash_to_curve_ts_1.expand_message_xmd)(msg, options.DST, 64, sha2_js_1.sha512);\n return Fn.create((0, utils_ts_1.bytesToNumberLE)(xmd));\n },\n};\n// export const ristretto255_oprf: OPRF = createORPF({\n// name: 'ristretto255-SHA512',\n// Point: RistrettoPoint,\n// hash: sha512,\n// hashToGroup: ristretto255_hasher.hashToCurve,\n// hashToScalar: ristretto255_hasher.hashToScalar,\n// });\n/**\n * Weird / bogus points, useful for debugging.\n * All 8 ed25519 points of 8-torsion subgroup can be generated from the point\n * T = `26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05`.\n * ⟨T⟩ = { O, T, 2T, 3T, 4T, 5T, 6T, 7T }\n */\nexports.ED25519_TORSION_SUBGROUP = [\n '0100000000000000000000000000000000000000000000000000000000000000',\n 'c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a',\n '0000000000000000000000000000000000000000000000000000000000000080',\n '26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05',\n 'ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f',\n '26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85',\n '0000000000000000000000000000000000000000000000000000000000000000',\n 'c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa',\n];\n/** @deprecated use `ed25519.utils.toMontgomery` */\nfunction edwardsToMontgomeryPub(edwardsPub) {\n return exports.ed25519.utils.toMontgomery((0, utils_ts_1.ensureBytes)('pub', edwardsPub));\n}\n/** @deprecated use `ed25519.utils.toMontgomery` */\nexports.edwardsToMontgomery = edwardsToMontgomeryPub;\n/** @deprecated use `ed25519.utils.toMontgomerySecret` */\nfunction edwardsToMontgomeryPriv(edwardsPriv) {\n return exports.ed25519.utils.toMontgomerySecret((0, utils_ts_1.ensureBytes)('pub', edwardsPriv));\n}\n/** @deprecated use `ristretto255.Point` */\nexports.RistrettoPoint = _RistrettoPoint;\n/** @deprecated use `import { ed25519_hasher } from '@noble/curves/ed25519.js';` */\nexports.hashToCurve = (() => exports.ed25519_hasher.hashToCurve)();\n/** @deprecated use `import { ed25519_hasher } from '@noble/curves/ed25519.js';` */\nexports.encodeToCurve = (() => exports.ed25519_hasher.encodeToCurve)();\n/** @deprecated use `import { ristretto255_hasher } from '@noble/curves/ed25519.js';` */\nexports.hashToRistretto255 = (() => exports.ristretto255_hasher.hashToCurve)();\n/** @deprecated use `import { ristretto255_hasher } from '@noble/curves/ed25519.js';` */\nexports.hash_to_ristretto255 = (() => exports.ristretto255_hasher.hashToCurve)();\n//# sourceMappingURL=ed25519.js.map",
|
|
38
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hmac = exports.HMAC = void 0;\n/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nconst utils_ts_1 = require(\"./utils.js\");\nclass HMAC extends utils_ts_1.Hash {\n constructor(hash, _key) {\n super();\n this.finished = false;\n this.destroyed = false;\n (0, utils_ts_1.ahash)(hash);\n const key = (0, utils_ts_1.toBytes)(_key);\n this.iHash = hash.create();\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create();\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n (0, utils_ts_1.clean)(pad);\n }\n update(buf) {\n (0, utils_ts_1.aexists)(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out) {\n (0, utils_ts_1.aexists)(this);\n (0, utils_ts_1.abytes)(out, this.outputLen);\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest() {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to) {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to || (to = Object.create(Object.getPrototypeOf(this), {}));\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n destroy() {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\nexports.HMAC = HMAC;\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nconst hmac = (hash, key, message) => new HMAC(hash, key).update(message).digest();\nexports.hmac = hmac;\nexports.hmac.create = (hash, key) => new HMAC(hash, key);\n//# sourceMappingURL=hmac.js.map",
|
|
39
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DER = exports.DERErr = void 0;\nexports._splitEndoScalar = _splitEndoScalar;\nexports._normFnElement = _normFnElement;\nexports.weierstrassN = weierstrassN;\nexports.SWUFpSqrtRatio = SWUFpSqrtRatio;\nexports.mapToCurveSimpleSWU = mapToCurveSimpleSWU;\nexports.ecdh = ecdh;\nexports.ecdsa = ecdsa;\nexports.weierstrassPoints = weierstrassPoints;\nexports._legacyHelperEquat = _legacyHelperEquat;\nexports.weierstrass = weierstrass;\n/**\n * Short Weierstrass curve methods. The formula is: y² = x³ + ax + b.\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst hmac_js_1 = require(\"@noble/hashes/hmac.js\");\nconst utils_1 = require(\"@noble/hashes/utils\");\nconst utils_ts_1 = require(\"../utils.js\");\nconst curve_ts_1 = require(\"./curve.js\");\nconst modular_ts_1 = require(\"./modular.js\");\n// We construct basis in such way that den is always positive and equals n, but num sign depends on basis (not on secret value)\nconst divNearest = (num, den) => (num + (num >= 0 ? den : -den) / _2n) / den;\n/**\n * Splits scalar for GLV endomorphism.\n */\nfunction _splitEndoScalar(k, basis, n) {\n // Split scalar into two such that part is ~half bits: `abs(part) < sqrt(N)`\n // Since part can be negative, we need to do this on point.\n // TODO: verifyScalar function which consumes lambda\n const [[a1, b1], [a2, b2]] = basis;\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n // |k1|/|k2| is < sqrt(N), but can be negative.\n // If we do `k1 mod N`, we'll get big scalar (`> sqrt(N)`): so, we do cheaper negation instead.\n let k1 = k - c1 * a1 - c2 * a2;\n let k2 = -c1 * b1 - c2 * b2;\n const k1neg = k1 < _0n;\n const k2neg = k2 < _0n;\n if (k1neg)\n k1 = -k1;\n if (k2neg)\n k2 = -k2;\n // Double check that resulting scalar less than half bits of N: otherwise wNAF will fail.\n // This should only happen on wrong basises. Also, math inside is too complex and I don't trust it.\n const MAX_NUM = (0, utils_ts_1.bitMask)(Math.ceil((0, utils_ts_1.bitLen)(n) / 2)) + _1n; // Half bits of N\n if (k1 < _0n || k1 >= MAX_NUM || k2 < _0n || k2 >= MAX_NUM) {\n throw new Error('splitScalar (endomorphism): failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n}\nfunction validateSigFormat(format) {\n if (!['compact', 'recovered', 'der'].includes(format))\n throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n return format;\n}\nfunction validateSigOpts(opts, def) {\n const optsn = {};\n for (let optName of Object.keys(def)) {\n // @ts-ignore\n optsn[optName] = opts[optName] === undefined ? def[optName] : opts[optName];\n }\n (0, utils_ts_1._abool2)(optsn.lowS, 'lowS');\n (0, utils_ts_1._abool2)(optsn.prehash, 'prehash');\n if (optsn.format !== undefined)\n validateSigFormat(optsn.format);\n return optsn;\n}\nclass DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\nexports.DERErr = DERErr;\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexports.DER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag, data) => {\n const { Err: E } = exports.DER;\n if (tag < 0 || tag > 256)\n throw new E('tlv.encode: wrong tag');\n if (data.length & 1)\n throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = (0, utils_ts_1.numberToHexUnpadded)(dataLen);\n if ((len.length / 2) & 128)\n throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? (0, utils_ts_1.numberToHexUnpadded)((len.length / 2) | 128) : '';\n const t = (0, utils_ts_1.numberToHexUnpadded)(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag, data) {\n const { Err: E } = exports.DER;\n let pos = 0;\n if (tag < 0 || tag > 256)\n throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag)\n throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 128); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong)\n length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 127;\n if (!lenLen)\n throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4)\n throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen)\n throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0)\n throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes)\n length = (length << 8) | b;\n pos += lenLen;\n if (length < 128)\n throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length)\n throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num) {\n const { Err: E } = exports.DER;\n if (num < _0n)\n throw new E('integer: negative integers are not allowed');\n let hex = (0, utils_ts_1.numberToHexUnpadded)(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000)\n hex = '00' + hex;\n if (hex.length & 1)\n throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data) {\n const { Err: E } = exports.DER;\n if (data[0] & 128)\n throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 128))\n throw new E('invalid signature integer: unnecessary leading zero');\n return (0, utils_ts_1.bytesToNumberBE)(data);\n },\n },\n toSig(hex) {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = exports.DER;\n const data = (0, utils_ts_1.ensureBytes)('signature', hex);\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length)\n throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length)\n throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig) {\n const { _tlv: tlv, _int: int } = exports.DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\nfunction _normFnElement(Fn, key) {\n const { BYTES: expected } = Fn;\n let num;\n if (typeof key === 'bigint') {\n num = key;\n }\n else {\n let bytes = (0, utils_ts_1.ensureBytes)('private key', key);\n try {\n num = Fn.fromBytes(bytes);\n }\n catch (error) {\n throw new Error(`invalid private key: expected ui8a of size ${expected}, got ${typeof key}`);\n }\n }\n if (!Fn.isValidNot0(num))\n throw new Error('invalid private key: out of range [1..N-1]');\n return num;\n}\n/**\n * Creates weierstrass Point constructor, based on specified curve options.\n *\n * @example\n```js\nconst opts = {\n p: BigInt('0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff'),\n n: BigInt('0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551'),\n h: BigInt(1),\n a: BigInt('0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc'),\n b: BigInt('0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b'),\n Gx: BigInt('0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296'),\n Gy: BigInt('0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5'),\n};\nconst p256_Point = weierstrass(opts);\n```\n */\nfunction weierstrassN(params, extraOpts = {}) {\n const validated = (0, curve_ts_1._createCurveFields)('weierstrass', params, extraOpts);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE;\n const { h: cofactor, n: CURVE_ORDER } = CURVE;\n (0, utils_ts_1._validateObject)(extraOpts, {}, {\n allowInfinityPoint: 'boolean',\n clearCofactor: 'function',\n isTorsionFree: 'function',\n fromBytes: 'function',\n toBytes: 'function',\n endo: 'object',\n wrapPrivateKey: 'boolean',\n });\n const { endo } = extraOpts;\n if (endo) {\n // validateObject(endo, { beta: 'bigint', splitScalar: 'function' });\n if (!Fp.is0(CURVE.a) || typeof endo.beta !== 'bigint' || !Array.isArray(endo.basises)) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n }\n }\n const lengths = getWLengths(Fp, Fn);\n function assertCompressionIsSupported() {\n if (!Fp.isOdd)\n throw new Error('compression is not supported: Field does not have .isOdd()');\n }\n // Implements IEEE P1363 point encoding\n function pointToBytes(_c, point, isCompressed) {\n const { x, y } = point.toAffine();\n const bx = Fp.toBytes(x);\n (0, utils_ts_1._abool2)(isCompressed, 'isCompressed');\n if (isCompressed) {\n assertCompressionIsSupported();\n const hasEvenY = !Fp.isOdd(y);\n return (0, utils_ts_1.concatBytes)(pprefix(hasEvenY), bx);\n }\n else {\n return (0, utils_ts_1.concatBytes)(Uint8Array.of(0x04), bx, Fp.toBytes(y));\n }\n }\n function pointFromBytes(bytes) {\n (0, utils_ts_1._abytes2)(bytes, undefined, 'Point');\n const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65\n const length = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // No actual validation is done here: use .assertValidity()\n if (length === comp && (head === 0x02 || head === 0x03)) {\n const x = Fp.fromBytes(tail);\n if (!Fp.isValid(x))\n throw new Error('bad point: is not on curve, wrong x');\n const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n let y;\n try {\n y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n }\n catch (sqrtError) {\n const err = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('bad point: is not on curve, sqrt error' + err);\n }\n assertCompressionIsSupported();\n const isYOdd = Fp.isOdd(y); // (y & _1n) === _1n;\n const isHeadOdd = (head & 1) === 1; // ECDSA-specific\n if (isHeadOdd !== isYOdd)\n y = Fp.neg(y);\n return { x, y };\n }\n else if (length === uncomp && head === 0x04) {\n // TODO: more checks\n const L = Fp.BYTES;\n const x = Fp.fromBytes(tail.subarray(0, L));\n const y = Fp.fromBytes(tail.subarray(L, L * 2));\n if (!isValidXY(x, y))\n throw new Error('bad point: is not on curve');\n return { x, y };\n }\n else {\n throw new Error(`bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`);\n }\n }\n const encodePoint = extraOpts.toBytes || pointToBytes;\n const decodePoint = extraOpts.fromBytes || pointFromBytes;\n function weierstrassEquation(x) {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); // x³ + a * x + b\n }\n // TODO: move top-level\n /** Checks whether equation holds for given x, y: y² == x³ + ax + b */\n function isValidXY(x, y) {\n const left = Fp.sqr(y); // y²\n const right = weierstrassEquation(x); // x³ + ax + b\n return Fp.eql(left, right);\n }\n // Validate whether the passed curve params are valid.\n // Test 1: equation y² = x³ + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy))\n throw new Error('bad curve params: generator point');\n // Test 2: discriminant Δ part should be non-zero: 4a³ + 27b² != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2)))\n throw new Error('bad curve params: a or b');\n /** Asserts coordinate is valid: 0 <= n < Fp.ORDER. */\n function acoord(title, n, banZero = false) {\n if (!Fp.isValid(n) || (banZero && Fp.is0(n)))\n throw new Error(`bad point coordinate ${title}`);\n return n;\n }\n function aprjpoint(other) {\n if (!(other instanceof Point))\n throw new Error('ProjectivePoint expected');\n }\n function splitEndoScalarN(k) {\n if (!endo || !endo.basises)\n throw new Error('no endo');\n return _splitEndoScalar(k, endo.basises, Fn.ORDER);\n }\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n const toAffineMemo = (0, utils_ts_1.memoized)((p, iz) => {\n const { X, Y, Z } = p;\n // Fast-path for normalized points\n if (Fp.eql(Z, Fp.ONE))\n return { x: X, y: Y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null)\n iz = is0 ? Fp.ONE : Fp.inv(Z);\n const x = Fp.mul(X, iz);\n const y = Fp.mul(Y, iz);\n const zz = Fp.mul(Z, iz);\n if (is0)\n return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE))\n throw new Error('invZ was invalid');\n return { x, y };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = (0, utils_ts_1.memoized)((p) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y))\n return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n if (!Fp.isValid(x) || !Fp.isValid(y))\n throw new Error('bad point: x or y not field elements');\n if (!isValidXY(x, y))\n throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree())\n throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n function finishEndo(endoBeta, k1p, k2p, k1neg, k2neg) {\n k2p = new Point(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z);\n k1p = (0, curve_ts_1.negateCt)(k1neg, k1p);\n k2p = (0, curve_ts_1.negateCt)(k2neg, k2p);\n return k1p.add(k2p);\n }\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates:(X, Y, Z) ∋ (x=X/Z, y=Y/Z).\n * Default Point works in 2d / affine coordinates: (x, y).\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point {\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n constructor(X, Y, Z) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y, true);\n this.Z = acoord('z', Z);\n Object.freeze(this);\n }\n static CURVE() {\n return CURVE;\n }\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n static fromAffine(p) {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y))\n throw new Error('invalid affine point');\n if (p instanceof Point)\n throw new Error('projective point not allowed');\n // (0, 0) would've produced (0, 0, 1) - instead, we need (0, 1, 0)\n if (Fp.is0(x) && Fp.is0(y))\n return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n static fromBytes(bytes) {\n const P = Point.fromAffine(decodePoint((0, utils_ts_1._abytes2)(bytes, undefined, 'point')));\n P.assertValidity();\n return P;\n }\n static fromHex(hex) {\n return Point.fromBytes((0, utils_ts_1.ensureBytes)('pointHex', hex));\n }\n get x() {\n return this.toAffine().x;\n }\n get y() {\n return this.toAffine().y;\n }\n /**\n *\n * @param windowSize\n * @param isLazy true will defer table computation until the first multiplication\n * @returns\n */\n precompute(windowSize = 8, isLazy = true) {\n wnaf.createCache(this, windowSize);\n if (!isLazy)\n this.multiply(_3n); // random number\n return this;\n }\n // TODO: return `this`\n /** A point on curve is valid if it conforms to equation. */\n assertValidity() {\n assertValidMemo(this);\n }\n hasEvenY() {\n const { y } = this.toAffine();\n if (!Fp.isOdd)\n throw new Error(\"Field doesn't support isOdd\");\n return !Fp.isOdd(y);\n }\n /** Compare one point to another. */\n equals(other) {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n negate() {\n return new Point(this.X, Fp.neg(this.Y), this.Z);\n }\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other) {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n subtract(other) {\n return this.add(other.negate());\n }\n is0() {\n return this.equals(Point.ZERO);\n }\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar) {\n const { endo } = extraOpts;\n if (!Fn.isValidNot0(scalar))\n throw new Error('invalid scalar: out of range'); // 0 is invalid\n let point, fake; // Fake point is used to const-time mult\n const mul = (n) => wnaf.cached(this, n, (p) => (0, curve_ts_1.normalizeZ)(Point, p));\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar);\n const { p: k1p, f: k1f } = mul(k1);\n const { p: k2p, f: k2f } = mul(k2);\n fake = k1f.add(k2f);\n point = finishEndo(endo.beta, k1p, k2p, k1neg, k2neg);\n }\n else {\n const { p, f } = mul(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return (0, curve_ts_1.normalizeZ)(Point, [point, fake])[0];\n }\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed secret key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc) {\n const { endo } = extraOpts;\n const p = this;\n if (!Fn.isValid(sc))\n throw new Error('invalid scalar: out of range'); // 0 is valid\n if (sc === _0n || p.is0())\n return Point.ZERO;\n if (sc === _1n)\n return p; // fast-path\n if (wnaf.hasCache(this))\n return this.multiply(sc);\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc);\n const { p1, p2 } = (0, curve_ts_1.mulEndoUnsafe)(Point, p, k1, k2); // 30% faster vs wnaf.unsafe\n return finishEndo(endo.beta, p1, p2, k1neg, k2neg);\n }\n else {\n return wnaf.unsafe(p, sc);\n }\n }\n multiplyAndAddUnsafe(Q, a, b) {\n const sum = this.multiplyUnsafe(a).add(Q.multiplyUnsafe(b));\n return sum.is0() ? undefined : sum;\n }\n /**\n * Converts Projective point to affine (x, y) coordinates.\n * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n */\n toAffine(invertedZ) {\n return toAffineMemo(this, invertedZ);\n }\n /**\n * Checks whether Point is free of torsion elements (is in prime subgroup).\n * Always torsion-free for cofactor=1 curves.\n */\n isTorsionFree() {\n const { isTorsionFree } = extraOpts;\n if (cofactor === _1n)\n return true;\n if (isTorsionFree)\n return isTorsionFree(Point, this);\n return wnaf.unsafe(this, CURVE_ORDER).is0();\n }\n clearCofactor() {\n const { clearCofactor } = extraOpts;\n if (cofactor === _1n)\n return this; // Fast-path\n if (clearCofactor)\n return clearCofactor(Point, this);\n return this.multiplyUnsafe(cofactor);\n }\n isSmallOrder() {\n // can we use this.clearCofactor()?\n return this.multiplyUnsafe(cofactor).is0();\n }\n toBytes(isCompressed = true) {\n (0, utils_ts_1._abool2)(isCompressed, 'isCompressed');\n this.assertValidity();\n return encodePoint(Point, this, isCompressed);\n }\n toHex(isCompressed = true) {\n return (0, utils_ts_1.bytesToHex)(this.toBytes(isCompressed));\n }\n toString() {\n return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n }\n // TODO: remove\n get px() {\n return this.X;\n }\n get py() {\n return this.X;\n }\n get pz() {\n return this.Z;\n }\n toRawBytes(isCompressed = true) {\n return this.toBytes(isCompressed);\n }\n _setWindowSize(windowSize) {\n this.precompute(windowSize);\n }\n static normalizeZ(points) {\n return (0, curve_ts_1.normalizeZ)(Point, points);\n }\n static msm(points, scalars) {\n return (0, curve_ts_1.pippenger)(Point, Fn, points, scalars);\n }\n static fromPrivateKey(privateKey) {\n return Point.BASE.multiply(_normFnElement(Fn, privateKey));\n }\n }\n // base / generator point\n Point.BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n Point.ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n // math field\n Point.Fp = Fp;\n // scalar field\n Point.Fn = Fn;\n const bits = Fn.BITS;\n const wnaf = new curve_ts_1.wNAF(Point, extraOpts.endo ? Math.ceil(bits / 2) : bits);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n// Points start with byte 0x02 when y is even; otherwise 0x03\nfunction pprefix(hasEvenY) {\n return Uint8Array.of(hasEvenY ? 0x02 : 0x03);\n}\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nfunction SWUFpSqrtRatio(Fp, Z) {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n)\n l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u, v) => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u, v) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nfunction mapToCurveSimpleSWU(Fp, opts) {\n (0, modular_ts_1.validateField)(Fp);\n const { A, B, Z } = opts;\n if (!Fp.isValid(A) || !Fp.isValid(B) || !Fp.isValid(Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, Z);\n if (!Fp.isOdd)\n throw new Error('Field does not have .isOdd()');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u) => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd(u) === Fp.isOdd(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = (0, modular_ts_1.FpInvertBatch)(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\nfunction getWLengths(Fp, Fn) {\n return {\n secretKey: Fn.BYTES,\n publicKey: 1 + Fp.BYTES,\n publicKeyUncompressed: 1 + 2 * Fp.BYTES,\n publicKeyHasPrefix: true,\n signature: 2 * Fn.BYTES,\n };\n}\n/**\n * Sometimes users only need getPublicKey, getSharedSecret, and secret key handling.\n * This helper ensures no signature functionality is present. Less code, smaller bundle size.\n */\nfunction ecdh(Point, ecdhOpts = {}) {\n const { Fn } = Point;\n const randomBytes_ = ecdhOpts.randomBytes || utils_ts_1.randomBytes;\n const lengths = Object.assign(getWLengths(Point.Fp, Fn), { seed: (0, modular_ts_1.getMinHashLength)(Fn.ORDER) });\n function isValidSecretKey(secretKey) {\n try {\n return !!_normFnElement(Fn, secretKey);\n }\n catch (error) {\n return false;\n }\n }\n function isValidPublicKey(publicKey, isCompressed) {\n const { publicKey: comp, publicKeyUncompressed } = lengths;\n try {\n const l = publicKey.length;\n if (isCompressed === true && l !== comp)\n return false;\n if (isCompressed === false && l !== publicKeyUncompressed)\n return false;\n return !!Point.fromBytes(publicKey);\n }\n catch (error) {\n return false;\n }\n }\n /**\n * Produces cryptographically secure secret key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n function randomSecretKey(seed = randomBytes_(lengths.seed)) {\n return (0, modular_ts_1.mapHashToField)((0, utils_ts_1._abytes2)(seed, lengths.seed, 'seed'), Fn.ORDER);\n }\n /**\n * Computes public key for a secret key. Checks for validity of the secret key.\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(secretKey, isCompressed = true) {\n return Point.BASE.multiply(_normFnElement(Fn, secretKey)).toBytes(isCompressed);\n }\n function keygen(seed) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: getPublicKey(secretKey) };\n }\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item) {\n if (typeof item === 'bigint')\n return false;\n if (item instanceof Point)\n return true;\n const { secretKey, publicKey, publicKeyUncompressed } = lengths;\n if (Fn.allowedLengths || secretKey === publicKey)\n return undefined;\n const l = (0, utils_ts_1.ensureBytes)('key', item).length;\n return l === publicKey || l === publicKeyUncompressed;\n }\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from secret key A and public key B.\n * Checks: 1) secret key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(secretKeyA, publicKeyB, isCompressed = true) {\n if (isProbPub(secretKeyA) === true)\n throw new Error('first arg must be private key');\n if (isProbPub(publicKeyB) === false)\n throw new Error('second arg must be public key');\n const s = _normFnElement(Fn, secretKeyA);\n const b = Point.fromHex(publicKeyB); // checks for being on-curve\n return b.multiply(s).toBytes(isCompressed);\n }\n const utils = {\n isValidSecretKey,\n isValidPublicKey,\n randomSecretKey,\n // TODO: remove\n isValidPrivateKey: isValidSecretKey,\n randomPrivateKey: randomSecretKey,\n normPrivateKeyToScalar: (key) => _normFnElement(Fn, key),\n precompute(windowSize = 8, point = Point.BASE) {\n return point.precompute(windowSize, false);\n },\n };\n return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point, utils, lengths });\n}\n/**\n * Creates ECDSA signing interface for given elliptic curve `Point` and `hash` function.\n * We need `hash` for 2 features:\n * 1. Message prehash-ing. NOT used if `sign` / `verify` are called with `prehash: false`\n * 2. k generation in `sign`, using HMAC-drbg(hash)\n *\n * ECDSAOpts are only rarely needed.\n *\n * @example\n * ```js\n * const p256_Point = weierstrass(...);\n * const p256_sha256 = ecdsa(p256_Point, sha256);\n * const p256_sha224 = ecdsa(p256_Point, sha224);\n * const p256_sha224_r = ecdsa(p256_Point, sha224, { randomBytes: (length) => { ... } });\n * ```\n */\nfunction ecdsa(Point, hash, ecdsaOpts = {}) {\n (0, utils_1.ahash)(hash);\n (0, utils_ts_1._validateObject)(ecdsaOpts, {}, {\n hmac: 'function',\n lowS: 'boolean',\n randomBytes: 'function',\n bits2int: 'function',\n bits2int_modN: 'function',\n });\n const randomBytes = ecdsaOpts.randomBytes || utils_ts_1.randomBytes;\n const hmac = ecdsaOpts.hmac ||\n ((key, ...msgs) => (0, hmac_js_1.hmac)(hash, key, (0, utils_ts_1.concatBytes)(...msgs)));\n const { Fp, Fn } = Point;\n const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn;\n const { keygen, getPublicKey, getSharedSecret, utils, lengths } = ecdh(Point, ecdsaOpts);\n const defaultSigOpts = {\n prehash: false,\n lowS: typeof ecdsaOpts.lowS === 'boolean' ? ecdsaOpts.lowS : false,\n format: undefined, //'compact' as ECDSASigFormat,\n extraEntropy: false,\n };\n const defaultSigOpts_format = 'compact';\n function isBiggerThanHalfOrder(number) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n function validateRS(title, num) {\n if (!Fn.isValidNot0(num))\n throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`);\n return num;\n }\n function validateSigLength(bytes, format) {\n validateSigFormat(format);\n const size = lengths.signature;\n const sizer = format === 'compact' ? size : format === 'recovered' ? size + 1 : undefined;\n return (0, utils_ts_1._abytes2)(bytes, sizer, `${format} signature`);\n }\n /**\n * ECDSA signature with its (r, s) properties. Supports compact, recovered & DER representations.\n */\n class Signature {\n constructor(r, s, recovery) {\n this.r = validateRS('r', r); // r in [1..N-1];\n this.s = validateRS('s', s); // s in [1..N-1];\n if (recovery != null)\n this.recovery = recovery;\n Object.freeze(this);\n }\n static fromBytes(bytes, format = defaultSigOpts_format) {\n validateSigLength(bytes, format);\n let recid;\n if (format === 'der') {\n const { r, s } = exports.DER.toSig((0, utils_ts_1._abytes2)(bytes));\n return new Signature(r, s);\n }\n if (format === 'recovered') {\n recid = bytes[0];\n format = 'compact';\n bytes = bytes.subarray(1);\n }\n const L = Fn.BYTES;\n const r = bytes.subarray(0, L);\n const s = bytes.subarray(L, L * 2);\n return new Signature(Fn.fromBytes(r), Fn.fromBytes(s), recid);\n }\n static fromHex(hex, format) {\n return this.fromBytes((0, utils_ts_1.hexToBytes)(hex), format);\n }\n addRecoveryBit(recovery) {\n return new Signature(this.r, this.s, recovery);\n }\n recoverPublicKey(messageHash) {\n const FIELD_ORDER = Fp.ORDER;\n const { r, s, recovery: rec } = this;\n if (rec == null || ![0, 1, 2, 3].includes(rec))\n throw new Error('recovery id invalid');\n // ECDSA recovery is hard for cofactor > 1 curves.\n // In sign, `r = q.x mod n`, and here we recover q.x from r.\n // While recovering q.x >= n, we need to add r+n for cofactor=1 curves.\n // However, for cofactor>1, r+n may not get q.x:\n // r+n*i would need to be done instead where i is unknown.\n // To easily get i, we either need to:\n // a. increase amount of valid recid values (4, 5...); OR\n // b. prohibit non-prime-order signatures (recid > 1).\n const hasCofactor = CURVE_ORDER * _2n < FIELD_ORDER;\n if (hasCofactor && rec > 1)\n throw new Error('recovery id is ambiguous for h>1 curve');\n const radj = rec === 2 || rec === 3 ? r + CURVE_ORDER : r;\n if (!Fp.isValid(radj))\n throw new Error('recovery id 2 or 3 invalid');\n const x = Fp.toBytes(radj);\n const R = Point.fromBytes((0, utils_ts_1.concatBytes)(pprefix((rec & 1) === 0), x));\n const ir = Fn.inv(radj); // r^-1\n const h = bits2int_modN((0, utils_ts_1.ensureBytes)('msgHash', messageHash)); // Truncate hash\n const u1 = Fn.create(-h * ir); // -hr^-1\n const u2 = Fn.create(s * ir); // sr^-1\n // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1). unsafe is fine: there is no private data.\n const Q = Point.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2));\n if (Q.is0())\n throw new Error('point at infinify');\n Q.assertValidity();\n return Q;\n }\n // Signatures should be low-s, to prevent malleability.\n hasHighS() {\n return isBiggerThanHalfOrder(this.s);\n }\n toBytes(format = defaultSigOpts_format) {\n validateSigFormat(format);\n if (format === 'der')\n return (0, utils_ts_1.hexToBytes)(exports.DER.hexFromSig(this));\n const r = Fn.toBytes(this.r);\n const s = Fn.toBytes(this.s);\n if (format === 'recovered') {\n if (this.recovery == null)\n throw new Error('recovery bit must be present');\n return (0, utils_ts_1.concatBytes)(Uint8Array.of(this.recovery), r, s);\n }\n return (0, utils_ts_1.concatBytes)(r, s);\n }\n toHex(format) {\n return (0, utils_ts_1.bytesToHex)(this.toBytes(format));\n }\n // TODO: remove\n assertValidity() { }\n static fromCompact(hex) {\n return Signature.fromBytes((0, utils_ts_1.ensureBytes)('sig', hex), 'compact');\n }\n static fromDER(hex) {\n return Signature.fromBytes((0, utils_ts_1.ensureBytes)('sig', hex), 'der');\n }\n normalizeS() {\n return this.hasHighS() ? new Signature(this.r, Fn.neg(this.s), this.recovery) : this;\n }\n toDERRawBytes() {\n return this.toBytes('der');\n }\n toDERHex() {\n return (0, utils_ts_1.bytesToHex)(this.toBytes('der'));\n }\n toCompactRawBytes() {\n return this.toBytes('compact');\n }\n toCompactHex() {\n return (0, utils_ts_1.bytesToHex)(this.toBytes('compact'));\n }\n }\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int = ecdsaOpts.bits2int ||\n function bits2int_def(bytes) {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192)\n throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = (0, utils_ts_1.bytesToNumberBE)(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - fnBits; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN = ecdsaOpts.bits2int_modN ||\n function bits2int_modN_def(bytes) {\n return Fn.create(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // Pads output with zero as per spec\n const ORDER_MASK = (0, utils_ts_1.bitMask)(fnBits);\n /** Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`. */\n function int2octets(num) {\n // IMPORTANT: the check ensures working for case `Fn.BYTES != Fn.BITS * 8`\n (0, utils_ts_1.aInRange)('num < 2^' + fnBits, num, _0n, ORDER_MASK);\n return Fn.toBytes(num);\n }\n function validateMsgAndHash(message, prehash) {\n (0, utils_ts_1._abytes2)(message, undefined, 'message');\n return prehash ? (0, utils_ts_1._abytes2)(hash(message), undefined, 'prehashed message') : message;\n }\n /**\n * Steps A, D of RFC6979 3.2.\n * Creates RFC6979 seed; converts msg/privKey to numbers.\n * Used only in sign, not in verify.\n *\n * Warning: we cannot assume here that message has same amount of bytes as curve order,\n * this will be invalid at least for P521. Also it can be bigger for P224 + SHA256.\n */\n function prepSig(message, privateKey, opts) {\n if (['recovered', 'canonical'].some((k) => k in opts))\n throw new Error('sign() legacy options not supported');\n const { lowS, prehash, extraEntropy } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash); // RFC6979 3.2 A: h1 = H(m)\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with fnBits % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(message);\n const d = _normFnElement(Fn, privateKey); // validate secret key, convert to bigint\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (extraEntropy != null && extraEntropy !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n // gen random bytes OR pass as-is\n const e = extraEntropy === true ? randomBytes(lengths.secretKey) : extraEntropy;\n seedArgs.push((0, utils_ts_1.ensureBytes)('extraEntropy', e)); // check for being bytes\n }\n const seed = (0, utils_ts_1.concatBytes)(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // NOTE: no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n // To transform k => Signature:\n // q = k⋅G\n // r = q.x mod n\n // s = k^-1(m + rd) mod n\n // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n function k2sig(kBytes) {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n // Important: all mod() calls here must be done over N\n const k = bits2int(kBytes); // mod n, not mod p\n if (!Fn.isValidNot0(k))\n return; // Valid scalars (including k) must be in 1..N-1\n const ik = Fn.inv(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = k⋅G\n const r = Fn.create(q.x); // r = q.x mod n\n if (r === _0n)\n return;\n const s = Fn.create(ik * Fn.create(m + r * d)); // Not using blinding here, see comment above\n if (s === _0n)\n return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3, when q.x > n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = Fn.neg(s); // if lowS was passed, ensure s is always\n recovery ^= 1; // // in the bottom half of N\n }\n return new Signature(r, normS, recovery); // use normS, not s\n }\n return { seed, k2sig };\n }\n /**\n * Signs message hash with a secret key.\n *\n * ```\n * sign(m, d) where\n * k = rfc6979_hmac_drbg(m, d)\n * (x, y) = G × k\n * r = x mod n\n * s = (m + dr) / k mod n\n * ```\n */\n function sign(message, secretKey, opts = {}) {\n message = (0, utils_ts_1.ensureBytes)('message', message);\n const { seed, k2sig } = prepSig(message, secretKey, opts); // Steps A, D of RFC6979 3.2.\n const drbg = (0, utils_ts_1.createHmacDrbg)(hash.outputLen, Fn.BYTES, hmac);\n const sig = drbg(seed, k2sig); // Steps B, C, D, E, F, G\n return sig;\n }\n function tryParsingSig(sg) {\n // Try to deduce format\n let sig = undefined;\n const isHex = typeof sg === 'string' || (0, utils_ts_1.isBytes)(sg);\n const isObj = !isHex &&\n sg !== null &&\n typeof sg === 'object' &&\n typeof sg.r === 'bigint' &&\n typeof sg.s === 'bigint';\n if (!isHex && !isObj)\n throw new Error('invalid signature, expected Uint8Array, hex string or Signature instance');\n if (isObj) {\n sig = new Signature(sg.r, sg.s);\n }\n else if (isHex) {\n try {\n sig = Signature.fromBytes((0, utils_ts_1.ensureBytes)('sig', sg), 'der');\n }\n catch (derError) {\n if (!(derError instanceof exports.DER.Err))\n throw derError;\n }\n if (!sig) {\n try {\n sig = Signature.fromBytes((0, utils_ts_1.ensureBytes)('sig', sg), 'compact');\n }\n catch (error) {\n return false;\n }\n }\n }\n if (!sig)\n return false;\n return sig;\n }\n /**\n * Verifies a signature against message and public key.\n * Rejects lowS signatures by default: see {@link ECDSAVerifyOpts}.\n * Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * u1 = hs^-1 mod n\n * u2 = rs^-1 mod n\n * R = u1⋅G + u2⋅P\n * mod(R.x, n) == r\n * ```\n */\n function verify(signature, message, publicKey, opts = {}) {\n const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts);\n publicKey = (0, utils_ts_1.ensureBytes)('publicKey', publicKey);\n message = validateMsgAndHash((0, utils_ts_1.ensureBytes)('message', message), prehash);\n if ('strict' in opts)\n throw new Error('options.strict was renamed to lowS');\n const sig = format === undefined\n ? tryParsingSig(signature)\n : Signature.fromBytes((0, utils_ts_1.ensureBytes)('sig', signature), format);\n if (sig === false)\n return false;\n try {\n const P = Point.fromBytes(publicKey);\n if (lowS && sig.hasHighS())\n return false;\n const { r, s } = sig;\n const h = bits2int_modN(message); // mod n, not mod p\n const is = Fn.inv(s); // s^-1 mod n\n const u1 = Fn.create(h * is); // u1 = hs^-1 mod n\n const u2 = Fn.create(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyUnsafe(u1).add(P.multiplyUnsafe(u2)); // u1⋅G + u2⋅P\n if (R.is0())\n return false;\n const v = Fn.create(R.x); // v = r.x mod n\n return v === r;\n }\n catch (e) {\n return false;\n }\n }\n function recoverPublicKey(signature, message, opts = {}) {\n const { prehash } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash);\n return Signature.fromBytes(signature, 'recovered').recoverPublicKey(message).toBytes();\n }\n return Object.freeze({\n keygen,\n getPublicKey,\n getSharedSecret,\n utils,\n lengths,\n Point,\n sign,\n verify,\n recoverPublicKey,\n Signature,\n hash,\n });\n}\n/** @deprecated use `weierstrass` in newer releases */\nfunction weierstrassPoints(c) {\n const { CURVE, curveOpts } = _weierstrass_legacy_opts_to_new(c);\n const Point = weierstrassN(CURVE, curveOpts);\n return _weierstrass_new_output_to_legacy(c, Point);\n}\nfunction _weierstrass_legacy_opts_to_new(c) {\n const CURVE = {\n a: c.a,\n b: c.b,\n p: c.Fp.ORDER,\n n: c.n,\n h: c.h,\n Gx: c.Gx,\n Gy: c.Gy,\n };\n const Fp = c.Fp;\n let allowedLengths = c.allowedPrivateKeyLengths\n ? Array.from(new Set(c.allowedPrivateKeyLengths.map((l) => Math.ceil(l / 2))))\n : undefined;\n const Fn = (0, modular_ts_1.Field)(CURVE.n, {\n BITS: c.nBitLength,\n allowedLengths: allowedLengths,\n modFromBytes: c.wrapPrivateKey,\n });\n const curveOpts = {\n Fp,\n Fn,\n allowInfinityPoint: c.allowInfinityPoint,\n endo: c.endo,\n isTorsionFree: c.isTorsionFree,\n clearCofactor: c.clearCofactor,\n fromBytes: c.fromBytes,\n toBytes: c.toBytes,\n };\n return { CURVE, curveOpts };\n}\nfunction _ecdsa_legacy_opts_to_new(c) {\n const { CURVE, curveOpts } = _weierstrass_legacy_opts_to_new(c);\n const ecdsaOpts = {\n hmac: c.hmac,\n randomBytes: c.randomBytes,\n lowS: c.lowS,\n bits2int: c.bits2int,\n bits2int_modN: c.bits2int_modN,\n };\n return { CURVE, curveOpts, hash: c.hash, ecdsaOpts };\n}\nfunction _legacyHelperEquat(Fp, a, b) {\n /**\n * y² = x³ + ax + b: Short weierstrass curve formula. Takes x, returns y².\n * @returns y²\n */\n function weierstrassEquation(x) {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x² * x\n return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); // x³ + a * x + b\n }\n return weierstrassEquation;\n}\nfunction _weierstrass_new_output_to_legacy(c, Point) {\n const { Fp, Fn } = Point;\n function isWithinCurveOrder(num) {\n return (0, utils_ts_1.inRange)(num, _1n, Fn.ORDER);\n }\n const weierstrassEquation = _legacyHelperEquat(Fp, c.a, c.b);\n return Object.assign({}, {\n CURVE: c,\n Point: Point,\n ProjectivePoint: Point,\n normPrivateKeyToScalar: (key) => _normFnElement(Fn, key),\n weierstrassEquation,\n isWithinCurveOrder,\n });\n}\nfunction _ecdsa_new_output_to_legacy(c, _ecdsa) {\n const Point = _ecdsa.Point;\n return Object.assign({}, _ecdsa, {\n ProjectivePoint: Point,\n CURVE: Object.assign({}, c, (0, modular_ts_1.nLength)(Point.Fn.ORDER, Point.Fn.BITS)),\n });\n}\n// _ecdsa_legacy\nfunction weierstrass(c) {\n const { CURVE, curveOpts, hash, ecdsaOpts } = _ecdsa_legacy_opts_to_new(c);\n const Point = weierstrassN(CURVE, curveOpts);\n const signs = ecdsa(Point, hash, ecdsaOpts);\n return _ecdsa_new_output_to_legacy(c, signs);\n}\n//# sourceMappingURL=weierstrass.js.map",
|
|
40
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getHash = getHash;\nexports.createCurve = createCurve;\n/**\n * Utilities for short weierstrass curves, combined with noble-hashes.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst weierstrass_ts_1 = require(\"./abstract/weierstrass.js\");\n/** connects noble-curves to noble-hashes */\nfunction getHash(hash) {\n return { hash };\n}\n/** @deprecated use new `weierstrass()` and `ecdsa()` methods */\nfunction createCurve(curveDef, defHash) {\n const create = (hash) => (0, weierstrass_ts_1.weierstrass)({ ...curveDef, hash: hash });\n return { ...create(defHash), create };\n}\n//# sourceMappingURL=_shortw_utils.js.map",
|
|
41
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.encodeToCurve = exports.hashToCurve = exports.secp256k1_hasher = exports.schnorr = exports.secp256k1 = void 0;\n/**\n * SECG secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Belongs to Koblitz curves: it has efficiently-computable GLV endomorphism ψ,\n * check out {@link EndomorphismOpts}. Seems to be rigid (not backdoored).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst sha2_js_1 = require(\"@noble/hashes/sha2.js\");\nconst utils_js_1 = require(\"@noble/hashes/utils.js\");\nconst _shortw_utils_ts_1 = require(\"./_shortw_utils.js\");\nconst hash_to_curve_ts_1 = require(\"./abstract/hash-to-curve.js\");\nconst modular_ts_1 = require(\"./abstract/modular.js\");\nconst weierstrass_ts_1 = require(\"./abstract/weierstrass.js\");\nconst utils_ts_1 = require(\"./utils.js\");\n// Seems like generator was produced from some seed:\n// `Point.BASE.multiply(Point.Fn.inv(2n, N)).toAffine().x`\n// // gives short x 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63n\nconst secp256k1_CURVE = {\n p: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'),\n n: BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'),\n h: BigInt(1),\n a: BigInt(0),\n b: BigInt(7),\n Gx: BigInt('0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'),\n Gy: BigInt('0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'),\n};\nconst secp256k1_ENDO = {\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n basises: [\n [BigInt('0x3086d221a7d46bcde86c90e49284eb15'), -BigInt('0xe4437ed6010e88286f547fa90abfe4c3')],\n [BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8'), BigInt('0x3086d221a7d46bcde86c90e49284eb15')],\n ],\n};\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nconst _2n = /* @__PURE__ */ BigInt(2);\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y) {\n const P = secp256k1_CURVE.p;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = ((0, modular_ts_1.pow2)(b3, _3n, P) * b3) % P;\n const b9 = ((0, modular_ts_1.pow2)(b6, _3n, P) * b3) % P;\n const b11 = ((0, modular_ts_1.pow2)(b9, _2n, P) * b2) % P;\n const b22 = ((0, modular_ts_1.pow2)(b11, _11n, P) * b11) % P;\n const b44 = ((0, modular_ts_1.pow2)(b22, _22n, P) * b22) % P;\n const b88 = ((0, modular_ts_1.pow2)(b44, _44n, P) * b44) % P;\n const b176 = ((0, modular_ts_1.pow2)(b88, _88n, P) * b88) % P;\n const b220 = ((0, modular_ts_1.pow2)(b176, _44n, P) * b44) % P;\n const b223 = ((0, modular_ts_1.pow2)(b220, _3n, P) * b3) % P;\n const t1 = ((0, modular_ts_1.pow2)(b223, _23n, P) * b22) % P;\n const t2 = ((0, modular_ts_1.pow2)(t1, _6n, P) * b2) % P;\n const root = (0, modular_ts_1.pow2)(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y))\n throw new Error('Cannot find square root');\n return root;\n}\nconst Fpk1 = (0, modular_ts_1.Field)(secp256k1_CURVE.p, { sqrt: sqrtMod });\n/**\n * secp256k1 curve, ECDSA and ECDH methods.\n *\n * Field: `2n**256n - 2n**32n - 2n**9n - 2n**8n - 2n**7n - 2n**6n - 2n**4n - 1n`\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1';\n * const { secretKey, publicKey } = secp256k1.keygen();\n * const msg = new TextEncoder().encode('hello');\n * const sig = secp256k1.sign(msg, secretKey);\n * const isValid = secp256k1.verify(sig, msg, publicKey) === true;\n * ```\n */\nexports.secp256k1 = (0, _shortw_utils_ts_1.createCurve)({ ...secp256k1_CURVE, Fp: Fpk1, lowS: true, endo: secp256k1_ENDO }, sha2_js_1.sha256);\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES = {};\nfunction taggedHash(tag, ...messages) {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = (0, sha2_js_1.sha256)((0, utils_ts_1.utf8ToBytes)(tag));\n tagP = (0, utils_ts_1.concatBytes)(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return (0, sha2_js_1.sha256)((0, utils_ts_1.concatBytes)(tagP, ...messages));\n}\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point) => point.toBytes(true).slice(1);\nconst Pointk1 = /* @__PURE__ */ (() => exports.secp256k1.Point)();\nconst hasEven = (y) => y % _2n === _0n;\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv) {\n const { Fn, BASE } = Pointk1;\n const d_ = (0, weierstrass_ts_1._normFnElement)(Fn, priv);\n const p = BASE.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside\n const scalar = hasEven(p.y) ? d_ : Fn.neg(d_);\n return { scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x) {\n const Fp = Fpk1;\n if (!Fp.isValidNot0(x))\n throw new Error('invalid x: Fail if x ≥ p');\n const xx = Fp.create(x * x);\n const c = Fp.create(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n let y = Fp.sqrt(c); // Let y = c^(p+1)/4 mod p. Same as sqrt().\n // Return the unique point P such that x(P) = x and\n // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n if (!hasEven(y))\n y = Fp.neg(y);\n const p = Pointk1.fromAffine({ x, y });\n p.assertValidity();\n return p;\n}\nconst num = utils_ts_1.bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args) {\n return Pointk1.Fn.create(num(taggedHash('BIP0340/challenge', ...args)));\n}\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(secretKey) {\n return schnorrGetExtPubKey(secretKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(message, secretKey, auxRand = (0, utils_js_1.randomBytes)(32)) {\n const { Fn } = Pointk1;\n const m = (0, utils_ts_1.ensureBytes)('message', message);\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(secretKey); // checks for isWithinCurveOrder\n const a = (0, utils_ts_1.ensureBytes)('auxRand', auxRand, 32); // Auxiliary random data a: a 32-byte array\n const t = Fn.toBytes(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n // Let k' = int(rand) mod n. Fail if k' = 0. Let R = k'⋅G\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(rand);\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(Fn.toBytes(Fn.create(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px))\n throw new Error('sign: Invalid signature produced');\n return sig;\n}\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature, message, publicKey) {\n const { Fn, BASE } = Pointk1;\n const sig = (0, utils_ts_1.ensureBytes)('signature', signature, 64);\n const m = (0, utils_ts_1.ensureBytes)('message', message);\n const pub = (0, utils_ts_1.ensureBytes)('publicKey', publicKey, 32);\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n if (!(0, utils_ts_1.inRange)(r, _1n, secp256k1_CURVE.p))\n return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n if (!(0, utils_ts_1.inRange)(s, _1n, secp256k1_CURVE.n))\n return false;\n // int(challenge(bytes(r)||bytes(P)||m))%n\n const e = challenge(Fn.toBytes(r), pointToBytes(P), m);\n // R = s⋅G - e⋅P, where -eP == (n-e)P\n const R = BASE.multiplyUnsafe(s).add(P.multiplyUnsafe(Fn.neg(e)));\n const { x, y } = R.toAffine();\n // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n if (R.is0() || !hasEven(y) || x !== r)\n return false;\n return true;\n }\n catch (error) {\n return false;\n }\n}\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1';\n * const { secretKey, publicKey } = schnorr.keygen();\n * // const publicKey = schnorr.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, secretKey);\n * const isValid = schnorr.verify(sig, msg, publicKey);\n * ```\n */\nexports.schnorr = (() => {\n const size = 32;\n const seedLength = 48;\n const randomSecretKey = (seed = (0, utils_js_1.randomBytes)(seedLength)) => {\n return (0, modular_ts_1.mapHashToField)(seed, secp256k1_CURVE.n);\n };\n // TODO: remove\n exports.secp256k1.utils.randomSecretKey;\n function keygen(seed) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: schnorrGetPublicKey(secretKey) };\n }\n return {\n keygen,\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n Point: Pointk1,\n utils: {\n randomSecretKey: randomSecretKey,\n randomPrivateKey: randomSecretKey,\n taggedHash,\n // TODO: remove\n lift_x,\n pointToBytes,\n numberToBytesBE: utils_ts_1.numberToBytesBE,\n bytesToNumberBE: utils_ts_1.bytesToNumberBE,\n mod: modular_ts_1.mod,\n },\n lengths: {\n secretKey: size,\n publicKey: size,\n publicKeyHasPrefix: false,\n signature: size * 2,\n seed: seedLength,\n },\n };\n})();\nconst isoMap = /* @__PURE__ */ (() => (0, hash_to_curve_ts_1.isogenyMap)(Fpk1, [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n].map((i) => i.map((j) => BigInt(j)))))();\nconst mapSWU = /* @__PURE__ */ (() => (0, weierstrass_ts_1.mapToCurveSimpleSWU)(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n}))();\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexports.secp256k1_hasher = (() => (0, hash_to_curve_ts_1.createHasher)(exports.secp256k1.Point, (scalars) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n}, {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha2_js_1.sha256,\n}))();\n/** @deprecated use `import { secp256k1_hasher } from '@noble/curves/secp256k1.js';` */\nexports.hashToCurve = (() => exports.secp256k1_hasher.hashToCurve)();\n/** @deprecated use `import { secp256k1_hasher } from '@noble/curves/secp256k1.js';` */\nexports.encodeToCurve = (() => exports.secp256k1_hasher.encodeToCurve)();\n//# sourceMappingURL=secp256k1.js.map",
|
|
42
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeHex = exports.remove0x = void 0;\nvar utils_1 = require(\"@noble/ciphers/utils\");\nvar remove0x = function (hex) {\n return hex.startsWith(\"0x\") || hex.startsWith(\"0X\") ? hex.slice(2) : hex;\n};\nexports.remove0x = remove0x;\nvar decodeHex = function (hex) { return (0, utils_1.hexToBytes)((0, exports.remove0x)(hex)); };\nexports.decodeHex = decodeHex;\n",
|
|
43
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hexToPublicKey = exports.convertPublicKeyFormat = exports.getSharedPoint = exports.getPublicKey = exports.isValidPrivateKey = exports.getValidSecret = void 0;\nvar webcrypto_1 = require(\"@noble/ciphers/webcrypto\");\nvar ed25519_1 = require(\"@noble/curves/ed25519\");\nvar secp256k1_1 = require(\"@noble/curves/secp256k1\");\nvar config_js_1 = require(\"../config.js\");\nvar consts_js_1 = require(\"../consts.js\");\nvar hex_js_1 = require(\"./hex.js\");\nvar getValidSecret = function (curve) {\n var key;\n do {\n key = (0, webcrypto_1.randomBytes)(consts_js_1.SECRET_KEY_LENGTH);\n } while (!(0, exports.isValidPrivateKey)(key, curve));\n return key;\n};\nexports.getValidSecret = getValidSecret;\nvar isValidPrivateKey = function (secret, curve) {\n // on secp256k1: only key ∈ (0, group order) is valid\n // on curve25519: any 32-byte key is valid\n return _exec(curve, function (curve) { return curve.utils.isValidSecretKey(secret); }, function () { return true; }, function () { return true; });\n};\nexports.isValidPrivateKey = isValidPrivateKey;\nvar getPublicKey = function (secret, curve) {\n return _exec(curve, function (curve) { return curve.getPublicKey(secret); }, function (curve) { return curve.getPublicKey(secret); }, function (curve) { return curve.getPublicKey(secret); });\n};\nexports.getPublicKey = getPublicKey;\nvar getSharedPoint = function (sk, pk, compressed, curve) {\n return _exec(curve, function (curve) { return curve.getSharedSecret(sk, pk, compressed); }, function (curve) { return curve.getSharedSecret(sk, pk); }, function (curve) { return getSharedPointOnEd25519(curve, sk, pk); });\n};\nexports.getSharedPoint = getSharedPoint;\nvar convertPublicKeyFormat = function (pk, compressed, curve) {\n // only for secp256k1\n return _exec(curve, function (curve) {\n return curve.getSharedSecret(Uint8Array.from(Array(31).fill(0).concat([1])), // 1 as private key\n pk, compressed);\n }, function () { return pk; }, function () { return pk; });\n};\nexports.convertPublicKeyFormat = convertPublicKeyFormat;\nvar hexToPublicKey = function (hex, curve) {\n var decoded = (0, hex_js_1.decodeHex)(hex);\n return _exec(curve, function () { return compatEthPublicKey(decoded); }, function () { return decoded; }, function () { return decoded; });\n};\nexports.hexToPublicKey = hexToPublicKey;\nfunction _exec(curve, secp256k1Callback, x25519Callback, ed25519Callback) {\n var _curve = curve || config_js_1.ECIES_CONFIG.ellipticCurve; // TODO: remove after 0.5.0\n /* v8 ignore else -- @preserve */\n if (_curve === \"secp256k1\") {\n return secp256k1Callback(secp256k1_1.secp256k1);\n }\n else if (_curve === \"x25519\") {\n return x25519Callback(ed25519_1.x25519);\n }\n else if (_curve === \"ed25519\") {\n return ed25519Callback(ed25519_1.ed25519);\n }\n else {\n throw new Error(\"Not implemented\");\n }\n}\nvar compatEthPublicKey = function (pk) {\n if (pk.length === consts_js_1.ETH_PUBLIC_KEY_SIZE) {\n var fixed = new Uint8Array(1 + pk.length);\n fixed.set([0x04]);\n fixed.set(pk, 1);\n return fixed;\n }\n return pk;\n};\nvar getSharedPointOnEd25519 = function (curve, sk, pk) {\n // Note: scalar is hashed from sk\n var scalar = curve.utils.getExtendedPublicKey(sk).scalar;\n var point = curve.Point.fromBytes(pk).multiply(scalar);\n return point.toBytes();\n};\n",
|
|
44
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hkdf = void 0;\nexports.extract = extract;\nexports.expand = expand;\n/**\n * HKDF (RFC 5869): extract + expand in one step.\n * See https://soatok.blog/2021/11/17/understanding-hkdf/.\n * @module\n */\nconst hmac_ts_1 = require(\"./hmac.js\");\nconst utils_ts_1 = require(\"./utils.js\");\n/**\n * HKDF-extract from spec. Less important part. `HKDF-Extract(IKM, salt) -> PRK`\n * Arguments position differs from spec (IKM is first one, since it is not optional)\n * @param hash - hash function that would be used (e.g. sha256)\n * @param ikm - input keying material, the initial key\n * @param salt - optional salt value (a non-secret random value)\n */\nfunction extract(hash, ikm, salt) {\n (0, utils_ts_1.ahash)(hash);\n // NOTE: some libraries treat zero-length array as 'not provided';\n // we don't, since we have undefined as 'not provided'\n // https://github.com/RustCrypto/KDFs/issues/15\n if (salt === undefined)\n salt = new Uint8Array(hash.outputLen);\n return (0, hmac_ts_1.hmac)(hash, (0, utils_ts_1.toBytes)(salt), (0, utils_ts_1.toBytes)(ikm));\n}\nconst HKDF_COUNTER = /* @__PURE__ */ Uint8Array.from([0]);\nconst EMPTY_BUFFER = /* @__PURE__ */ Uint8Array.of();\n/**\n * HKDF-expand from the spec. The most important part. `HKDF-Expand(PRK, info, L) -> OKM`\n * @param hash - hash function that would be used (e.g. sha256)\n * @param prk - a pseudorandom key of at least HashLen octets (usually, the output from the extract step)\n * @param info - optional context and application specific information (can be a zero-length string)\n * @param length - length of output keying material in bytes\n */\nfunction expand(hash, prk, info, length = 32) {\n (0, utils_ts_1.ahash)(hash);\n (0, utils_ts_1.anumber)(length);\n const olen = hash.outputLen;\n if (length > 255 * olen)\n throw new Error('Length should be <= 255*HashLen');\n const blocks = Math.ceil(length / olen);\n if (info === undefined)\n info = EMPTY_BUFFER;\n // first L(ength) octets of T\n const okm = new Uint8Array(blocks * olen);\n // Re-use HMAC instance between blocks\n const HMAC = hmac_ts_1.hmac.create(hash, prk);\n const HMACTmp = HMAC._cloneInto();\n const T = new Uint8Array(HMAC.outputLen);\n for (let counter = 0; counter < blocks; counter++) {\n HKDF_COUNTER[0] = counter + 1;\n // T(0) = empty string (zero length)\n // T(N) = HMAC-Hash(PRK, T(N-1) | info | N)\n HMACTmp.update(counter === 0 ? EMPTY_BUFFER : T)\n .update(info)\n .update(HKDF_COUNTER)\n .digestInto(T);\n okm.set(T, olen * counter);\n HMAC._cloneInto(HMACTmp);\n }\n HMAC.destroy();\n HMACTmp.destroy();\n (0, utils_ts_1.clean)(T, HKDF_COUNTER);\n return okm.slice(0, length);\n}\n/**\n * HKDF (RFC 5869): derive keys from an initial input.\n * Combines hkdf_extract + hkdf_expand in one step\n * @param hash - hash function that would be used (e.g. sha256)\n * @param ikm - input keying material, the initial key\n * @param salt - optional salt value (a non-secret random value)\n * @param info - optional context and application specific information (can be a zero-length string)\n * @param length - length of output keying material in bytes\n * @example\n * import { hkdf } from '@noble/hashes/hkdf';\n * import { sha256 } from '@noble/hashes/sha2';\n * import { randomBytes } from '@noble/hashes/utils';\n * const inputKey = randomBytes(32);\n * const salt = randomBytes(32);\n * const info = 'application-key';\n * const hk1 = hkdf(sha256, inputKey, salt, info, 32);\n */\nconst hkdf = (hash, ikm, salt, info, length) => expand(hash, extract(hash, ikm, salt), info, length);\nexports.hkdf = hkdf;\n//# sourceMappingURL=hkdf.js.map",
|
|
45
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSharedKey = exports.deriveKey = void 0;\nvar utils_1 = require(\"@noble/ciphers/utils\");\nvar hkdf_1 = require(\"@noble/hashes/hkdf\");\nvar sha2_1 = require(\"@noble/hashes/sha2\");\nvar deriveKey = function (master, salt, info) {\n // 32 bytes shared secret for aes256 and xchacha20 derived from HKDF-SHA256\n return (0, hkdf_1.hkdf)(sha2_1.sha256, master, salt, info, 32);\n};\nexports.deriveKey = deriveKey;\nvar getSharedKey = function () {\n var parts = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n parts[_i] = arguments[_i];\n }\n return (0, exports.deriveKey)(utils_1.concatBytes.apply(void 0, parts));\n};\nexports.getSharedKey = getSharedKey;\n",
|
|
46
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports._compat = void 0;\n// biome-ignore-all lint/suspicious/noExplicitAny: hide type error\nvar node_crypto_1 = require(\"node:crypto\");\nvar utils_1 = require(\"@noble/ciphers/utils\");\nvar AEAD_TAG_LENGTH = 16;\n// @ts-expect-error: only necessary for deno\nvar IS_DENO = globalThis.Deno !== undefined;\n/**\n * make `node:crypto`'s ciphers compatible with `@noble/ciphers`.\n *\n * `Cipher`'s interface is the same for both `aes-256-gcm` and `chacha20-poly1305`,\n * albeit the latter is one of `CipherCCMTypes`.\n * Interestingly, whether to set `plaintextLength` or not, or which value to set, has no actual effect.\n */\nvar _compat = function (algorithm, key, nonce, AAD) {\n var isAEAD = algorithm === \"aes-256-gcm\" || algorithm === \"chacha20-poly1305\";\n var authTagLength = isAEAD ? AEAD_TAG_LENGTH : 0;\n // authTagLength is necessary for `chacha20-poly1305` before Node v16.17\n var options = isAEAD ? { authTagLength: authTagLength } : undefined;\n var encrypt = function (plainText) {\n var cipher = (0, node_crypto_1.createCipheriv)(algorithm, key, nonce, options);\n if (isAEAD && AAD !== undefined) {\n cipher.setAAD(AAD);\n }\n var updated = cipher.update(plainText);\n var finalized = cipher.final();\n var tag = isAEAD ? cipher.getAuthTag() : new Uint8Array(0);\n return (0, utils_1.concatBytes)(updated, finalized, tag);\n };\n var decrypt = function (cipherText) {\n var rawCipherText = cipherText.subarray(0, cipherText.length - authTagLength);\n var tag = cipherText.subarray(cipherText.length - authTagLength);\n var decipher = (0, node_crypto_1.createDecipheriv)(algorithm, key, nonce, options);\n if (isAEAD) {\n if (AAD !== undefined) {\n decipher.setAAD(AAD);\n }\n decipher.setAuthTag(tag);\n }\n /* v8 ignore if -- @preserve */\n if (!isAEAD && IS_DENO) {\n decipher.setAutoPadding(false); // See: https://github.com/denoland/deno/issues/28381\n }\n var updated = decipher.update(rawCipherText);\n var finalized = decipher.final();\n return (0, utils_1.concatBytes)(updated, finalized);\n };\n return {\n encrypt: encrypt,\n decrypt: decrypt,\n };\n};\nexports._compat = _compat;\n",
|
|
47
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.aes256cbc = exports.aes256gcm = void 0;\nvar compat_js_1 = require(\"../_node/compat.js\");\nvar aes256gcm = function (key, nonce, AAD) {\n return (0, compat_js_1._compat)(\"aes-256-gcm\", key, nonce, AAD);\n};\nexports.aes256gcm = aes256gcm;\nvar aes256cbc = function (key, nonce, _AAD) {\n return (0, compat_js_1._compat)(\"aes-256-cbc\", key, nonce);\n};\nexports.aes256cbc = aes256cbc;\n",
|
|
48
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.rotl = rotl;\nexports.createCipher = createCipher;\n/**\n * Basic utils for ARX (add-rotate-xor) salsa and chacha ciphers.\n\nRFC8439 requires multi-step cipher stream, where\nauthKey starts with counter: 0, actual msg with counter: 1.\n\nFor this, we need a way to re-use nonce / counter:\n\n const counter = new Uint8Array(4);\n chacha(..., counter, ...); // counter is now 1\n chacha(..., counter, ...); // counter is now 2\n\nThis is complicated:\n\n- 32-bit counters are enough, no need for 64-bit: max ArrayBuffer size in JS is 4GB\n- Original papers don't allow mutating counters\n- Counter overflow is undefined [^1]\n- Idea A: allow providing (nonce | counter) instead of just nonce, re-use it\n- Caveat: Cannot be re-used through all cases:\n- * chacha has (counter | nonce)\n- * xchacha has (nonce16 | counter | nonce16)\n- Idea B: separate nonce / counter and provide separate API for counter re-use\n- Caveat: there are different counter sizes depending on an algorithm.\n- salsa & chacha also differ in structures of key & sigma:\n salsa20: s[0] | k(4) | s[1] | nonce(2) | ctr(2) | s[2] | k(4) | s[3]\n chacha: s(4) | k(8) | ctr(1) | nonce(3)\n chacha20orig: s(4) | k(8) | ctr(2) | nonce(2)\n- Idea C: helper method such as `setSalsaState(key, nonce, sigma, data)`\n- Caveat: we can't re-use counter array\n\nxchacha [^2] uses the subkey and remaining 8 byte nonce with ChaCha20 as normal\n(prefixed by 4 NUL bytes, since [RFC8439] specifies a 12-byte nonce).\n\n[^1]: https://mailarchive.ietf.org/arch/msg/cfrg/gsOnTJzcbgG6OqD8Sc0GO5aR_tU/\n[^2]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha#appendix-A.2\n\n * @module\n */\n// prettier-ignore\nconst utils_ts_1 = require(\"./utils.js\");\n// We can't make top-level var depend on utils.utf8ToBytes\n// because it's not present in all envs. Creating a similar fn here\nconst _utf8ToBytes = (str) => Uint8Array.from(str.split('').map((c) => c.charCodeAt(0)));\nconst sigma16 = _utf8ToBytes('expand 16-byte k');\nconst sigma32 = _utf8ToBytes('expand 32-byte k');\nconst sigma16_32 = (0, utils_ts_1.u32)(sigma16);\nconst sigma32_32 = (0, utils_ts_1.u32)(sigma32);\nfunction rotl(a, b) {\n return (a << b) | (a >>> (32 - b));\n}\n// Is byte array aligned to 4 byte offset (u32)?\nfunction isAligned32(b) {\n return b.byteOffset % 4 === 0;\n}\n// Salsa and Chacha block length is always 512-bit\nconst BLOCK_LEN = 64;\nconst BLOCK_LEN32 = 16;\n// new Uint32Array([2**32]) // => Uint32Array(1) [ 0 ]\n// new Uint32Array([2**32-1]) // => Uint32Array(1) [ 4294967295 ]\nconst MAX_COUNTER = 2 ** 32 - 1;\nconst U32_EMPTY = new Uint32Array();\nfunction runCipher(core, sigma, key, nonce, data, output, counter, rounds) {\n const len = data.length;\n const block = new Uint8Array(BLOCK_LEN);\n const b32 = (0, utils_ts_1.u32)(block);\n // Make sure that buffers aligned to 4 bytes\n const isAligned = isAligned32(data) && isAligned32(output);\n const d32 = isAligned ? (0, utils_ts_1.u32)(data) : U32_EMPTY;\n const o32 = isAligned ? (0, utils_ts_1.u32)(output) : U32_EMPTY;\n for (let pos = 0; pos < len; counter++) {\n core(sigma, key, nonce, b32, counter, rounds);\n if (counter >= MAX_COUNTER)\n throw new Error('arx: counter overflow');\n const take = Math.min(BLOCK_LEN, len - pos);\n // aligned to 4 bytes\n if (isAligned && take === BLOCK_LEN) {\n const pos32 = pos / 4;\n if (pos % 4 !== 0)\n throw new Error('arx: invalid block position');\n for (let j = 0, posj; j < BLOCK_LEN32; j++) {\n posj = pos32 + j;\n o32[posj] = d32[posj] ^ b32[j];\n }\n pos += BLOCK_LEN;\n continue;\n }\n for (let j = 0, posj; j < take; j++) {\n posj = pos + j;\n output[posj] = data[posj] ^ block[j];\n }\n pos += take;\n }\n}\n/** Creates ARX-like (ChaCha, Salsa) cipher stream from core function. */\nfunction createCipher(core, opts) {\n const { allowShortKeys, extendNonceFn, counterLength, counterRight, rounds } = (0, utils_ts_1.checkOpts)({ allowShortKeys: false, counterLength: 8, counterRight: false, rounds: 20 }, opts);\n if (typeof core !== 'function')\n throw new Error('core must be a function');\n (0, utils_ts_1.anumber)(counterLength);\n (0, utils_ts_1.anumber)(rounds);\n (0, utils_ts_1.abool)(counterRight);\n (0, utils_ts_1.abool)(allowShortKeys);\n return (key, nonce, data, output, counter = 0) => {\n (0, utils_ts_1.abytes)(key);\n (0, utils_ts_1.abytes)(nonce);\n (0, utils_ts_1.abytes)(data);\n const len = data.length;\n if (output === undefined)\n output = new Uint8Array(len);\n (0, utils_ts_1.abytes)(output);\n (0, utils_ts_1.anumber)(counter);\n if (counter < 0 || counter >= MAX_COUNTER)\n throw new Error('arx: counter overflow');\n if (output.length < len)\n throw new Error(`arx: output (${output.length}) is shorter than data (${len})`);\n const toClean = [];\n // Key & sigma\n // key=16 -> sigma16, k=key|key\n // key=32 -> sigma32, k=key\n let l = key.length;\n let k;\n let sigma;\n if (l === 32) {\n toClean.push((k = (0, utils_ts_1.copyBytes)(key)));\n sigma = sigma32_32;\n }\n else if (l === 16 && allowShortKeys) {\n k = new Uint8Array(32);\n k.set(key);\n k.set(key, 16);\n sigma = sigma16_32;\n toClean.push(k);\n }\n else {\n throw new Error(`arx: invalid 32-byte key, got length=${l}`);\n }\n // Nonce\n // salsa20: 8 (8-byte counter)\n // chacha20orig: 8 (8-byte counter)\n // chacha20: 12 (4-byte counter)\n // xsalsa20: 24 (16 -> hsalsa, 8 -> old nonce)\n // xchacha20: 24 (16 -> hchacha, 8 -> old nonce)\n // Align nonce to 4 bytes\n if (!isAligned32(nonce))\n toClean.push((nonce = (0, utils_ts_1.copyBytes)(nonce)));\n const k32 = (0, utils_ts_1.u32)(k);\n // hsalsa & hchacha: handle extended nonce\n if (extendNonceFn) {\n if (nonce.length !== 24)\n throw new Error(`arx: extended nonce must be 24 bytes`);\n extendNonceFn(sigma, k32, (0, utils_ts_1.u32)(nonce.subarray(0, 16)), k32);\n nonce = nonce.subarray(16);\n }\n // Handle nonce counter\n const nonceNcLen = 16 - counterLength;\n if (nonceNcLen !== nonce.length)\n throw new Error(`arx: nonce must be ${nonceNcLen} or 16 bytes`);\n // Pad counter when nonce is 64 bit\n if (nonceNcLen !== 12) {\n const nc = new Uint8Array(12);\n nc.set(nonce, counterRight ? 0 : 12 - nonce.length);\n nonce = nc;\n toClean.push(nonce);\n }\n const n32 = (0, utils_ts_1.u32)(nonce);\n runCipher(core, sigma, k32, n32, data, output, counter, rounds);\n (0, utils_ts_1.clean)(...toClean);\n return output;\n };\n}\n//# sourceMappingURL=_arx.js.map",
|
|
49
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.poly1305 = void 0;\nexports.wrapConstructorWithKey = wrapConstructorWithKey;\n/**\n * Poly1305 ([PDF](https://cr.yp.to/mac/poly1305-20050329.pdf),\n * [wiki](https://en.wikipedia.org/wiki/Poly1305))\n * is a fast and parallel secret-key message-authentication code suitable for\n * a wide variety of applications. It was standardized in\n * [RFC 8439](https://datatracker.ietf.org/doc/html/rfc8439) and is now used in TLS 1.3.\n *\n * Polynomial MACs are not perfect for every situation:\n * they lack Random Key Robustness: the MAC can be forged, and can't be used in PAKE schemes.\n * See [invisible salamanders attack](https://keymaterial.net/2020/09/07/invisible-salamanders-in-aes-gcm-siv/).\n * To combat invisible salamanders, `hash(key)` can be included in ciphertext,\n * however, this would violate ciphertext indistinguishability:\n * an attacker would know which key was used - so `HKDF(key, i)`\n * could be used instead.\n *\n * Check out [original website](https://cr.yp.to/mac.html).\n * @module\n */\nconst utils_ts_1 = require(\"./utils.js\");\n// Based on Public Domain poly1305-donna https://github.com/floodyberry/poly1305-donna\nconst u8to16 = (a, i) => (a[i++] & 0xff) | ((a[i++] & 0xff) << 8);\nclass Poly1305 {\n constructor(key) {\n this.blockLen = 16;\n this.outputLen = 16;\n this.buffer = new Uint8Array(16);\n this.r = new Uint16Array(10);\n this.h = new Uint16Array(10);\n this.pad = new Uint16Array(8);\n this.pos = 0;\n this.finished = false;\n key = (0, utils_ts_1.toBytes)(key);\n (0, utils_ts_1.abytes)(key, 32);\n const t0 = u8to16(key, 0);\n const t1 = u8to16(key, 2);\n const t2 = u8to16(key, 4);\n const t3 = u8to16(key, 6);\n const t4 = u8to16(key, 8);\n const t5 = u8to16(key, 10);\n const t6 = u8to16(key, 12);\n const t7 = u8to16(key, 14);\n // https://github.com/floodyberry/poly1305-donna/blob/e6ad6e091d30d7f4ec2d4f978be1fcfcbce72781/poly1305-donna-16.h#L47\n this.r[0] = t0 & 0x1fff;\n this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03;\n this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff;\n this.r[5] = (t4 >>> 1) & 0x1ffe;\n this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81;\n this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n this.r[9] = (t7 >>> 5) & 0x007f;\n for (let i = 0; i < 8; i++)\n this.pad[i] = u8to16(key, 16 + 2 * i);\n }\n process(data, offset, isLast = false) {\n const hibit = isLast ? 0 : 1 << 11;\n const { h, r } = this;\n const r0 = r[0];\n const r1 = r[1];\n const r2 = r[2];\n const r3 = r[3];\n const r4 = r[4];\n const r5 = r[5];\n const r6 = r[6];\n const r7 = r[7];\n const r8 = r[8];\n const r9 = r[9];\n const t0 = u8to16(data, offset + 0);\n const t1 = u8to16(data, offset + 2);\n const t2 = u8to16(data, offset + 4);\n const t3 = u8to16(data, offset + 6);\n const t4 = u8to16(data, offset + 8);\n const t5 = u8to16(data, offset + 10);\n const t6 = u8to16(data, offset + 12);\n const t7 = u8to16(data, offset + 14);\n let h0 = h[0] + (t0 & 0x1fff);\n let h1 = h[1] + (((t0 >>> 13) | (t1 << 3)) & 0x1fff);\n let h2 = h[2] + (((t1 >>> 10) | (t2 << 6)) & 0x1fff);\n let h3 = h[3] + (((t2 >>> 7) | (t3 << 9)) & 0x1fff);\n let h4 = h[4] + (((t3 >>> 4) | (t4 << 12)) & 0x1fff);\n let h5 = h[5] + ((t4 >>> 1) & 0x1fff);\n let h6 = h[6] + (((t4 >>> 14) | (t5 << 2)) & 0x1fff);\n let h7 = h[7] + (((t5 >>> 11) | (t6 << 5)) & 0x1fff);\n let h8 = h[8] + (((t6 >>> 8) | (t7 << 8)) & 0x1fff);\n let h9 = h[9] + ((t7 >>> 5) | hibit);\n let c = 0;\n let d0 = c + h0 * r0 + h1 * (5 * r9) + h2 * (5 * r8) + h3 * (5 * r7) + h4 * (5 * r6);\n c = d0 >>> 13;\n d0 &= 0x1fff;\n d0 += h5 * (5 * r5) + h6 * (5 * r4) + h7 * (5 * r3) + h8 * (5 * r2) + h9 * (5 * r1);\n c += d0 >>> 13;\n d0 &= 0x1fff;\n let d1 = c + h0 * r1 + h1 * r0 + h2 * (5 * r9) + h3 * (5 * r8) + h4 * (5 * r7);\n c = d1 >>> 13;\n d1 &= 0x1fff;\n d1 += h5 * (5 * r6) + h6 * (5 * r5) + h7 * (5 * r4) + h8 * (5 * r3) + h9 * (5 * r2);\n c += d1 >>> 13;\n d1 &= 0x1fff;\n let d2 = c + h0 * r2 + h1 * r1 + h2 * r0 + h3 * (5 * r9) + h4 * (5 * r8);\n c = d2 >>> 13;\n d2 &= 0x1fff;\n d2 += h5 * (5 * r7) + h6 * (5 * r6) + h7 * (5 * r5) + h8 * (5 * r4) + h9 * (5 * r3);\n c += d2 >>> 13;\n d2 &= 0x1fff;\n let d3 = c + h0 * r3 + h1 * r2 + h2 * r1 + h3 * r0 + h4 * (5 * r9);\n c = d3 >>> 13;\n d3 &= 0x1fff;\n d3 += h5 * (5 * r8) + h6 * (5 * r7) + h7 * (5 * r6) + h8 * (5 * r5) + h9 * (5 * r4);\n c += d3 >>> 13;\n d3 &= 0x1fff;\n let d4 = c + h0 * r4 + h1 * r3 + h2 * r2 + h3 * r1 + h4 * r0;\n c = d4 >>> 13;\n d4 &= 0x1fff;\n d4 += h5 * (5 * r9) + h6 * (5 * r8) + h7 * (5 * r7) + h8 * (5 * r6) + h9 * (5 * r5);\n c += d4 >>> 13;\n d4 &= 0x1fff;\n let d5 = c + h0 * r5 + h1 * r4 + h2 * r3 + h3 * r2 + h4 * r1;\n c = d5 >>> 13;\n d5 &= 0x1fff;\n d5 += h5 * r0 + h6 * (5 * r9) + h7 * (5 * r8) + h8 * (5 * r7) + h9 * (5 * r6);\n c += d5 >>> 13;\n d5 &= 0x1fff;\n let d6 = c + h0 * r6 + h1 * r5 + h2 * r4 + h3 * r3 + h4 * r2;\n c = d6 >>> 13;\n d6 &= 0x1fff;\n d6 += h5 * r1 + h6 * r0 + h7 * (5 * r9) + h8 * (5 * r8) + h9 * (5 * r7);\n c += d6 >>> 13;\n d6 &= 0x1fff;\n let d7 = c + h0 * r7 + h1 * r6 + h2 * r5 + h3 * r4 + h4 * r3;\n c = d7 >>> 13;\n d7 &= 0x1fff;\n d7 += h5 * r2 + h6 * r1 + h7 * r0 + h8 * (5 * r9) + h9 * (5 * r8);\n c += d7 >>> 13;\n d7 &= 0x1fff;\n let d8 = c + h0 * r8 + h1 * r7 + h2 * r6 + h3 * r5 + h4 * r4;\n c = d8 >>> 13;\n d8 &= 0x1fff;\n d8 += h5 * r3 + h6 * r2 + h7 * r1 + h8 * r0 + h9 * (5 * r9);\n c += d8 >>> 13;\n d8 &= 0x1fff;\n let d9 = c + h0 * r9 + h1 * r8 + h2 * r7 + h3 * r6 + h4 * r5;\n c = d9 >>> 13;\n d9 &= 0x1fff;\n d9 += h5 * r4 + h6 * r3 + h7 * r2 + h8 * r1 + h9 * r0;\n c += d9 >>> 13;\n d9 &= 0x1fff;\n c = ((c << 2) + c) | 0;\n c = (c + d0) | 0;\n d0 = c & 0x1fff;\n c = c >>> 13;\n d1 += c;\n h[0] = d0;\n h[1] = d1;\n h[2] = d2;\n h[3] = d3;\n h[4] = d4;\n h[5] = d5;\n h[6] = d6;\n h[7] = d7;\n h[8] = d8;\n h[9] = d9;\n }\n finalize() {\n const { h, pad } = this;\n const g = new Uint16Array(10);\n let c = h[1] >>> 13;\n h[1] &= 0x1fff;\n for (let i = 2; i < 10; i++) {\n h[i] += c;\n c = h[i] >>> 13;\n h[i] &= 0x1fff;\n }\n h[0] += c * 5;\n c = h[0] >>> 13;\n h[0] &= 0x1fff;\n h[1] += c;\n c = h[1] >>> 13;\n h[1] &= 0x1fff;\n h[2] += c;\n g[0] = h[0] + 5;\n c = g[0] >>> 13;\n g[0] &= 0x1fff;\n for (let i = 1; i < 10; i++) {\n g[i] = h[i] + c;\n c = g[i] >>> 13;\n g[i] &= 0x1fff;\n }\n g[9] -= 1 << 13;\n let mask = (c ^ 1) - 1;\n for (let i = 0; i < 10; i++)\n g[i] &= mask;\n mask = ~mask;\n for (let i = 0; i < 10; i++)\n h[i] = (h[i] & mask) | g[i];\n h[0] = (h[0] | (h[1] << 13)) & 0xffff;\n h[1] = ((h[1] >>> 3) | (h[2] << 10)) & 0xffff;\n h[2] = ((h[2] >>> 6) | (h[3] << 7)) & 0xffff;\n h[3] = ((h[3] >>> 9) | (h[4] << 4)) & 0xffff;\n h[4] = ((h[4] >>> 12) | (h[5] << 1) | (h[6] << 14)) & 0xffff;\n h[5] = ((h[6] >>> 2) | (h[7] << 11)) & 0xffff;\n h[6] = ((h[7] >>> 5) | (h[8] << 8)) & 0xffff;\n h[7] = ((h[8] >>> 8) | (h[9] << 5)) & 0xffff;\n let f = h[0] + pad[0];\n h[0] = f & 0xffff;\n for (let i = 1; i < 8; i++) {\n f = (((h[i] + pad[i]) | 0) + (f >>> 16)) | 0;\n h[i] = f & 0xffff;\n }\n (0, utils_ts_1.clean)(g);\n }\n update(data) {\n (0, utils_ts_1.aexists)(this);\n data = (0, utils_ts_1.toBytes)(data);\n (0, utils_ts_1.abytes)(data);\n const { buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input\n if (take === blockLen) {\n for (; blockLen <= len - pos; pos += blockLen)\n this.process(data, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(buffer, 0, false);\n this.pos = 0;\n }\n }\n return this;\n }\n destroy() {\n (0, utils_ts_1.clean)(this.h, this.r, this.buffer, this.pad);\n }\n digestInto(out) {\n (0, utils_ts_1.aexists)(this);\n (0, utils_ts_1.aoutput)(out, this);\n this.finished = true;\n const { buffer, h } = this;\n let { pos } = this;\n if (pos) {\n buffer[pos++] = 1;\n for (; pos < 16; pos++)\n buffer[pos] = 0;\n this.process(buffer, 0, true);\n }\n this.finalize();\n let opos = 0;\n for (let i = 0; i < 8; i++) {\n out[opos++] = h[i] >>> 0;\n out[opos++] = h[i] >>> 8;\n }\n return out;\n }\n digest() {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n}\nfunction wrapConstructorWithKey(hashCons) {\n const hashC = (msg, key) => hashCons(key).update((0, utils_ts_1.toBytes)(msg)).digest();\n const tmp = hashCons(new Uint8Array(32));\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (key) => hashCons(key);\n return hashC;\n}\n/** Poly1305 MAC from RFC 8439. */\nexports.poly1305 = wrapConstructorWithKey((key) => new Poly1305(key));\n//# sourceMappingURL=_poly1305.js.map",
|
|
50
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.xchacha20poly1305 = exports.chacha20poly1305 = exports._poly1305_aead = exports.chacha12 = exports.chacha8 = exports.xchacha20 = exports.chacha20 = exports.chacha20orig = void 0;\nexports.hchacha = hchacha;\n/**\n * [ChaCha20](https://cr.yp.to/chacha.html) stream cipher, released\n * in 2008. Developed after Salsa20, ChaCha aims to increase diffusion per round.\n * It was standardized in [RFC 8439](https://datatracker.ietf.org/doc/html/rfc8439) and\n * is now used in TLS 1.3.\n *\n * [XChaCha20](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha)\n * extended-nonce variant is also provided. Similar to XSalsa, it's safe to use with\n * randomly-generated nonces.\n *\n * Check out [PDF](http://cr.yp.to/chacha/chacha-20080128.pdf) and\n * [wiki](https://en.wikipedia.org/wiki/Salsa20).\n * @module\n */\nconst _arx_ts_1 = require(\"./_arx.js\");\nconst _poly1305_ts_1 = require(\"./_poly1305.js\");\nconst utils_ts_1 = require(\"./utils.js\");\n/**\n * ChaCha core function.\n */\n// prettier-ignore\nfunction chachaCore(s, k, n, out, cnt, rounds = 20) {\n let y00 = s[0], y01 = s[1], y02 = s[2], y03 = s[3], // \"expa\" \"nd 3\" \"2-by\" \"te k\"\n y04 = k[0], y05 = k[1], y06 = k[2], y07 = k[3], // Key Key Key Key\n y08 = k[4], y09 = k[5], y10 = k[6], y11 = k[7], // Key Key Key Key\n y12 = cnt, y13 = n[0], y14 = n[1], y15 = n[2]; // Counter Counter\tNonce Nonce\n // Save state to temporary variables\n let x00 = y00, x01 = y01, x02 = y02, x03 = y03, x04 = y04, x05 = y05, x06 = y06, x07 = y07, x08 = y08, x09 = y09, x10 = y10, x11 = y11, x12 = y12, x13 = y13, x14 = y14, x15 = y15;\n for (let r = 0; r < rounds; r += 2) {\n x00 = (x00 + x04) | 0;\n x12 = (0, _arx_ts_1.rotl)(x12 ^ x00, 16);\n x08 = (x08 + x12) | 0;\n x04 = (0, _arx_ts_1.rotl)(x04 ^ x08, 12);\n x00 = (x00 + x04) | 0;\n x12 = (0, _arx_ts_1.rotl)(x12 ^ x00, 8);\n x08 = (x08 + x12) | 0;\n x04 = (0, _arx_ts_1.rotl)(x04 ^ x08, 7);\n x01 = (x01 + x05) | 0;\n x13 = (0, _arx_ts_1.rotl)(x13 ^ x01, 16);\n x09 = (x09 + x13) | 0;\n x05 = (0, _arx_ts_1.rotl)(x05 ^ x09, 12);\n x01 = (x01 + x05) | 0;\n x13 = (0, _arx_ts_1.rotl)(x13 ^ x01, 8);\n x09 = (x09 + x13) | 0;\n x05 = (0, _arx_ts_1.rotl)(x05 ^ x09, 7);\n x02 = (x02 + x06) | 0;\n x14 = (0, _arx_ts_1.rotl)(x14 ^ x02, 16);\n x10 = (x10 + x14) | 0;\n x06 = (0, _arx_ts_1.rotl)(x06 ^ x10, 12);\n x02 = (x02 + x06) | 0;\n x14 = (0, _arx_ts_1.rotl)(x14 ^ x02, 8);\n x10 = (x10 + x14) | 0;\n x06 = (0, _arx_ts_1.rotl)(x06 ^ x10, 7);\n x03 = (x03 + x07) | 0;\n x15 = (0, _arx_ts_1.rotl)(x15 ^ x03, 16);\n x11 = (x11 + x15) | 0;\n x07 = (0, _arx_ts_1.rotl)(x07 ^ x11, 12);\n x03 = (x03 + x07) | 0;\n x15 = (0, _arx_ts_1.rotl)(x15 ^ x03, 8);\n x11 = (x11 + x15) | 0;\n x07 = (0, _arx_ts_1.rotl)(x07 ^ x11, 7);\n x00 = (x00 + x05) | 0;\n x15 = (0, _arx_ts_1.rotl)(x15 ^ x00, 16);\n x10 = (x10 + x15) | 0;\n x05 = (0, _arx_ts_1.rotl)(x05 ^ x10, 12);\n x00 = (x00 + x05) | 0;\n x15 = (0, _arx_ts_1.rotl)(x15 ^ x00, 8);\n x10 = (x10 + x15) | 0;\n x05 = (0, _arx_ts_1.rotl)(x05 ^ x10, 7);\n x01 = (x01 + x06) | 0;\n x12 = (0, _arx_ts_1.rotl)(x12 ^ x01, 16);\n x11 = (x11 + x12) | 0;\n x06 = (0, _arx_ts_1.rotl)(x06 ^ x11, 12);\n x01 = (x01 + x06) | 0;\n x12 = (0, _arx_ts_1.rotl)(x12 ^ x01, 8);\n x11 = (x11 + x12) | 0;\n x06 = (0, _arx_ts_1.rotl)(x06 ^ x11, 7);\n x02 = (x02 + x07) | 0;\n x13 = (0, _arx_ts_1.rotl)(x13 ^ x02, 16);\n x08 = (x08 + x13) | 0;\n x07 = (0, _arx_ts_1.rotl)(x07 ^ x08, 12);\n x02 = (x02 + x07) | 0;\n x13 = (0, _arx_ts_1.rotl)(x13 ^ x02, 8);\n x08 = (x08 + x13) | 0;\n x07 = (0, _arx_ts_1.rotl)(x07 ^ x08, 7);\n x03 = (x03 + x04) | 0;\n x14 = (0, _arx_ts_1.rotl)(x14 ^ x03, 16);\n x09 = (x09 + x14) | 0;\n x04 = (0, _arx_ts_1.rotl)(x04 ^ x09, 12);\n x03 = (x03 + x04) | 0;\n x14 = (0, _arx_ts_1.rotl)(x14 ^ x03, 8);\n x09 = (x09 + x14) | 0;\n x04 = (0, _arx_ts_1.rotl)(x04 ^ x09, 7);\n }\n // Write output\n let oi = 0;\n out[oi++] = (y00 + x00) | 0;\n out[oi++] = (y01 + x01) | 0;\n out[oi++] = (y02 + x02) | 0;\n out[oi++] = (y03 + x03) | 0;\n out[oi++] = (y04 + x04) | 0;\n out[oi++] = (y05 + x05) | 0;\n out[oi++] = (y06 + x06) | 0;\n out[oi++] = (y07 + x07) | 0;\n out[oi++] = (y08 + x08) | 0;\n out[oi++] = (y09 + x09) | 0;\n out[oi++] = (y10 + x10) | 0;\n out[oi++] = (y11 + x11) | 0;\n out[oi++] = (y12 + x12) | 0;\n out[oi++] = (y13 + x13) | 0;\n out[oi++] = (y14 + x14) | 0;\n out[oi++] = (y15 + x15) | 0;\n}\n/**\n * hchacha helper method, used primarily in xchacha, to hash\n * key and nonce into key' and nonce'.\n * Same as chachaCore, but there doesn't seem to be a way to move the block\n * out without 25% performance hit.\n */\n// prettier-ignore\nfunction hchacha(s, k, i, o32) {\n let x00 = s[0], x01 = s[1], x02 = s[2], x03 = s[3], x04 = k[0], x05 = k[1], x06 = k[2], x07 = k[3], x08 = k[4], x09 = k[5], x10 = k[6], x11 = k[7], x12 = i[0], x13 = i[1], x14 = i[2], x15 = i[3];\n for (let r = 0; r < 20; r += 2) {\n x00 = (x00 + x04) | 0;\n x12 = (0, _arx_ts_1.rotl)(x12 ^ x00, 16);\n x08 = (x08 + x12) | 0;\n x04 = (0, _arx_ts_1.rotl)(x04 ^ x08, 12);\n x00 = (x00 + x04) | 0;\n x12 = (0, _arx_ts_1.rotl)(x12 ^ x00, 8);\n x08 = (x08 + x12) | 0;\n x04 = (0, _arx_ts_1.rotl)(x04 ^ x08, 7);\n x01 = (x01 + x05) | 0;\n x13 = (0, _arx_ts_1.rotl)(x13 ^ x01, 16);\n x09 = (x09 + x13) | 0;\n x05 = (0, _arx_ts_1.rotl)(x05 ^ x09, 12);\n x01 = (x01 + x05) | 0;\n x13 = (0, _arx_ts_1.rotl)(x13 ^ x01, 8);\n x09 = (x09 + x13) | 0;\n x05 = (0, _arx_ts_1.rotl)(x05 ^ x09, 7);\n x02 = (x02 + x06) | 0;\n x14 = (0, _arx_ts_1.rotl)(x14 ^ x02, 16);\n x10 = (x10 + x14) | 0;\n x06 = (0, _arx_ts_1.rotl)(x06 ^ x10, 12);\n x02 = (x02 + x06) | 0;\n x14 = (0, _arx_ts_1.rotl)(x14 ^ x02, 8);\n x10 = (x10 + x14) | 0;\n x06 = (0, _arx_ts_1.rotl)(x06 ^ x10, 7);\n x03 = (x03 + x07) | 0;\n x15 = (0, _arx_ts_1.rotl)(x15 ^ x03, 16);\n x11 = (x11 + x15) | 0;\n x07 = (0, _arx_ts_1.rotl)(x07 ^ x11, 12);\n x03 = (x03 + x07) | 0;\n x15 = (0, _arx_ts_1.rotl)(x15 ^ x03, 8);\n x11 = (x11 + x15) | 0;\n x07 = (0, _arx_ts_1.rotl)(x07 ^ x11, 7);\n x00 = (x00 + x05) | 0;\n x15 = (0, _arx_ts_1.rotl)(x15 ^ x00, 16);\n x10 = (x10 + x15) | 0;\n x05 = (0, _arx_ts_1.rotl)(x05 ^ x10, 12);\n x00 = (x00 + x05) | 0;\n x15 = (0, _arx_ts_1.rotl)(x15 ^ x00, 8);\n x10 = (x10 + x15) | 0;\n x05 = (0, _arx_ts_1.rotl)(x05 ^ x10, 7);\n x01 = (x01 + x06) | 0;\n x12 = (0, _arx_ts_1.rotl)(x12 ^ x01, 16);\n x11 = (x11 + x12) | 0;\n x06 = (0, _arx_ts_1.rotl)(x06 ^ x11, 12);\n x01 = (x01 + x06) | 0;\n x12 = (0, _arx_ts_1.rotl)(x12 ^ x01, 8);\n x11 = (x11 + x12) | 0;\n x06 = (0, _arx_ts_1.rotl)(x06 ^ x11, 7);\n x02 = (x02 + x07) | 0;\n x13 = (0, _arx_ts_1.rotl)(x13 ^ x02, 16);\n x08 = (x08 + x13) | 0;\n x07 = (0, _arx_ts_1.rotl)(x07 ^ x08, 12);\n x02 = (x02 + x07) | 0;\n x13 = (0, _arx_ts_1.rotl)(x13 ^ x02, 8);\n x08 = (x08 + x13) | 0;\n x07 = (0, _arx_ts_1.rotl)(x07 ^ x08, 7);\n x03 = (x03 + x04) | 0;\n x14 = (0, _arx_ts_1.rotl)(x14 ^ x03, 16);\n x09 = (x09 + x14) | 0;\n x04 = (0, _arx_ts_1.rotl)(x04 ^ x09, 12);\n x03 = (x03 + x04) | 0;\n x14 = (0, _arx_ts_1.rotl)(x14 ^ x03, 8);\n x09 = (x09 + x14) | 0;\n x04 = (0, _arx_ts_1.rotl)(x04 ^ x09, 7);\n }\n let oi = 0;\n o32[oi++] = x00;\n o32[oi++] = x01;\n o32[oi++] = x02;\n o32[oi++] = x03;\n o32[oi++] = x12;\n o32[oi++] = x13;\n o32[oi++] = x14;\n o32[oi++] = x15;\n}\n/**\n * Original, non-RFC chacha20 from DJB. 8-byte nonce, 8-byte counter.\n */\nexports.chacha20orig = (0, _arx_ts_1.createCipher)(chachaCore, {\n counterRight: false,\n counterLength: 8,\n allowShortKeys: true,\n});\n/**\n * ChaCha stream cipher. Conforms to RFC 8439 (IETF, TLS). 12-byte nonce, 4-byte counter.\n * With 12-byte nonce, it's not safe to use fill it with random (CSPRNG), due to collision chance.\n */\nexports.chacha20 = (0, _arx_ts_1.createCipher)(chachaCore, {\n counterRight: false,\n counterLength: 4,\n allowShortKeys: false,\n});\n/**\n * XChaCha eXtended-nonce ChaCha. 24-byte nonce.\n * With 24-byte nonce, it's safe to use fill it with random (CSPRNG).\n * https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha\n */\nexports.xchacha20 = (0, _arx_ts_1.createCipher)(chachaCore, {\n counterRight: false,\n counterLength: 8,\n extendNonceFn: hchacha,\n allowShortKeys: false,\n});\n/**\n * Reduced 8-round chacha, described in original paper.\n */\nexports.chacha8 = (0, _arx_ts_1.createCipher)(chachaCore, {\n counterRight: false,\n counterLength: 4,\n rounds: 8,\n});\n/**\n * Reduced 12-round chacha, described in original paper.\n */\nexports.chacha12 = (0, _arx_ts_1.createCipher)(chachaCore, {\n counterRight: false,\n counterLength: 4,\n rounds: 12,\n});\nconst ZEROS16 = /* @__PURE__ */ new Uint8Array(16);\n// Pad to digest size with zeros\nconst updatePadded = (h, msg) => {\n h.update(msg);\n const left = msg.length % 16;\n if (left)\n h.update(ZEROS16.subarray(left));\n};\nconst ZEROS32 = /* @__PURE__ */ new Uint8Array(32);\nfunction computeTag(fn, key, nonce, data, AAD) {\n const authKey = fn(key, nonce, ZEROS32);\n const h = _poly1305_ts_1.poly1305.create(authKey);\n if (AAD)\n updatePadded(h, AAD);\n updatePadded(h, data);\n const num = (0, utils_ts_1.u64Lengths)(data.length, AAD ? AAD.length : 0, true);\n h.update(num);\n const res = h.digest();\n (0, utils_ts_1.clean)(authKey, num);\n return res;\n}\n/**\n * AEAD algorithm from RFC 8439.\n * Salsa20 and chacha (RFC 8439) use poly1305 differently.\n * We could have composed them similar to:\n * https://github.com/paulmillr/scure-base/blob/b266c73dde977b1dd7ef40ef7a23cc15aab526b3/index.ts#L250\n * But it's hard because of authKey:\n * In salsa20, authKey changes position in salsa stream.\n * In chacha, authKey can't be computed inside computeTag, it modifies the counter.\n */\nconst _poly1305_aead = (xorStream) => (key, nonce, AAD) => {\n const tagLength = 16;\n return {\n encrypt(plaintext, output) {\n const plength = plaintext.length;\n output = (0, utils_ts_1.getOutput)(plength + tagLength, output, false);\n output.set(plaintext);\n const oPlain = output.subarray(0, -tagLength);\n xorStream(key, nonce, oPlain, oPlain, 1);\n const tag = computeTag(xorStream, key, nonce, oPlain, AAD);\n output.set(tag, plength); // append tag\n (0, utils_ts_1.clean)(tag);\n return output;\n },\n decrypt(ciphertext, output) {\n output = (0, utils_ts_1.getOutput)(ciphertext.length - tagLength, output, false);\n const data = ciphertext.subarray(0, -tagLength);\n const passedTag = ciphertext.subarray(-tagLength);\n const tag = computeTag(xorStream, key, nonce, data, AAD);\n if (!(0, utils_ts_1.equalBytes)(passedTag, tag))\n throw new Error('invalid tag');\n output.set(ciphertext.subarray(0, -tagLength));\n xorStream(key, nonce, output, output, 1); // start stream with i=1\n (0, utils_ts_1.clean)(tag);\n return output;\n },\n };\n};\nexports._poly1305_aead = _poly1305_aead;\n/**\n * ChaCha20-Poly1305 from RFC 8439.\n *\n * Unsafe to use random nonces under the same key, due to collision chance.\n * Prefer XChaCha instead.\n */\nexports.chacha20poly1305 = (0, utils_ts_1.wrapCipher)({ blockSize: 64, nonceLength: 12, tagLength: 16 }, (0, exports._poly1305_aead)(exports.chacha20));\n/**\n * XChaCha20-Poly1305 extended-nonce chacha.\n *\n * Can be safely used with random nonces (CSPRNG).\n * See [IRTF draft](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha).\n */\nexports.xchacha20poly1305 = (0, utils_ts_1.wrapCipher)({ blockSize: 64, nonceLength: 24, tagLength: 16 }, (0, exports._poly1305_aead)(exports.xchacha20));\n//# sourceMappingURL=chacha.js.map",
|
|
51
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.chacha20 = exports.xchacha20 = void 0;\nvar chacha_1 = require(\"@noble/ciphers/chacha\");\nvar xchacha20 = function (key, nonce, AAD) {\n return (0, chacha_1.xchacha20poly1305)(key, nonce, AAD);\n};\nexports.xchacha20 = xchacha20;\nvar chacha20 = function (key, nonce, AAD) {\n return (0, chacha_1.chacha20poly1305)(key, nonce, AAD);\n};\nexports.chacha20 = chacha20;\n",
|
|
52
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.aesDecrypt = exports.aesEncrypt = exports.symDecrypt = exports.symEncrypt = void 0;\nvar aes_1 = require(\"@ecies/ciphers/aes\");\nvar chacha_1 = require(\"@ecies/ciphers/chacha\");\nvar utils_1 = require(\"@noble/ciphers/utils\");\nvar webcrypto_1 = require(\"@noble/ciphers/webcrypto\");\nvar config_js_1 = require(\"../config.js\");\nvar consts_js_1 = require(\"../consts.js\");\nvar symEncrypt = function (key, plainText, AAD) {\n return _exec(_encrypt, config_js_1.ECIES_CONFIG.symmetricAlgorithm, config_js_1.ECIES_CONFIG.symmetricNonceLength, key, plainText, AAD);\n};\nexports.symEncrypt = symEncrypt;\nvar symDecrypt = function (key, cipherText, AAD) {\n return _exec(_decrypt, config_js_1.ECIES_CONFIG.symmetricAlgorithm, config_js_1.ECIES_CONFIG.symmetricNonceLength, key, cipherText, AAD);\n};\nexports.symDecrypt = symDecrypt;\n/** @deprecated - use `symEncrypt` instead. */\nexports.aesEncrypt = exports.symEncrypt; // TODO: delete\n/** @deprecated - use `symDecrypt` instead. */\nexports.aesDecrypt = exports.symDecrypt; // TODO: delete\nfunction _exec(callback, algorithm, nonceLength, // aes-256-gcm only\nkey, data, AAD) {\n if (algorithm === \"aes-256-gcm\") {\n return callback(aes_1.aes256gcm, key, data, nonceLength, consts_js_1.AEAD_TAG_LENGTH, AAD);\n }\n else if (algorithm === \"xchacha20\") {\n return callback(chacha_1.xchacha20, key, data, consts_js_1.XCHACHA20_NONCE_LENGTH, consts_js_1.AEAD_TAG_LENGTH, AAD);\n }\n else if (algorithm === \"aes-256-cbc\") {\n // NOT RECOMMENDED. There is neither AAD nor AEAD tag in cbc mode\n // aes-256-cbc always uses 16 bytes iv\n return callback(aes_1.aes256cbc, key, data, 16, 0);\n }\n else {\n throw new Error(\"Not implemented\");\n }\n}\nfunction _encrypt(func, key, data, nonceLength, tagLength, AAD) {\n var nonce = (0, webcrypto_1.randomBytes)(nonceLength);\n var cipher = func(key, nonce, AAD);\n // @noble/ciphers format: cipherText || tag\n var encrypted = cipher.encrypt(data);\n if (tagLength === 0) {\n return (0, utils_1.concatBytes)(nonce, encrypted);\n }\n var cipherTextLength = encrypted.length - tagLength;\n var cipherText = encrypted.subarray(0, cipherTextLength);\n var tag = encrypted.subarray(cipherTextLength);\n // ecies payload format: pk || nonce || tag || cipherText\n return (0, utils_1.concatBytes)(nonce, tag, cipherText);\n}\nfunction _decrypt(func, key, data, nonceLength, tagLength, AAD) {\n var nonce = data.subarray(0, nonceLength);\n var cipher = func(key, Uint8Array.from(nonce), AAD); // to reset byteOffset\n var encrypted = data.subarray(nonceLength);\n if (tagLength === 0) {\n return cipher.decrypt(encrypted);\n }\n var tag = encrypted.subarray(0, tagLength);\n var cipherText = encrypted.subarray(tagLength);\n return cipher.decrypt((0, utils_1.concatBytes)(cipherText, tag));\n}\n",
|
|
53
|
-
"\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./elliptic.js\"), exports);\n__exportStar(require(\"./hash.js\"), exports);\n__exportStar(require(\"./hex.js\"), exports);\n__exportStar(require(\"./symmetric.js\"), exports);\n",
|
|
54
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PublicKey = void 0;\nvar utils_1 = require(\"@noble/ciphers/utils\");\nvar index_js_1 = require(\"../utils/index.js\");\nvar PublicKey = /** @class */ (function () {\n function PublicKey(data, curve) {\n // data can be either compressed or uncompressed if secp256k1\n var compressed = (0, index_js_1.convertPublicKeyFormat)(data, true, curve);\n var uncompressed = (0, index_js_1.convertPublicKeyFormat)(data, false, curve);\n this.data = compressed;\n this.dataUncompressed =\n compressed.length !== uncompressed.length ? uncompressed : null;\n }\n PublicKey.fromHex = function (hex, curve) {\n return new PublicKey((0, index_js_1.hexToPublicKey)(hex, curve), curve);\n };\n Object.defineProperty(PublicKey.prototype, \"_uncompressed\", {\n get: function () {\n return this.dataUncompressed !== null ? this.dataUncompressed : this.data;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PublicKey.prototype, \"uncompressed\", {\n /** @deprecated - use `PublicKey.toBytes(false)` instead. You may also need `Buffer.from`. */\n get: function () {\n return Buffer.from(this._uncompressed); // TODO: delete\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PublicKey.prototype, \"compressed\", {\n /** @deprecated - use `PublicKey.toBytes()` instead. You may also need `Buffer.from`. */\n get: function () {\n return Buffer.from(this.data); // TODO: delete\n },\n enumerable: false,\n configurable: true\n });\n PublicKey.prototype.toBytes = function (compressed) {\n if (compressed === void 0) { compressed = true; }\n return compressed ? this.data : this._uncompressed;\n };\n PublicKey.prototype.toHex = function (compressed) {\n if (compressed === void 0) { compressed = true; }\n return (0, utils_1.bytesToHex)(this.toBytes(compressed));\n };\n /**\n * Derives a shared secret from receiver's private key (sk) and ephemeral public key (this).\n * Opposite of `encapsulate`.\n * @see PrivateKey.encapsulate\n *\n * @param sk - Receiver's private key.\n * @param compressed - (default: `false`) Whether to use compressed or uncompressed public keys in the key derivation (secp256k1 only).\n * @returns Shared secret, derived with HKDF-SHA256.\n */\n PublicKey.prototype.decapsulate = function (sk, compressed) {\n if (compressed === void 0) { compressed = false; }\n var senderPoint = this.toBytes(compressed);\n var sharedPoint = sk.multiply(this, compressed);\n return (0, index_js_1.getSharedKey)(senderPoint, sharedPoint);\n };\n PublicKey.prototype.equals = function (other) {\n return (0, utils_1.equalBytes)(this.data, other.data);\n };\n return PublicKey;\n}());\nexports.PublicKey = PublicKey;\n",
|
|
55
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PrivateKey = void 0;\nvar utils_1 = require(\"@noble/ciphers/utils\");\nvar index_js_1 = require(\"../utils/index.js\");\nvar PublicKey_js_1 = require(\"./PublicKey.js\");\nvar PrivateKey = /** @class */ (function () {\n function PrivateKey(secret, curve) {\n this.curve = curve;\n if (secret === undefined) {\n this.data = (0, index_js_1.getValidSecret)(curve);\n }\n else if ((0, index_js_1.isValidPrivateKey)(secret, curve)) {\n this.data = secret;\n }\n else {\n throw new Error(\"Invalid private key\");\n }\n this.publicKey = new PublicKey_js_1.PublicKey((0, index_js_1.getPublicKey)(this.data, curve), curve);\n }\n PrivateKey.fromHex = function (hex, curve) {\n return new PrivateKey((0, index_js_1.decodeHex)(hex), curve);\n };\n Object.defineProperty(PrivateKey.prototype, \"secret\", {\n /** @description From version 0.5.0, `Uint8Array` will be returned instead of `Buffer`. */\n get: function () {\n // TODO: Uint8Array\n return Buffer.from(this.data);\n },\n enumerable: false,\n configurable: true\n });\n PrivateKey.prototype.toHex = function () {\n return (0, utils_1.bytesToHex)(this.data);\n };\n /**\n * Derives a shared secret from ephemeral private key (this) and receiver's public key (pk).\n * @description The shared key is 32 bytes, derived with `HKDF-SHA256(senderPoint || sharedPoint)`. See implementation for details.\n *\n * There are some variations in different ECIES implementations:\n * which key derivation function to use, compressed or uncompressed `senderPoint`/`sharedPoint`, whether to include `senderPoint`, etc.\n *\n * Because the entropy of `senderPoint`, `sharedPoint` is enough high[1], we don't need salt to derive keys.\n *\n * [1]: Two reasons: the public keys are \"random\" bytes (albeit secp256k1 public keys are **not uniformly** random), and ephemeral keys are generated in every encryption.\n *\n * @param pk - Receiver's public key.\n * @param compressed - (default: `false`) Whether to use compressed or uncompressed public keys in the key derivation (secp256k1 only).\n * @returns Shared secret, derived with HKDF-SHA256.\n */\n PrivateKey.prototype.encapsulate = function (pk, compressed) {\n if (compressed === void 0) { compressed = false; }\n var senderPoint = this.publicKey.toBytes(compressed);\n var sharedPoint = this.multiply(pk, compressed);\n return (0, index_js_1.getSharedKey)(senderPoint, sharedPoint);\n };\n PrivateKey.prototype.multiply = function (pk, compressed) {\n if (compressed === void 0) { compressed = false; }\n return (0, index_js_1.getSharedPoint)(this.data, pk.toBytes(true), compressed, this.curve);\n };\n PrivateKey.prototype.equals = function (other) {\n return (0, utils_1.equalBytes)(this.data, other.data);\n };\n return PrivateKey;\n}());\nexports.PrivateKey = PrivateKey;\n",
|
|
56
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PublicKey = exports.PrivateKey = void 0;\n// treat Buffer as Uint8array, i.e. no call of Buffer specific functions\n// finally Uint8Array only\nvar PrivateKey_js_1 = require(\"./PrivateKey.js\");\nObject.defineProperty(exports, \"PrivateKey\", { enumerable: true, get: function () { return PrivateKey_js_1.PrivateKey; } });\nvar PublicKey_js_1 = require(\"./PublicKey.js\");\nObject.defineProperty(exports, \"PublicKey\", { enumerable: true, get: function () { return PublicKey_js_1.PublicKey; } });\n",
|
|
57
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.utils = exports.PublicKey = exports.PrivateKey = exports.ECIES_CONFIG = void 0;\nexports.encrypt = encrypt;\nexports.decrypt = decrypt;\nvar utils_1 = require(\"@noble/ciphers/utils\");\nvar config_js_1 = require(\"./config.js\");\nvar index_js_1 = require(\"./keys/index.js\");\nvar index_js_2 = require(\"./utils/index.js\");\n/**\n * Encrypts data with a receiver's public key.\n * @description From version 0.5.0, `Uint8Array` will be returned instead of `Buffer`.\n * To keep the same behavior, use `Buffer.from(encrypt(...))`.\n *\n * @param receiverRawPK - Raw public key of the receiver, either as a hex `string` or a `Uint8Array`.\n * @param data - Data to encrypt.\n * @returns Encrypted payload, format: `public key || encrypted`.\n */\nfunction encrypt(receiverRawPK, data) {\n return Buffer.from(_encrypt(receiverRawPK, data, config_js_1.ECIES_CONFIG));\n}\nfunction _encrypt(receiverRawPK, data, config) {\n var curve = config.ellipticCurve;\n var ephemeralSK = new index_js_1.PrivateKey(undefined, curve);\n var receiverPK = receiverRawPK instanceof Uint8Array\n ? new index_js_1.PublicKey(receiverRawPK, curve)\n : index_js_1.PublicKey.fromHex(receiverRawPK, curve);\n var sharedKey = ephemeralSK.encapsulate(receiverPK, config.isHkdfKeyCompressed);\n var ephemeralPK = ephemeralSK.publicKey.toBytes(config.isEphemeralKeyCompressed);\n var encrypted = (0, index_js_2.symEncrypt)(sharedKey, data);\n return (0, utils_1.concatBytes)(ephemeralPK, encrypted);\n}\n/**\n * Decrypts data with a receiver's private key.\n * @description From version 0.5.0, `Uint8Array` will be returned instead of `Buffer`.\n * To keep the same behavior, use `Buffer.from(decrypt(...))`.\n *\n * @param receiverRawSK - Raw private key of the receiver, either as a hex `string` or a `Uint8Array`.\n * @param data - Data to decrypt.\n * @returns Decrypted plain text.\n */\nfunction decrypt(receiverRawSK, data) {\n return Buffer.from(_decrypt(receiverRawSK, data));\n}\nfunction _decrypt(receiverRawSK, data, config) {\n if (config === void 0) { config = config_js_1.ECIES_CONFIG; }\n var curve = config.ellipticCurve;\n var receiverSK = receiverRawSK instanceof Uint8Array\n ? new index_js_1.PrivateKey(receiverRawSK, curve)\n : index_js_1.PrivateKey.fromHex(receiverRawSK, curve);\n var keySize = config.ephemeralKeySize;\n var ephemeralPK = new index_js_1.PublicKey(data.subarray(0, keySize), curve);\n var encrypted = data.subarray(keySize);\n var sharedKey = ephemeralPK.decapsulate(receiverSK, config.isHkdfKeyCompressed);\n return (0, index_js_2.symDecrypt)(sharedKey, encrypted);\n}\nvar config_js_2 = require(\"./config.js\");\nObject.defineProperty(exports, \"ECIES_CONFIG\", { enumerable: true, get: function () { return config_js_2.ECIES_CONFIG; } });\nvar index_js_3 = require(\"./keys/index.js\");\nObject.defineProperty(exports, \"PrivateKey\", { enumerable: true, get: function () { return index_js_3.PrivateKey; } });\nObject.defineProperty(exports, \"PublicKey\", { enumerable: true, get: function () { return index_js_3.PublicKey; } });\n/** @deprecated - use `import * as utils from \"eciesjs/utils\"` instead. */\nexports.utils = {\n // TODO: remove these after 0.5.0\n aesEncrypt: index_js_2.aesEncrypt,\n aesDecrypt: index_js_2.aesDecrypt,\n symEncrypt: index_js_2.symEncrypt,\n symDecrypt: index_js_2.symDecrypt,\n decodeHex: index_js_2.decodeHex,\n getValidSecret: index_js_2.getValidSecret,\n remove0x: index_js_2.remove0x,\n};\n",
|
|
58
|
-
"function truncate (str, showChar = 7) {\n if (str && str.length > 0) {\n const visiblePart = str.slice(0, showChar)\n return visiblePart + '…'\n } else {\n return ''\n }\n}\n\nmodule.exports = truncate\n",
|
|
59
|
-
"const truncate = require('./truncate')\n\nclass Errors {\n constructor (options = {}) {\n this.filepath = options.filepath\n this.envFilepath = options.envFilepath\n\n this.key = options.key\n this.privateKey = options.privateKey\n this.privateKeyName = options.privateKeyName\n this.command = options.command\n\n this.message = options.message\n }\n\n missingEnvFile () {\n const code = 'MISSING_ENV_FILE'\n const message = `[${code}] missing ${this.envFilepath} file (${this.filepath})`\n const help = `[${code}] https://github.com/dotenvx/dotenvx/issues/484`\n\n const e = new Error(message)\n e.code = code\n e.help = help\n return e\n }\n\n missingKey () {\n const code = 'MISSING_KEY'\n const message = `[${code}] missing ${this.key} key`\n\n const e = new Error(message)\n e.code = code\n return e\n }\n\n missingPrivateKey () {\n const code = 'MISSING_PRIVATE_KEY'\n const message = `[${code}] could not decrypt ${this.key} using private key '${this.privateKeyName}=${truncate(this.privateKey)}'`\n const help = `[${code}] https://github.com/dotenvx/dotenvx/issues/464`\n\n const e = new Error(message)\n e.code = code\n e.help = help\n return e\n }\n\n invalidPrivateKey () {\n const code = 'INVALID_PRIVATE_KEY'\n const message = `[${code}] could not decrypt ${this.key} using private key '${this.privateKeyName}=${truncate(this.privateKey)}'`\n const help = `[${code}] https://github.com/dotenvx/dotenvx/issues/465`\n\n const e = new Error(message)\n e.code = code\n e.help = help\n return e\n }\n\n looksWrongPrivateKey () {\n const code = 'WRONG_PRIVATE_KEY'\n const message = `[${code}] could not decrypt ${this.key} using private key '${this.privateKeyName}=${truncate(this.privateKey)}'`\n const help = `[${code}] https://github.com/dotenvx/dotenvx/issues/466`\n\n const e = new Error(message)\n e.code = code\n e.help = help\n return e\n }\n\n malformedEncryptedData () {\n const code = 'MALFORMED_ENCRYPTED_DATA'\n const message = `[${code}] could not decrypt ${this.key} because encrypted data appears malformed`\n const help = `[${code}] https://github.com/dotenvx/dotenvx/issues/467`\n\n const e = new Error(message)\n e.code = code\n e.help = help\n return e\n }\n\n decryptionFailed () {\n const code = 'DECRYPTION_FAILED'\n const message = this.message\n\n const e = new Error(message)\n e.code = code\n return e\n }\n\n commandSubstitutionFailed () {\n const code = 'COMMAND_SUBSTITUTION_FAILED'\n const message = `[${code}] could not eval ${this.key} containing command '${this.command}': ${this.message}`\n const help = `[${code}] https://github.com/dotenvx/dotenvx/issues/532`\n\n const e = new Error(message)\n e.code = code\n e.help = help\n return e\n }\n\n dangerousDependencyHoist () {\n const code = 'DANGEROUS_DEPENDENCY_HOIST'\n const message = `[${code}] your environment has hoisted an incompatible version of a dotenvx dependency: ${this.message}`\n const help = `[${code}] https://github.com/dotenvx/dotenvx/issues/622`\n\n const e = new Error(message)\n e.code = code\n e.help = help\n return e\n }\n}\n\nmodule.exports = Errors\n",
|
|
60
|
-
"const { decrypt } = require('eciesjs')\n\nconst Errors = require('./errors')\n\nconst PREFIX = 'encrypted:'\n\nfunction decryptKeyValue (key, value, privateKeyName, privateKey) {\n let decryptedValue\n let decryptionError\n\n if (!value.startsWith(PREFIX)) {\n return value\n }\n\n privateKey = privateKey || ''\n if (privateKey.length <= 0) {\n decryptionError = new Errors({ key, privateKeyName, privateKey }).missingPrivateKey()\n } else {\n const privateKeys = privateKey.split(',')\n for (const privKey of privateKeys) {\n const secret = Buffer.from(privKey, 'hex')\n const encoded = value.substring(PREFIX.length)\n const ciphertext = Buffer.from(encoded, 'base64')\n\n try {\n decryptedValue = decrypt(secret, ciphertext).toString()\n decryptionError = null // reset to null error (scenario for multiple private keys)\n break\n } catch (e) {\n if (e.message === 'Invalid private key') {\n decryptionError = new Errors({ key, privateKeyName, privateKey }).invalidPrivateKey()\n } else if (e.message === 'Unsupported state or unable to authenticate data') {\n decryptionError = new Errors({ key, privateKeyName, privateKey }).looksWrongPrivateKey()\n } else if (e.message === 'Point of length 65 was invalid. Expected 33 compressed bytes or 65 uncompressed bytes') {\n decryptionError = new Errors({ key, privateKeyName, privateKey }).malformedEncryptedData()\n } else {\n decryptionError = new Errors({ key, privateKeyName, privateKey, message: e.message }).decryptionFailed()\n }\n }\n }\n }\n\n if (decryptionError) {\n throw decryptionError\n }\n\n return decryptedValue\n}\n\nmodule.exports = decryptKeyValue\n",
|
|
61
|
-
"function chomp (value) {\n return value.replace(/[\\r\\n]+$/, '')\n}\n\nmodule.exports = chomp\n",
|
|
62
|
-
"const { execSync } = require('child_process')\nconst chomp = require('./chomp')\nconst Errors = require('./errors')\n\nfunction evalKeyValue (key, value, processEnv, runningParsed) {\n // Match everything between the outermost $() using a regex with non-capturing groups\n const matches = value.match(/\\$\\(([^)]+(?:\\)[^(]*)*)\\)/g) || []\n return matches.reduce((newValue, match) => {\n const command = match.slice(2, -1) // Extract command by removing $() wrapper\n let result\n\n try {\n result = execSync(command, { env: { ...processEnv, ...runningParsed } }).toString() // execute command (including runningParsed)\n } catch (e) {\n throw new Errors({ key, command, message: e.message.trim() }).commandSubstitutionFailed()\n }\n\n result = chomp(result) // chomp it\n return newValue.replace(match, result) // Replace match with result\n }, value)\n}\n\nmodule.exports = evalKeyValue\n",
|
|
63
|
-
"function resolveEscapeSequences (value) {\n return value.replace(/\\\\\\$/g, '$')\n}\n\nmodule.exports = resolveEscapeSequences\n",
|
|
64
|
-
"const decryptKeyValue = require('./decryptKeyValue')\nconst evalKeyValue = require('./evalKeyValue')\nconst resolveEscapeSequences = require('./resolveEscapeSequences')\n\nclass Parse {\n static LINE = /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg\n\n constructor (src, privateKey = null, processEnv = process.env, overload = false, privateKeyName = null) {\n this.src = src\n this.privateKey = privateKey\n this.privateKeyName = privateKeyName\n this.processEnv = processEnv\n this.overload = overload\n\n this.parsed = {}\n this.preExisted = {}\n this.injected = {}\n this.errors = []\n\n // for use with progressive expansion\n this.runningParsed = {}\n // for use with stopping expansion for literals\n this.literals = {}\n }\n\n run () {\n const lines = this.getLines()\n\n let match\n while ((match = Parse.LINE.exec(lines)) !== null) {\n const key = match[1]\n const value = match[2]\n const quote = this.quote(value) // must be raw match\n this.parsed[key] = this.clean(value, quote) // file value\n\n if (!this.overload && this.inProcessEnv(key)) {\n this.parsed[key] = this.processEnv[key] // use process.env pre-existing value\n }\n\n // decrypt\n try {\n this.parsed[key] = this.decrypt(key, this.parsed[key])\n } catch (e) {\n this.errors.push(e)\n }\n\n // eval empty, double, or backticks\n let evaled = false\n if (quote !== \"'\" && (!this.inProcessEnv(key) || this.processEnv[key] === this.parsed[key])) {\n const priorEvaled = this.parsed[key]\n // eval\n try {\n this.parsed[key] = this.eval(key, priorEvaled)\n } catch (e) {\n this.errors.push(e)\n }\n if (priorEvaled !== this.parsed[key]) {\n evaled = true\n }\n }\n\n // expand empty, double, or backticks\n if (!evaled && quote !== \"'\" && (!this.processEnv[key] || this.overload)) {\n this.parsed[key] = resolveEscapeSequences(this.expand(this.parsed[key]))\n }\n\n if (quote === \"'\") {\n this.literals[key] = this.parsed[key]\n }\n\n // for use with progressive expansion\n this.runningParsed[key] = this.parsed[key]\n\n if (Object.prototype.hasOwnProperty.call(this.processEnv, key) && !this.overload) {\n this.preExisted[key] = this.processEnv[key] // track preExisted\n } else {\n this.injected[key] = this.parsed[key] // track injected\n }\n }\n\n return {\n parsed: this.parsed,\n processEnv: this.processEnv,\n injected: this.injected,\n preExisted: this.preExisted,\n errors: this.errors\n }\n }\n\n trimmer (value) {\n // Default undefined or null to empty string\n return (value || '').trim()\n }\n\n quote (value) {\n const v = this.trimmer(value)\n const maybeQuote = v[0]\n let q = ''\n switch (maybeQuote) {\n // single\n case \"'\":\n q = \"'\"\n break\n // double\n case '\"':\n q = '\"'\n break\n // backtick\n case '`':\n q = '`'\n break\n // empty\n default:\n q = ''\n }\n\n return q\n }\n\n clean (value, _quote) {\n let v = this.trimmer(value)\n\n // Remove surrounding quotes\n v = v.replace(/^(['\"`])([\\s\\S]*)\\1$/mg, '$2')\n\n // Expand newlines if double quoted\n if (_quote === '\"') {\n v = v.replace(/\\\\n/g, '\\n') // newline\n v = v.replace(/\\\\r/g, '\\r') // carriage return\n v = v.replace(/\\\\t/g, '\\t') // tabs\n }\n\n return v\n }\n\n decrypt (key, value) {\n return decryptKeyValue(key, value, this.privateKeyName, this.privateKey)\n }\n\n eval (key, value) {\n return evalKeyValue(key, value, this.processEnv, this.runningParsed)\n }\n\n expand (value) {\n let env = { ...this.runningParsed, ...this.processEnv } // typically process.env wins\n if (this.overload) {\n env = { ...this.processEnv, ...this.runningParsed } // parsed wins\n }\n\n const regex = /(?<!\\\\)\\${([^{}]+)}|(?<!\\\\)\\$([A-Za-z_][A-Za-z0-9_]*)/g\n\n let result = value\n let match\n\n while ((match = regex.exec(result)) !== null) {\n const [template, bracedExpression, unbracedExpression] = match\n const expression = bracedExpression || unbracedExpression\n\n // match the operators `:+`, `+`, `:-`, and `-`\n const opRegex = /(:\\+|\\+|:-|-)/\n // find first match\n const opMatch = expression.match(opRegex)\n const splitter = opMatch ? opMatch[0] : null\n\n const r = expression.split(splitter)\n\n let defaultValue\n let value\n const key = r.shift()\n\n if ([':+', '+'].includes(splitter)) {\n defaultValue = env[key] ? r.join(splitter) : ''\n value = null\n } else {\n defaultValue = r.join(splitter)\n value = env[key]\n }\n\n if (value) {\n result = result.replace(template, value)\n } else {\n result = result.replace(template, defaultValue)\n }\n\n // if the result equaled what was in env then stop expanding - handle self-referential check as well\n if (result === env[key]) {\n break\n }\n\n // if the result came from what was a literal value then stop expanding\n // BUT only if the literal value contains expansion patterns (${...} or $VAR)\n if (this.literals[key] && /\\$\\{[^}]+\\}|\\$[A-Za-z_][A-Za-z0-9_]*/.test(this.literals[key])) {\n break\n }\n\n regex.lastIndex = 0 // reset regex search position to re-evaluate after each replacement\n }\n\n return result\n }\n\n inProcessEnv (key) {\n return Object.prototype.hasOwnProperty.call(this.processEnv, key)\n }\n\n getLines () {\n return (this.src || '').toString().replace(/\\r\\n?/mg, '\\n') // Convert buffer to string and Convert line breaks to same format\n }\n}\n\nmodule.exports = Parse\n",
|
|
65
|
-
"// historical dotenv.parse - https://github.com/motdotla/dotenv)\nconst LINE = /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg\n\nfunction dotenvParse (src, skipExpandForDoubleQuotes = false, skipConvertingWindowsNewlines = false, collectAllValues = false) {\n const obj = {}\n\n // Convert buffer to string\n let lines = src.toString()\n\n // Convert line breaks to same format\n if (!skipConvertingWindowsNewlines) {\n lines = lines.replace(/\\r\\n?/mg, '\\n')\n }\n\n let match\n while ((match = LINE.exec(lines)) != null) {\n const key = match[1]\n\n // Default undefined or null to empty string\n let value = (match[2] || '')\n\n // Remove whitespace\n value = value.trim()\n\n // Check if double quoted\n const maybeQuote = value[0]\n\n // Remove surrounding quotes\n value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/mg, '$2')\n\n // Expand newlines if double quoted\n if (maybeQuote === '\"' && !skipExpandForDoubleQuotes) {\n value = value.replace(/\\\\n/g, '\\n') // newline\n value = value.replace(/\\\\r/g, '\\r') // carriage return\n value = value.replace(/\\\\t/g, '\\t') // tabs\n }\n\n if (collectAllValues) {\n // handle scenario where user mistakenly includes plaintext duplicate in .env:\n //\n // # .env\n // HELLO=\"World\"\n // HELLO=\"encrypted:1234\"\n obj[key] = obj[key] || []\n obj[key].push(value)\n } else {\n // Add to object\n obj[key] = value\n }\n }\n\n return obj\n}\n\nmodule.exports = dotenvParse\n",
|
|
66
|
-
"function parseEnvironmentFromDotenvKey (dotenvKey) {\n // Parse DOTENV_KEY. Format is a URI\n let uri\n try {\n uri = new URL(dotenvKey)\n } catch (e) {\n throw new Error(`INVALID_DOTENV_KEY: ${e.message}`)\n }\n\n // Get environment\n const environment = uri.searchParams.get('environment')\n if (!environment) {\n throw new Error('INVALID_DOTENV_KEY: Missing environment part')\n }\n\n return environment\n}\n\nmodule.exports = parseEnvironmentFromDotenvKey\n",
|
|
67
|
-
"const fs = require('fs')\n\nfunction detectEncoding (filepath) {\n const buffer = fs.readFileSync(filepath)\n\n // check for UTF-16LE BOM (Byte Order Mark)\n if (buffer.length >= 2 && buffer[0] === 0xFF && buffer[1] === 0xFE) {\n return 'utf16le'\n }\n\n /* c8 ignore start */\n // check for UTF-8 BOM\n if (buffer.length >= 3 && buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) {\n return 'utf8'\n }\n\n /* c8 ignore stop */\n\n return 'utf8'\n}\n\nmodule.exports = detectEncoding\n",
|
|
68
|
-
"const path = require('path')\n\nfunction guessEnvironment (filepath) {\n const filename = path.basename(filepath)\n\n const parts = filename.split('.')\n const possibleEnvironmentList = [...parts.slice(2)]\n\n if (possibleEnvironmentList.length === 0) {\n // handle .env1 -> development1\n const environment = filename.replace('.env', 'development')\n\n return environment\n }\n\n if (possibleEnvironmentList.length === 1) {\n return possibleEnvironmentList[0]\n }\n\n if (\n possibleEnvironmentList.length === 2\n ) {\n return possibleEnvironmentList.join('_')\n }\n\n return possibleEnvironmentList.slice(0, 2).join('_')\n}\n\nmodule.exports = guessEnvironment\n",
|
|
69
|
-
"const path = require('path')\nconst guessEnvironment = require('./guessEnvironment')\n\nfunction guessPrivateKeyName (filepath) {\n const filename = path.basename(filepath).toLowerCase()\n\n // .env\n if (filename === '.env') {\n return 'DOTENV_PRIVATE_KEY'\n }\n\n // .env.ENVIRONMENT\n const environment = guessEnvironment(filename)\n\n return `DOTENV_PRIVATE_KEY_${environment.toUpperCase()}`\n}\n\nmodule.exports = guessPrivateKeyName\n",
|
|
70
|
-
"const path = require('path')\nconst guessEnvironment = require('./guessEnvironment')\n\nfunction guessPublicKeyName (filepath) {\n const filename = path.basename(filepath).toLowerCase()\n\n // .env\n if (filename === '.env') {\n return 'DOTENV_PUBLIC_KEY'\n }\n\n // .env.ENVIRONMENT\n const environment = guessEnvironment(filename)\n\n return `DOTENV_PUBLIC_KEY_${environment.toUpperCase()}`\n}\n\nmodule.exports = guessPublicKeyName\n",
|
|
71
|
-
"const path = require('path')\nconst childProcess = require('child_process')\n\nconst guessPrivateKeyName = require('./guessPrivateKeyName')\nconst guessPublicKeyName = require('./guessPublicKeyName')\n\nclass ProKeypair {\n constructor (envFilepath) {\n this.envFilepath = envFilepath\n }\n\n run () {\n let result = {}\n\n try {\n const fallbackBin = path.resolve(process.cwd(), 'node_modules/.bin/dotenvx-pro')\n const output = childProcess.execSync(`${fallbackBin} keypair -f ${this.envFilepath}`, { stdio: ['pipe', 'pipe', 'ignore'] }).toString().trim()\n result = JSON.parse(output)\n } catch (_e) {\n try {\n // if installed as binary cli\n const output = childProcess.execSync(`dotenvx-pro keypair -f ${this.envFilepath}`, { stdio: ['pipe', 'pipe', 'ignore'] }).toString().trim()\n\n result = JSON.parse(output)\n } catch (_e) {\n const privateKeyName = guessPrivateKeyName(this.envFilepath)\n const publicKeyName = guessPublicKeyName(this.envFilepath)\n\n // match format of dotenvx-pro\n result[privateKeyName] = null\n result[publicKeyName] = null\n }\n }\n\n return result\n }\n}\n\nmodule.exports = ProKeypair\n",
|
|
72
|
-
"const fsx = require('./fsx')\nconst dotenvParse = require('./dotenvParse')\n\nconst guessPublicKeyName = require('./guessPublicKeyName')\n\nfunction searchProcessEnv (publicKeyName) {\n if (process.env[publicKeyName] && process.env[publicKeyName].length > 0) {\n return process.env[publicKeyName]\n }\n}\n\nfunction searchEnvFile (publicKeyName, envFilepath) {\n if (fsx.existsSync(envFilepath)) {\n const keysSrc = fsx.readFileX(envFilepath)\n const keysParsed = dotenvParse(keysSrc)\n\n if (keysParsed[publicKeyName] && keysParsed[publicKeyName].length > 0) {\n return keysParsed[publicKeyName]\n }\n }\n}\n\nfunction smartDotenvPublicKey (envFilepath) {\n let publicKey = null\n const publicKeyName = guessPublicKeyName(envFilepath) // DOTENV_PUBLIC_KEY_${ENVIRONMENT}\n\n // 1. attempt process.env first\n publicKey = searchProcessEnv(publicKeyName)\n if (publicKey) {\n return publicKey\n }\n\n // 2. attempt .env.keys second (path/to/.env.keys)\n publicKey = searchEnvFile(publicKeyName, envFilepath)\n if (publicKey) {\n return publicKey\n }\n\n return null\n}\n\nmodule.exports = smartDotenvPublicKey\n",
|
|
73
|
-
"const fsx = require('./fsx')\nconst path = require('path')\n\nconst PUBLIC_KEY_SCHEMA = 'DOTENV_PUBLIC_KEY'\nconst PRIVATE_KEY_SCHEMA = 'DOTENV_PRIVATE_KEY'\n\nconst dotenvParse = require('./dotenvParse')\nconst guessPrivateKeyName = require('./guessPrivateKeyName')\n\nfunction searchProcessEnv (privateKeyName) {\n if (process.env[privateKeyName] && process.env[privateKeyName].length > 0) {\n return process.env[privateKeyName]\n }\n}\n\nfunction searchKeysFile (privateKeyName, envFilepath, envKeysFilepath = null) {\n let keysFilepath = path.resolve(path.dirname(envFilepath), '.env.keys') // typical scenario\n if (envKeysFilepath) { // user specified -fk flag\n keysFilepath = path.resolve(envKeysFilepath)\n }\n\n if (fsx.existsSync(keysFilepath)) {\n const keysSrc = fsx.readFileX(keysFilepath)\n const keysParsed = dotenvParse(keysSrc)\n\n if (keysParsed[privateKeyName] && keysParsed[privateKeyName].length > 0) {\n return keysParsed[privateKeyName]\n }\n }\n}\n\nfunction invertForPrivateKeyName (envFilepath) {\n if (!fsx.existsSync(envFilepath)) {\n return null\n }\n\n const envSrc = fsx.readFileX(envFilepath)\n const envParsed = dotenvParse(envSrc)\n\n let publicKeyName\n for (const keyName of Object.keys(envParsed)) {\n if (keyName === PUBLIC_KEY_SCHEMA || keyName.startsWith(PUBLIC_KEY_SCHEMA)) {\n publicKeyName = keyName // find DOTENV_PUBLIC_KEY* in filename\n }\n }\n\n if (publicKeyName) {\n return publicKeyName.replace(PUBLIC_KEY_SCHEMA, PRIVATE_KEY_SCHEMA) // return inverted (DOTENV_PUBLIC_KEY* -> DOTENV_PRIVATE_KEY*) if found\n }\n\n return null\n}\n\nfunction smartDotenvPrivateKey (envFilepath, envKeysFilepath = null) {\n let privateKey = null\n let privateKeyName = guessPrivateKeyName(envFilepath) // DOTENV_PRIVATE_KEY_${ENVIRONMENT}\n\n // 1. attempt process.env first\n privateKey = searchProcessEnv(privateKeyName)\n if (privateKey) {\n return privateKey\n }\n\n // 2. attempt .env.keys second (path/to/.env.keys)\n privateKey = searchKeysFile(privateKeyName, envFilepath, envKeysFilepath)\n if (privateKey) {\n return privateKey\n }\n\n // 3. attempt inverting `DOTENV_PUBLIC_KEY*` name inside file (unlocks custom filenames not matching .env.${ENVIRONMENT} pattern)\n privateKeyName = invertForPrivateKeyName(envFilepath)\n if (privateKeyName) {\n // 3.1 attempt process.env first\n privateKey = searchProcessEnv(privateKeyName)\n if (privateKey) {\n return privateKey\n }\n\n // 3.2. attempt .env.keys second (path/to/.env.keys)\n privateKey = searchKeysFile(privateKeyName, envFilepath, envKeysFilepath)\n if (privateKey) {\n return privateKey\n }\n }\n\n return null\n}\n\nmodule.exports = smartDotenvPrivateKey\n",
|
|
74
|
-
"const guessPublicKeyName = require('./../helpers/guessPublicKeyName')\nconst smartDotenvPublicKey = require('./../helpers/smartDotenvPublicKey')\nconst guessPrivateKeyName = require('./../helpers/guessPrivateKeyName')\nconst smartDotenvPrivateKey = require('./../helpers/smartDotenvPrivateKey')\n\nclass Keypair {\n constructor (envFile = '.env', envKeysFilepath = null) {\n this.envFile = envFile\n this.envKeysFilepath = envKeysFilepath\n }\n\n run () {\n const out = {}\n\n const envFilepaths = this._envFilepaths()\n for (const envFilepath of envFilepaths) {\n // public key\n const publicKeyName = guessPublicKeyName(envFilepath)\n const publicKeyValue = smartDotenvPublicKey(envFilepath)\n out[publicKeyName] = publicKeyValue\n\n // private key\n const privateKeyName = guessPrivateKeyName(envFilepath)\n const privateKeyValue = smartDotenvPrivateKey(envFilepath, this.envKeysFilepath)\n\n out[privateKeyName] = privateKeyValue\n }\n\n return out\n }\n\n _envFilepaths () {\n if (!Array.isArray(this.envFile)) {\n return [this.envFile]\n }\n\n return this.envFile\n }\n}\n\nmodule.exports = Keypair\n",
|
|
75
|
-
"// helpers\nconst guessPrivateKeyName = require('./guessPrivateKeyName')\nconst ProKeypair = require('./proKeypair')\n\n// services\nconst Keypair = require('./../services/keypair')\n\nfunction findPrivateKey (envFilepath, envKeysFilepath = null, opsOn = true) {\n // use path/to/.env.${environment} to generate privateKeyName\n const privateKeyName = guessPrivateKeyName(envFilepath)\n\n let proKeypairs = {}\n if (opsOn) {\n proKeypairs = new ProKeypair(envFilepath).run() // TODO: implement custom envKeysFilepath\n }\n\n const keypairs = new Keypair(envFilepath, envKeysFilepath).run()\n\n return proKeypairs[privateKeyName] || keypairs[privateKeyName]\n}\n\nmodule.exports = { findPrivateKey }\n",
|
|
76
|
-
"const PRIVATE_KEY_NAME_SCHEMA = 'DOTENV_PRIVATE_KEY'\n\nfunction dotenvPrivateKeyNames (processEnv) {\n return Object.keys(processEnv).filter(key => key.startsWith(PRIVATE_KEY_NAME_SCHEMA))\n}\n\nmodule.exports = dotenvPrivateKeyNames\n",
|
|
77
|
-
"const PREFIX = 'DOTENV_PRIVATE_KEY'\n\nfunction guessPrivateKeyFilename (privateKeyName) {\n // .env\n if (privateKeyName === PREFIX) {\n return '.env'\n }\n\n const filenameSuffix = privateKeyName.substring(`${PREFIX}_`.length).split('_').join('.').toLowerCase()\n // .env.ENVIRONMENT\n\n return `.env.${filenameSuffix}`\n}\n\nmodule.exports = guessPrivateKeyFilename\n",
|
|
78
|
-
"const dotenvPrivateKeyNames = require('./dotenvPrivateKeyNames')\nconst guessPrivateKeyFilename = require('./guessPrivateKeyFilename')\n\nconst TYPE_ENV_FILE = 'envFile'\nconst TYPE_ENV_VAULT_FILE = 'envVaultFile'\nconst DEFAULT_ENVS = [{ type: TYPE_ENV_FILE, value: '.env' }]\nconst DEFAULT_ENV_VAULTS = [{ type: TYPE_ENV_VAULT_FILE, value: '.env.vault' }]\n\nfunction determineEnvsFromDotenvPrivateKey (privateKeyNames) {\n const envs = []\n\n for (const privateKeyName of privateKeyNames) {\n const filename = guessPrivateKeyFilename(privateKeyName)\n envs.push({ type: TYPE_ENV_FILE, value: filename })\n }\n\n return envs\n}\n\nfunction determineEnvs (envs = [], processEnv, DOTENV_KEY = '') {\n const privateKeyNames = dotenvPrivateKeyNames(processEnv)\n if (!envs || envs.length <= 0) {\n // if process.env.DOTENV_PRIVATE_KEY or process.env.DOTENV_PRIVATE_KEY_${environment} is set, assume inline encryption methodology\n if (privateKeyNames.length > 0) {\n return determineEnvsFromDotenvPrivateKey(privateKeyNames)\n }\n\n if (DOTENV_KEY.length > 0) {\n // if DOTENV_KEY is set then default to look for .env.vault file\n return DEFAULT_ENV_VAULTS\n } else {\n return DEFAULT_ENVS // default to .env file expectation\n }\n } else {\n let fileAlreadySpecified = false // can be .env or .env.vault type\n\n for (const env of envs) {\n // if DOTENV_KEY set then we are checking if a .env.vault file is already specified\n if (DOTENV_KEY.length > 0 && env.type === TYPE_ENV_VAULT_FILE) {\n fileAlreadySpecified = true\n }\n\n // if DOTENV_KEY not set then we are checking if a .env file is already specified\n if (DOTENV_KEY.length <= 0 && env.type === TYPE_ENV_FILE) {\n fileAlreadySpecified = true\n }\n }\n\n // return early since envs array objects already contain 1 .env.vault or .env file\n if (fileAlreadySpecified) {\n return envs\n }\n\n // no .env.vault or .env file specified as a flag so we assume either .env.vault (if dotenv key is set) or a .env file\n if (DOTENV_KEY.length > 0) {\n // if DOTENV_KEY is set then default to look for .env.vault file\n return [...DEFAULT_ENV_VAULTS, ...envs]\n } else {\n // if no DOTENV_KEY then default to look for .env file\n return [...DEFAULT_ENVS, ...envs]\n }\n }\n}\n\nmodule.exports = determineEnvs\n",
|
|
79
|
-
"const fsx = require('./../helpers/fsx')\nconst path = require('path')\n\nconst TYPE_ENV = 'env'\nconst TYPE_ENV_FILE = 'envFile'\nconst TYPE_ENV_VAULT_FILE = 'envVaultFile'\n\nconst decrypt = require('./../helpers/decrypt')\nconst Parse = require('./../helpers/parse')\nconst Errors = require('./../helpers/errors')\nconst dotenvParse = require('./../helpers/dotenvParse')\nconst parseEnvironmentFromDotenvKey = require('./../helpers/parseEnvironmentFromDotenvKey')\nconst detectEncoding = require('./../helpers/detectEncoding')\nconst { findPrivateKey } = require('./../helpers/findPrivateKey')\nconst guessPrivateKeyName = require('./../helpers/guessPrivateKeyName')\nconst determineEnvs = require('./../helpers/determineEnvs')\n\nclass Run {\n constructor (envs = [], overload = false, DOTENV_KEY = '', processEnv = process.env, envKeysFilepath = null, opsOn = true) {\n this.envs = determineEnvs(envs, processEnv, DOTENV_KEY)\n this.overload = overload\n this.DOTENV_KEY = DOTENV_KEY\n this.processEnv = processEnv\n this.envKeysFilepath = envKeysFilepath\n this.opsOn = opsOn\n\n this.processedEnvs = []\n this.readableFilepaths = new Set()\n this.readableStrings = new Set()\n this.uniqueInjectedKeys = new Set()\n this.beforeEnv = { ...this.processEnv }\n }\n\n run () {\n // example\n // envs [\n // { type: 'envVaultFile', value: '.env.vault' },\n // { type: 'env', value: 'HELLO=one' },\n // { type: 'envFile', value: '.env' },\n // { type: 'env', value: 'HELLO=three' }\n // ]\n\n for (const env of this.envs) {\n if (env.type === TYPE_ENV_VAULT_FILE) { // deprecate someday - for deprecated .env.vault files\n this._injectEnvVaultFile(env.value)\n } else if (env.type === TYPE_ENV_FILE) {\n this._injectEnvFile(env.value)\n } else if (env.type === TYPE_ENV) {\n this._injectEnv(env.value)\n }\n }\n\n return {\n processedEnvs: this.processedEnvs,\n readableStrings: [...this.readableStrings],\n readableFilepaths: [...this.readableFilepaths],\n uniqueInjectedKeys: [...this.uniqueInjectedKeys],\n beforeEnv: this.beforeEnv,\n afterEnv: { ...this.processEnv }\n }\n }\n\n _injectEnv (env) {\n const row = {}\n row.type = TYPE_ENV\n row.string = env\n\n try {\n const { parsed, errors, injected, preExisted } = new Parse(env, null, this.processEnv, this.overload).run()\n row.parsed = parsed\n row.errors = errors\n row.injected = injected\n row.preExisted = preExisted\n\n this.inject(row.parsed) // inject\n\n this.readableStrings.add(env)\n\n for (const key of Object.keys(injected)) {\n this.uniqueInjectedKeys.add(key) // track uniqueInjectedKeys across multiple files\n }\n } catch (e) {\n row.errors = [e]\n }\n\n this.processedEnvs.push(row)\n }\n\n _injectEnvFile (envFilepath) {\n const row = {}\n row.type = TYPE_ENV_FILE\n row.filepath = envFilepath\n\n const filepath = path.resolve(envFilepath)\n try {\n const encoding = detectEncoding(filepath)\n const src = fsx.readFileX(filepath, { encoding })\n this.readableFilepaths.add(envFilepath)\n\n const privateKey = findPrivateKey(envFilepath, this.envKeysFilepath, this.opsOn)\n const privateKeyName = guessPrivateKeyName(envFilepath)\n const { parsed, errors, injected, preExisted } = new Parse(src, privateKey, this.processEnv, this.overload, privateKeyName).run()\n\n row.privateKeyName = privateKeyName\n row.privateKey = privateKey\n row.src = src\n row.parsed = parsed\n row.errors = errors\n row.injected = injected\n row.preExisted = preExisted\n\n this.inject(row.parsed) // inject\n\n for (const key of Object.keys(injected)) {\n this.uniqueInjectedKeys.add(key) // track uniqueInjectedKeys across multiple files\n }\n } catch (e) {\n if (e.code === 'ENOENT' || e.code === 'EISDIR') {\n row.errors = [new Errors({ envFilepath, filepath }).missingEnvFile()]\n } else {\n row.errors = [e]\n }\n }\n\n this.processedEnvs.push(row)\n }\n\n _injectEnvVaultFile (envVaultFilepath) {\n const row = {}\n row.type = TYPE_ENV_VAULT_FILE\n row.filepath = envVaultFilepath\n\n const filepath = path.resolve(envVaultFilepath)\n this.readableFilepaths.add(envVaultFilepath)\n\n if (!fsx.existsSync(filepath)) {\n const code = 'MISSING_ENV_VAULT_FILE'\n const message = `you set DOTENV_KEY but your .env.vault file is missing: ${filepath}`\n const error = new Error(message)\n error.code = code\n throw error\n }\n\n if (this.DOTENV_KEY.length < 1) {\n const code = 'MISSING_DOTENV_KEY'\n const message = `your DOTENV_KEY appears to be blank: '${this.DOTENV_KEY}'`\n const error = new Error(message)\n error.code = code\n throw error\n }\n\n let decrypted\n const dotenvKeys = this._dotenvKeys()\n const parsedVault = this._parsedVault(filepath)\n for (let i = 0; i < dotenvKeys.length; i++) {\n try {\n const dotenvKey = dotenvKeys[i].trim() // dotenv://key_1234@...?environment=prod\n\n decrypted = this._decrypted(dotenvKey, parsedVault)\n\n break\n } catch (error) {\n // last key\n if (i + 1 >= dotenvKeys.length) {\n throw error\n }\n // try next key\n }\n }\n\n try {\n // parse this. it's the equivalent of the .env file\n const { parsed, errors, injected, preExisted } = new Parse(decrypted, null, this.processEnv, this.overload).run()\n row.parsed = parsed\n row.errors = errors\n row.injected = injected\n row.preExisted = preExisted\n\n this.inject(row.parsed) // inject\n\n for (const key of Object.keys(injected)) {\n this.uniqueInjectedKeys.add(key) // track uniqueInjectedKeys across multiple files\n }\n } catch (e) {\n row.errors = [e]\n }\n\n this.processedEnvs.push(row)\n }\n\n inject (parsed) {\n for (const key of Object.keys(parsed)) {\n this.processEnv[key] = parsed[key] // inject to process.env\n }\n }\n\n // handle scenario for comma separated keys - for use with key rotation\n // example: DOTENV_KEY=\"dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=prod,dotenv://:key_7890@dotenvx.com/vault/.env.vault?environment=prod\"\n _dotenvKeys () {\n return this.DOTENV_KEY.split(',')\n }\n\n // { \"DOTENV_VAULT_DEVELOPMENT\": \"<ciphertext>\" }\n _parsedVault (filepath) {\n const src = fsx.readFileX(filepath)\n return dotenvParse(src)\n }\n\n _decrypted (dotenvKey, parsedVault) {\n const environment = parseEnvironmentFromDotenvKey(dotenvKey)\n\n // DOTENV_KEY_PRODUCTION\n const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`\n const ciphertext = parsedVault[environmentKey]\n if (!ciphertext) {\n const error = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: cannot locate environment ${environmentKey} in your .env.vault file`)\n error.code = 'NOT_FOUND_DOTENV_ENVIRONMENT'\n\n throw error\n }\n\n return decrypt(ciphertext, dotenvKey)\n }\n}\n\nmodule.exports = Run\n",
|
|
80
|
-
"const { encrypt } = require('eciesjs')\n\nconst PREFIX = 'encrypted:'\n\nfunction encryptValue (value, publicKey) {\n const ciphertext = encrypt(publicKey, Buffer.from(value))\n const encoded = Buffer.from(ciphertext, 'hex').toString('base64') // base64 encode ciphertext\n\n return `${PREFIX}${encoded}`\n}\n\nmodule.exports = encryptValue\n",
|
|
81
|
-
"const LINE = /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg\n\nfunction quotes (src) {\n const obj = {}\n // Convert buffer to string\n let lines = src.toString()\n\n // Convert line breaks to same format\n lines = lines.replace(/\\r\\n?/mg, '\\n')\n\n let match\n while ((match = LINE.exec(lines)) != null) {\n const key = match[1]\n\n // Default undefined or null to empty string\n let value = (match[2] || '')\n\n // Remove whitespace\n value = value.trim()\n\n // Check if double quoted\n const maybeQuote = value[0]\n\n value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/mg, '$2')\n\n if (maybeQuote === value[0]) {\n obj[key] = ''\n } else {\n obj[key] = maybeQuote\n }\n }\n\n return obj\n}\n\nmodule.exports = quotes\n",
|
|
82
|
-
"function escapeForRegex (str) {\n return str.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d')\n}\n\nmodule.exports = escapeForRegex\n",
|
|
83
|
-
"function escapeDollarSigns (str) {\n return str.replace(/\\$/g, '$$$$')\n}\n\nmodule.exports = escapeDollarSigns\n",
|
|
84
|
-
"const quotes = require('./quotes')\nconst dotenvParse = require('./dotenvParse')\nconst escapeForRegex = require('./escapeForRegex')\nconst escapeDollarSigns = require('./escapeDollarSigns')\n\nfunction replace (src, key, replaceValue) {\n let output\n let newPart = ''\n\n const parsed = dotenvParse(src, true, true) // skip expanding \\n and skip converting \\r\\n\n const _quotes = quotes(src)\n if (Object.prototype.hasOwnProperty.call(parsed, key)) {\n const quote = _quotes[key]\n newPart += `${key}=${quote}${replaceValue}${quote}`\n\n const originalValue = parsed[key]\n const escapedOriginalValue = escapeForRegex(originalValue)\n\n // conditionally enforce end of line\n let enforceEndOfLine = ''\n if (escapedOriginalValue === '') {\n enforceEndOfLine = '$' // EMPTY scenario\n\n // if empty quote and consecutive newlines\n const newlineMatch = src.match(new RegExp(`${key}\\\\s*=\\\\s*\\n\\n`, 'm')) // match any consecutive newline scenario for a blank value\n if (quote === '' && newlineMatch) {\n const newlineCount = (newlineMatch[0].match(/\\n/g)).length - 1\n for (let i = 0; i < newlineCount; i++) {\n newPart += '\\n' // re-append the extra newline to preserve user's format choice\n }\n }\n }\n\n const currentPart = new RegExp(\n '^' + // start of line\n '(\\\\s*)?' + // spaces\n '(export\\\\s+)?' + // export\n key + // KEY\n '\\\\s*=\\\\s*' + // spaces (KEY = value)\n '[\"\\'`]?' + // open quote\n escapedOriginalValue + // escaped value\n '[\"\\'`]?' + // close quote\n enforceEndOfLine\n ,\n 'gm' // (g)lobal (m)ultiline\n )\n\n const saferInput = escapeDollarSigns(newPart) // cleanse user inputted capture groups ($1, $2 etc)\n\n // $1 preserves spaces\n // $2 preserves export\n output = src.replace(currentPart, `$1$2${saferInput}`)\n } else {\n newPart += `${key}=\"${replaceValue}\"`\n\n // append\n if (src.endsWith('\\n')) {\n newPart = newPart + '\\n'\n } else {\n newPart = '\\n' + newPart\n }\n\n output = src + newPart\n }\n\n return output\n}\n\nmodule.exports = replace\n",
|
|
85
|
-
"// helpers\nconst guessPublicKeyName = require('./guessPublicKeyName')\nconst ProKeypair = require('./proKeypair')\n\n// services\nconst Keypair = require('./../services/keypair')\n\nfunction findPublicKey (envFilepath, opsOn = true) {\n const publicKeyName = guessPublicKeyName(envFilepath)\n\n let proKeypairs = {}\n if (opsOn) {\n proKeypairs = new ProKeypair(envFilepath).run()\n }\n\n const keypairs = new Keypair(envFilepath).run()\n\n return proKeypairs[publicKeyName] || keypairs[publicKeyName]\n}\n\nmodule.exports = findPublicKey\n",
|
|
86
|
-
"const { PrivateKey } = require('eciesjs')\n\nfunction keypair (existingPrivateKey) {\n let kp\n\n if (existingPrivateKey) {\n kp = new PrivateKey(Buffer.from(existingPrivateKey, 'hex'))\n } else {\n kp = new PrivateKey()\n }\n\n const publicKey = kp.publicKey.toHex()\n const privateKey = kp.secret.toString('hex')\n\n return {\n publicKey,\n privateKey\n }\n}\n\nmodule.exports = keypair\n",
|
|
87
|
-
"const ENCRYPTION_PATTERN = /^encrypted:.+/\n\nfunction isEncrypted (value) {\n return ENCRYPTION_PATTERN.test(value)\n}\n\nmodule.exports = isEncrypted\n",
|
|
88
|
-
"const fsx = require('./../helpers/fsx')\nconst path = require('path')\n\nconst TYPE_ENV_FILE = 'envFile'\n\nconst Errors = require('./../helpers/errors')\nconst guessPrivateKeyName = require('./../helpers/guessPrivateKeyName')\nconst guessPublicKeyName = require('./../helpers/guessPublicKeyName')\nconst encryptValue = require('./../helpers/encryptValue')\nconst decryptKeyValue = require('./../helpers/decryptKeyValue')\nconst replace = require('./../helpers/replace')\nconst dotenvParse = require('./../helpers/dotenvParse')\nconst detectEncoding = require('./../helpers/detectEncoding')\nconst determineEnvs = require('./../helpers/determineEnvs')\nconst { findPrivateKey } = require('./../helpers/findPrivateKey')\nconst findPublicKey = require('./../helpers/findPublicKey')\nconst keypair = require('./../helpers/keypair')\nconst truncate = require('./../helpers/truncate')\nconst isEncrypted = require('./../helpers/isEncrypted')\n\nclass Sets {\n constructor (key, value, envs = [], encrypt = true, envKeysFilepath = null) {\n this.envs = determineEnvs(envs, process.env)\n this.key = key\n this.value = value\n this.encrypt = encrypt\n this.envKeysFilepath = envKeysFilepath\n\n this.processedEnvs = []\n this.changedFilepaths = new Set()\n this.unchangedFilepaths = new Set()\n this.readableFilepaths = new Set()\n }\n\n run () {\n // example\n // envs [\n // { type: 'envFile', value: '.env' }\n // ]\n\n for (const env of this.envs) {\n if (env.type === TYPE_ENV_FILE) {\n this._setEnvFile(env.value)\n }\n }\n\n return {\n processedEnvs: this.processedEnvs,\n changedFilepaths: [...this.changedFilepaths],\n unchangedFilepaths: [...this.unchangedFilepaths]\n }\n }\n\n _setEnvFile (envFilepath) {\n const row = {}\n row.key = this.key || null\n row.value = this.value || null\n row.type = TYPE_ENV_FILE\n\n const filename = path.basename(envFilepath)\n const filepath = path.resolve(envFilepath)\n row.filepath = filepath\n row.envFilepath = envFilepath\n row.changed = false\n\n try {\n const encoding = this._detectEncoding(filepath)\n let envSrc = fsx.readFileX(filepath, { encoding })\n const envParsed = dotenvParse(envSrc)\n row.originalValue = envParsed[row.key] || null\n const wasPlainText = !isEncrypted(row.originalValue)\n this.readableFilepaths.add(envFilepath)\n\n if (this.encrypt) {\n let publicKey\n let privateKey\n\n const publicKeyName = guessPublicKeyName(envFilepath)\n const privateKeyName = guessPrivateKeyName(envFilepath)\n const existingPrivateKey = findPrivateKey(envFilepath, this.envKeysFilepath)\n const existingPublicKey = findPublicKey(envFilepath)\n\n let envKeysFilepath = path.join(path.dirname(filepath), '.env.keys')\n if (this.envKeysFilepath) {\n envKeysFilepath = path.resolve(this.envKeysFilepath)\n }\n const relativeFilepath = path.relative(path.dirname(filepath), envKeysFilepath)\n\n if (existingPrivateKey) {\n const kp = keypair(existingPrivateKey)\n publicKey = kp.publicKey\n privateKey = kp.privateKey\n\n if (row.originalValue) {\n row.originalValue = decryptKeyValue(row.key, row.originalValue, privateKeyName, privateKey)\n }\n\n // if derivation doesn't match what's in the file (or preset in env)\n if (existingPublicKey && existingPublicKey !== publicKey) {\n const error = new Error(`derived public key (${truncate(publicKey)}) does not match the existing public key (${truncate(existingPublicKey)})`)\n error.code = 'INVALID_DOTENV_PRIVATE_KEY'\n error.help = `debug info: ${privateKeyName}=${truncate(existingPrivateKey)} (derived ${publicKeyName}=${truncate(publicKey)} vs existing ${publicKeyName}=${truncate(existingPublicKey)})`\n throw error\n }\n\n // typical scenario when encrypting a monorepo second .env file from a prior generated -fk .env.keys file\n if (!existingPublicKey) {\n const ps = this._preserveShebang(envSrc)\n const firstLinePreserved = ps.firstLinePreserved\n envSrc = ps.envSrc\n\n const prependPublicKey = this._prependPublicKey(publicKeyName, publicKey, filename, relativeFilepath)\n\n envSrc = `${firstLinePreserved}${prependPublicKey}\\n${envSrc}`\n }\n } else if (existingPublicKey) {\n publicKey = existingPublicKey\n } else {\n // .env.keys\n let keysSrc = ''\n if (fsx.existsSync(envKeysFilepath)) {\n keysSrc = fsx.readFileX(envKeysFilepath)\n }\n\n const ps = this._preserveShebang(envSrc)\n const firstLinePreserved = ps.firstLinePreserved\n envSrc = ps.envSrc\n\n const kp = keypair() // generates a fresh keypair in memory\n publicKey = kp.publicKey\n privateKey = kp.privateKey\n\n const prependPublicKey = this._prependPublicKey(publicKeyName, publicKey, filename, relativeFilepath)\n\n // privateKey\n const firstTimeKeysSrc = [\n '#/------------------!DOTENV_PRIVATE_KEYS!-------------------/',\n '#/ private decryption keys. DO NOT commit to source control /',\n '#/ [how it works](https://dotenvx.com/encryption) /',\n '#/ backup with: `dotenvx ops backup` /',\n '#/----------------------------------------------------------/'\n ].join('\\n')\n const appendPrivateKey = [\n `# ${filename}`,\n `${privateKeyName}=${privateKey}`,\n ''\n ].join('\\n')\n\n envSrc = `${firstLinePreserved}${prependPublicKey}\\n${envSrc}`\n keysSrc = keysSrc.length > 1 ? keysSrc : `${firstTimeKeysSrc}\\n`\n keysSrc = `${keysSrc}\\n${appendPrivateKey}`\n\n // write to .env.keys\n fsx.writeFileX(envKeysFilepath, keysSrc)\n\n row.privateKeyAdded = true\n row.envKeysFilepath = this.envKeysFilepath || path.join(path.dirname(envFilepath), path.basename(envKeysFilepath))\n }\n\n row.publicKey = publicKey\n row.privateKey = privateKey\n row.encryptedValue = encryptValue(this.value, publicKey)\n row.privateKeyName = privateKeyName\n }\n\n const goingFromPlainTextToEncrypted = wasPlainText && this.encrypt\n const valueChanged = this.value !== row.originalValue\n if (goingFromPlainTextToEncrypted || valueChanged) {\n row.envSrc = replace(envSrc, this.key, row.encryptedValue || this.value)\n this.changedFilepaths.add(envFilepath)\n row.changed = true\n } else {\n row.envSrc = envSrc\n this.unchangedFilepaths.add(envFilepath)\n row.changed = false\n }\n } catch (e) {\n if (e.code === 'ENOENT') {\n row.error = new Errors({ envFilepath, filepath }).missingEnvFile()\n } else {\n row.error = e\n }\n }\n\n this.processedEnvs.push(row)\n }\n\n _detectEncoding (filepath) {\n return detectEncoding(filepath)\n }\n\n _prependPublicKey (publicKeyName, publicKey, filename, relativeFilepath = '.env.keys') {\n const comment = relativeFilepath === '.env.keys' ? '' : ` # -fk ${relativeFilepath}`\n\n return [\n '#/-------------------[DOTENV_PUBLIC_KEY]--------------------/',\n '#/ public-key encryption for .env files /',\n '#/ [how it works](https://dotenvx.com/encryption) /',\n '#/----------------------------------------------------------/',\n `${publicKeyName}=\"${publicKey}\"${comment}`,\n '',\n `# ${filename}`\n ].join('\\n')\n }\n\n _preserveShebang (envSrc) {\n // preserve shebang\n const [firstLine, ...remainingLines] = envSrc.split('\\n')\n let firstLinePreserved = ''\n\n if (firstLine.startsWith('#!')) {\n firstLinePreserved = firstLine + '\\n'\n envSrc = remainingLines.join('\\n')\n }\n\n return {\n firstLinePreserved,\n envSrc\n }\n }\n}\n\nmodule.exports = Sets\n",
|
|
89
|
-
"const Run = require('./run')\nconst Errors = require('./../helpers/errors')\n\nclass Get {\n constructor (key, envs = [], overload = false, DOTENV_KEY = '', all = false, envKeysFilepath = null) {\n this.key = key\n this.envs = envs\n this.overload = overload\n this.DOTENV_KEY = DOTENV_KEY\n this.all = all\n this.envKeysFilepath = envKeysFilepath\n }\n\n run () {\n const processEnv = { ...process.env }\n const { processedEnvs } = new Run(this.envs, this.overload, this.DOTENV_KEY, processEnv, this.envKeysFilepath).run()\n\n const errors = []\n for (const processedEnv of processedEnvs) {\n for (const error of processedEnv.errors) {\n errors.push(error)\n }\n }\n\n if (this.key) {\n const parsed = {}\n const value = processEnv[this.key]\n parsed[this.key] = value\n\n if (value === undefined) {\n errors.push(new Errors({ key: this.key }).missingKey())\n }\n\n return { parsed, errors }\n } else {\n // if user wants to return ALL envs (even prior set on machine)\n if (this.all) {\n return { parsed: processEnv, errors }\n }\n\n // typical scenario - return only envs that were identified in the .env file\n // iterate over all processedEnvs.parsed and grab from processEnv\n /** @type {Record<string, string>} */\n const parsed = {}\n for (const processedEnv of processedEnvs) {\n // parsed means we saw the key in a file or --env flag. this effectively filters out any preset machine envs - while still respecting complex evaluating, expansion, and overload. in other words, the value might be the machine value because the key was displayed in a .env file\n if (processedEnv.parsed) {\n for (const key of Object.keys(processedEnv.parsed)) {\n parsed[key] = processEnv[key]\n }\n }\n }\n\n return { parsed, errors }\n }\n }\n}\n\nmodule.exports = Get\n",
|
|
90
|
-
"const fsx = require('./fsx')\n\nconst RESERVED_ENV_FILES = ['.env.vault', '.env.project', '.env.keys', '.env.me', '.env.x', '.env.example']\n\nfunction findEnvFiles (directory) {\n try {\n const files = fsx.readdirSync(directory)\n const envFiles = files.filter(file =>\n file.startsWith('.env') &&\n !file.endsWith('.previous') &&\n !RESERVED_ENV_FILES.includes(file)\n )\n\n return envFiles\n } catch (e) {\n if (e.code === 'ENOENT') {\n const error = new Error(`missing directory (${directory})`)\n error.code = 'MISSING_DIRECTORY'\n\n throw error\n } else {\n throw e\n }\n }\n}\n\nmodule.exports = findEnvFiles\n",
|
|
91
|
-
"const fsx = require('./../helpers/fsx')\nconst path = require('path')\n\nconst Errors = require('../helpers/errors')\nconst findEnvFiles = require('../helpers/findEnvFiles')\nconst replace = require('../helpers/replace')\nconst dotenvParse = require('../helpers/dotenvParse')\n\nclass Genexample {\n constructor (directory = '.', envFile) {\n this.directory = directory\n this.envFile = envFile || findEnvFiles(directory)\n\n this.exampleFilename = '.env.example'\n this.exampleFilepath = path.resolve(this.directory, this.exampleFilename)\n }\n\n run () {\n if (this.envFile.length < 1) {\n const code = 'MISSING_ENV_FILES'\n const message = 'no .env* files found'\n const help = '? add one with [echo \"HELLO=World\" > .env] and then run [dotenvx genexample]'\n\n const error = new Error(message)\n error.code = code\n error.help = help\n throw error\n }\n\n const keys = new Set()\n const addedKeys = new Set()\n const envFilepaths = this._envFilepaths()\n /** @type {Record<string, string>} */\n const injected = {}\n /** @type {Record<string, string>} */\n const preExisted = {}\n\n let exampleSrc = `# ${this.exampleFilename} - generated with dotenvx\\n`\n\n for (const envFilepath of envFilepaths) {\n const filepath = path.resolve(this.directory, envFilepath)\n if (!fsx.existsSync(filepath)) {\n const error = new Errors({ envFilepath, filepath }).missingEnvFile()\n error.help = `? add it with [echo \"HELLO=World\" > ${envFilepath}] and then run [dotenvx genexample]`\n throw error\n }\n\n // get the original src\n let src = fsx.readFileX(filepath)\n const parsed = dotenvParse(src)\n for (const key in parsed) {\n // used later\n keys.add(key)\n\n // once newSrc is built write it out\n src = replace(src, key, '') // empty value\n }\n\n exampleSrc += `\\n${src}`\n }\n\n if (!fsx.existsSync(this.exampleFilepath)) {\n // it doesn't exist so just write this first generated one\n // exampleSrc - already written to from the prior loop\n for (const key of [...keys]) {\n // every key is added since it's the first time generating .env.example\n addedKeys.add(key)\n\n injected[key] = ''\n }\n } else {\n // it already exists (which means the user might have it modified a way in which they prefer, so replace exampleSrc with their existing .env.example)\n exampleSrc = fsx.readFileX(this.exampleFilepath)\n\n const parsed = dotenvParse(exampleSrc)\n for (const key of [...keys]) {\n if (key in parsed) {\n preExisted[key] = parsed[key]\n } else {\n exampleSrc += `${key}=''\\n`\n\n addedKeys.add(key)\n\n injected[key] = ''\n }\n }\n }\n\n return {\n envExampleFile: exampleSrc,\n envFile: this.envFile,\n exampleFilepath: this.exampleFilepath,\n addedKeys: [...addedKeys],\n injected,\n preExisted\n }\n }\n\n _envFilepaths () {\n if (!Array.isArray(this.envFile)) {\n return [this.envFile]\n }\n\n return this.envFile\n }\n}\n\nmodule.exports = Genexample\n",
|
|
92
|
-
"function conventions (convention) {\n const env = process.env.DOTENV_ENV || process.env.NODE_ENV || 'development'\n\n if (convention === 'nextjs') {\n const canonicalEnv = ['development', 'test', 'production'].includes(env) && env\n\n return [\n canonicalEnv && { type: 'envFile', value: `.env.${canonicalEnv}.local` },\n canonicalEnv !== 'test' && { type: 'envFile', value: '.env.local' },\n canonicalEnv && { type: 'envFile', value: `.env.${canonicalEnv}` },\n { type: 'envFile', value: '.env' }\n ].filter(Boolean)\n } else if (convention === 'flow') {\n return [\n { type: 'envFile', value: `.env.${env}.local` },\n { type: 'envFile', value: `.env.${env}` },\n { type: 'envFile', value: '.env.local' },\n { type: 'envFile', value: '.env' },\n { type: 'envFile', value: '.env.defaults' }\n ]\n } else {\n throw new Error(`INVALID_CONVENTION: '${convention}'. permitted conventions: ['nextjs', 'flow']`)\n }\n}\n\nmodule.exports = conventions\n",
|
|
93
|
-
"const os = require('os')\nconst path = require('path')\n\nfunction resolveHome (filepath) {\n if (filepath[0] === '~') {\n return path.join(os.homedir(), filepath.slice(1))\n }\n\n return filepath\n}\n\nmodule.exports = resolveHome\n",
|
|
94
|
-
"const resolveHome = require('./resolveHome')\n\nfunction dotenvOptionPaths (options) {\n let optionPaths = []\n\n if (options && options.path) {\n if (!Array.isArray(options.path)) {\n optionPaths = [resolveHome(options.path)]\n } else {\n optionPaths = [] // reset default\n\n for (const filepath of options.path) {\n optionPaths.push(resolveHome(filepath))\n }\n }\n }\n\n return optionPaths\n}\n\nmodule.exports = dotenvOptionPaths\n",
|
|
95
|
-
"const { logger } = require('./../../shared/logger')\n\nclass DeprecationNotice {\n constructor (options = {}) {\n this.DOTENV_KEY = options.DOTENV_KEY || process.env.DOTENV_KEY\n }\n\n dotenvKey () {\n if (this.DOTENV_KEY) {\n logger.warn('[DEPRECATION NOTICE] Setting DOTENV_KEY with .env.vault is deprecated.')\n logger.warn('[DEPRECATION NOTICE] Run [dotenvx ext vault migrate] for instructions on converting your .env.vault file to encrypted .env files (using public key encryption algorithm secp256k1)')\n logger.warn('[DEPRECATION NOTICE] Read more at [https://github.com/dotenvx/dotenvx/blob/main/CHANGELOG.md#0380]')\n }\n }\n}\n\nmodule.exports = DeprecationNotice\n",
|
|
96
|
-
"const path = require('path')\n\nconst conventions = require('./conventions')\nconst dotenvOptionPaths = require('./dotenvOptionPaths')\nconst DeprecationNotice = require('./deprecationNotice')\n\nfunction buildEnvs (options, DOTENV_KEY = undefined) {\n // build envs using user set option.path\n const optionPaths = dotenvOptionPaths(options) // [ '.env' ]\n\n let envs = []\n if (options.convention) { // handle shorthand conventions\n envs = conventions(options.convention).concat(envs)\n }\n\n new DeprecationNotice({ DOTENV_KEY }).dotenvKey() // DEPRECATION NOTICE\n\n for (const optionPath of optionPaths) {\n // if DOTENV_KEY is set then assume we are checking envVaultFile\n if (DOTENV_KEY) {\n envs.push({\n type: 'envVaultFile',\n value: path.join(path.dirname(optionPath), '.env.vault')\n })\n } else {\n envs.push({ type: 'envFile', value: optionPath })\n }\n }\n\n return envs\n}\n\nmodule.exports = buildEnvs\n",
|
|
97
|
-
"// A simple implementation of make-array\nfunction makeArray (subject) {\n return Array.isArray(subject)\n ? subject\n : [subject]\n}\n\nconst EMPTY = ''\nconst SPACE = ' '\nconst ESCAPE = '\\\\'\nconst REGEX_TEST_BLANK_LINE = /^\\s+$/\nconst REGEX_INVALID_TRAILING_BACKSLASH = /(?:[^\\\\]|^)\\\\$/\nconst REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION = /^\\\\!/\nconst REGEX_REPLACE_LEADING_EXCAPED_HASH = /^\\\\#/\nconst REGEX_SPLITALL_CRLF = /\\r?\\n/g\n// /foo,\n// ./foo,\n// ../foo,\n// .\n// ..\nconst REGEX_TEST_INVALID_PATH = /^\\.*\\/|^\\.+$/\n\nconst SLASH = '/'\n\n// Do not use ternary expression here, since \"istanbul ignore next\" is buggy\nlet TMP_KEY_IGNORE = 'node-ignore'\n/* istanbul ignore else */\nif (typeof Symbol !== 'undefined') {\n TMP_KEY_IGNORE = Symbol.for('node-ignore')\n}\nconst KEY_IGNORE = TMP_KEY_IGNORE\n\nconst define = (object, key, value) =>\n Object.defineProperty(object, key, {value})\n\nconst REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g\n\nconst RETURN_FALSE = () => false\n\n// Sanitize the range of a regular expression\n// The cases are complicated, see test cases for details\nconst sanitizeRange = range => range.replace(\n REGEX_REGEXP_RANGE,\n (match, from, to) => from.charCodeAt(0) <= to.charCodeAt(0)\n ? match\n // Invalid range (out of order) which is ok for gitignore rules but\n // fatal for JavaScript regular expression, so eliminate it.\n : EMPTY\n)\n\n// See fixtures #59\nconst cleanRangeBackSlash = slashes => {\n const {length} = slashes\n return slashes.slice(0, length - length % 2)\n}\n\n// > If the pattern ends with a slash,\n// > it is removed for the purpose of the following description,\n// > but it would only find a match with a directory.\n// > In other words, foo/ will match a directory foo and paths underneath it,\n// > but will not match a regular file or a symbolic link foo\n// > (this is consistent with the way how pathspec works in general in Git).\n// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`'\n// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call\n// you could use option `mark: true` with `glob`\n\n// '`foo/`' should not continue with the '`..`'\nconst REPLACERS = [\n\n [\n // remove BOM\n // TODO:\n // Other similar zero-width characters?\n /^\\uFEFF/,\n () => EMPTY\n ],\n\n // > Trailing spaces are ignored unless they are quoted with backslash (\"\\\")\n [\n // (a\\ ) -> (a )\n // (a ) -> (a)\n // (a ) -> (a)\n // (a \\ ) -> (a )\n /((?:\\\\\\\\)*?)(\\\\?\\s+)$/,\n (_, m1, m2) => m1 + (\n m2.indexOf('\\\\') === 0\n ? SPACE\n : EMPTY\n )\n ],\n\n // replace (\\ ) with ' '\n // (\\ ) -> ' '\n // (\\\\ ) -> '\\\\ '\n // (\\\\\\ ) -> '\\\\ '\n [\n /(\\\\+?)\\s/g,\n (_, m1) => {\n const {length} = m1\n return m1.slice(0, length - length % 2) + SPACE\n }\n ],\n\n // Escape metacharacters\n // which is written down by users but means special for regular expressions.\n\n // > There are 12 characters with special meanings:\n // > - the backslash \\,\n // > - the caret ^,\n // > - the dollar sign $,\n // > - the period or dot .,\n // > - the vertical bar or pipe symbol |,\n // > - the question mark ?,\n // > - the asterisk or star *,\n // > - the plus sign +,\n // > - the opening parenthesis (,\n // > - the closing parenthesis ),\n // > - and the opening square bracket [,\n // > - the opening curly brace {,\n // > These special characters are often called \"metacharacters\".\n [\n /[\\\\$.|*+(){^]/g,\n match => `\\\\${match}`\n ],\n\n [\n // > a question mark (?) matches a single character\n /(?!\\\\)\\?/g,\n () => '[^/]'\n ],\n\n // leading slash\n [\n\n // > A leading slash matches the beginning of the pathname.\n // > For example, \"/*.c\" matches \"cat-file.c\" but not \"mozilla-sha1/sha1.c\".\n // A leading slash matches the beginning of the pathname\n /^\\//,\n () => '^'\n ],\n\n // replace special metacharacter slash after the leading slash\n [\n /\\//g,\n () => '\\\\/'\n ],\n\n [\n // > A leading \"**\" followed by a slash means match in all directories.\n // > For example, \"**/foo\" matches file or directory \"foo\" anywhere,\n // > the same as pattern \"foo\".\n // > \"**/foo/bar\" matches file or directory \"bar\" anywhere that is directly\n // > under directory \"foo\".\n // Notice that the '*'s have been replaced as '\\\\*'\n /^\\^*\\\\\\*\\\\\\*\\\\\\//,\n\n // '**/foo' <-> 'foo'\n () => '^(?:.*\\\\/)?'\n ],\n\n // starting\n [\n // there will be no leading '/'\n // (which has been replaced by section \"leading slash\")\n // If starts with '**', adding a '^' to the regular expression also works\n /^(?=[^^])/,\n function startingReplacer () {\n // If has a slash `/` at the beginning or middle\n return !/\\/(?!$)/.test(this)\n // > Prior to 2.22.1\n // > If the pattern does not contain a slash /,\n // > Git treats it as a shell glob pattern\n // Actually, if there is only a trailing slash,\n // git also treats it as a shell glob pattern\n\n // After 2.22.1 (compatible but clearer)\n // > If there is a separator at the beginning or middle (or both)\n // > of the pattern, then the pattern is relative to the directory\n // > level of the particular .gitignore file itself.\n // > Otherwise the pattern may also match at any level below\n // > the .gitignore level.\n ? '(?:^|\\\\/)'\n\n // > Otherwise, Git treats the pattern as a shell glob suitable for\n // > consumption by fnmatch(3)\n : '^'\n }\n ],\n\n // two globstars\n [\n // Use lookahead assertions so that we could match more than one `'/**'`\n /\\\\\\/\\\\\\*\\\\\\*(?=\\\\\\/|$)/g,\n\n // Zero, one or several directories\n // should not use '*', or it will be replaced by the next replacer\n\n // Check if it is not the last `'/**'`\n (_, index, str) => index + 6 < str.length\n\n // case: /**/\n // > A slash followed by two consecutive asterisks then a slash matches\n // > zero or more directories.\n // > For example, \"a/**/b\" matches \"a/b\", \"a/x/b\", \"a/x/y/b\" and so on.\n // '/**/'\n ? '(?:\\\\/[^\\\\/]+)*'\n\n // case: /**\n // > A trailing `\"/**\"` matches everything inside.\n\n // #21: everything inside but it should not include the current folder\n : '\\\\/.+'\n ],\n\n // normal intermediate wildcards\n [\n // Never replace escaped '*'\n // ignore rule '\\*' will match the path '*'\n\n // 'abc.*/' -> go\n // 'abc.*' -> skip this rule,\n // coz trailing single wildcard will be handed by [trailing wildcard]\n /(^|[^\\\\]+)(\\\\\\*)+(?=.+)/g,\n\n // '*.js' matches '.js'\n // '*.js' doesn't match 'abc'\n (_, p1, p2) => {\n // 1.\n // > An asterisk \"*\" matches anything except a slash.\n // 2.\n // > Other consecutive asterisks are considered regular asterisks\n // > and will match according to the previous rules.\n const unescaped = p2.replace(/\\\\\\*/g, '[^\\\\/]*')\n return p1 + unescaped\n }\n ],\n\n [\n // unescape, revert step 3 except for back slash\n // For example, if a user escape a '\\\\*',\n // after step 3, the result will be '\\\\\\\\\\\\*'\n /\\\\\\\\\\\\(?=[$.|*+(){^])/g,\n () => ESCAPE\n ],\n\n [\n // '\\\\\\\\' -> '\\\\'\n /\\\\\\\\/g,\n () => ESCAPE\n ],\n\n [\n // > The range notation, e.g. [a-zA-Z],\n // > can be used to match one of the characters in a range.\n\n // `\\` is escaped by step 3\n /(\\\\)?\\[([^\\]/]*?)(\\\\*)($|\\])/g,\n (match, leadEscape, range, endEscape, close) => leadEscape === ESCAPE\n // '\\\\[bar]' -> '\\\\\\\\[bar\\\\]'\n ? `\\\\[${range}${cleanRangeBackSlash(endEscape)}${close}`\n : close === ']'\n ? endEscape.length % 2 === 0\n // A normal case, and it is a range notation\n // '[bar]'\n // '[bar\\\\\\\\]'\n ? `[${sanitizeRange(range)}${endEscape}]`\n // Invalid range notaton\n // '[bar\\\\]' -> '[bar\\\\\\\\]'\n : '[]'\n : '[]'\n ],\n\n // ending\n [\n // 'js' will not match 'js.'\n // 'ab' will not match 'abc'\n /(?:[^*])$/,\n\n // WTF!\n // https://git-scm.com/docs/gitignore\n // changes in [2.22.1](https://git-scm.com/docs/gitignore/2.22.1)\n // which re-fixes #24, #38\n\n // > If there is a separator at the end of the pattern then the pattern\n // > will only match directories, otherwise the pattern can match both\n // > files and directories.\n\n // 'js*' will not match 'a.js'\n // 'js/' will not match 'a.js'\n // 'js' will match 'a.js' and 'a.js/'\n match => /\\/$/.test(match)\n // foo/ will not match 'foo'\n ? `${match}$`\n // foo matches 'foo' and 'foo/'\n : `${match}(?=$|\\\\/$)`\n ],\n\n // trailing wildcard\n [\n /(\\^|\\\\\\/)?\\\\\\*$/,\n (_, p1) => {\n const prefix = p1\n // '\\^':\n // '/*' does not match EMPTY\n // '/*' does not match everything\n\n // '\\\\\\/':\n // 'abc/*' does not match 'abc/'\n ? `${p1}[^/]+`\n\n // 'a*' matches 'a'\n // 'a*' matches 'aa'\n : '[^/]*'\n\n return `${prefix}(?=$|\\\\/$)`\n }\n ],\n]\n\n// A simple cache, because an ignore rule only has only one certain meaning\nconst regexCache = Object.create(null)\n\n// @param {pattern}\nconst makeRegex = (pattern, ignoreCase) => {\n let source = regexCache[pattern]\n\n if (!source) {\n source = REPLACERS.reduce(\n (prev, [matcher, replacer]) =>\n prev.replace(matcher, replacer.bind(pattern)),\n pattern\n )\n regexCache[pattern] = source\n }\n\n return ignoreCase\n ? new RegExp(source, 'i')\n : new RegExp(source)\n}\n\nconst isString = subject => typeof subject === 'string'\n\n// > A blank line matches no files, so it can serve as a separator for readability.\nconst checkPattern = pattern => pattern\n && isString(pattern)\n && !REGEX_TEST_BLANK_LINE.test(pattern)\n && !REGEX_INVALID_TRAILING_BACKSLASH.test(pattern)\n\n // > A line starting with # serves as a comment.\n && pattern.indexOf('#') !== 0\n\nconst splitPattern = pattern => pattern.split(REGEX_SPLITALL_CRLF)\n\nclass IgnoreRule {\n constructor (\n origin,\n pattern,\n negative,\n regex\n ) {\n this.origin = origin\n this.pattern = pattern\n this.negative = negative\n this.regex = regex\n }\n}\n\nconst createRule = (pattern, ignoreCase) => {\n const origin = pattern\n let negative = false\n\n // > An optional prefix \"!\" which negates the pattern;\n if (pattern.indexOf('!') === 0) {\n negative = true\n pattern = pattern.substr(1)\n }\n\n pattern = pattern\n // > Put a backslash (\"\\\") in front of the first \"!\" for patterns that\n // > begin with a literal \"!\", for example, `\"\\!important!.txt\"`.\n .replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION, '!')\n // > Put a backslash (\"\\\") in front of the first hash for patterns that\n // > begin with a hash.\n .replace(REGEX_REPLACE_LEADING_EXCAPED_HASH, '#')\n\n const regex = makeRegex(pattern, ignoreCase)\n\n return new IgnoreRule(\n origin,\n pattern,\n negative,\n regex\n )\n}\n\nconst throwError = (message, Ctor) => {\n throw new Ctor(message)\n}\n\nconst checkPath = (path, originalPath, doThrow) => {\n if (!isString(path)) {\n return doThrow(\n `path must be a string, but got \\`${originalPath}\\``,\n TypeError\n )\n }\n\n // We don't know if we should ignore EMPTY, so throw\n if (!path) {\n return doThrow(`path must not be empty`, TypeError)\n }\n\n // Check if it is a relative path\n if (checkPath.isNotRelative(path)) {\n const r = '`path.relative()`d'\n return doThrow(\n `path should be a ${r} string, but got \"${originalPath}\"`,\n RangeError\n )\n }\n\n return true\n}\n\nconst isNotRelative = path => REGEX_TEST_INVALID_PATH.test(path)\n\ncheckPath.isNotRelative = isNotRelative\ncheckPath.convert = p => p\n\nclass Ignore {\n constructor ({\n ignorecase = true,\n ignoreCase = ignorecase,\n allowRelativePaths = false\n } = {}) {\n define(this, KEY_IGNORE, true)\n\n this._rules = []\n this._ignoreCase = ignoreCase\n this._allowRelativePaths = allowRelativePaths\n this._initCache()\n }\n\n _initCache () {\n this._ignoreCache = Object.create(null)\n this._testCache = Object.create(null)\n }\n\n _addPattern (pattern) {\n // #32\n if (pattern && pattern[KEY_IGNORE]) {\n this._rules = this._rules.concat(pattern._rules)\n this._added = true\n return\n }\n\n if (checkPattern(pattern)) {\n const rule = createRule(pattern, this._ignoreCase)\n this._added = true\n this._rules.push(rule)\n }\n }\n\n // @param {Array<string> | string | Ignore} pattern\n add (pattern) {\n this._added = false\n\n makeArray(\n isString(pattern)\n ? splitPattern(pattern)\n : pattern\n ).forEach(this._addPattern, this)\n\n // Some rules have just added to the ignore,\n // making the behavior changed.\n if (this._added) {\n this._initCache()\n }\n\n return this\n }\n\n // legacy\n addPattern (pattern) {\n return this.add(pattern)\n }\n\n // | ignored : unignored\n // negative | 0:0 | 0:1 | 1:0 | 1:1\n // -------- | ------- | ------- | ------- | --------\n // 0 | TEST | TEST | SKIP | X\n // 1 | TESTIF | SKIP | TEST | X\n\n // - SKIP: always skip\n // - TEST: always test\n // - TESTIF: only test if checkUnignored\n // - X: that never happen\n\n // @param {boolean} whether should check if the path is unignored,\n // setting `checkUnignored` to `false` could reduce additional\n // path matching.\n\n // @returns {TestResult} true if a file is ignored\n _testOne (path, checkUnignored) {\n let ignored = false\n let unignored = false\n\n this._rules.forEach(rule => {\n const {negative} = rule\n if (\n unignored === negative && ignored !== unignored\n || negative && !ignored && !unignored && !checkUnignored\n ) {\n return\n }\n\n const matched = rule.regex.test(path)\n\n if (matched) {\n ignored = !negative\n unignored = negative\n }\n })\n\n return {\n ignored,\n unignored\n }\n }\n\n // @returns {TestResult}\n _test (originalPath, cache, checkUnignored, slices) {\n const path = originalPath\n // Supports nullable path\n && checkPath.convert(originalPath)\n\n checkPath(\n path,\n originalPath,\n this._allowRelativePaths\n ? RETURN_FALSE\n : throwError\n )\n\n return this._t(path, cache, checkUnignored, slices)\n }\n\n _t (path, cache, checkUnignored, slices) {\n if (path in cache) {\n return cache[path]\n }\n\n if (!slices) {\n // path/to/a.js\n // ['path', 'to', 'a.js']\n slices = path.split(SLASH)\n }\n\n slices.pop()\n\n // If the path has no parent directory, just test it\n if (!slices.length) {\n return cache[path] = this._testOne(path, checkUnignored)\n }\n\n const parent = this._t(\n slices.join(SLASH) + SLASH,\n cache,\n checkUnignored,\n slices\n )\n\n // If the path contains a parent directory, check the parent first\n return cache[path] = parent.ignored\n // > It is not possible to re-include a file if a parent directory of\n // > that file is excluded.\n ? parent\n : this._testOne(path, checkUnignored)\n }\n\n ignores (path) {\n return this._test(path, this._ignoreCache, false).ignored\n }\n\n createFilter () {\n return path => !this.ignores(path)\n }\n\n filter (paths) {\n return makeArray(paths).filter(this.createFilter())\n }\n\n // @returns {TestResult}\n test (path) {\n return this._test(path, this._testCache, true)\n }\n}\n\nconst factory = options => new Ignore(options)\n\nconst isPathValid = path =>\n checkPath(path && checkPath.convert(path), path, RETURN_FALSE)\n\nfactory.isPathValid = isPathValid\n\n// Fixes typescript\nfactory.default = factory\n\nmodule.exports = factory\n\n// Windows\n// --------------------------------------------------------------\n/* istanbul ignore if */\nif (\n // Detect `process` so that it can run in browsers.\n typeof process !== 'undefined'\n && (\n process.env && process.env.IGNORE_TEST_WIN32\n || process.platform === 'win32'\n )\n) {\n /* eslint no-control-regex: \"off\" */\n const makePosix = str => /^\\\\\\\\\\?\\\\/.test(str)\n || /[\"<>|\\u0000-\\u001F]+/u.test(str)\n ? str\n : str.replace(/\\\\/g, '/')\n\n checkPath.convert = makePosix\n\n // 'C:\\\\foo' <- 'C:\\\\foo' has been converted to 'C:/'\n // 'd:\\\\foo'\n const REGIX_IS_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\\//i\n checkPath.isNotRelative = path =>\n REGIX_IS_WINDOWS_PATH_ABSOLUTE.test(path)\n || isNotRelative(path)\n}\n",
|
|
98
|
-
"const fsx = require('./fsx')\nconst ignore = require('ignore')\n\nfunction isIgnoringDotenvKeys () {\n if (!fsx.existsSync('.gitignore')) {\n return false\n }\n\n const gitignore = fsx.readFileX('.gitignore')\n const ig = ignore(gitignore).add(gitignore)\n\n if (!ig.ignores('.env.keys')) {\n return false\n }\n\n return true\n}\n\nmodule.exports = isIgnoringDotenvKeys\n",
|
|
99
|
-
"// @ts-check\nconst path = require('path')\n\n// shared\nconst { setLogLevel, setLogName, setLogVersion, logger } = require('./../shared/logger')\nconst { getColor, bold } = require('./../shared/colors')\n\n// services\nconst Ls = require('./services/ls')\nconst Run = require('./services/run')\nconst Sets = require('./services/sets')\nconst Get = require('./services/get')\nconst Keypair = require('./services/keypair')\nconst Genexample = require('./services/genexample')\n\n// helpers\nconst buildEnvs = require('./helpers/buildEnvs')\nconst Parse = require('./helpers/parse')\nconst fsx = require('./helpers/fsx')\nconst isIgnoringDotenvKeys = require('./helpers/isIgnoringDotenvKeys')\n\n/** @type {import('./main').config} */\nconst config = function (options = {}) {\n // allow user to set processEnv to write to\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n // overload\n const overload = options.overload || options.override\n\n // ignore\n const ignore = options.ignore || []\n\n // strict\n const strict = options.strict\n\n // envKeysFile\n const envKeysFile = options.envKeysFile\n\n // DOTENV_KEY (DEPRECATED)\n let DOTENV_KEY = process.env.DOTENV_KEY\n if (options && options.DOTENV_KEY) {\n DOTENV_KEY = options.DOTENV_KEY\n }\n\n // dotenvx-ops related\n const opsOn = options.opsOff !== true\n\n if (options) {\n setLogLevel(options)\n setLogName(options)\n setLogVersion(options)\n }\n\n try {\n const envs = buildEnvs(options, DOTENV_KEY)\n const {\n processedEnvs,\n readableFilepaths,\n uniqueInjectedKeys\n } = new Run(envs, overload, DOTENV_KEY, processEnv, envKeysFile, opsOn).run()\n\n if (opsOn) {\n // removed radar feature for now. contact me at mot@dotenvx.com if still needed for your organization.\n // try { new Ops().observe({ beforeEnv, processedEnvs, afterEnv }) } catch {}\n }\n\n let lastError\n /** @type {Record<string, string>} */\n const parsedAll = {}\n for (const processedEnv of processedEnvs) {\n if (processedEnv.type === 'envVaultFile') {\n logger.verbose(`loading env from encrypted ${processedEnv.filepath} (${path.resolve(processedEnv.filepath)})`)\n logger.debug(`decrypting encrypted env from ${processedEnv.filepath} (${path.resolve(processedEnv.filepath)})`)\n }\n\n if (processedEnv.type === 'envFile') {\n logger.verbose(`loading env from ${processedEnv.filepath} (${path.resolve(processedEnv.filepath)})`)\n }\n\n for (const error of processedEnv.errors || []) {\n if (ignore.includes(error.code)) {\n logger.verbose(`ignored: ${error.message}`)\n continue // ignore error\n }\n\n if (strict) throw error // throw if strict and not ignored\n\n lastError = error // surface later in { error }\n\n if (error.code === 'MISSING_ENV_FILE') {\n if (!options.convention) { // do not output error for conventions (too noisy)\n logger.error(error.message)\n if (error.help) {\n logger.error(error.help)\n }\n }\n } else {\n logger.error(error.message)\n if (error.help) {\n logger.error(error.help)\n }\n }\n }\n\n Object.assign(parsedAll, processedEnv.injected || {})\n Object.assign(parsedAll, processedEnv.preExisted || {}) // preExisted 'wins'\n\n // debug parsed\n logger.debug(processedEnv.parsed)\n\n // verbose/debug injected key/value\n for (const [key, value] of Object.entries(processedEnv.injected || {})) {\n logger.verbose(`${key} set`)\n logger.debug(`${key} set to ${value}`)\n }\n\n // verbose/debug preExisted key/value\n for (const [key, value] of Object.entries(processedEnv.preExisted || {})) {\n logger.verbose(`${key} pre-exists (protip: use --overload to override)`)\n logger.debug(`${key} pre-exists as ${value} (protip: use --overload to override)`)\n }\n }\n\n let msg = `injecting env (${uniqueInjectedKeys.length})`\n if (readableFilepaths.length > 0) {\n msg += ` from ${readableFilepaths.join(', ')}`\n }\n logger.successv(msg)\n\n if (lastError) {\n return { parsed: parsedAll, error: lastError }\n } else {\n return { parsed: parsedAll }\n }\n } catch (error) {\n if (strict) throw error // throw immediately if strict\n\n logger.error(error.message)\n if (error.help) {\n logger.help(error.help)\n }\n\n return { parsed: {}, error }\n }\n}\n\n/** @type {import('./main').parse} */\nconst parse = function (src, options = {}) {\n // allow user to set processEnv to read from\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n // private decryption key\n const privateKey = options.privateKey || null\n\n // overload\n const overload = options.overload || options.override\n\n const { parsed, errors } = new Parse(src, privateKey, processEnv, overload).run()\n\n // display any errors\n for (const error of errors) {\n logger.error(error.message)\n if (error.help) {\n logger.error(error.help)\n }\n }\n\n return parsed\n}\n\n/* @type {import('./main').set} */\nconst set = function (key, value, options = {}) {\n // encrypt\n let encrypt = true\n if (options.plain) {\n encrypt = false\n } else if (options.encrypt === false) {\n encrypt = false\n }\n\n if (options) {\n setLogLevel(options)\n setLogName(options)\n setLogVersion(options)\n }\n\n const envs = buildEnvs(options)\n const envKeysFilepath = options.envKeysFile\n\n const {\n processedEnvs,\n changedFilepaths,\n unchangedFilepaths\n } = new Sets(key, value, envs, encrypt, envKeysFilepath).run()\n\n let withEncryption = ''\n\n if (encrypt) {\n withEncryption = ' with encryption'\n }\n\n for (const processedEnv of processedEnvs) {\n logger.verbose(`setting for ${processedEnv.envFilepath}`)\n\n if (processedEnv.error) {\n if (processedEnv.error.code === 'MISSING_ENV_FILE') {\n logger.warn(processedEnv.error.message)\n logger.help(`? add one with [echo \"HELLO=World\" > ${processedEnv.envFilepath}] and re-run [dotenvx set]`)\n } else {\n logger.warn(processedEnv.error.message)\n if (processedEnv.error.help) {\n logger.help(processedEnv.error.help)\n }\n }\n } else {\n fsx.writeFileX(processedEnv.filepath, processedEnv.envSrc)\n\n logger.verbose(`${processedEnv.key} set${withEncryption} (${processedEnv.envFilepath})`)\n logger.debug(`${processedEnv.key} set${withEncryption} to ${processedEnv.value} (${processedEnv.envFilepath})`)\n }\n }\n\n if (changedFilepaths.length > 0) {\n logger.success(`✔ set ${key}${withEncryption} (${changedFilepaths.join(',')})`)\n } else if (unchangedFilepaths.length > 0) {\n logger.info(`no changes (${unchangedFilepaths})`)\n } else {\n // do nothing\n }\n\n for (const processedEnv of processedEnvs) {\n if (processedEnv.privateKeyAdded) {\n logger.success(`✔ key added to ${processedEnv.envKeysFilepath} (${processedEnv.privateKeyName})`)\n logger.help('⮕ optional: [dotenvx ops backup] to securely backup private key')\n\n if (!isIgnoringDotenvKeys()) {\n logger.help('⮕ next run: [dotenvx ext gitignore --pattern .env.keys] to gitignore .env.keys')\n }\n\n logger.help(`⮕ next run: [${processedEnv.privateKeyName}='${processedEnv.privateKey}' dotenvx get ${key}] to test decryption locally`)\n }\n }\n\n return {\n processedEnvs,\n changedFilepaths,\n unchangedFilepaths\n }\n}\n\n/* @type {import('./main').get} */\nconst get = function (key, options = {}) {\n const envs = buildEnvs(options)\n\n // ignore\n const ignore = options.ignore || []\n\n const { parsed, errors } = new Get(key, envs, options.overload, process.env.DOTENV_KEY, options.all, options.envKeysFile).run()\n\n for (const error of errors || []) {\n if (ignore.includes(error.code)) {\n continue // ignore error\n }\n\n if (options.strict) throw error // throw immediately if strict\n\n logger.error(error.message)\n if (error.help) {\n logger.error(error.help)\n }\n }\n\n if (key) {\n const single = parsed[key]\n if (single === undefined) {\n return undefined\n } else {\n return single\n }\n } else {\n if (options.format === 'eval') {\n let inline = ''\n for (const [key, value] of Object.entries(parsed)) {\n inline += `${key}=${escape(value)}\\n`\n }\n inline = inline.trim()\n\n return inline\n } else if (options.format === 'shell') {\n let inline = ''\n for (const [key, value] of Object.entries(parsed)) {\n inline += `${key}=${value} `\n }\n inline = inline.trim()\n\n return inline\n } else {\n return parsed\n }\n }\n}\n\n/** @type {import('./main').ls} */\nconst ls = function (directory, envFile, excludeEnvFile) {\n return new Ls(directory, envFile, excludeEnvFile).run()\n}\n\n/** @type {import('./main').genexample} */\nconst genexample = function (directory, envFile) {\n return new Genexample(directory, envFile).run()\n}\n\n/** @type {import('./main').keypair} */\nconst keypair = function (envFile, key, envKeysFile = null) {\n const keypairs = new Keypair(envFile, envKeysFile).run()\n if (key) {\n return keypairs[key]\n } else {\n return keypairs\n }\n}\n\nmodule.exports = {\n // dotenv proxies\n config,\n parse,\n // actions related\n set,\n get,\n ls,\n keypair,\n genexample,\n // expose for libs depending on @dotenvx/dotenvx - like dotenvx-ops\n setLogLevel,\n logger,\n getColor,\n bold\n}\n",
|
|
100
|
-
"// oxlint-disable no-explicit-any ban-types\n\nimport type {\n AnyAsyncFunction,\n AnyAsyncGeneratorFunction,\n AnyFunction,\n AnyGeneratorFunction,\n AnySyncFunction,\n NonPrimitive,\n PlainObject,\n Primitive\n} from \"#Source/type/index.ts\"\n\n/**\n * 进行类型检测的常用手段包括:\n * - typeof: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof\n * https://tc39.es/ecma262/#sec-typeof-operator\n * - instanceof: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof\n * - toString: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString\n *\n * 检测可能不存在的变量:\n * - typeof value === \"undefined\"\n * - globalThis.value === undefined\n */\n\n/**\n * 判断目标值是否为原始值(primitive)。\n */\nexport const isPrimitive = (target: unknown): target is Primitive => {\n return isString(target) || isNumber(target) || isBoolean(target) || isBigInt(target) || isSymbol(target) || isNull(target) || isUndefined(target)\n}\n\n/**\n * 判断目标值是否为非原始值(non-primitive)。\n */\nexport const isNonPrimitive = (target: unknown): target is NonPrimitive => {\n return isPrimitive(target) === false\n}\n\n/**\n * 判断目标值是否为字符串。\n */\nexport const isString = (target: unknown): target is string => {\n return Object.prototype.toString.call(target) === \"[object String]\"\n}\n\n/**\n * 判断目标值是否为数字。\n */\nexport const isNumber = (target: unknown): target is number => {\n return Object.prototype.toString.call(target) === \"[object Number]\" && isNaN(Number.parseFloat(String(target)))\n}\n\n/**\n * 判断目标值是否为 `NaN`。\n */\nexport const isNaN = (target: unknown): boolean => {\n return Number.isNaN(target)\n}\n\n/**\n * 判断目标值是否为有限数字。\n */\nexport const isFiniteNumber = (target: unknown): target is number => {\n return isNumber(target) && Number.isFinite(target)\n}\n\n/**\n * 判断目标值是否为无限数字。\n */\nexport const isInfiniteNumber = (target: unknown): target is number => {\n return isNumber(target) && !Number.isFinite(target)\n}\n\n/**\n * 判断目标值是否为布尔值。\n */\nexport const isBoolean = (target: unknown): target is boolean => {\n return Object.prototype.toString.call(target) === \"[object Boolean]\"\n}\n\n/**\n * 判断目标值是否为 `true`。\n */\nexport const isTrue = (target: unknown): target is true => {\n return isBoolean(target) && target === true\n}\n\n/**\n * 判断目标值是否为 `false`。\n */\nexport const isFalse = (target: unknown): target is false => {\n return isBoolean(target) && target === false\n}\n\n/**\n * 判断目标值是否为大整数(BigInt)。\n */\nexport const isBigInt = (target: unknown): target is bigint => {\n return Object.prototype.toString.call(target) === \"[object BigInt]\"\n}\n\n/**\n * 判断目标值是否为符号(Symbol)。\n */\nexport const isSymbol = (target: unknown): target is symbol => {\n return Object.prototype.toString.call(target) === \"[object Symbol]\"\n}\n\n/**\n * 判断目标值是否为 `null`。\n */\nexport const isNull = (target: unknown): target is null => {\n return Object.prototype.toString.call((target)) === \"[object Null]\"\n}\n\n/**\n * 判断目标值是否为 `undefined`。\n */\nexport const isUndefined = (target: unknown): target is undefined => {\n return Object.prototype.toString.call(target) === \"[object Undefined]\"\n}\n/**\n * 判断目标值是否不是 `undefined`。\n *\n * @see {@link https://stackoverflow.com/a/52097700}\n */\nexport const isDefined = <T>(target: T | undefined): target is T => {\n return isUndefined(target) === false\n}\n\n/**\n * 判断目标值是否为 `null` 或 `undefined`。\n */\nexport const isNil = (target: unknown): target is (null | undefined) => {\n return target === null || target === undefined\n}\n\n/**\n * 使用 `instanceof` 判断目标值是否为对象。\n *\n * @see {@link isGeneralObject}, {@link isPlainObject}\n */\n// oxlint-disable-next-line no-wrapper-object-types\nexport const isObject = (target: unknown): target is Object => {\n return target instanceof Object\n}\n/**\n * 使用 `typeof` 判断目标值是否为广义对象。\n *\n * A general object is an object that is:\n * - not `null`, not a `function`, not a `primitive`.\n *\n * Any other object is a general object:\n * - `Array` instance, `Map` instance, `WeakMap` instance, `Set` instance, `Date` instance, etc.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = isGeneralObject([])\n * // Expect: true\n * const example2 = isGeneralObject(new Map())\n * // Expect: false\n * const example3 = isGeneralObject(null)\n * ```\n *\n * @see {@link isObject}, {@link isPlainObject}\n */\n// oxlint-disable-next-line no-wrapper-object-types\nexport const isGeneralObject = (target: unknown): target is Object => {\n return target !== null && typeof target === \"object\"\n}\n/**\n * Predicate whether the target is a plain object.\n *\n * A plain object is an object that is:\n * - not `null`, not a `function`, not a `primitive` type,\n * - not an `Array`, not a `RegExp`, not a `Date`, not a `Map`, not a `Set`, not a `WeakMap`,\n * - not `window`, not a DOM `element`, not an `Error`,\n * - not any other customize object type.\n *\n * @see {@link isObject}, {@link isGeneralObject}\n */\nexport const isPlainObject = (target: unknown): target is PlainObject => {\n // 非 null、非 Function、非 Primitive\n if (target === null || typeof target !== \"object\") {\n return false\n }\n // 非 Array、非 Regexp、非 Date、非 Map、非 Set、非 Window、非 DOM、非 Error……\n if (Object.prototype.toString.call(target) !== \"[object Object]\") {\n return false\n }\n // 非其它自定义类实例对象,allow only plain object literal or Object.create(null)\n // oxlint-disable-next-line no-unsafe-assignment\n const proto = Object.getPrototypeOf(target)\n return proto === Object.prototype || proto === null\n}\n\n/**\n * 判断目标值是否为空普通对象。\n */\nexport const isEmptyPlainObject = (target: unknown): target is PlainObject => {\n return isPlainObject(target) && Reflect.ownKeys(target).length === 0\n}\n\n/**\n * 判断目标值是否为数组。\n */\nexport function isArray<T>(target: T[]): target is T[]\nexport function isArray<T>(target: unknown): target is T[]\nexport function isArray<T>(target: unknown): target is T[] {\n return Array.isArray(target)\n}\n\n/**\n * 判断目标值是否为空数组。\n */\nexport const isEmptyArray = (target: unknown): target is [] => {\n return isArray(target) && target.length === 0\n}\n\n/**\n * 判断目标值是否为类数组对象(array-like)。\n */\nexport function isArrayLike<T>(target: ArrayLike<T>): target is ArrayLike<T>\nexport function isArrayLike<T>(target: unknown): target is ArrayLike<T>\nexport function isArrayLike<T>(target: unknown): target is ArrayLike<T> {\n return isGeneralObject(target) && (\"length\" in target) && isNumber(target.length)\n}\n\n/**\n * 判断目标值是否为 `Map`。\n */\nexport function isMap<K, V>(target: Map<K, V>): target is Map<K, V>\nexport function isMap<K, V>(target: unknown): target is Map<K, V>\nexport function isMap<K, V>(target: unknown): target is Map<K, V> {\n return Object.prototype.toString.call(target) === \"[object Map]\"\n}\n\n/**\n * 判断目标值是否为 `WeakMap`。\n */\nexport function isWeakMap<K extends object, V>(target: WeakMap<K, V>): target is WeakMap<K, V>\nexport function isWeakMap<K extends object, V>(target: unknown): target is WeakMap<K, V>\nexport function isWeakMap<K extends object, V>(target: unknown): target is WeakMap<K, V> {\n return Object.prototype.toString.call(target) === \"[object WeakMap]\"\n}\n\n/**\n * 判断目标值是否为 `Set`。\n */\nexport function isSet<T>(target: Set<T>): target is Set<T>\nexport function isSet<T>(target: unknown): target is Set<T>\nexport function isSet<T>(target: unknown): target is Set<T> {\n return Object.prototype.toString.call(target) === \"[object Set]\"\n}\n\n/**\n * 判断目标值是否为 `WeakSet`。\n */\nexport function isWeakSet<T extends object>(target: WeakSet<T>): target is WeakSet<T>\nexport function isWeakSet<T extends object>(target: unknown): target is WeakSet<T>\nexport function isWeakSet<T extends object>(target: unknown): target is WeakSet<T> {\n return Object.prototype.toString.call(target) === \"[object WeakSet]\"\n}\n\n/**\n * 判断目标值是否为 `Date`。\n */\nexport const isDate = (target: unknown): target is Date => {\n return Object.prototype.toString.call(target) === \"[object Date]\"\n}\n\n/**\n * 判断目标值是否为 `RegExp`。\n */\nexport const isRegExp = (target: unknown): target is RegExp => {\n return Object.prototype.toString.call(target) === \"[object RegExp]\"\n}\n\n/**\n * 判断目标值是否为 `Error`。\n */\nexport const isError = (target: unknown): target is Error => {\n return Object.prototype.toString.call(target) === \"[object Error]\"\n}\n\n/**\n * 判断目标值是否为 `Promise`。\n */\nexport function isPromise<T>(target: Promise<T>): target is Promise<T>\nexport function isPromise<T>(target: unknown): target is Promise<T>\nexport function isPromise<T>(target: unknown): target is Promise<T> {\n return Object.prototype.toString.call(target) === \"[object Promise]\"\n}\n\n/**\n * 判断目标值是否为任意函数。\n*/\n// oxlint-disable-next-line no-unsafe-function-type\nexport const isFunction = (target: unknown): target is Function => {\n return typeof target === \"function\"\n}\n\n/**\n * 判断目标值是否为任意同步或异步函数类型。\n */\nexport const isAnyFunction = (target: unknown): target is AnyFunction => {\n return isFunction(target)\n}\n\n/**\n * 判断目标值是否为同步函数。\n */\nexport const isSyncFunction = (target: unknown): target is AnySyncFunction => {\n return Object.prototype.toString.call(target) === \"[object Function]\"\n}\n\n/**\n * 判断目标值是否为异步函数。\n */\nexport const isAsyncFunction = (target: unknown): target is AnyAsyncFunction => {\n return Object.prototype.toString.call(target) === \"[object AsyncFunction]\"\n}\n\n/**\n * 判断目标值是否为生成器函数。\n */\nexport const isGeneratorFunction = (target: unknown): target is AnyGeneratorFunction => {\n return Object.prototype.toString.call((target)) === \"[object GeneratorFunction]\"\n}\n\n/**\n * 判断目标值是否为异步生成器函数。\n */\nexport const isAsyncGeneratorFunction = (target: unknown): target is AnyAsyncGeneratorFunction => {\n return Object.prototype.toString.call(target) === \"[object AsyncGeneratorFunction]\"\n}\n\n/**\n * 判断目标值是否实现可迭代协议(iterable protocol)。\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#the_iterable_protocol}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator}\n */\nexport function isIterable<T>(target: Iterable<T>): target is Iterable<T>\nexport function isIterable<T>(target: unknown): target is Iterable<T>\nexport function isIterable<T>(target: unknown): target is Iterable<T> {\n // oxlint-disable-next-line no-unsafe-type-assertion no-unsafe-member-access\n return isGeneralObject(target) && typeof (target as any)[Symbol.iterator] === \"function\"\n}\n/**\n * 判断目标值是否实现异步可迭代协议。\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator}\n */\nexport function isAsyncIterable<T>(target: AsyncIterable<T>): target is AsyncIterable<T>\nexport function isAsyncIterable<T>(target: unknown): target is AsyncIterable<T>\nexport function isAsyncIterable<T>(target: unknown): target is AsyncIterable<T> {\n // oxlint-disable-next-line no-unsafe-type-assertion no-unsafe-member-access\n return isGeneralObject(target) && typeof (target as any)[Symbol.asyncIterator] === \"function\"\n}\n/**\n * 判断目标值是否实现迭代器协议(iterator protocol)。\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#the_iterator_protocol}\n */\nexport function isIterator<T, TReturn = unknown, TNext = undefined>(target: Iterator<T, TReturn, TNext>): target is Iterator<T, TReturn, TNext>\nexport function isIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is Iterator<T, TReturn, TNext>\nexport function isIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is Iterator<T, TReturn, TNext> {\n // oxlint-disable-next-line no-unsafe-type-assertion no-unsafe-member-access\n return isGeneralObject(target) && typeof (target as any).next === \"function\"\n}\n\n/**\n * 判断目标值是否实现异步迭代器协议。\n */\nexport function isAsyncIterator<T, TReturn = unknown, TNext = undefined>(target: AsyncIterator<T, TReturn, TNext>): target is AsyncIterator<T, TReturn, TNext>\nexport function isAsyncIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is AsyncIterator<T, TReturn, TNext>\nexport function isAsyncIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is AsyncIterator<T, TReturn, TNext> {\n // oxlint-disable-next-line no-unsafe-type-assertion no-unsafe-member-access\n return isGeneralObject(target) && typeof (target as any).next === \"function\"\n}\n\n/**\n * 判断目标值是否同时满足可迭代对象与迭代器的条件。\n */\nexport function isIterableIterator<T, TReturn = unknown, TNext = undefined>(target: IterableIterator<T>): target is IterableIterator<T, TReturn, TNext>\nexport function isIterableIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is IterableIterator<T, TReturn, TNext>\nexport function isIterableIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is IterableIterator<T> {\n return isIterator<T, TReturn, TNext>(target) && isIterable<T>(target)\n}\n\n/**\n * 判断目标值是否同时满足异步可迭代对象与异步迭代器的条件。\n */\nexport function isAsyncIterableIterator<T, TReturn = unknown, TNext = undefined>(target: AsyncIterableIterator<T>): target is AsyncIterableIterator<T, TReturn, TNext>\nexport function isAsyncIterableIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is AsyncIterableIterator<T, TReturn, TNext>\nexport function isAsyncIterableIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is AsyncIterableIterator<T> {\n return isAsyncIterator<T, TReturn, TNext>(target) && isAsyncIterable<T>(target)\n}\n",
|
|
101
|
-
"import type {\n AnyFunctionOfReturn, BooleanNot, CastBoolean\n} from \"#Source/type/index.ts\"\n\n/**\n * Convert any value to a boolean.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = booleanFrom(1)\n * // Expect: false\n * const example2 = booleanFrom(0)\n * ```\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Glossary/Truthy}\n * @see {@link https://developer.mozilla.org/en-US/docs/Glossary/Falsy}\n */\nexport const booleanFrom = (value: unknown): boolean => Boolean(value)\n\n/**\n * Invert a boolean value.\n *\n * @example\n * ```\n * // Expect: false\n * const example1 = booleanNot(true)\n * // Expect: true\n * const example2 = booleanNot(false)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Logic_gate}\n */\nexport function booleanNot(b: true): false\nexport function booleanNot(b: false): true\n// catch all overload, used in `pipe` or `compose` or likewise situations.\nexport function booleanNot(b: boolean): boolean\nexport function booleanNot(b: unknown): boolean\nexport function booleanNot(b: unknown): boolean { return !booleanFrom(b) }\n\n/**\n * Perform logical AND.\n *\n * @example\n * ```\n * // Expect: false\n * const example1 = booleanAnd(true, false)\n * // Expect: true\n * const example2 = booleanAnd(true, true)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Logic_gate}\n */\nexport const booleanAnd = (x: unknown, y: unknown): boolean => booleanFrom(x) && booleanFrom(y)\n\n/**\n * Perform logical OR.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = booleanOr(true, false)\n * // Expect: false\n * const example2 = booleanOr(false, false)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Logic_gate}\n */\nexport const booleanOr = (x: unknown, y: unknown): boolean => booleanFrom(x) || booleanFrom(y)\n\n/**\n * Perform logical NAND.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = booleanNand(true, false)\n * // Expect: false\n * const example2 = booleanNand(true, true)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Logic_gate}\n */\nexport const booleanNand = (x: unknown, y: unknown): boolean => !booleanAnd(x, y)\n\n/**\n * Perform logical NOR.\n *\n * @example\n * ```\n * // Expect: false\n * const example1 = booleanNor(true, false)\n * // Expect: true\n * const example2 = booleanNor(false, false)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Logic_gate}\n */\nexport const booleanNor = (x: unknown, y: unknown): boolean => !booleanOr(x, y)\n\n/**\n * Perform logical XOR.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = booleanXor(true, false)\n * // Expect: false\n * const example2 = booleanXor(true, true)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Logic_gate}\n */\nexport const booleanXor = (x: unknown, y: unknown): boolean => booleanFrom(x) !== booleanFrom(y)\n\n/**\n * Perform logical XNOR.\n *\n * @example\n * ```\n * // Expect: false\n * const example1 = booleanXnor(true, false)\n * // Expect: true\n * const example2 = booleanXnor(true, true)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Logic_gate}\n */\nexport const booleanXnor = (x: unknown, y: unknown): boolean => !booleanXor(x, y)\n\nexport type BooleanInvertFunctionReturn<FN extends AnyFunctionOfReturn<boolean>> =\n // oxlint-disable-next-line no-explicit-any\n FN extends (...args: any[]) => infer R ? (...args: Parameters<FN>) => BooleanNot<CastBoolean<R>> : never\n/**\n * Create a complement function that inverts a boolean-returning function.\n *\n * @example\n * ```\n * const isEven = (value: number) => value % 2 === 0\n * const isOdd = booleanComplement(isEven)\n * // Expect: true\n * const example1 = isOdd(3)\n * // Expect: false\n * const example2 = isOdd(4)\n * ```\n */\nexport const booleanComplement = <FN extends AnyFunctionOfReturn<boolean>>(fn: FN): BooleanInvertFunctionReturn<FN> =>\n // oxlint-disable-next-line no-explicit-any no-unsafe-type-assertion no-unsafe-argument\n ((...args: any[]) => booleanNot(fn(...args))) as any as BooleanInvertFunctionReturn<FN>\n\n/**\n * Check whether the value is truthy.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = booleanIsTruthy(\"ok\")\n * // Expect: false\n * const example2 = booleanIsTruthy(\"\")\n * ```\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Glossary/Truthy}\n * @see {@link booleanIsFalsy}\n */\nexport const booleanIsTruthy = (v: unknown): boolean => booleanFrom(v)\n/**\n * Check whether the value is falsy.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = booleanIsFalsy(0)\n * // Expect: false\n * const example2 = booleanIsFalsy(\"0\")\n * ```\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Glossary/Falsy}\n * @see {@link booleanIsTruthy}\n */\nexport const booleanIsFalsy = (v: unknown): boolean => !booleanIsTruthy(v)\n",
|
|
102
|
-
"\nimport { isAnyFunction, isFunction } from \"./is.ts\"\n\nimport { booleanFrom } from \"./boolean.ts\"\n\n/**\n * Return the input value as is, ignoring any additional arguments.\n *\n * @example\n * ```\n * // Expect: 5\n * const example1 = asIs(5)\n * // Expect: \"hello\"\n * const example2 = asIs(\"hello\", 1, 2, 3)\n * ```\n */\nexport const asIs = <T = unknown>(target: T, ..._args: unknown[]): T => target\n/**\n * Return undefined, ignoring any input arguments.\n *\n * @example\n * ```\n * // Expect: undefined\n * const example1 = asUndefined()\n * // Expect: undefined\n * const example2 = asUndefined(1, \"hello\", null)\n * ```\n */\nexport const asUndefined = (..._target: unknown[]): undefined => undefined\n/**\n * Return null, ignoring any input arguments.\n *\n * @example\n * ```\n * // Expect: null\n * const example1 = asNull()\n * // Expect: null\n * const example2 = asNull(1, \"hello\", undefined)\n * ```\n */\nexport const asNull = (..._target: unknown[]): null => null\n/**\n * Return void, ignoring any input arguments.\n *\n * @example\n * ```\n * // Expect: void\n * const example1 = asVoid()\n * // Expect: void\n * const example2 = asVoid(1, \"hello\", null)\n * ```\n */\nexport const asVoid = (..._target: unknown[]): void => { /* do nothing */ }\n\n/**\n * Check whether two values are strictly equal using `===`.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = isStrictEqual(1, 1)\n * // Expect: false\n * const example2 = isStrictEqual(1, \"1\")\n * ```\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness}\n */\nexport const isStrictEqual = (v1: unknown, v2: unknown): boolean => v1 === v2\n\n/**\n * Check whether two values are loosely equal using `==`.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = isLooseEqual(1, \"1\")\n * // Expect: false\n * const example2 = isLooseEqual(0, \"1\")\n * ```\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness}\n */\n// eslint-disable-next-line eqeqeq\nexport const isLooseEqual = (v1: unknown, v2: unknown): boolean => v1 == v2\n\n/**\n * Check whether two values are equal using `Object.is`.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = isObjectEqual(NaN, NaN)\n * // Expect: false\n * const example2 = isObjectEqual(0, -0)\n * ```\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is}\n */\nexport const isObjectEqual = (v1: unknown, v2: unknown): boolean => Object.is(v1, v2)\n\n/**\n * Invoke the conditional function with the target value, according to the predicate result.\n *\n * @example\n * ```\n * const example1 = ifElse(true, () => \"yes\", () => \"no\")\n * // Expect: \"yes\"\n * const example2 = ifElse(false, () => \"yes\", () => \"no\")\n * // Expect: \"no\"\n * ```\n */\nexport const ifElse = <X = unknown, TR = unknown, ER = unknown>(\n pred: unknown,\n thenFn: (x?: X) => TR,\n elseFn: (x?: X) => ER,\n x?: X,\n): TR | ER => {\n return booleanFrom(isAnyFunction(pred) ? pred(x) : pred) ? thenFn(x) : elseFn(x)\n}\n\n/**\n * Invoke a function when the predicate result is truthy.\n *\n * @example\n * ```\n * // Expect: 4\n * const example1 = when(true, (value?: number) => (value ?? 0) + 1, 3)\n * // Expect: 3\n * const example2 = when(false, (value?: number) => (value ?? 0) + 1, 3)\n * ```\n */\nexport function when<X = unknown, WR = unknown>(pred: unknown, whenFn: (x?: X) => WR): WR\nexport function when<X = unknown, WR = unknown>(pred: unknown, whenFn: (x?: X) => WR, x: X): WR | X\nexport function when<X = unknown, WR = unknown>(pred: unknown, whenFn: (x?: X) => WR, x?: X): WR | X | undefined {\n return booleanFrom(isAnyFunction(pred) ? pred(x) : pred) ? whenFn(x) : x\n}\n\n/**\n * Invoke a function when the predicate result is falsy.\n *\n * @example\n * ```\n * // Expect: 2\n * const example1 = unless(false, (value?: number) => (value ?? 0) + 1, 1)\n * // Expect: 1\n * const example2 = unless(true, (value?: number) => (value ?? 0) + 1, 1)\n * ```\n */\nexport function unless<X = unknown, UR = unknown>(pred: unknown, unlessFn: (x?: X) => UR): UR\nexport function unless<X = unknown, UR = unknown>(pred: unknown, unlessFn: (x?: X) => UR, x: X): UR\nexport function unless<X = unknown, UR = unknown>(\n pred: unknown,\n unlessFn: (x?: X) => UR,\n x?: X,\n): UR | X | undefined {\n return !booleanFrom(isAnyFunction(pred) ? pred(x) : pred) ? unlessFn(x) : x\n}\n\n/**\n * Evaluate an immediate if expression.\n *\n * @example\n * ```\n * // Expect: \"yes\"\n * const example1 = iif(true, \"yes\", \"no\")\n * // Expect: \"no\"\n * const example2 = iif(false, \"yes\", \"no\")\n * ```\n *\n * @see {@link booleanFrom}\n */\nexport const iif = <X = unknown, Y = unknown>(cond: unknown, trueValue: X, falseValue: Y): X | Y => {\n return booleanFrom(isAnyFunction(cond) ? cond(trueValue) : cond) ? trueValue : falseValue\n}\n\nexport type GuardCondition<V> = [judgement: boolean, value: V]\n/**\n * Pick the first matching value from guard conditions.\n *\n * @example\n * ```\n * // Expect: \"b\"\n * const example1 = guards([\n * [false, \"a\"],\n * [true, \"b\"],\n * ], \"z\")\n * // Expect: \"z\"\n * const example2 = guards([[false, \"a\"]], \"z\")\n * ```\n *\n * @see {@link https://hackage.haskell.org/package/Boolean-0.2.4/candidate/docs/Data-Boolean.html}\n * @see {@link https://hackage.haskell.org/package/Boolean-0.2.4/candidate/docs/src/Data-Boolean.html#guardedB}\n */\nexport const guards = <V = unknown>(conditions: Array<GuardCondition<V>>, defaultValue: V): V => {\n for (const [judgement, value] of conditions) {\n if (judgement) { return value }\n }\n return defaultValue\n}\n\nexport type CaseCondition<P, V> = [predicate: (predicated?: P) => boolean, value: V]\n/**\n * Pick the first matching value from predicate cases.\n *\n * @example\n * ```\n * // Expect: \"mid\"\n * const example1 = cases(3, [\n * [(value?: number) => (value ?? 0) > 5, \"big\"],\n * [(value?: number) => (value ?? 0) > 1, \"mid\"],\n * ], \"small\")\n * // Expect: \"small\"\n * const example2 = cases(0, [[(value?: number) => (value ?? 0) > 1, \"mid\"]], \"small\")\n * ```\n *\n * @see {@link https://hackage.haskell.org/package/Boolean-0.2.4/candidate/docs/src/Data-Boolean.html#caseB}\n */\nexport const cases = <P = unknown, V = unknown>(\n predicated: P,\n conditions: Array<CaseCondition<P, V>>,\n defaultValue: V,\n): V => {\n for (const [predicate, value] of conditions) {\n if (predicate(predicated)) {\n return value\n }\n }\n return defaultValue\n}\n\nexport interface TryCatch {\n <Target>(tryer: () => Target, catcher: (exception: unknown) => Target): Target\n <Target>(tryer: () => Target, catchallValue: Target): Target\n /**\n * 未提供 `catcher` 或 `catchallValue` 的情况下,若 `tryer` 抛出异常,则返回 `undefined`\n */\n <Target>(tryer: () => Target): Target | undefined\n (tryer: () => void): void\n}\n/**\n * Execute a function and catch any exception, returning either a catch value or undefined.\n *\n * @example\n * ```\n * // Expect: \"ok\"\n * const example1 = tryCatch(() => \"ok\", () => \"error\")\n * // Expect: \"error\"\n * const example2 = tryCatch(() => { throw new Error(\"fail\") }, () => \"error\")\n * // Expect: 0\n * const example3 = tryCatch(() => { throw new Error(\"fail\") }, 0)\n * // Expect: undefined\n * const example4 = tryCatch(() => { throw new Error(\"fail\") })\n */\nexport const tryCatch: TryCatch = <Target>(\n tryer: () => Target,\n catcherOrCatchallValue?: Target | ((exception: unknown) => Target),\n): Target | undefined => {\n try {\n return tryer()\n }\n catch (exception) {\n // NOTE: intended redundant type guard\n if (catcherOrCatchallValue !== undefined) {\n if (isFunction(catcherOrCatchallValue)) {\n return catcherOrCatchallValue(exception)\n }\n else {\n return catcherOrCatchallValue\n }\n }\n else {\n return undefined\n }\n }\n}\n",
|
|
103
|
-
"/**\n * Convert a camelCase string into kebab-case.\n *\n * @example\n * ```\n * // Expect: \"hello-world\"\n * const example1 = stringCamelCaseToKebabCase(\"helloWorld\")\n * // Expect: \"ab2-cd\"\n * const example2 = stringCamelCaseToKebabCase(\"ab2Cd\")\n * ```\n */\nexport const stringCamelCaseToKebabCase = (camelCase: string): string => {\n return camelCase.replaceAll(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase()\n}\n\n/**\n * Convert a kebab-case string into camelCase.\n *\n * @example\n * ```\n * // Expect: \"helloWorld\"\n * const example1 = stringKebabCaseToCamelCase(\"hello-world\")\n * // Expect: \"ab2Cd\"\n * const example2 = stringKebabCaseToCamelCase(\"ab2-cd\")\n * ```\n */\nexport const stringKebabCaseToCamelCase = (kebabCase: string): string => {\n return kebabCase.replaceAll(/-./g, x => x[1]!.toUpperCase())\n}\n\n/**\n * Get a greeting based on the current local hour.\n *\n * @example\n * ```\n * // Expect: \"你好\" | \"早上好\" | \"晚上好\" | ...\n * const example1 = stringHelloWord()\n * ```\n */\nexport const stringHelloWord = (): string => {\n const currentHour = new Date().getHours()\n if (currentHour < 5) {\n return \"凌晨好\"\n }\n if (currentHour < 8) {\n return \"早上好\"\n }\n if (currentHour < 12) {\n return \"上午好\"\n }\n if (currentHour < 14) {\n return \"中午好\"\n }\n if (currentHour < 17) {\n return \"下午好\"\n }\n if (currentHour < 19) {\n return \"傍晚好\"\n }\n if (currentHour < 24) {\n return \"晚上好\"\n }\n return \"你好\"\n}\n\n/**\n * Calculate the total unit length of a string.\n *\n * @example\n * ```\n * // Expect: 1.5\n * const example1 = stringCalculateUnits(\"a中\")\n * // Expect: 2\n * const example2 = stringCalculateUnits(\"中文\")\n * ```\n */\nexport const stringCalculateUnits = (text: string): number => {\n let units = 0\n\n for (const char of text) {\n if (/[\\u0000-\\u007F]/.test(char)) {\n // Half-width character (e.g., ASCII)\n units = units + 0.5\n }\n else {\n // Full-width character (e.g., CJK)\n units = units + 1\n }\n }\n\n return units\n}\n\n/**\n * Truncate a string by the unit limit and keep whole characters.\n *\n * @example\n * ```\n * // Expect: \"a中\"\n * const example1 = stringTruncateByUnits(\"a中文\", 1.5)\n * // Expect: \"abc\"\n * const example2 = stringTruncateByUnits(\"abc\", 2)\n * ```\n */\nexport const stringTruncateByUnits = (text: string, maxUnits: number): string => {\n let truncated = \"\"\n let units = 0\n\n for (const char of text) {\n const charUnits = /[\\u0000-\\u007F]/.test(char) ? 0.5 : 1\n if (units + charUnits > maxUnits) { break }\n\n truncated = truncated + char\n units = units + charUnits\n }\n\n return truncated\n}\n\n/**\n * Slice a string by unit indices.\n *\n * @example\n * ```\n * // Expect: \"a中\"\n * const example1 = stringSliceByUnits(\"a中文\", 0, 1.5)\n * // Expect: \"文\"\n * const example2 = stringSliceByUnits(\"中文ab\", 1, 2)\n * ```\n */\nexport const stringSliceByUnits = (text: string, start: number, end: number): string => {\n let units = 0\n let result = \"\"\n for (const char of text) {\n const charUnits = /[\\u0000-\\u007F]/.test(char) ? 0.5 : 1\n if (units >= end) { break }\n\n if (units >= start) {\n result = result + char\n }\n units = units + charUnits\n }\n\n return result\n}\n\nexport interface StringSplitOptions {\n input: string\n chunkSize?: number | undefined\n chunkOverlap?: number | undefined\n}\n\n/**\n * Split a long string into fixed-size chunks with optional overlap.\n *\n * @example\n * ```\n * // Expect: [\"hello\", \"lo wo\", \"world\"]\n * const example1 = stringSplit({ input: \"hello world\", chunkSize: 5, chunkOverlap: 2 })\n * ```\n */\nexport const stringSplit = (options: StringSplitOptions): string[] => {\n const { input, chunkSize = 1_500, chunkOverlap: overlap = 20 } = options\n const safeChunkSize = Math.max(1, Math.trunc(chunkSize))\n const safeOverlap = Math.max(0, Math.min(Math.trunc(overlap), safeChunkSize - 1))\n\n // 去除换行符和其他特殊符号\n const sanitizedInput = input.replaceAll(/[\\t\\n\\r]/g, \" \")\n\n // 分割结果数组\n const result: string[] = []\n\n // 当前处理位置\n let currentPosition = 0\n\n // 循环处理整个输入字符串\n while (currentPosition < sanitizedInput.length) {\n // 计算当前片段的结束位置\n const endPosition = Math.min(currentPosition + safeChunkSize, sanitizedInput.length)\n\n // 获取当前片段\n const segment = sanitizedInput.slice(currentPosition, endPosition)\n\n // 将当前片段添加到结果数组中\n result.push(segment)\n\n // 如果已经到达文本末尾,退出循环\n if (endPosition >= sanitizedInput.length) {\n break\n }\n\n // 更新处理位置,有重叠部分\n currentPosition = endPosition - safeOverlap\n }\n\n return result\n}\n\n/**\n * Split a string into chunks while trying to keep natural line breaks.\n *\n * @example\n * ```\n * // Expect: [\"a\\\\n\", \"b\\\\n\", \"c\"]\n * const example1 = stringSmartSplit(\"a\\nb\\nc\", 2)\n * ```\n */\nexport const stringSmartSplit = (text: string, maxLength: number): string[] => {\n let _text = text\n if (_text.length <= maxLength) {\n return [_text]\n }\n\n const conservativeMaxLength = maxLength * 0.9\n\n const threshold = maxLength * 0.2\n const texts: string[] = []\n while (_text.length > conservativeMaxLength) {\n texts.push(_text.slice(0, conservativeMaxLength))\n _text = _text.slice(conservativeMaxLength)\n }\n if (_text.length > threshold) {\n texts.push(_text)\n }\n else {\n texts[texts.length - 1] = texts.at(-1)! + _text\n }\n\n if (texts.length === 1) {\n return texts\n }\n\n for (let i = 1; i < texts.length; i = i + 1) {\n const previousText = texts[i - 1]!\n const currentText = texts[i]!\n const lastIndexOfNewLineOfPreviousText = previousText.lastIndexOf(\"\\n\")\n const firstIndexOfNewLineOfCurrentText = currentText.indexOf(\"\\n\")\n const endOfPreviousText = previousText.slice(lastIndexOfNewLineOfPreviousText + 1)\n const startOfCurrentText = currentText.slice(0, firstIndexOfNewLineOfCurrentText)\n if (endOfPreviousText.length >= startOfCurrentText.length) {\n const newPreviousText = previousText + startOfCurrentText\n const newCurrentText = currentText.slice(firstIndexOfNewLineOfCurrentText + 1)\n texts[i - 1] = newPreviousText\n texts[i] = newCurrentText\n }\n else {\n const newPreviousText = previousText.slice(0, lastIndexOfNewLineOfPreviousText)\n const newCurrentText = endOfPreviousText + currentText\n texts[i - 1] = newPreviousText\n texts[i] = newCurrentText\n }\n }\n\n const trimmedTexts = texts.map(text => text.trim())\n\n return trimmedTexts\n}\n\n/**\n * Truncate a string to a maximum length with an ellipsis.\n *\n * @example\n * ```\n * // Expect: \"hello...\"\n * const example1 = stringTruncate(\"hello world\", 5)\n * // Expect: \"hi\"\n * const example2 = stringTruncate(\"hi\", 5)\n * ```\n */\nexport const stringTruncate = (str: string, n: number): string => {\n if (str.length <= n) {\n return str\n }\n else {\n return `${str.slice(0, n)}...`\n }\n}\n",
|
|
104
|
-
"/**\n * Normalize a value to a 0-1 range based on min and max.\n *\n * @example\n * ```\n * // Expect: 0.5\n * const example1 = normalize(5, 0, 10)\n * // Expect: 0\n * const example2 = normalize(2, 2, 6)\n * ```\n */\nexport const normalize = (value: number, min: number, max: number): number => {\n if (min === max) {\n throw new Error(\"Min and max value are the same.\")\n }\n if (value < min || value > max) {\n throw new Error(`Value ${value} is not in the range of ${min} to ${max}.`)\n }\n return (value - min) / (max - min)\n}\n\n/**\n * Check if a number is even.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = isEven(10)\n * // Expect: false\n * const example2 = isEven(7)\n * ```\n */\nexport const isEven = (x: number): boolean => x % 2 === 0\n\n/**\n * Check if a number is odd.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = isOdd(7)\n * // Expect: false\n * const example2 = isOdd(10)\n * ```\n */\nexport const isOdd = (x: number): boolean => x % 2 !== 0\n\n/**\n * Clamp a number to a maximum value.\n *\n * @example\n * ```\n * // Expect: 5\n * const example1 = maxTo(5, 10)\n * // Expect: 3\n * const example2 = maxTo(5, 3)\n * ```\n */\nexport const maxTo = (max: number, x: number): number => x > max ? max : x\n\n/**\n * Clamp a number to a minimum value.\n *\n * @example\n * ```\n * // Expect: 5\n * const example1 = minTo(5, 3)\n * // Expect: 8\n * const example2 = minTo(5, 8)\n * ```\n */\nexport const minTo = (min: number, x: number): number => x < min ? min : x\n\n/**\n * Get the smaller of two numbers.\n *\n * @example\n * ```\n * // Expect: 2\n * const example1 = minOf(2, 9)\n * // Expect: -1\n * const example2 = minOf(5, -1)\n * ```\n */\nexport const minOf = (x: number, y: number): number => x < y ? x : y\n\n/**\n * Get the larger of two numbers.\n *\n * @example\n * ```\n * // Expect: 9\n * const example1 = maxOf(2, 9)\n * // Expect: 5\n * const example2 = maxOf(5, -1)\n * ```\n */\nexport const maxOf = (x: number, y: number): number => x > y ? x : y\n\n/**\n * Clamp a number between two bounds.\n *\n * @example\n * ```\n * // Expect: 5\n * const example1 = between(0, 10, 5)\n * // Expect: 0\n * const example2 = between(0, 10, -3)\n * ```\n */\nexport const between = (a: number, b: number, x: number): number => {\n const min = minOf(a, b)\n const max = maxOf(a, b)\n return x < min ? min : (x > max ? max : x)\n}\n\n/**\n * Get a random integer between min and max, inclusive.\n *\n * @example\n * ```\n * // Expect: 4\n * const example1 = randomBetween(4, 4)\n * // Expect: 10\n * const example2 = randomBetween(10, 10)\n * ```\n */\nexport const randomBetween = (min: number, max: number): number => {\n return Math.floor(Math.random() * (max - min + 1) + min)\n}\n\n/**\n * Get a random integer between two values, regardless of order, inclusive.\n *\n * @example\n * ```\n * // Expect: 4\n * const example1 = randomIntBetween(4, 4)\n * // Expect: 10\n * const example2 = randomIntBetween(10, 10)\n * ```\n */\nexport const randomIntBetween = (a: number, b: number): number => {\n const min = minOf(a, b)\n const max = maxOf(a, b)\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\nexport interface NumberConstraints {\n min?: number | undefined\n max?: number | undefined\n step?: number | undefined\n}\n\n/**\n * Constrain a number by step size and min/max bounds.\n *\n * @example\n * ```\n * // Expect: 10\n * const example1 = constrainNumber(12, { step: 5, max: 10 })\n * // Expect: 3\n * const example2 = constrainNumber(2.6, { step: 0.5, min: 3 })\n * ```\n */\nexport const constrainNumber = (value: number, constraints: NumberConstraints): number => {\n let constrainedValue = value\n if (constraints.step !== undefined) {\n constrainedValue = Math.round(constrainedValue / constraints.step) * constraints.step\n }\n if (constraints.min !== undefined) {\n constrainedValue = Math.max(constraints.min, constrainedValue)\n }\n if (constraints.max !== undefined) {\n constrainedValue = Math.min(constraints.max, constrainedValue)\n }\n return constrainedValue\n}\n",
|
|
105
|
-
"import { isBigInt } from \"./is.ts\"\n\n/**\n * Check whether a value is zero as a bigint.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = bigintIsZero(0n)\n * // Expect: false\n * const example2 = bigintIsZero(2n)\n * ```\n */\nexport const bigintIsZero = (value: unknown): value is 0n => {\n return isBigInt(value) && value === 0n\n}\n\n/**\n * Check whether a value is a positive bigint.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = bigintIsPositive(3n)\n * // Expect: false\n * const example2 = bigintIsPositive(-1n)\n * ```\n */\nexport const bigintIsPositive = (value: unknown): value is bigint => {\n return isBigInt(value) && value > 0n\n}\n\n/**\n * Check whether a value is a negative bigint.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = bigintIsNegative(-3n)\n * // Expect: false\n * const example2 = bigintIsNegative(1n)\n * ```\n */\nexport const bigintIsNegative = (value: unknown): value is bigint => {\n return isBigInt(value) && value < 0n\n}\n\n/**\n * Get the absolute value of a bigint.\n *\n * @example\n * ```\n * // Expect: 5n\n * const example1 = bigintAbs(-5n)\n * // Expect: 2n\n * const example2 = bigintAbs(2n)\n * ```\n */\nexport const bigintAbs = (value: bigint): bigint => {\n return value < 0n ? -value : value\n}\n\n/**\n * Get the smaller of two bigint values.\n *\n * @example\n * ```\n * // Expect: 2n\n * const example1 = bigintMinOf(2n, 9n)\n * // Expect: -1n\n * const example2 = bigintMinOf(5n, -1n)\n * ```\n */\nexport const bigintMinOf = (a: bigint, b: bigint): bigint => {\n return a < b ? a : b\n}\n\n/**\n * Get the larger of two bigint values.\n *\n * @example\n * ```\n * // Expect: 9n\n * const example1 = bigintMaxOf(2n, 9n)\n * // Expect: 5n\n * const example2 = bigintMaxOf(5n, -1n)\n * ```\n */\nexport const bigintMaxOf = (a: bigint, b: bigint): bigint => {\n return a > b ? a : b\n}\n\n/**\n * Clamp a bigint between two bounds.\n *\n * @example\n * ```\n * // Expect: 5n\n * const example1 = bigintClamp(0n, 10n, 5n)\n * // Expect: 0n\n * const example2 = bigintClamp(0n, 10n, -3n)\n * ```\n */\nexport const bigintClamp = (min: bigint, max: bigint, value: bigint): bigint => {\n const minValue = bigintMinOf(min, max)\n const maxValue = bigintMaxOf(min, max)\n if (value < minValue) {\n return minValue\n }\n if (value > maxValue) {\n return maxValue\n }\n return value\n}\n",
|
|
106
|
-
"import { isSymbol } from \"./is.ts\"\n\n/**\n * Create a new unique symbol with an optional description.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = typeof symbolCreateLocal(\"demo\") === \"symbol\"\n * // Expect: false\n * const example2 = symbolCreateLocal(\"demo\") === symbolCreateLocal(\"demo\")\n * ```\n */\nexport const symbolCreateLocal = (description?: string): symbol => {\n return Symbol(description)\n}\n\n/**\n * Get or create a global symbol for the given key.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = symbolCreateGlobal(\"demo\") === Symbol.for(\"demo\")\n * // Expect: true\n * const example2 = symbolCreateGlobal(\"demo\") === symbolCreateGlobal(\"demo\")\n * ```\n */\nexport const symbolCreateGlobal = (key: string): symbol => Symbol.for(key)\n\n/**\n * Get the key for a global symbol, or undefined if not global.\n *\n * @example\n * ```\n * // Expect: \"demo\"\n * const example1 = symbolGetKey(Symbol.for(\"demo\"))\n * // Expect: undefined\n * const example2 = symbolGetKey(Symbol(\"demo\"))\n * ```\n */\nexport const symbolGetKey = (value: unknown): string | undefined => {\n return isSymbol(value) ? Symbol.keyFor(value) : undefined\n}\n\n/**\n * Check whether a symbol is from the global registry.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = symbolIsGlobal(Symbol.for(\"demo\"))\n * // Expect: false\n * const example2 = symbolIsGlobal(Symbol(\"demo\"))\n * ```\n */\nexport const symbolIsGlobal = (value: unknown): value is symbol => {\n return isSymbol(value) && Symbol.keyFor(value) !== undefined\n}\n\n/**\n * Check whether a symbol is not from the global registry.\n *\n * @example\n * ```\n * // Expect: false\n * const example1 = symbolIsLocal(Symbol.for(\"demo\"))\n * // Expect: true\n * const example2 = symbolIsLocal(Symbol(\"demo\"))\n * ```\n */\nexport const symbolIsLocal = (value: unknown): value is symbol => {\n return isSymbol(value) && Symbol.keyFor(value) === undefined\n}\n\n/**\n * Check whether a symbol has a description.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = symbolHasDescription(Symbol(\"demo\"))\n * // Expect: false\n * const example2 = symbolHasDescription(Symbol())\n * ```\n */\nexport const symbolHasDescription = (value: unknown): value is symbol => {\n return isSymbol(value) && value.description !== undefined\n}\n\n/**\n * Get the description of a symbol, or undefined for non-symbols.\n *\n * @example\n * ```\n * // Expect: \"demo\"\n * const example1 = symbolGetDescription(Symbol(\"demo\"))\n * // Expect: undefined\n * const example2 = symbolGetDescription(Symbol())\n * ```\n */\nexport const symbolGetDescription = (value: unknown): string | undefined => {\n return isSymbol(value) ? value.description : undefined\n}\n\n/**\n * Check whether a symbol is anonymous (no description).\n *\n * @example\n * ```\n * // Expect: false\n * const example1 = symbolIsAnonymous(Symbol(\"demo\"))\n * // Expect: true\n * const example2 = symbolIsAnonymous(Symbol())\n * ```\n */\nexport const symbolIsAnonymous = (value: unknown): value is symbol => {\n return isSymbol(value) && value.description === undefined\n}\n\nconst internalWellKnownSymbols = new Set<symbol>([\n Symbol.asyncIterator,\n Symbol.hasInstance,\n Symbol.isConcatSpreadable,\n Symbol.iterator,\n Symbol.match,\n Symbol.matchAll,\n Symbol.replace,\n Symbol.search,\n Symbol.species,\n Symbol.split,\n Symbol.toPrimitive,\n Symbol.toStringTag,\n Symbol.unscopables,\n])\n/**\n * Check whether a symbol is one of the well-known symbols.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = symbolIsWellKnown(Symbol.iterator)\n * // Expect: false\n * const example2 = symbolIsWellKnown(Symbol(\"iterator\"))\n * ```\n */\nexport const symbolIsWellKnown = (value: unknown): value is symbol => {\n return isSymbol(value) && internalWellKnownSymbols.has(value)\n}\n\n/**\n * Convert a symbol to its string representation.\n *\n * @example\n * ```\n * // Expect: \"Symbol(demo)\"\n * const example1 = symbolToString(Symbol(\"demo\"))\n * // Expect: undefined\n * const example2 = symbolToString(\"demo\")\n * ```\n */\nexport const symbolToString = (value: unknown): string | undefined => {\n return isSymbol(value) ? value.toString() : undefined\n}\n",
|
|
107
|
-
"/**\n * Convert an iterable target into an array using spread.\n *\n * @example\n * ```\n * // Expect: [1, 2, 3]\n * const example1 = arrayFromSpread(new Set([1, 2, 3]))\n * // Expect: []\n * const example2 = arrayFromSpread([])\n * ```\n */\nexport const arrayFromSpread = <T = unknown>(target: Iterable<T>): T[] => {\n return [...target]\n}\n\n/**\n * Returns the length of `targetArray`.\n *\n * @example\n * ```\n * // Expect: 3\n * const example1 = arrayLength([\"a\", \"b\", \"c\"])\n * // Expect: 0\n * const example2 = arrayLength([])\n * ```\n */\nexport const arrayLength = (targetArray: unknown[]): number => {\n return targetArray.length\n}\n\n/**\n * Returns a copy of `targetArray` in which last element has been removed.\n * New array's length is `targetArray.length - 1`.\n *\n * @example\n * ```\n * // Expect: [1, 2]\n * const example1 = arrayPop([1, 2, 3])\n * // Expect: []\n * const example2 = arrayPop([\"only\"])\n * ```\n */\nexport const arrayPop = <T = unknown>(targetArray: T[]): T[] => {\n return targetArray.slice(0, -1)\n}\n\n/**\n * Returns a copy of `targetArray` in which inserts the given `item` as new last item.\n * New array's length is `targetArray.length + 1`.\n *\n * @example\n * ```\n * // Expect: [1, 2, 3]\n * const example1 = arrayPush(3, [1, 2])\n * // Expect: [\"a\"]\n * const example2 = arrayPush(\"a\", [])\n * ```\n */\nexport const arrayPush = <T = unknown>(item: T, targetArray: T[]): T[] => {\n return [...targetArray, item]\n}\n\n/**\n * Alias of {@link arrayPush}.\n *\n * @example\n * ```\n * // Expect: [1, 2]\n * const example1 = arrayAppend(2, [1])\n * // Expect: [\"x\"]\n * const example2 = arrayAppend(\"x\", [])\n * ```\n */\nexport const arrayAppend: typeof arrayPush = arrayPush\n\n/**\n * Returns a copy of `targetArray` in which inserts the given `item` as new fist item.\n * New array's length is `targetArray`'s length + 1.\n *\n * @example\n * ```\n * // Expect: [0, 1, 2]\n * const example1 = arrayUnshift(0, [1, 2])\n * // Expect: [\"a\"]\n * const example2 = arrayUnshift(\"a\", [])\n * ```\n */\nexport const arrayUnshift = <T = unknown>(item: T, targetArray: T[]): T[] => {\n return [item, ...targetArray]\n}\n\n/**\n * Alias of {@link arrayUnshift}.\n *\n * @example\n * ```\n * // Expect: [\"first\", \"second\"]\n * const example1 = arrayPrepend(\"first\", [\"second\"])\n * // Expect: [true]\n * const example2 = arrayPrepend(true, [])\n * ```\n */\nexport const arrayPrepend: typeof arrayUnshift = arrayUnshift\n\n/**\n * Returns a copy of `targetArray` in which first element has been removed.\n * New array's length is `targetArray`'s length - 1.\n *\n * @example\n * ```\n * // Expect: [2, 3]\n * const example1 = arrayShift([1, 2, 3])\n * // Expect: []\n * const example2 = arrayShift([\"only\"])\n * ```\n */\nexport const arrayShift = <T = unknown>(targetArray: T[]): T[] => {\n return targetArray.slice(1)\n}\n\n/**\n * Returns the first element of `targetArray`.\n *\n * @example\n * ```\n * // Expect: 1\n * const example1 = arrayHead([1, 2, 3])\n * // Expect: undefined\n * const example2 = arrayHead([])\n * ```\n *\n * @see {@link arrayTail}, {@link arrayLast}\n */\nexport const arrayHead = <T = unknown>(targetArray: T[]): T | undefined => {\n return targetArray[0]\n}\n\n/**\n * Returns the tail of `targetArray`.\n *\n * @example\n * ```\n * // Expect: [2, 3]\n * const example1 = arrayTail([1, 2, 3])\n * // Expect: []\n * const example2 = arrayTail([\"only\"])\n * ```\n *\n * @see {@link arrayHead}, {@link arrayInit}\n */\nexport const arrayTail = <T = unknown>(targetArray: T[]): T[] => {\n return targetArray.slice(1)\n}\n\n/**\n * Returns the init of `targetArray`.\n *\n * @example\n * ```\n * // Expect: [1, 2]\n * const example1 = arrayInit([1, 2, 3])\n * // Expect: []\n * const example2 = arrayInit([\"only\"])\n * ```\n *\n * @see {@link arrayLast}, {@link arrayTail}\n */\nexport const arrayInit = <T = unknown>(targetArray: T[]): T[] => {\n return targetArray.slice(0, -1)\n}\n\n/**\n * Returns the last element of `targetArray`.\n *\n * @example\n * ```\n * // Expect: 3\n * const example1 = arrayLast([1, 2, 3])\n * // Expect: undefined\n * const example2 = arrayLast([])\n * ```\n *\n * @see {@link arrayInit}, {@link arrayHead}\n */\nexport const arrayLast = <T = unknown>(targetArray: T[]): T | undefined => {\n return targetArray.at(-1)\n}\n\n/**\n * Returns a copy of a section of an array.\n *\n * @example\n * ```\n * // Expect: [\"b\", \"c\"]\n * const example1 = arraySlice(1, 3, [\"a\", \"b\", \"c\", \"d\"])\n * // Expect: []\n * const example2 = arraySlice(2, 2, [1, 2, 3])\n * ```\n *\n * @see {@link arraySliceInit}, {@link arraySliceTail}\n */\nexport const arraySlice = <T = unknown>(\n start: number,\n end: number,\n targetArray: T[],\n): T[] => {\n return targetArray.slice(start, end)\n}\n\n/**\n * Returns a copy of a section of an array.\n *\n * @example\n * ```\n * // Expect: [3, 4]\n * const example1 = arraySliceTail(2, [1, 2, 3, 4])\n * // Expect: []\n * const example2 = arraySliceTail(1, [\"only\"])\n * ```\n *\n * @see {@link arraySlice}, {@link arraySliceTail}\n * @see {@link arrayDrop}\n */\nexport const arraySliceTail = <T = unknown>(\n start: number,\n targetArray: T[],\n): T[] => {\n return targetArray.slice(start)\n}\n\n/**\n * Returns a copy of a section of an array.\n *\n * @example\n * ```\n * // Expect: [3, 4]\n * const example1 = arrayDrop(2, [1, 2, 3, 4])\n * // Expect: []\n * const example2 = arrayDrop(-2, [1, 2])\n * ```\n *\n * @see {@link arraySliceTail}\n */\nexport const arrayDrop = <T = unknown>(\n n: number,\n targetArray: T[],\n): T[] => {\n return targetArray.slice(Math.abs(Math.round(n)))\n}\n/**\n * Returns a copy of a section of an array.\n *\n * @example\n * ```\n * // Expect: [1, 2]\n * const example1 = arraySliceInit(2, [1, 2, 3, 4])\n * // Expect: []\n * const example2 = arraySliceInit(0, [1, 2])\n * ```\n *\n * @see {@link arraySlice}, {@link arraySliceInit}\n */\nexport const arraySliceInit = <T = unknown>(\n end: number,\n targetArray: T[],\n): T[] => {\n return targetArray.slice(0, Math.round(end))\n}\n\n/**\n * Returns a copy of a section of an array.\n *\n * @example\n * ```\n * // Expect: [1, 2]\n * const example1 = arrayDropLast(2, [1, 2, 3, 4])\n * // Expect: []\n * const example2 = arrayDropLast(3, [1, 2])\n * ```\n *\n * @see {@link arraySliceInit}\n */\nexport const arrayDropLast = <T = unknown>(\n n: number,\n targetArray: T[],\n): T[] => {\n return targetArray.slice(0, -Math.abs(Math.round(n)))\n}\n\n/**\n * Returns a copy of `targetArray` with the elements between `start` (inclusive)\n * and `end` (exclusive) removed.\n *\n * @example\n * ```\n * // Expect: [\"a\", \"d\"]\n * const example1 = arrayRemove(1, 3, [\"a\", \"b\", \"c\", \"d\"])\n * // Expect: [1, 2, 3]\n * const example2 = arrayRemove(2, 2, [1, 2, 3])\n * ```\n */\nexport const arrayRemove = <T = unknown>(\n start: number, end: number, targetArray: T[]\n): T[] => {\n let internalStart = Math.abs(Math.round(start))\n let internalEnd = Math.abs(Math.round(end))\n\n if (internalEnd < internalStart) {\n [internalStart, internalEnd] = [internalEnd, internalStart]\n }\n return [...targetArray.slice(0, internalStart), ...targetArray.slice(internalEnd)]\n}\n\n/**\n * Returns a copy of `targetArray` with the element at `index` removed.\n *\n * @example\n * ```\n * // Expect: [\"a\", \"c\"]\n * const example1 = arrayRemoveIndex(1, [\"a\", \"b\", \"c\"])\n * // Expect: []\n * const example2 = arrayRemoveIndex(0, [\"only\"])\n * ```\n */\nexport const arrayRemoveIndex = <T = unknown>(\n index: number,\n targetArray: T[],\n): T[] => {\n return [...targetArray.slice(0, index), ...targetArray.slice(index + 1 === 0 ? Infinity : index + 1)]\n}\n\n/**\n * Combines two array. `appendedArray` will be appended to the end of `targetArray`.\n *\n * @example\n * ```\n * // Expect: [1, 2, 3, 4]\n * const example1 = arrayConcat([3, 4], [1, 2])\n * // Expect: [\"a\"]\n * const example2 = arrayConcat([], [\"a\"])\n * ```\n */\nexport const arrayConcat = <T = unknown>(appendedArray: T[], targetArray: T[]): T[] => {\n return [...targetArray, ...appendedArray]\n}\n\n/**\n * Adds all the elements of an array into a string, separated by the specified\n * separator string.\n *\n * @example\n * ```\n * // Expect: \"a,b,c\"\n * const example1 = arrayJoin(\",\", [\"a\", \"b\", \"c\"])\n * // Expect: \"\"\n * const example2 = arrayJoin(\"-\", [])\n * ```\n */\nexport const arrayJoin = (separator: string, targetArray: unknown[]): string => {\n return targetArray.join(separator)\n}\n\n/**\n * Returns the first index at which a given element can be found in the array,\n * or -1 if it is not present.\n *\n * @example\n * ```\n * // Expect: 1\n * const example1 = arrayIndexOf(\"b\", [\"a\", \"b\", \"c\"])\n * // Expect: -1\n * const example2 = arrayIndexOf(9, [1, 2, 3])\n * ```\n */\nexport const arrayIndexOf = (searchElement: unknown, targetArray: unknown[]): number => {\n return targetArray.indexOf(searchElement)\n}\n\n/**\n * Returns the last index at which a given element can be found in the array,\n * or -1 if it is not present.\n *\n * @example\n * ```\n * // Expect: 2\n * const example1 = arrayLastIndexOf(\"a\", [\"a\", \"b\", \"a\"])\n * // Expect: -1\n * const example2 = arrayLastIndexOf(9, [1, 2, 3])\n * ```\n */\nexport const arrayLastIndexOf = (searchElement: unknown, targetArray: unknown[]): number => {\n return targetArray.lastIndexOf(searchElement)\n}\n\n/**\n * Predicate whether the target array includes the searchElement.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = arrayIncludes(2, [1, 2, 3])\n * // Expect: false\n * const example2 = arrayIncludes(\"x\", [\"a\", \"b\"])\n * ```\n */\nexport const arrayIncludes = <T = unknown>(searchElement: T, targetArray: T[]): boolean => {\n return targetArray.includes(searchElement)\n}\n\n/**\n * Predicate whether all elements in the target array satisfy the provided testing function.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = arrayEvery((item) => item > 0, [1, 2, 3])\n * // Expect: false\n * const example2 = arrayEvery((item) => item > 1, [1, 2, 3])\n * ```\n */\nexport function arrayEvery<T = unknown, S extends T = T>(\n predicate: (item: T, index: number, array: T[]) => item is S, targetArray: T[]\n): targetArray is S[]\nexport function arrayEvery<T = unknown>(\n predicate: (item: T, index: number, array: T[]) => boolean, targetArray: T[]\n): boolean\nexport function arrayEvery<T = unknown>(\n predicate: (item: T, index: number, array: T[]) => boolean,\n targetArray: T[],\n): boolean {\n return targetArray.every((item, index, array) => predicate(item, index, array))\n}\n\n/**\n * Alias of {@link arrayEvery}.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = arrayAll((item) => item !== null, [1, 2])\n * // Expect: false\n * const example2 = arrayAll((item) => item === 0, [0, 1])\n * ```\n */\nexport const arrayAll: typeof arrayEvery = arrayEvery\n\n/**\n * Predicate whether at least one element in the target array satisfies the provided testing function.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = arraySome((item) => item > 2, [1, 2, 3])\n * // Expect: false\n * const example2 = arraySome((item) => item < 0, [1, 2, 3])\n * ```\n */\nexport const arraySome = <T = unknown>(\n predicate: (item: T, index: number, array: T[]) => boolean,\n targetArray: T[],\n): boolean => {\n return targetArray.some((item, index, array) => predicate(item, index, array))\n}\n\n/**\n * Alias of {@link arraySome}.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = arrayAny((item) => item === \"b\", [\"a\", \"b\"])\n * // Expect: false\n * const example2 = arrayAny((item) => item === \"x\", [\"a\", \"b\"])\n * ```\n */\nexport const arrayAny: typeof arraySome = arraySome\n\n/**\n * Applies a function to each element in the target array.\n *\n * @example\n * ```\n * const target: number[] = []\n * arrayForEach((item) => target.push(item * 2), [1, 2, 3])\n * // Expect: [2, 4, 6]\n * const example1 = target\n * ```\n */\nexport const arrayForEach = <T = unknown>(\n eachDo: (item: T, index: number, array: T[]) => void,\n targetArray: T[],\n): void => {\n targetArray.forEach((item, index, array) => {\n eachDo(item, index, array)\n })\n}\n\n/**\n * Returns a new array containing all elements of the target array that satisfy the provided testing function.\n *\n * @example\n * ```\n * // Expect: [2, 4]\n * const example1 = arrayFilter((item) => item % 2 === 0, [1, 2, 3, 4])\n * // Expect: []\n * const example2 = arrayFilter((item) => item > 0, [])\n * ```\n *\n * @see {@link arrayReject}\n */\nexport function arrayFilter<T = unknown, S extends T = T>(\n predicate: (item: T, index: number, array: T[]) => item is S, targetArray: T[]\n): S[]\nexport function arrayFilter<T = unknown>(\n predicate: (item: T, index: number, array: T[]) => boolean, targetArray: T[]\n): T[]\nexport function arrayFilter<T = unknown>(\n predicate: (item: T, index: number, array: T[]) => boolean,\n targetArray: T[],\n): T[] {\n return targetArray.filter((item, index, array) => predicate(item, index, array))\n}\n\n/**\n * Returns a new array containing all elements of the target array that do not satisfy the provided testing function.\n *\n * @example\n * ```\n * // Expect: [1, 3]\n * const example1 = arrayReject((item) => item % 2 === 0, [1, 2, 3, 4])\n * // Expect: [\"a\"]\n * const example2 = arrayReject((item) => item === \"b\", [\"a\", \"b\"])\n * ```\n *\n * @see {@link arrayFilter}\n */\nexport const arrayReject = <T = unknown>(\n predicate: (item: T, index: number, array: T[]) => boolean,\n targetArray: T[],\n): T[] => {\n return targetArray.filter((item, index, array) => !predicate(item, index, array))\n}\n\n/**\n * Returns a tuple of two arrays: the first array contains the elements of the target array that satisfy the provided testing function, while the second array contains the elements that do not satisfy the testing function.\n *\n * @example\n * ```\n * // Expect: [[2, 4], [1, 3]]\n * const example1 = arrayPartition((item) => item % 2 === 0, [1, 2, 3, 4])\n * // Expect: [[], [\"a\"]]\n * const example2 = arrayPartition((item) => item === \"b\", [\"a\"])\n * ```\n *\n * @see {@link arrayFilter}, {@link arrayReject}\n */\nexport const arrayPartition = <T = unknown>(\n predicate: (item: T, index: number, array: T[]) => boolean,\n targetArray: T[],\n): [T[], T[]] => {\n const truthyArray: T[] = []\n const falsyArray: T[] = []\n targetArray.forEach((item, index, array) => {\n if (predicate(item, index, array)) {\n truthyArray.push(item)\n }\n else {\n falsyArray.push(item)\n }\n })\n return [truthyArray, falsyArray]\n}\n\n/**\n * Returns a new array containing the results of applying a provided function to every element in the target array.\n *\n * @example\n * ```\n * // Expect: [2, 4, 6]\n * const example1 = arrayMap((item) => item * 2, [1, 2, 3])\n * // Expect: []\n * const example2 = arrayMap((item) => item, [])\n * ```\n */\nexport const arrayMap = <T = unknown, R = unknown>(\n transformation: (item: T, index: number, array: T[]) => R,\n targetArray: T[],\n): R[] => {\n return targetArray.map((item, index, array) => transformation(item, index, array))\n}\n\n/**\n * Returns a new array with all sub-array elements concatenated into it recursively up to the specified depth.\n *\n * @example\n * ```\n * // Expect: [1, 2, 3, 4]\n * const example1 = arrayFlat(1, [1, [2, 3], [4]])\n * // Expect: [1, 2]\n * const example2 = arrayFlat(2, [1, [[2]]])\n * ```\n *\n * @see {@link arrayFlatMap}\n */\nexport const arrayFlat = <T = unknown, D extends number = number>(\n depth: D,\n targetArray: T[],\n): Array<FlatArray<T[], D>> => {\n return targetArray.flat(depth)\n}\n\n/**\n * Returns a new array containing the results of applying a provided function to every element in the target array, and then flattening the result by one level.\n *\n * @example\n * ```\n * // Expect: [1, 1, 2, 2]\n * const example1 = arrayFlatMap((item) => [item, item], [1, 2])\n * // Expect: []\n * const example2 = arrayFlatMap((item) => [item], [])\n * ```\n *\n * @see {@link arrayMap}, {@link arrayFlat}\n */\nexport const arrayFlatMap = <T = unknown, R = unknown>(\n transformation: (item: T, index: number, array: T[]) => (R | R[]),\n targetArray: T[],\n): R[] => {\n return targetArray.flatMap((item, index, array) => transformation(item, index, array))\n}\n\n/**\n * Returns a single value that is the result of applying a provided function against an accumulator and each element in the target array (from left to right).\n *\n * @example\n * ```\n * // Expect: 6\n * const example1 = arrayReduce((acc, item) => acc + item, 0, [1, 2, 3])\n * // Expect: \"abc\"\n * const example2 = arrayReduce((acc, item) => acc + item, \"\", [\"a\", \"b\", \"c\"])\n * ```\n *\n * @see {@link arrayReduceLeft}, {@link arrayReduceRight}\n */\nexport const arrayReduce = <T = unknown, R = unknown>(\n reducer: (accumulated: R, item: T, index: number, array: T[]) => R,\n initialValue: R,\n targetArray: T[],\n): R => {\n return targetArray.reduce((accumulated, item, index, array) => reducer(accumulated, item, index, array), initialValue)\n}\n/**\n * Alias of {@link arrayReduce}.\n *\n * @example\n * ```\n * // Expect: 6\n * const example1 = arrayReduceLeft((acc, item) => acc + item, 0, [1, 2, 3])\n * // Expect: \"ab\"\n * const example2 = arrayReduceLeft((acc, item) => acc + item, \"\", [\"a\", \"b\"])\n * ```\n *\n * @see {@link arrayReduce}\n */\nexport const arrayReduceLeft: typeof arrayReduce = arrayReduce\n\n/**\n * Returns a single value that is the result of applying a provided function against an accumulator and each element in the target array (from right to left).\n *\n * @example\n * ```\n * // Expect: \"cba\"\n * const example1 = arrayReduceRight((acc, item) => acc + item, \"\", [\"a\", \"b\", \"c\"])\n * // Expect: 6\n * const example2 = arrayReduceRight((acc, item) => acc + item, 0, [1, 2, 3])\n * ```\n *\n * @see {@link arrayReduceLeft}, {@link arrayReduceRight}\n */\nexport const arrayReduceRight = <T = unknown, R = unknown>(\n reducer: (accumulated: R, item: T, index: number, array: T[]) => R,\n initialValue: R,\n targetArray: T[],\n): R => {\n return targetArray.reduceRight((accumulated, item, index, array) => reducer(accumulated, item, index, array), initialValue)\n}\n\n/**\n * Returns a new array containing only one copy of each element in the original array.\n *\n * @example\n * ```\n * // Expect: [1, 2, 3]\n * const example1 = arrayUnique([1, 2, 1, 3])\n * // Expect: [\"a\"]\n * const example2 = arrayUnique([\"a\", \"a\"])\n * ```\n */\nexport const arrayUnique = <T = unknown>(targetArray: T[]): T[] => {\n return Array.from(new Set(targetArray))\n}\n\n/**\n * Returns a new array containing only one copy of each element in the original array,\n * based on the provided unique function.\n *\n * @example\n * ```\n * // Expect: [{ id: 1 }, { id: 2 }]\n * const example1 = arrayUniqueBy((item) => item.id, [{ id: 1 }, { id: 1 }, { id: 2 }])\n * // Expect: []\n * const example2 = arrayUniqueBy((item) => item, [])\n * ```\n */\nexport const arrayUniqueBy = <T = unknown>(\n uniqueFunction: (item: T) => unknown, targetArray: T[]\n): T[] => {\n const uniqueMap = new Map<unknown, T>()\n targetArray.forEach((item) => {\n const uniqueKey = uniqueFunction(item)\n if (!uniqueMap.has(uniqueKey)) {\n uniqueMap.set(uniqueKey, item)\n }\n })\n return Array.from(uniqueMap.values())\n}\n\n/**\n * Combines two arrays into one array (no duplicates) composed of the elements of each array.\n *\n * @example\n * ```\n * // Expect: [1, 2, 3]\n * const example1 = arrayUnion([1, 2], [2, 3])\n * // Expect: [\"a\"]\n * const example2 = arrayUnion([\"a\"], [])\n * ```\n *\n * @see {@link arrayIntersection}\n */\nexport const arrayUnion = <T = unknown>(firstArray: T[], secondArray: T[]): T[] => {\n return arrayUnique([...firstArray, ...secondArray])\n}\n\ntype CompareArray = (arr1: unknown[], arr2: unknown[]) => unknown[]\nconst _longer: CompareArray = (arr1, arr2) => arr1.length > arr2.length ? arr1 : arr2\nconst _shorter: CompareArray = (arr1, arr2) => arr1.length > arr2.length ? arr2 : arr1\n/**\n * Combines two arrays into one array (no duplicates) composed of those elements common to both arrays.\n *\n * @example\n * ```\n * // Expect: [2]\n * const example1 = arrayIntersection([1, 2], [2, 3])\n * // Expect: []\n * const example2 = arrayIntersection([\"a\"], [\"b\"])\n * ```\n *\n * @see {@link https://ramdajs.com/docs/#intersection}\n * @see {@link arrayUnion}\n */\nexport const arrayIntersection = <T = unknown>(firstArray: T[], secondArray: T[]): T[] => {\n // reference: ramda, it is more efficient when the array length gap is large\n const lookupArr = _longer(firstArray, secondArray)\n const filteredArr = _shorter(firstArray, secondArray)\n // oxlint-disable-next-line no-unsafe-type-assertion\n return arrayUnique(filteredArr.filter(item => lookupArr.includes(item))) as T[]\n}\n\n/**\n * Returns a new array with the elements in reverse order.\n *\n * @example\n * ```\n * // Expect: [3, 2, 1]\n * const example1 = arrayReverse([1, 2, 3])\n * // Expect: []\n * const example2 = arrayReverse([])\n * ```\n */\nexport const arrayReverse = <T = unknown>(targetArray: T[]): T[] => {\n return targetArray.toReversed()\n}\n\n/**\n * Returns a new array with the elements sorted according to the provided compare function.\n *\n * @example\n * ```\n * // Expect: [1, 2, 3]\n * const example1 = arraySort((a, b) => a - b, [3, 1, 2])\n * // Expect: [\"a\", \"b\"]\n * const example2 = arraySort((a, b) => a.localeCompare(b), [\"b\", \"a\"])\n * ```\n */\nexport const arraySort = <T = unknown>(\n compareFunction: (a: T, b: T) => number,\n targetArray: T[],\n): T[] => {\n return targetArray.toSorted(compareFunction)\n}\n\n/**\n * Shuffle the target array.\n *\n * @see {@link https://github.com/mqyqingfeng/Blog/issues/51}\n *\n * @example\n * ```\n * const example1 = shuffle([1, 2, 3])\n * const example2 = shuffle([\"a\", \"b\"])\n * // Expect: example1.length === 3\n * // Expect: example2.length === 2\n * ```\n */\nexport const shuffle = <T = unknown>(target: T[]): T[] => {\n const _target = [...target]\n for (let i = _target.length; i !== 0; i = i - 1) {\n const j = Math.floor(Math.random() * i);\n // @ts-expect-error - ignore the error\n [_target[i - 1], _target[j]] = [_target[j], _target[i - 1]]\n }\n return _target\n}\n\n/**\n * Applies a function to the value at the given index of an array,\n * returning a new copy of the array with the element at the given index\n * replaced with the result of the function application.\n *\n * @example\n * ```\n * // Expect: [1, 20, 3]\n * const example1 = arrayAdjust(1, (item) => item * 10, [1, 2, 3])\n * // Expect: [\"a\"]\n * const example2 = arrayAdjust(0, (item) => item, [\"a\"])\n * ```\n *\n * @see {@link https://ramdajs.com/docs/#adjust}\n */\nexport const arrayAdjust = <T = unknown>(\n index: number,\n transformation: (item: T) => T,\n targetArray: T[],\n): T[] => {\n const _targetArray = [...targetArray]\n // oxlint-disable-next-line no-unsafe-type-assertion\n _targetArray[index] = transformation(_targetArray[index] as T)\n return _targetArray\n}\n\n/**\n * Returns a new copy of the array with the element\n * at the provided index replaced with the given value.\n *\n * @example\n * ```\n * // Expect: [1, 9, 3]\n * const example1 = arrayUpdate(1, 9, [1, 2, 3])\n * // Expect: [\"x\"]\n * const example2 = arrayUpdate(0, \"x\", [\"a\"])\n * ```\n *\n * @see {@link arrayAdjust}\n */\nexport const arrayUpdate = <T = unknown>(\n index: number,\n newItem: T,\n targetArray: T[],\n): T[] => {\n return arrayAdjust(index, () => newItem, targetArray)\n}\n",
|
|
108
|
-
"import type { AnyRecord } from \"../type/index.ts\"\nimport { isDate } from \"./is.ts\"\n\n/**\n * Return a new object that includes only the specified keys from the source object.\n *\n * @example\n * ```\n * // Expect: { a: 1, c: 3 }\n * const example1 = includeFields({ a: 1, b: 2, c: 3 }, [\"a\", \"c\"])\n * // Expect: {}\n * const example2 = includeFields(null, [\"a\"])\n * ```\n */\nexport const includeFields = <T extends AnyRecord, K extends keyof T>(\n object: T | null | undefined,\n keys: K[],\n): Pick<T, K> => {\n if (object === null || object === undefined) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return {} as Pick<T, K>\n }\n const newObject: Partial<Pick<T, K>> = {} // 初始化一个部分类型的对象\n keys.forEach((key) => {\n if (key in object) {\n newObject[key] = object[key]\n }\n })\n // oxlint-disable-next-line no-unsafe-type-assertion\n return newObject as Pick<T, K> // 使用正确的变量名并断言返回类型\n}\n\n/**\n * Return a new object that excludes the specified keys from the source object.\n *\n * @example\n * ```\n * // Expect: { a: 1 }\n * const example1 = excludeFields({ a: 1, b: 2 }, [\"b\"])\n * // Expect: {}\n * const example2 = excludeFields(undefined, [\"a\"])\n * ```\n */\nexport const excludeFields = <T extends AnyRecord, K extends keyof T>(\n object: T | null | undefined,\n keys: K[],\n): Omit<T, K> => {\n if (object === null || object === undefined) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return {} as Omit<T, K>\n }\n const newObject: Partial<T> = { ...object } // 创建原对象的浅拷贝\n keys.forEach((key) => {\n // oxlint-disable-next-line no-dynamic-delete\n delete newObject[key] // 删除指定的键\n })\n // oxlint-disable-next-line no-unsafe-type-assertion\n return newObject as Omit<T, K> // 使用Omit类型确保返回的类型反映了被排除的键\n}\n\n/**\n * Convert all Date fields in an object to number.\n *\n * @example\n * ```before\n * type Obj = {\n * createdAt: Date,\n * }\n * ```\n * ```after\n * type Obj = {\n * createdAt: number,\n * }\n * ```\n *\n * @example\n * ```before\n * type Obj = {\n * createdAt: Date | undefined,\n * }\n * ```\n * ```after\n * type Obj = {\n * createdAt: number | undefined,\n * }\n * ```\n *\n * @example\n * ```before\n * type Obj = {\n * createdAt: Date | null,\n * }\n * ```\n * ```after\n * type Obj = {\n * createdAt: number | null,\n * }\n * ```\n */\nexport type ObjectDateFieldsToNumber<O extends object> = {\n [K in keyof O]: O[K] extends Date\n ? number\n : (\n O[K] extends Date | undefined\n ? number | undefined\n :\n (O[K] extends Date | null\n ? number | null\n : (\n O[K] extends object\n ? ObjectDateFieldsToNumber<O[K]>\n : O[K]\n )\n )\n )\n}\n/**\n * Convert all Date fields in an object to number.\n *\n * @example\n * ```\n * const obj = { createdAt: new Date() };\n * const result = objectDateFieldsToNumber(obj);\n * // Expect: { createdAt: 1712345678901 }\n * ```\n */\nexport const objectDateFieldsToNumber = <O extends Record<string | number | symbol, unknown>>(\n obj: O\n): ObjectDateFieldsToNumber<O> => {\n // oxlint-disable-next-line guard-for-in\n for (const key in obj) {\n const value = obj[key];\n if (isDate(value)) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n obj[key] = value.getTime() as O[Extract<keyof O, string>]\n }\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n return obj as ObjectDateFieldsToNumber<O>\n}\n",
|
|
109
|
-
"import type {\n AnyAsyncFunction,\n AnyFunction,\n FunctionComposeAll,\n FunctionPipeAll,\n} from \"#Source/type/index.ts\"\n\nimport { asIs } from \"./helper.ts\"\nimport { isAsyncFunction, isSyncFunction } from \"./is.ts\"\n\n/**\n * Immediately invoke a function with the provided arguments.\n *\n * @example\n * ```\n * // Expect: 3\n * const example1 = functionIife((a: number, b: number) => a + b, 1, 2)\n * // Expect: \"ok\"\n * const example2 = functionIife(() => \"ok\")\n * ```\n */\nexport const functionIife = <T extends AnyFunction>(\n fn: T, ...args: Parameters<T>\n): ReturnType<T> => {\n // oxlint-disable-next-line no-unsafe-return\n return fn(...args)\n}\n\n/**\n * 表示只会保留首次执行结果的一次性函数。\n */\nexport type FunctionOnce<T extends AnyFunction> =\n (...args: Parameters<T>) => ReturnType<T>\n/**\n * 生成一个只在首次调用时真正执行的函数。\n *\n * @example\n * ```\n * const exampleFn1 = functionOnce((x: number) => x * 2)\n * // Expect: 10\n * const example1 = exampleFn1(5)\n * // Expect: 10\n * const example2 = exampleFn1(10)\n *\n * let callCount = 0\n * const exampleFn2 = functionOnce((x: number) => x * 2, (times) => { callCount = times })\n * exampleFn2(5)\n * exampleFn2(10)\n * // Expect: 2\n * const example3 = callCount\n * ```\n */\nexport const functionOnce = <T extends AnyFunction>(\n fn: T,\n timesSubscriber?: (times: number) => void,\n): FunctionOnce<T> => {\n let called = false\n let result: ReturnType<typeof fn>\n let times = 0\n return (...args) => {\n times = times + 1\n if (called === false) {\n // oxlint-disable-next-line no-unsafe-assignment\n result = fn(...args)\n called = true\n }\n if (times >= 2 && timesSubscriber !== undefined) {\n timesSubscriber(times)\n }\n // oxlint-disable-next-line no-unsafe-return\n return result\n }\n}\n\n/**\n * 表示简单防抖后的函数类型。\n */\nexport type FunctionDebouncedSimple<T extends AnyFunction> =\n (...args: Parameters<T>) => void\n\n/**\n * 生成一个简单防抖函数,在最后一次调用后的指定时间再触发原函数。\n *\n * @example\n * ```\n * const records: number[] = []\n * const exampleFn1 = functionDebounceSimple((x: number) => { records.push(x) }, 10)\n * exampleFn1(5)\n * exampleFn1(10)\n * // Expect: records.length === 0\n * const example1 = records.length === 0\n * ```\n */\nexport const functionDebounceSimple = <T extends AnyFunction>(\n fn: T,\n ms: number\n): FunctionDebouncedSimple<T> => {\n let timer: NodeJS.Timeout\n return (...args) => {\n clearTimeout(timer)\n timer = setTimeout(() => {\n fn(...args)\n }, ms)\n }\n}\n\n/**\n * 表示返回 `Promise` 的防抖函数类型。\n */\nexport type FunctionDebounced<T extends AnyFunction>\n = (...args: Parameters<T>) => Promise<ReturnType<T>>\n/**\n * 生成一个返回 `Promise` 的防抖函数,并在防抖窗口内合并并发调用。\n *\n * @example\n * ```\n * const exampleFn1 = debounce(async (x: number) => x * 2, 10)\n * const example1 = exampleFn1(5)\n * const example2 = exampleFn1(10)\n * // Expect: example1 instanceof Promise\n * const example3 = example1 instanceof Promise\n * // Expect: example2 instanceof Promise\n * const example4 = example2 instanceof Promise\n * ```\n */\nexport const debounce = <T extends AnyFunction>(\n fn: T,\n ms: number\n): FunctionDebounced<T> => {\n let timer: NodeJS.Timeout\n let waiting: AnyFunction[] = []\n return async (...args) => {\n clearTimeout(timer)\n timer = setTimeout((async () => {\n // oxlint-disable-next-line no-unsafe-assignment\n const res = await fn(...args)\n waiting.forEach((resolve) => {\n resolve(res)\n })\n waiting = []\n }) as (() => void), ms)\n\n // oxlint-disable-next-line no-unsafe-return\n return await new Promise((resolve) => {\n waiting.push(resolve)\n })\n }\n}\n\nconst THROTTLE_TYPE_ERROR = new TypeError(\"Throttle: fn must be a SyncFunction or AsyncFunction\")\n/**\n * 表示基于时间窗口的简单节流函数类型。\n */\nexport type FunctionThrottleTimeSimple<T extends AnyFunction> =\n (...args: Parameters<T>) => void\n/**\n * 生成一个简单时间节流函数,在指定时间窗口内最多执行一次原函数。\n *\n * 当 `strict` 为 `true` 时,节流窗口会同时考虑等待时长与目标函数执行时长。\n *\n * @example\n * ```\n * let called = 0\n * const exampleFn1 = functionThrottleTimeSimple(() => { called += 1 }, 100)\n * exampleFn1()\n * exampleFn1()\n * // Expect: 1\n * const example1 = called\n * ```\n */\nexport const functionThrottleTimeSimple = <T extends AnyFunction>(\n fn: T,\n ms: number,\n strict = false\n): FunctionThrottleTimeSimple<T> => {\n let isCalling = false\n // NOTE: 对于不同的目标函数,分别返回不同的结果,避免在每次运行时再做条件判断。\n if (isSyncFunction(fn) === true) {\n return (...args) => {\n if (isCalling === false) {\n isCalling = true\n setTimeout(() => {\n isCalling = false\n }, ms)\n fn(...args)\n }\n }\n }\n else if (isAsyncFunction(fn) === true) {\n return (...args) => {\n let isExecuted = false\n let timerExpired = false\n if (isCalling === false) {\n isCalling = true\n setTimeout(() => {\n if (strict === false) {\n isCalling = false\n }\n else {\n if (isExecuted === true) {\n isCalling = false\n }\n else {\n timerExpired = true\n }\n }\n }, ms);\n ; void (fn as AnyAsyncFunction)(...args).finally(() => {\n isExecuted = true\n if (timerExpired === true) {\n isCalling = false\n }\n })\n }\n }\n }\n else {\n throw THROTTLE_TYPE_ERROR\n }\n}\n\n/**\n * 表示执行期间丢弃重复调用的简单节流函数类型。\n */\nexport type FunctionThrottleSimple<T extends AnyFunction> =\n (...args: Parameters<T>) => void\n/**\n * 生成一个在执行期间忽略重复调用的节流函数。\n *\n * @example\n * ```\n * let called = 0\n * const exampleFn1 = functionThrottleSimple(() => { called += 1 })\n * exampleFn1()\n * exampleFn1()\n * // Expect: 1\n * const example1 = called\n * ```\n */\nexport const functionThrottleSimple = <T extends AnyFunction>(\n fn: T\n): FunctionThrottleSimple<T> => {\n let isCalling = false\n if (isSyncFunction(fn) === true) {\n return (...args) => {\n if (isCalling === false) {\n isCalling = true\n fn(...args)\n isCalling = false\n }\n }\n }\n else if (isAsyncFunction(fn) === true) {\n return (...args) => {\n if (isCalling === false) {\n isCalling = true;\n ; void (fn as AnyAsyncFunction)(...args).then(() => {\n isCalling = false\n })\n }\n }\n }\n else {\n throw THROTTLE_TYPE_ERROR\n }\n}\n\n/**\n * 表示返回 `Promise` 的时间节流函数类型。\n */\nexport type FunctionThrottleTime<T extends AnyFunction> =\n (...args: Parameters<T>) => Promise<ReturnType<T>>\n/**\n * 生成一个返回 `Promise` 的时间节流函数。\n *\n * 当 `strict` 为 `true` 时,节流窗口会同时考虑等待时长与目标函数执行时长。\n *\n * @example\n * ```\n * const exampleFn1 = throttleTime(async (value: number) => value * 2, 100)\n * const example1 = exampleFn1(2)\n * const example2 = exampleFn1(3)\n * // Expect: example1 instanceof Promise\n * const example3 = example1 instanceof Promise\n * // Expect: example2 instanceof Promise\n * const example4 = example2 instanceof Promise\n * ```\n */\nexport const throttleTime = <T extends AnyFunction>(\n fn: T,\n ms: number,\n strict = false\n): FunctionThrottleTime<T> => {\n let isCalling = false\n let waiting: AnyFunction[] = []\n return async (...args) => {\n let isExecuted = false\n let timerExpired = false\n if (isCalling === false) {\n isCalling = true\n setTimeout(() => {\n if (strict === false) {\n isCalling = false\n }\n else {\n if (isExecuted === true) {\n isCalling = false\n }\n else {\n timerExpired = true\n }\n }\n }, ms)\n // NOTE: 一般来说,如果目标函数是同步函数,节流版本也会同步执行,\n // 如果是异步函数,节流版本会异步运行,\n // 需要拿到结果的节流版本一律按照异步处理。\n void Promise.resolve(fn(...args)).then((res) => {\n // 先广播执行结果\n waiting.forEach((resolve) => {\n resolve(res)\n })\n waiting = []\n // 后重置节流状态\n isExecuted = true\n if (timerExpired === true) {\n isCalling = false\n }\n })\n }\n // oxlint-disable-next-line no-unsafe-return\n return (await new Promise((resolve) => {\n waiting.push(resolve)\n })) as ReturnType<T>\n }\n}\n\n/**\n * 表示合并并发调用的节流函数类型。\n */\nexport type FunctionThrottle<T extends AnyFunction> =\n (...args: Parameters<T>) => Promise<ReturnType<T>>\n/**\n * 生成一个返回 `Promise` 的节流函数,并合并并发调用。\n *\n * @example\n * ```\n * const exampleFn1 = functionThrottle(async () => \"ok\")\n * const example1 = exampleFn1()\n * const example2 = exampleFn1()\n * // Expect: example1 instanceof Promise\n * const example3 = example1 instanceof Promise\n * // Expect: example2 instanceof Promise\n * const example4 = example2 instanceof Promise\n * ```\n */\nexport const functionThrottle = <T extends AnyFunction>(\n fn: T\n): FunctionThrottle<T> => {\n let isCalling = false\n let waiting: AnyFunction[] = []\n return async () => {\n if (isCalling === false) {\n isCalling = true\n void Promise.resolve(fn()).then((res) => {\n // 先广播执行结果\n waiting.forEach((resolve) => {\n resolve(res)\n })\n waiting = []\n // 后重置节流状态\n isCalling = false\n })\n }\n // oxlint-disable-next-line no-unsafe-return\n return (await new Promise((resolve) => {\n waiting.push(resolve)\n })) as ReturnType<T>\n }\n}\n\n/**\n * Compose functions from right to left.\n *\n * @example\n * ```\n * const addOne = (value: number) => value + 1\n * const double = (value: number) => value * 2\n * const composed = functionCompose(addOne, double)\n * // Expect: 5\n * const example1 = composed(2)\n * ```\n */\nexport const functionCompose = <Fns extends AnyFunction[]>(\n ...fns: Fns\n): FunctionComposeAll<Fns> => {\n const reversedFns = fns.toReversed()\n const initialFunction = reversedFns.shift() ?? asIs\n const composedFunction = reversedFns.reduce((g, f) => {\n // oxlint-disable-next-line no-explicit-any explicit-function-return-type\n return (...args: any[]) => {\n // oxlint-disable-next-line no-unsafe-return no-unsafe-argument\n return f(g(...args))\n }\n }, initialFunction)\n // oxlint-disable-next-line no-unsafe-type-assertion\n return composedFunction as FunctionComposeAll<Fns>\n}\n\n/**\n * Pipe functions from left to right.\n *\n * @example\n * ```\n * const addOne = (value: number) => value + 1\n * const double = (value: number) => value * 2\n * const piped = functionPipe(addOne, double)\n * // Expect: 6\n * const example1 = piped(2)\n * ```\n */\nexport const functionPipe = <Fns extends AnyFunction[]>(\n ...fns: Fns\n): FunctionPipeAll<Fns> => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return functionCompose(...fns.toReversed()) as FunctionPipeAll<Fns>\n}\n\n/**\n * 表示带参数缓存能力的记忆化函数类型。\n */\nexport type FunctionMemorized<T extends AnyFunction> =\n (...args: Parameters<T>) => ReturnType<T>\n// oxlint-disable-next-line no-explicit-any\nconst defaultMemorizeHasher = (...args: any[]): string => JSON.stringify(args)\n/**\n * Generate a memoized function that caches results by arguments.\n *\n * @example\n * ```\n * let calls = 0\n * const sum = (a: number, b: number) => {\n * calls += 1\n * return a + b\n * }\n * const memoized = functionMemorize(sum)\n * // Expect: 3\n * const example1 = memoized(1, 2)\n * // Expect: 3\n * const example2 = memoized(1, 2)\n * // Expect: calls === 1\n * const example3 = calls\n * ```\n */\nexport const functionMemorize = <T extends AnyFunction>(\n fn: T,\n hashFunction?: (...args: Parameters<T>) => unknown | undefined\n): FunctionMemorized<T> => {\n const cache = new Map()\n const hasher = hashFunction ?? defaultMemorizeHasher\n return (...args) => {\n const key = hasher(...args)\n if (cache.has(key)) {\n // oxlint-disable-next-line no-unsafe-return\n return cache.get(key)\n }\n // oxlint-disable-next-line no-unsafe-assignment\n const result = fn(...args)\n cache.set(key, result)\n // oxlint-disable-next-line no-unsafe-return\n return result\n }\n}\n",
|
|
110
|
-
"import { isDate } from \"./is.ts\"\n\n/**\n * Check whether a date is outdated (in the past).\n */\nexport const temporalIsOutdated = (target: unknown): boolean => {\n return isDate(target) && (new Date(target).getTime() < Date.now())\n}\n\n/**\n * Format a timestamp to a YYYY-MM-DD string.\n *\n * @example\n * ```\n * // Expect: \"1970-01-01\"\n * const example1 = temporalFormatToYYYYMMDD(0)\n * // Expect: \"2000/01/02\"\n * const example2 = temporalFormatToYYYYMMDD(946771200000, \"/\")\n * ```\n */\nexport const temporalFormatToYYYYMMDD = (timestamp: number, separator = \"-\"): string => {\n const date = new Date(timestamp)\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, \"0\")\n const day = String(date.getDate()).padStart(2, \"0\")\n return `${year}${separator}${month}${separator}${day}`\n}\n\n/**\n * Format a timestamp to a hh:mm:ss string.\n *\n * @example\n * ```\n * // Expect: \"00:00:00\"\n * const example1 = temporalFormatTohhmmss(0)\n * // Expect: \"12:34:56\"\n * const example2 = temporalFormatTohhmmss(45296000)\n * ```\n */\nexport const temporalFormatTohhmmss = (timestamp: number, separator = \":\"): string => {\n const date = new Date(timestamp)\n const hours = String(date.getHours()).padStart(2, \"0\")\n const minutes = String(date.getMinutes()).padStart(2, \"0\")\n const seconds = String(date.getSeconds()).padStart(2, \"0\")\n return `${hours}${separator}${minutes}${separator}${seconds}`\n}\n\n/**\n * Format a timestamp to a YYYY-MM-DD hh:mm:ss string.\n *\n * @example\n * ```\n * // Expect: \"1970-01-01 00:00:00\"\n * const example1 = temporalFormatToYYYYMMDDhhmmss(0)\n * // Expect: \"2000-01-02 00:00:00\"\n * const example2 = temporalFormatToYYYYMMDDhhmmss(946771200000)\n * ```\n */\nexport const temporalFormatToYYYYMMDDhhmmss = (timestamp: number): string => {\n return `${temporalFormatToYYYYMMDD(timestamp)} ${temporalFormatTohhmmss(timestamp)}`\n}\n\n/**\n * Format a timestamp to a relative time string (e.g., \"刚刚\", \"5 分钟前\").\n *\n * @example\n * ```\n * // Expect: \"刚刚\"\n * const originalNow = Date.now\n * Date.now = () => 3_600_000\n * const example1 = temporalFormatToRelativeTime(3_600_000)\n * // Expect: \"1 小时前\"\n * const example2 = temporalFormatToRelativeTime(0)\n * Date.now = originalNow\n * ```\n */\nexport const temporalFormatToRelativeTime = (timestamp: number): string => {\n const now = Date.now()\n const diffInSeconds = Math.floor((now - timestamp) / 1_000)\n\n if (diffInSeconds < 60) {\n return \"刚刚\"\n }\n else if (diffInSeconds < 3_600) {\n const minutes = Math.floor(diffInSeconds / 60)\n return `${minutes} 分钟前`\n }\n else if (diffInSeconds < 86_400) {\n const hours = Math.floor(diffInSeconds / 3_600)\n return `${hours} 小时前`\n }\n else if (diffInSeconds < 172_800) {\n return \"昨天\"\n }\n else if (diffInSeconds < 604_800) {\n return \"一周内\"\n }\n else {\n // 格式化为 YYYY-MM-DD hh:ss\n return temporalFormatToYYYYMMDDhhmmss(timestamp)\n }\n}\n\nexport interface TemporalFormatToWechatRelativeTimeOptions {\n timestamp: number\n alwaysShowTime?: boolean | undefined\n}\n/**\n * Format a timestamp to a WeChat-style relative time string.\n *\n * @example\n * ```\n * // Expect: \"70/01/01\"\n * const example1 = temporalFormatToWechatRelativeTime({ timestamp: 0 })\n * // Expect: \"70/01/01 00:00\"\n * const example2 = temporalFormatToWechatRelativeTime({ timestamp: 0, alwaysShowTime: true })\n * ```\n */\nexport const temporalFormatToWechatRelativeTime = (\n options: TemporalFormatToWechatRelativeTimeOptions\n): string => {\n const {\n timestamp,\n alwaysShowTime = false,\n } = options\n\n const now = new Date()\n const targetDate = new Date(timestamp)\n\n const padZero = (num: number): string => num.toString().padStart(2, \"0\")\n\n const isSameDay = (date1: Date, date2: Date): boolean => {\n return date1.getFullYear() === date2.getFullYear()\n && date1.getMonth() === date2.getMonth()\n && date1.getDate() === date2.getDate()\n }\n\n const isYesterday = (date1: Date, date2: Date): boolean => {\n const yesterday = new Date(date1)\n yesterday.setDate(date1.getDate() - 1)\n return isSameDay(yesterday, date2)\n }\n\n const getWeekDayName = (date: Date): string => {\n const weekdays = [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"]\n return weekdays[date.getDay()]!\n }\n\n const isSameWeek = (date1: Date, date2: Date): boolean => {\n const startOfWeek = (date: Date): Date => {\n const result = new Date(date)\n const day = result.getDay()\n const diff = result.getDate() - day + (day === 0 ? -6 : 1)\n result.setDate(diff)\n return new Date(result.getFullYear(), result.getMonth(), result.getDate())\n }\n\n return startOfWeek(date1).getTime() === startOfWeek(date2).getTime()\n }\n\n const date = `${padZero(targetDate.getFullYear() % 100)}/${padZero(targetDate.getMonth() + 1)}/${padZero(targetDate.getDate())}`\n const time = `${padZero(targetDate.getHours())}:${padZero(targetDate.getMinutes())}`\n\n if (isSameDay(now, targetDate)) {\n return time\n }\n else if (isYesterday(now, targetDate)) {\n return alwaysShowTime ? `昨天 ${time}` : \"昨天\"\n }\n else if (isSameWeek(now, targetDate)) {\n return alwaysShowTime ? `${getWeekDayName(targetDate)} ${time}` : getWeekDayName(targetDate)\n }\n else {\n return alwaysShowTime ? `${date} ${time}` : date\n }\n}\n\ntype InternalUnitsDict = Record<string, string>\nconst INTERNAL_UNITS_DICT: InternalUnitsDict = {\n year: \"年\",\n month: \"月\",\n week: \"周\",\n day: \"天\",\n hour: \"小时\",\n minute: \"分钟\",\n second: \"秒\",\n millisecond: \"毫秒\",\n}\ntype InternalUnitsMilliDict = Record<string, number>\nconst INTERNAL_UNITS_MILLI_DICT: InternalUnitsMilliDict = {\n year: 31_557_600_000,\n month: 2_629_800_000,\n week: 604_800_000,\n day: 86_400_000,\n hour: 3_600_000,\n minute: 60_000,\n second: 1_000,\n millisecond: 1,\n}\n/**\n * Convert a timestamp to a human-readable relative time string in Chinese.\n *\n * @example\n * ```\n * // Expect: \"刚刚\"\n * const originalNow = Date.now\n * Date.now = () => 3_600_000\n * const example1 = temporalHumanize(3_600_000)\n * // Expect: \"1 小时前\"\n * const example2 = temporalHumanize(0)\n * Date.now = originalNow\n * ```\n */\nexport const temporalHumanize = (timestamp: number): string => {\n let res = \"\"\n const milliseconds = Date.now() - timestamp\n for (const key in INTERNAL_UNITS_MILLI_DICT) {\n if (milliseconds >= INTERNAL_UNITS_MILLI_DICT[key]!) {\n res = `${Math.floor(milliseconds / INTERNAL_UNITS_MILLI_DICT[key]!)} ${INTERNAL_UNITS_DICT[key]}前`\n break\n }\n }\n return res !== \"\" ? res : \"刚刚\"\n}\n",
|
|
111
|
-
"import { isError } from \"./is.ts\"\n\nconst internalErrorMessages = new Set([\n \"network error\", // Chrome\n \"Failed to fetch\", // Chrome\n \"NetworkError when attempting to fetch resource.\", // Firefox\n \"The Internet connection appears to be offline.\", // Safari 16\n \"Load failed\", // Safari 17+\n \"Network request failed\", // `cross-fetch`\n \"fetch failed\", // Undici (Node.js)\n \"terminated\", // Undici (Node.js)\n])\n\n/**\n * Checks if an error is a network error.\n *\n * @see {@link https://github.com/sindresorhus/is-network-error}\n */\nexport const errorIsNetworkError = (error: unknown): error is Error => {\n if (error === null || error === undefined) {\n return false\n }\n\n if (isError(error) === false) {\n return false\n }\n\n if (error.name !== \"TypeError\" || typeof error.message !== \"string\") {\n return false\n }\n\n // We do an extra check for Safari 17+ as it has a very generic error message.\n // Network errors in Safari have no stack.\n if (error.message === \"Load failed\") {\n return error.stack === undefined\n }\n\n return internalErrorMessages.has(error.message)\n}\n\n/**\n * Stringifies an exception into a readable format.\n */\nexport const errorStringifyException = (exception: unknown): string => {\n if (isError(exception)) {\n return `${exception.name}: ${exception.message}`\n }\n else {\n return `${String(exception)}`\n }\n}\n",
|
|
112
|
-
"/**\n * Checks if a string is a valid email address.\n */\nexport const regexpIsEmail = (value: string): boolean => {\n const emailRegex = /^[\\w.%+-]+@[a-z0-9.-]+\\.[a-z]{2,}$/i\n return emailRegex.test(value)\n}\n",
|
|
113
|
-
"import { isPlainObject } from \"./is.ts\"\n\n/**\n * Chain a promise with a fulfillment callback and return the transformed result.\n *\n * @example\n * ```\n * // Expect: 6\n * const example1 = await promiseThen((value: number) => value * 2, Promise.resolve(3))\n * // Expect: \"ok!\"\n * const example2 = await promiseThen((value: string) => `${value}!`, Promise.resolve(\"ok\"))\n * ```\n */\nexport const promiseThen = async <V, R>(\n doSomething: (value: V) => R | PromiseLike<R>,\n target: Promise<V>,\n): Promise<R> => {\n return await target.then(doSomething)\n}\n\n/**\n * Handle a rejected promise and convert it to a resolved fallback value.\n *\n * @example\n * ```\n * // Expect: \"fallback\"\n * const example1 = await promiseCatch(() => \"fallback\", Promise.reject(new Error(\"x\")))\n * // Expect: 3\n * const example2 = await promiseCatch(() => 0, Promise.resolve(3))\n * ```\n */\nexport const promiseCatch = async <V, R>(\n doSomething: (reason: unknown) => R | PromiseLike<R>,\n target: Promise<V>,\n): Promise<V | R> => {\n return await target.catch(doSomething)\n}\n\n/**\n * Run a callback after a promise settles and keep the original resolved value.\n *\n * @example\n * ```\n * let cleaned = false\n * // Expect: 10\n * const example1 = await promiseFinally(() => { cleaned = true }, Promise.resolve(10))\n * // Expect: true\n * const example2 = cleaned\n * ```\n */\nexport const promiseFinally = async <V>(\n doSomething: () => void,\n target: Promise<V>,\n): Promise<V> => {\n return await target.finally(doSomething)\n}\n\nconst INTERNAL_PROMISE_FAIL_RESULT_TYPE: symbol = Symbol(\"fail\")\n\n/**\n * 表示标准化的 Promise 失败结果。\n */\nexport interface PromiseFailResult {\n __type__: typeof INTERNAL_PROMISE_FAIL_RESULT_TYPE\n reason: unknown\n}\n\n/**\n * 表示带原始下标信息的 Promise 失败结果。\n */\nexport interface PromiseIndexedFailResult extends PromiseFailResult {\n index: number\n}\n\n/**\n * 根据拒因构造标准化的 Promise 失败结果。\n */\nexport const promiseConstructFailResult = (reason: unknown): PromiseFailResult => {\n return { __type__: INTERNAL_PROMISE_FAIL_RESULT_TYPE, reason }\n}\n/**\n * 判断目标值是否为标准化的 Promise 失败结果。\n */\nexport const isPromiseFailResult = (target: unknown): target is PromiseFailResult => {\n return isPlainObject(target) && target[\"__type__\"] === INTERNAL_PROMISE_FAIL_RESULT_TYPE\n}\n/**\n * 用作 `Promise.catch` 的 `onrejected` 回调,并返回标准化失败结果。\n */\nexport const promiseCatchToFailResult = (reason: unknown): PromiseFailResult => {\n return { __type__: INTERNAL_PROMISE_FAIL_RESULT_TYPE, reason }\n}\n\n/**\n * 从结果数组中过滤出非 `PromiseFailResult` 项。\n */\nexport const promiseFilterSuccessResults = <V>(\n results: Array<V | PromiseFailResult>,\n): V[] => {\n const filtered = results.filter(result => {\n return isPromiseFailResult(result) === false\n })\n // oxlint-disable-next-line no-unsafe-type-assertion\n return filtered as V[]\n}\n/**\n * 从结果数组中过滤出失败项,并补充其原始下标。\n */\nexport const promiseFilterFailResults = <V>(\n results: Array<V | PromiseFailResult>,\n): PromiseIndexedFailResult[] => {\n const filtered = results.reduce<PromiseIndexedFailResult[]>((\n accumulatedResults, currentResult, index\n ) => {\n if (isPromiseFailResult(currentResult)) {\n accumulatedResults.push({ ...currentResult, index })\n }\n return accumulatedResults\n }, [])\n return filtered\n}\n\ninterface PromiseQueueFirstPromiseMakerContext<S = unknown> {\n index: number\n hasPreviousResult: false\n state: S\n}\ninterface PromiseQueueRestPromiseMakerContext<V, S = unknown> {\n index: number\n hasPreviousResult: true\n previousResult: V | PromiseFailResult\n state: S\n}\ntype PromiseQueueFirstPromiseMaker<T, S = unknown> = (context: PromiseQueueFirstPromiseMakerContext<S>) => Promise<T>\ntype PromiseQueueRestPromiseMaker<T, S = unknown> = (context: PromiseQueueRestPromiseMakerContext<T, S>) => Promise<T>\ntype PromiseQueuePromiseMakers<T, S = unknown> = [\n PromiseQueueFirstPromiseMaker<T, S>,\n ...Array<PromiseQueueRestPromiseMaker<T, S>>\n]\n\n/**\n * `promiseQueue` 的配置项。\n */\nexport interface PromiseQueueOptions {\n /**\n * @default 0\n */\n breakTime?: number\n}\n/**\n * Execute promise makers in sequence, passing the previous result to the next maker.\n *\n * @example\n * ```\n * // Expect: [1, 2]\n * const example1 = await promiseQueue<number>([\n * async () => 1,\n * async ({ previousResult }) => (isPromiseFailResult(previousResult) ? 0 : previousResult + 1),\n * ])\n * ```\n */\nexport const promiseQueue = async <T, S = unknown>(\n promiseMakers: PromiseQueuePromiseMakers<T, S>,\n options?: PromiseQueueOptions | undefined,\n): Promise<Array<T | PromiseFailResult>> => {\n const { breakTime = 0 } = options ?? {}\n const results: Array<T | PromiseFailResult> = []\n\n let context: PromiseQueueFirstPromiseMakerContext<S> | PromiseQueueRestPromiseMakerContext<T, S> = {\n index: 0,\n hasPreviousResult: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n state: undefined as unknown as S\n }\n\n const [firstPromiseMaker, ...restPromiseMakers] = promiseMakers\n const lastPromise = restPromiseMakers.reduce(async (\n accumulatedPromise, currentPromiseMaker, index\n ) => {\n return await accumulatedPromise\n .catch(promiseCatchToFailResult)\n .then(async (result) => {\n results.push(result)\n return await new Promise((resolve) => {\n setTimeout(() => {\n context = {\n ...context,\n index: index + 1,\n hasPreviousResult: true,\n previousResult: result\n }\n resolve(currentPromiseMaker(context))\n }, breakTime)\n })\n })\n }, firstPromiseMaker(context))\n\n await lastPromise\n .catch(promiseCatchToFailResult)\n .then((result) => {\n results.push(result)\n })\n\n return results\n}\n\ninterface PromiseRetryFirstPromiseMakerContext<S = unknown> {\n time: number\n hasPreviousResult: false\n state: S\n}\ninterface PromiseRetryRestPromiseMakerContext<T, S = unknown> {\n time: number\n hasPreviousResult: true\n previousResult: T | PromiseFailResult\n state: S\n}\ntype PromiseRetryPromiseMaker<T, S = unknown> = (\n context: PromiseRetryFirstPromiseMakerContext<S> | PromiseRetryRestPromiseMakerContext<T, S>\n) => Promise<T>\n\n/**\n * `promiseRetryWhile` 与 `promiseRetryUntil` 的配置项。\n */\nexport interface PromiseRetryOptions {\n /**\n * @default 0\n */\n breakTime?: number\n /**\n * @default Infinity\n */\n maxTryTimes?: number\n}\n/**\n * Retry while the predicate indicates the result is not acceptable.\n *\n * @example\n * ```\n * let counter = 0\n * // Expect: 3\n * const example1 = await promiseRetryWhile(\n * (value) => value < 3,\n * async () => {\n * counter = counter + 1\n * return counter\n * },\n * )\n * ```\n *\n * @see {@link promiseRetryUntil}\n */\nexport const promiseRetryWhile = async <T, S = unknown>(\n predicate: (value: T) => boolean | Promise<boolean>,\n promiseMaker: PromiseRetryPromiseMaker<T, S>,\n options?: PromiseRetryOptions | undefined,\n): Promise<T | PromiseFailResult> => {\n const {\n breakTime = 0,\n maxTryTimes = Infinity,\n } = options ?? {}\n\n if (maxTryTimes < 1) {\n throw new Error(\"`maxTryTimes` must be greater than 0.\")\n }\n\n let time = 1\n // oxlint-disable-next-line no-accumulating-spread\n let context: PromiseRetryFirstPromiseMakerContext<S> | PromiseRetryRestPromiseMakerContext<T, S> = {\n time,\n hasPreviousResult: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n state: undefined as unknown as S\n }\n let result = await promiseMaker(context).catch(promiseCatchToFailResult)\n\n while (\n (isPromiseFailResult(result) || (await predicate(result)))\n && time < maxTryTimes\n ) {\n time = time + 1\n // oxlint-disable-next-line no-loop-func\n result = await new Promise<T | PromiseFailResult>((resolve) => {\n setTimeout(() => {\n context = {\n ...context,\n time,\n hasPreviousResult: true,\n previousResult: result,\n }\n resolve(promiseMaker(context))\n }, breakTime)\n }).catch(promiseCatchToFailResult)\n }\n\n return result\n}\n\n/**\n * Retry until the predicate returns true for the current result.\n *\n * @example\n * ```\n * let counter = 0\n * // Expect: 2\n * const example1 = await promiseRetryUntil(\n * (value) => value >= 2,\n * async () => {\n * counter = counter + 1\n * return counter\n * },\n * )\n * ```\n *\n * @see {@link promiseRetryWhile}\n */\nexport const promiseRetryUntil = async <T, S = unknown>(\n predicate: (value: T, time: number) => boolean | Promise<boolean>,\n promiseMaker: PromiseRetryPromiseMaker<T, S>,\n options?: PromiseRetryOptions | undefined,\n): Promise<T | PromiseFailResult> => {\n const {\n breakTime = 0,\n maxTryTimes = Infinity,\n } = options ?? {}\n\n if (maxTryTimes < 1) {\n throw new Error(\"`maxTryTimes` must be greater than 0.\")\n }\n\n let time = 1\n // oxlint-disable-next-line no-accumulating-spread\n let context: PromiseRetryFirstPromiseMakerContext<S> | PromiseRetryRestPromiseMakerContext<T, S> = {\n time,\n hasPreviousResult: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n state: undefined as unknown as S\n }\n let result = await promiseMaker(context).catch(promiseCatchToFailResult)\n\n while (\n (isPromiseFailResult(result) || !(await predicate(result, time)))\n && time < maxTryTimes\n ) {\n time = time + 1\n // oxlint-disable-next-line no-loop-func\n result = await new Promise<T | PromiseFailResult>((resolve) => {\n setTimeout(() => {\n context = {\n ...context,\n time,\n hasPreviousResult: true,\n previousResult: result\n }\n resolve(promiseMaker(context))\n }, breakTime)\n }).catch(promiseCatchToFailResult)\n }\n\n return result\n}\n\n/**\n * Start periodic asynchronous execution and return a function to stop it.\n *\n * @example\n * ```\n * const records: number[] = []\n * const stop = promiseInterval(10, async (time) => {\n * records.push(time)\n * return time\n * })\n * // Later: stop()\n * // Expect: typeof stop === \"function\"\n * const example1 = typeof stop === \"function\"\n * ```\n */\nexport const promiseInterval = <T>(\n interval: number,\n promiseMaker: (time: number) => Promise<T>,\n): (() => void) => {\n let time = 1\n\n const intervalID = setInterval(() => {\n void promiseMaker(time)\n time = time + 1\n }, interval)\n\n return () => {\n clearInterval(intervalID)\n }\n}\n\ninterface PromiseForeverFirstPromiseMakerContext<S = unknown> {\n time: number\n hasPreviousResult: false\n state: S\n}\ninterface PromiseForeverRestPromiseMakerContext<T, S = unknown> {\n time: number\n hasPreviousResult: true\n previousResult: T | PromiseFailResult\n state: S\n}\ntype PromiseForeverPromiseMaker<T, S = unknown> = (\n context: PromiseForeverFirstPromiseMakerContext<S> | PromiseForeverRestPromiseMakerContext<T, S>\n) => Promise<T>\n\n/**\n * `promiseForever` 的配置项。\n */\nexport interface PromiseForeverOptions {\n /**\n * @default 0\n */\n breakTime?: number | undefined\n onRejected?: ((time: number, result: PromiseFailResult) => void) | undefined\n}\n/**\n * Continuously execute an async maker forever with optional delay and rejection hook.\n *\n * @example\n * ```\n * let times = 0\n * promiseForever(async () => {\n * times = times + 1\n * return times\n * }, { breakTime: 0 })\n * // Expect: no return value\n * const example1 = promiseForever(async () => 1)\n * ```\n */\nexport const promiseForever = <T, S = unknown>(\n promiseMaker: PromiseForeverPromiseMaker<T, S>,\n options?: PromiseForeverOptions | undefined,\n): void => {\n const {\n breakTime = 0,\n onRejected,\n } = options ?? {}\n\n let time = 1\n let context: PromiseForeverFirstPromiseMakerContext<S> | PromiseForeverRestPromiseMakerContext<T, S> = {\n time,\n hasPreviousResult: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n state: undefined as unknown as S\n }\n\n const handlePromise = (result: T | PromiseFailResult): void => {\n time = time + 1\n setTimeout(() => {\n context = {\n ...context,\n time,\n hasPreviousResult: true,\n previousResult: result\n }\n runPromise(context)\n }, breakTime)\n }\n const runPromise = (\n context: PromiseForeverFirstPromiseMakerContext<S> | PromiseForeverRestPromiseMakerContext<T, S>\n ): void => {\n void promiseMaker(context)\n .catch((error: unknown) => {\n const failedResult = promiseCatchToFailResult(error)\n if (onRejected !== undefined) {\n try {\n onRejected(time, failedResult)\n }\n catch {\n // omit exceptions from execution of `onRejected`\n }\n }\n else {\n console.log(\"❌ [promiseForever] unexcepted error occured:\", failedResult)\n }\n return failedResult\n })\n .then(result => handlePromise(result))\n }\n\n runPromise(context)\n}\n",
|
|
114
|
-
"import type { ReadableStreamController, ReadableStreamReadResult } from \"node:stream/web\"\n\nimport { ReadableStream } from \"node:stream/web\"\n\n/**\n * 从数组创建一个 ReadableStream。\n */\nexport const streamFromArray = <T>(values: T[]): ReadableStream<T> => {\n const stream = new ReadableStream<T>({\n start(controller): void {\n for (const value of values) {\n controller.enqueue(value)\n }\n controller.close()\n },\n })\n return stream\n}\n\nexport interface StreamConsumeInSyncMacroTaskOptions<T> {\n readableStream: ReadableStream<T>\n onValue?: ((chunk: T) => (void | Promise<void>)) | undefined\n onDone?: (() => (void | Promise<void>)) | undefined\n onError?: ((error: Error) => (void | Promise<void>)) | undefined\n}\n/**\n * 在同步宏任务中完成 ReadableStream 的消费。\n */\nexport const streamConsumeInSyncMacroTask = async <T>(\n options: StreamConsumeInSyncMacroTaskOptions<T>,\n): Promise<void> => {\n const { readableStream, onValue, onDone, onError } = options\n\n try {\n for await (const chunk of readableStream) {\n await onValue?.(chunk)\n }\n await onDone?.()\n }\n catch (exception) {\n console.error(`Error reading stream: ${String(exception)}`)\n await onError?.(new Error(`Error reading stream: ${String(exception)}`))\n }\n}\n\nexport interface StreamConsumeInAsyncMacroTaskOptions<T> {\n readableStream: ReadableStream<T>\n onValue?: ((chunk: T) => (void | Promise<void>)) | undefined\n onDone?: (() => (void | Promise<void>)) | undefined\n onError?: ((error: Error) => (void | Promise<void>)) | undefined\n}\n/**\n * 在异步宏任务中完成 ReadableStream 的消费。\n */\nexport const streamConsumeInAsyncMacroTask = <T>(\n options: StreamConsumeInAsyncMacroTaskOptions<T>,\n): void => {\n const { readableStream, onValue, onDone, onError } = options\n\n const reader = readableStream.getReader()\n const read = (): void => {\n setTimeout(() => {\n void reader.read()\n .then(async (chunk) => {\n const { done, value } = chunk\n if (done === true) {\n await onDone?.()\n return\n }\n await onValue?.(value)\n read()\n })\n .catch(async (reason: unknown) => {\n await onError?.(new Error(String(reason)))\n })\n }, 0)\n }\n read()\n}\n\nexport interface StreamTransformInAsyncMacroTaskOptions<T, U> {\n readableStream?: ReadableStream<T> | undefined\n reader?: ReadableStreamDefaultReader<T> | undefined\n onChunk?: ((chunk: ReadableStreamReadResult<T>, controller: ReadableStreamDefaultController<U>) => (void | Promise<void>)) | undefined\n onError?: ((error: Error) => (void | Error | Promise<void | Error>)) | undefined\n}\n/**\n * 在宏任务队列中完成 ReadableStream 到另一个 ReadableStream 的转换。\n */\nexport const streamTransformInAsyncMacroTask = <T, U>(\n options: StreamTransformInAsyncMacroTaskOptions<T, U>,\n): ReadableStream<U> => {\n const { readableStream, reader, onChunk, onError } = options\n\n if (reader === undefined && readableStream === undefined) {\n throw new Error(\"Either readableStream or reader must be provided\")\n }\n\n const preparedReader = reader ?? readableStream!.getReader()\n const stream = new ReadableStream<U>({\n start(controller): void {\n const read = (): void => {\n setTimeout(() => {\n void preparedReader.read()\n .then(async (chunk) => {\n let shouldContinue = true\n const proxyController: ReadableStreamController<U> = {\n // oxlint-disable-next-line no-misused-spread\n ...controller,\n enqueue: (chunk: U): void => {\n controller.enqueue(chunk)\n shouldContinue = true\n },\n close: (): void => {\n controller.close()\n shouldContinue = false\n },\n error: (error: Error): void => {\n controller.error(error)\n shouldContinue = false\n },\n }\n await onChunk?.(chunk, proxyController)\n if (shouldContinue === true) {\n read()\n }\n })\n .catch(async (reason: unknown) => {\n const error = new Error(String(reason))\n const refinedError = await onError?.(error)\n controller.error(refinedError ?? error)\n })\n }, 0)\n }\n read()\n },\n })\n\n return stream\n}\n",
|
|
115
|
-
"/**\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/BigInt#%E5%9C%A8_json_%E4%B8%AD%E4%BD%BF%E7%94%A8}\n */\nexport const enhanceBigInt = (): void => {\n // @ts-expect-error - extend BigInt toJSON\n // oxlint-disable-next-line no-extend-native\n BigInt.prototype.toJSON = function toJSON(): number {\n return Number(this.toString())\n }\n}\n",
|
|
116
|
-
"\n/**\n * Define a conditional usage function for a target object.\n */\nexport type Use<Target> = <R>(\n use: (target: Target) => R,\n otherwise: () => R\n) => R\n/**\n * Create a conditional usage helper from getter and availability checks.\n */\nexport const useFactory = <Target>(\n get: () => Target,\n has: () => boolean,\n): Use<Target> => {\n const use = <R>(use: (target: Target) => R, otherwise: () => R): R => {\n if (has() === true) {\n const target = get();\n return use(target);\n } else {\n return otherwise();\n }\n }\n\n return use;\n}\n",
|
|
117
|
-
"/**\n * 描述来自 Cloudflare trace 接口的地理信息。\n *\n * @example\n * ```\n * fl=1232f78\n * h=www.cloudflare.com\n * ip=23.132.124.129\n * ts=1772261014.000\n * visit_scheme=https\n * uag=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 Edg/144.0.0.0\n * colo=SJC\n * sliver=none\n * http=http/2\n * loc=US\n * tls=TLSv1.3\n * sni=plaintext\n * warp=off\n * gateway=off\n * rbi=off\n * kex=X25519MLKEM768\n * ```\n */\nexport interface GeoInfoFromCloudflare {\n /**\n * Data center request was handled at (Cloudflare internal code)\n */\n fl?: string | undefined\n /**\n * Hostname of the incoming HTTP request\n */\n h?: string | undefined\n /**\n * Client IP address detected by Cloudflare\n */\n ip?: string | undefined\n /**\n * Timestamp of request (in seconds)\n */\n ts?: string | undefined\n /**\n * Request scheme used by the visitor (for example: http/https)\n */\n visit_scheme?: string | undefined\n /**\n * User-Agent header value\n */\n uag?: string | undefined\n /**\n * IATA-like code of the Cloudflare edge location\n */\n colo?: string | undefined\n /**\n * Cloudflare edge “sliver” identifier\n */\n sliver?: string | undefined\n /**\n * HTTP protocol version used for the request\n */\n http?: string | undefined\n /**\n * Country code inferred from client IP (ISO 3166-1 alpha-2)\n */\n loc?: string | undefined\n /**\n * TLS protocol version negotiated for the connection\n */\n tls?: string | undefined\n /**\n * Server Name Indication (SNI) mode\n */\n sni?: string | undefined\n /**\n * Whether WARP is enabled for the client\n */\n warp?: string | undefined\n /**\n * Whether Cloudflare Gateway is enabled for the client\n */\n gateway?: string | undefined\n /**\n * Whether browser isolation (RBI) is enabled\n */\n rbi?: string | undefined\n /**\n * Key exchange algorithm used by TLS\n */\n kex?: string | undefined\n}\n/**\n * Parse geolocation information from Cloudflare trace response.\n */\nconst parseGeoInfoFromCloudflare = (text: string): GeoInfoFromCloudflare => {\n const pairs = text\n .split('\\n')\n .map((pair: string) => pair.split('='))\n .filter(([key]) => key !== '')\n const result = pairs.reduce((geo: GeoInfoFromCloudflare, pair) => {\n const [key, value] = pair\n if (key !== undefined) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n geo[key as keyof GeoInfoFromCloudflare] = value\n }\n return geo\n }, {})\n return result\n}\n/**\n * Get device geolocation information from Cloudflare\n *\n * @see {@link https://dev.to/brojenuel/get-ip-clients-addresses-6k6}\n * @see {@link https://dataflowkit.com/blog/determine-location-of-users/}\n */\nexport const getGeoInfoFromCloudflare = async (): Promise<GeoInfoFromCloudflare> => {\n const response = await fetch('https://www.cloudflare.com/cdn-cgi/trace', {\n method: 'GET',\n mode: 'cors',\n credentials: 'omit'\n })\n const responseText = await response.text()\n const geo = parseGeoInfoFromCloudflare(responseText)\n\n return geo\n}\n\n/**\n * 描述来自 ipapi 响应的地理信息。\n *\n * @example\n * ```\n * {\n * \"ip\": \"23.132.124.129\",\n * \"network\": \"23.132.124.0/24\",\n * \"version\": \"IPv4\",\n * \"city\": \"Los Angeles\",\n * \"region\": \"California\",\n * \"region_code\": \"CA\",\n * \"country\": \"US\",\n * \"country_name\": \"United States\",\n * \"country_code\": \"US\",\n * \"country_code_iso3\": \"USA\",\n * \"country_capital\": \"Washington\",\n * \"country_tld\": \".us\",\n * \"continent_code\": \"NA\",\n * \"in_eu\": false,\n * \"postal\": \"90001\",\n * \"latitude\": 34.05223,\n * \"longitude\": -118.24368,\n * \"timezone\": \"America/Los_Angeles\",\n * \"utc_offset\": \"-0800\",\n * \"country_calling_code\": \"+1\",\n * \"currency\": \"USD\",\n * \"currency_name\": \"Dollar\",\n * \"languages\": \"en-US,es-US,haw,fr\",\n * \"country_area\": 9629091,\n * \"country_population\": 327167434,\n * \"asn\": \"AS7018\",\n * \"org\": \"AT&T Enterprises, LLC\"\n * }\n * ```\n */\nexport interface GeoInfoFromIpapi {\n /**\n * Public (external) IP address (same as URL ip).\n */\n ip?: string | undefined\n /**\n * Network address in CIDR notation.\n */\n network?: string | undefined\n /**\n * IP version (IPv4 or IPv6).\n */\n version?: string | undefined\n /**\n * City name.\n */\n city?: string | undefined\n /**\n * Region name (administrative division).\n */\n region?: string | undefined\n /**\n * Region code.\n */\n region_code?: string | undefined\n /**\n * Country code (2 letter, ISO 3166-1 alpha-2).\n */\n country?: string | undefined\n /**\n * Short country name.\n */\n country_name?: string | undefined\n /**\n * Country code (2 letter, ISO 3166-1 alpha-2).\n */\n country_code?: string | undefined\n /**\n * Country code (3 letter, ISO 3166-1 alpha-3).\n */\n country_code_iso3?: string | undefined\n /**\n * Capital of the country.\n */\n country_capital?: string | undefined\n /**\n * Country specific TLD (top-level domain).\n */\n country_tld?: string | undefined\n /**\n * Continent code.\n */\n continent_code?: string | undefined\n /**\n * Whether IP address belongs to a country that is a member of the European Union (EU).\n */\n in_eu?: boolean | undefined\n /**\n * Postal code / zip code.\n */\n postal?: string | undefined\n /**\n * Latitude coordinate.\n */\n latitude?: number | undefined\n /**\n * Longitude coordinate.\n */\n longitude?: number | undefined\n /**\n * Timezone (IANA format i.e. “Area/Location”).\n */\n timezone?: string | undefined\n /**\n * UTC offset (with daylight saving time) as `+HHMM` or `-HHMM` (HH is hours, MM is minutes).\n */\n utc_offset?: string | undefined\n /**\n * Country calling code (dial in code, comma separated).\n */\n country_calling_code?: string | undefined\n /**\n * Currency code (ISO 4217 format).\n */\n currency?: string | undefined\n /**\n * Currency name.\n */\n currency_name?: string | undefined\n /**\n * Languages spoken (comma separated 2 or 3 letter ISO 639 code with optional hyphen separated country suffix).\n */\n languages?: string | undefined\n /**\n * Area of the country (in sq km).\n */\n country_area?: number | undefined\n /**\n * Population of the country.\n */\n country_population?: number | undefined\n /**\n * Autonomous System Number.\n */\n asn?: string | undefined\n /**\n * Organization name.\n */\n org?: string | undefined\n /**\n * Host or domain name associated with the IP (*optional beta add-on, please contact us for details).\n */\n hostname?: string | undefined\n}\n/**\n * Get geographical information from IP address using ipapi.co API.\n *\n * @see {@link https://ipapi.co/}\n */\nexport const getGeoInfoFromIpapi = async (): Promise<GeoInfoFromIpapi> => {\n const response = await fetch(`https://ipapi.co/json/`, {\n method: 'GET',\n mode: 'cors',\n credentials: 'omit'\n })\n // oxlint-disable-next-line no-unsafe-type-assertion\n const geo = await response.json() as GeoInfoFromIpapi\n return geo\n}\n\n/**\n * 描述来自 ipify API 的公网 IP 信息。\n *\n * @example\n * ```\n * {\n * \"ip\": \"23.132.124.129\"\n * }\n * ```\n */\nexport interface GeoInfoFromIpify {\n ip: string\n}\n/**\n * Get public IP address using ipify API.\n *\n * @see {@link https://www.ipify.org/}\n */\nexport const getGeoInfoFromIpify = async (): Promise<GeoInfoFromIpify> => {\n const response = await fetch(\"https://api.ipify.org?format=json\", {\n method: 'GET',\n })\n // oxlint-disable-next-line no-unsafe-type-assertion\n const geo = await response.json() as GeoInfoFromIpify\n return geo\n}\n\n/**\n * Describe aggregated geolocation data from all providers.\n */\nexport interface GeoInfo {\n cloudflare: GeoInfoFromCloudflare\n ipapi: GeoInfoFromIpapi\n ipify: GeoInfoFromIpify\n}\n/**\n * Get geographical information from multiple sources.\n */\nexport const getGeoInfo = async (): Promise<GeoInfo> => {\n const [cloudflare, ipapi, ipify] = await Promise.all([\n getGeoInfoFromCloudflare(),\n getGeoInfoFromIpapi(),\n getGeoInfoFromIpify()\n ])\n return { cloudflare, ipapi, ipify }\n}\n",
|
|
118
|
-
"// Generated ESM version of ua-parser-js\n// DO NOT EDIT THIS FILE!\n// Source: /src/main/ua-parser.js\n\n/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v2.0.9\n Copyright © 2012-2026 Faisal Salman <f@faisalman.com>\n AGPLv3 License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://uaparser.dev\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n/* jshint esversion: 6 */ \n/* globals window */\n\n\n \n //////////////\n // Constants\n /////////////\n\n var LIBVERSION = '2.0.9',\n UA_MAX_LENGTH = 500,\n USER_AGENT = 'user-agent',\n EMPTY = '',\n UNKNOWN = '?',\n TYPEOF = {\n FUNCTION : 'function',\n OBJECT : 'object',\n STRING : 'string',\n UNDEFINED : 'undefined'\n },\n\n // properties\n BROWSER = 'browser',\n CPU = 'cpu',\n DEVICE = 'device',\n ENGINE = 'engine',\n OS = 'os',\n RESULT = 'result',\n\n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n MAJOR = 'major',\n MODEL = 'model',\n\n // device types\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n XR = 'xr',\n EMBEDDED = 'embedded',\n\n // browser types\n FETCHER = 'fetcher',\n INAPP = 'inapp',\n\n // client hints\n BRANDS = 'brands',\n FORMFACTORS = 'formFactors',\n FULLVERLIST = 'fullVersionList',\n PLATFORM = 'platform',\n PLATFORMVER = 'platformVersion',\n BITNESS = 'bitness',\n CH = 'sec-ch-ua',\n CH_FULL_VER_LIST= CH + '-full-version-list',\n CH_ARCH = CH + '-arch',\n CH_BITNESS = CH + '-' + BITNESS,\n CH_FORM_FACTORS = CH + '-form-factors',\n CH_MOBILE = CH + '-' + MOBILE,\n CH_MODEL = CH + '-' + MODEL,\n CH_PLATFORM = CH + '-' + PLATFORM,\n CH_PLATFORM_VER = CH_PLATFORM + '-version',\n CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],\n\n // device vendors\n AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LENOVO = 'Lenovo',\n HONOR = 'Honor',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n NVIDIA = 'Nvidia',\n ONEPLUS = 'OnePlus',\n OPPO = 'OPPO',\n SAMSUNG = 'Samsung',\n SHARP = 'Sharp',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n\n // browsers\n CHROME = 'Chrome',\n CHROMIUM = 'Chromium',\n CHROMECAST = 'Chromecast',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n OPERA = 'Opera',\n FACEBOOK = 'Facebook',\n SOGOU = 'Sogou',\n\n PREFIX_MOBILE = 'Mobile ',\n SUFFIX_BROWSER = ' Browser',\n\n // os\n WINDOWS = 'Windows';\n \n var isWindow = typeof window !== TYPEOF.UNDEFINED,\n NAVIGATOR = (isWindow && window.navigator) ? \n window.navigator : \n undefined,\n NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ? \n NAVIGATOR.userAgentData : \n undefined;\n\n ///////////\n // Helper\n //////////\n\n var extend = function (defaultRgx, extensions) {\n var mergedRgx = {};\n var extraRgx = extensions;\n if (!isExtensions(extensions)) {\n extraRgx = {};\n for (var i in extensions) {\n for (var j in extensions[i]) {\n extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);\n }\n }\n }\n for (var k in defaultRgx) {\n mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];\n }\n return mergedRgx;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i=0; i<arr.length; i++) {\n enums[arr[i].toUpperCase()] = arr[i];\n }\n return enums;\n },\n has = function (str1, str2) {\n if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {\n for (var i in str1) {\n if (lowerize(str2) == lowerize(str1[i])) return true;\n }\n return false;\n }\n return isString(str1) ? lowerize(str2) == lowerize(str1) : false;\n },\n isExtensions = function (obj, deep) {\n for (var prop in obj) {\n return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);\n }\n },\n isString = function (val) {\n return typeof val === TYPEOF.STRING;\n },\n itemListToArray = function (header) {\n if (!header) return undefined;\n var arr = [];\n var tokens = strip(/\\\\?\\\"/g, header).split(',');\n for (var i = 0; i < tokens.length; i++) {\n if (tokens[i].indexOf(';') > -1) {\n var token = trim(tokens[i]).split(';v=');\n arr[i] = { brand : token[0], version : token[1] };\n } else {\n arr[i] = trim(tokens[i]);\n }\n }\n return arr;\n },\n lowerize = function (str) {\n return isString(str) ? str.toLowerCase() : str;\n },\n majorize = function (version) {\n return isString(version) ? strip(/[^\\d\\.]/g, version).split('.')[0] : undefined;\n },\n setProps = function (arr) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n\n var propName = arr[i];\n if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {\n this[propName[0]] = propName[1];\n } else {\n this[propName] = undefined;\n }\n }\n return this;\n },\n strip = function (pattern, str) {\n return isString(str) ? str.replace(pattern, EMPTY) : str;\n },\n stripQuotes = function (str) {\n return strip(/\\\\?\\\"/g, str); \n },\n trim = function (str, len) {\n str = strip(/^\\s\\s*/, String(str));\n return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);\n };\n\n ///////////////\n // Map helper\n //////////////\n\n var rgxMapper = function (ua, arrays) {\n\n if(!ua || !arrays) return;\n\n var i = 0, j, k, p, q, matches, match;\n\n // loop through all regexes maps\n while (i < arrays.length && !matches) {\n\n var regex = arrays[i], // even sequence (0,2,4,..)\n props = arrays[i + 1]; // odd sequence (1,3,5,..)\n j = k = 0;\n\n // try matching uastring with regexes\n while (j < regex.length && !matches) {\n\n if (!regex[j]) { break; }\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n // check if given property is actually array\n if (typeof q === TYPEOF.OBJECT && q.length > 0) {\n if (q.length === 2) {\n if (typeof q[1] == TYPEOF.FUNCTION) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length >= 3) {\n // Check whether q[1] FUNCTION or REGEX\n if (typeof q[1] === TYPEOF.FUNCTION && !(q[1].exec && q[1].test)) {\n if (q.length > 3) {\n this[q[0]] = match ? q[1].apply(this, q.slice(2)) : undefined;\n } else {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n }\n } else {\n if (q.length == 3) {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n } else if (q.length == 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n } else if (q.length > 4) {\n this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : undefined;\n }\n }\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return map.hasOwnProperty('*') ? map['*'] : str;\n };\n\n ///////////////\n // String map\n //////////////\n\n var windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.51': '3.51',\n 'NT 4.0': '4.0',\n '2000' : ['5.0', '5.01'],\n 'XP' : ['5.1', '5.2'],\n 'Vista' : '6.0',\n '7' : '6.1',\n '8' : '6.2',\n '8.1' : '6.3',\n '10' : ['6.4', '10.0'],\n 'NT' : ''\n },\n \n formFactorsMap = {\n 'embedded' : 'Automotive',\n 'mobile' : 'Mobile',\n 'tablet' : ['Tablet', 'EInk'],\n 'smarttv' : 'TV',\n 'wearable' : 'Watch',\n 'xr' : ['VR', 'XR'],\n '?' : ['Desktop', 'Unknown'],\n '*' : undefined\n },\n\n browserHintsMap = {\n 'Chrome' : 'Google Chrome',\n 'Edge' : 'Microsoft Edge',\n 'Edge WebView2' : 'Microsoft Edge WebView2',\n 'Chrome WebView': 'Android WebView',\n 'Chrome Headless':'HeadlessChrome',\n 'Huawei Browser': 'HuaweiBrowser',\n 'MIUI Browser' : 'Miui Browser',\n 'Opera Mobi' : 'OperaMobile',\n 'Yandex' : 'YaBrowser'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var defaultRegexes = {\n\n browser : [[\n\n // Most common regardless engine\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [\n /webview.+edge\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, EDGE+' WebView']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i \n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bop(?:rg)?x\\/([\\w\\.]+)/i // Opera GX\n ], [VERSION, [NAME, OPERA+' GX']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /\\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\\/ ]?([\\w\\.]+)/i // Baidu\n ], [VERSION, [NAME, 'Baidu']], [\n /\\b(?:mxbrowser|mxios|myie2)\\/?([-\\w\\.]*)\\b/i // Maxthon\n ], [VERSION, [NAME, 'Maxthon']], [\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\\/ ]?([\\w\\.]*)/i, \n // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir\n // Trident based\n /(avant|iemobile|slim(?:browser|boat|jet))[\\/ ]?([\\d\\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon/HiBrowser\n /(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\\/v?([-\\w\\.]+)/i,\n // Atlas/Rekonq/Puffin/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon\n /(brave)(?: chrome)?\\/([\\d\\.]+)/i, // Brave\n /(aloha|heytap|ovi|115|surf|qwant)browser\\/([\\d\\.]+)/i, // Aloha/HeyTap/Ovi/115/Surf\n /(qwant)(?:ios|mobile)\\/([\\d\\.]+)/i, // Qwant\n /(ecosia|weibo)(?:__| \\w+@)([\\d\\.]+)/i // Ecosia/Weibo\n ], [NAME, VERSION], [\n /quark(?:pc)?\\/([-\\w\\.]+)/i // Quark\n ], [VERSION, [NAME, 'Quark']], [\n /\\bddg\\/([\\w\\.]+)/i // DuckDuckGo\n ], [VERSION, [NAME, 'DuckDuckGo']], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UCBrowser']], [\n /microm.+\\bqbcore\\/([\\w\\.]+)/i, // WeChat Desktop for Windows Built-in Browser\n /\\bqbcore\\/([\\w\\.]+).+microm/i,\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /ya(?:search)?browser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /slbrowser\\/([\\w\\.]+)/i // Smart Lenovo Browser\n ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [\n /(av(?:ast|g|ira))\\/([\\w\\.]+)/i // Avast/AVG/Avira Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [\n /norton\\/([\\w\\.]+)/i // Norton Private Browser\n ], [VERSION, [NAME, 'Norton Private' + SUFFIX_BROWSER]], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n / mms\\/([\\w\\.]+)$/i // Opera Neon\n ], [VERSION, [NAME, OPERA+' Neon']], [\n / opt\\/([\\w\\.]+)$/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [\n /fxios\\/([\\w\\.-]+)/i // Firefox for iOS\n ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [\n /\\bqihoobrowser\\/?([\\w\\.]*)/i // 360\n ], [VERSION, [NAME, '360']], [\n /\\b(qq)\\/([\\w\\.]+)/i // QQ\n ], [[NAME, /(.+)/, '$1Browser'], VERSION], [\n /(oculus|sailfish|huawei|vivo|pico)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser\n /samsungbrowser\\/([\\w\\.]+)/i // Samsung Internet\n ], [VERSION, [NAME, SAMSUNG + ' Internet']], [\n /metasr[\\/ ]?([\\d\\.]+)/i // Sogou Explorer\n ], [VERSION, [NAME, SOGOU + ' Explorer']], [\n /(sogou)mo\\w+\\/([\\d\\.]+)/i // Sogou Mobile\n ], [[NAME, SOGOU + ' Mobile'], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|2345(?=browser|chrome|explorer))\\w*[\\/ ]?v?([\\w\\.]+)/i // QQ/2345\n ], [NAME, VERSION], [\n /(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i // LieBao Browser/Luakit/Rekonq/Steam\n ], [NAME], [\n /ome\\/([\\w\\.]+).+(iron(?= saf)|360(?=[es]e$))/i // Iron / 360\n ], [VERSION, NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]], [\n /(kakao(?:talk|story))[\\/ ]([\\w\\.]+)/i, // Kakao App\n /(naver)\\(.*?(\\d+\\.[\\w\\.]+).*\\)/i, // Naver InApp\n /(daum)apps[\\/ ]([\\w\\.]+)/i, // Daum App\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(alipay)client\\/([\\w\\.]+)/i, // Alipay\n /(twitter)(?:and| f.+e\\/([\\w\\.]+))/i, // Twitter\n /(bing)(?:web|sapphire)\\/([\\w\\.]+)/i, // Bing\n /(instagram|snapchat|klarna)[\\/ ]([-\\w\\.]+)/i // Instagram/Snapchat/Klarna\n ], [NAME, VERSION, [TYPE, INAPP]], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [\n /(?:musical_ly|trill)(?:.+app_?version\\/|_)([\\w\\.]+)/i // TikTok\n ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [\n /\\[(linkedin)app\\]/i // LinkedIn App for iOS & Android\n ], [NAME, [TYPE, INAPP]], [\n /(zalo(?:app)?)[\\/\\sa-z]*([\\w\\.-]+)/i // Zalo \n ], [[NAME, /(.+)/, 'Zalo'], VERSION, [TYPE, INAPP]], [\n\n /(chromium)[\\/ ]([-\\w\\.]+)/i // Chromium\n ], [NAME, VERSION], [\n\n /ome-(lighthouse)$/i // Chrome Lighthouse\n ], [NAME, [TYPE, FETCHER]], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n /wv\\).+chrome\\/([\\w\\.]+).+edgw\\//i // Edge WebView2\n ], [VERSION, [NAME, EDGE+' WebView2']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [\n\n /chrome\\/([\\w\\.]+) mobile/i // Chrome Mobile\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.\\,]+) .*mobile(?:\\/\\w+ | ?)safari/i // Safari Mobile\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [\n /iphone .*mobile(?:\\/\\w+ | ?)safari/i\n ], [[NAME, PREFIX_MOBILE + 'Safari']], [\n /version\\/([\\w\\.\\,]+) .*(safari)/i // Safari\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, '1']], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(?:mobile|tablet);.*(firefox)\\/([\\w\\.-]+)/i // Firefox Mobile\n ], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /(wolvic|librewolf)\\/([\\w\\.]+)/i // Wolvic/LibreWolf\n ], [NAME, VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+(?= .+rv\\:.+gecko\\/\\d+)|[0-4][\\w\\.]+(?!.+compatible))/i, // Mozilla\n\n // Other\n /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird\n /\\b(links) \\(([\\w\\.]+)/i // Links\n ], [NAME, [VERSION, /_/g, '.']], [\n \n /(cobalt)\\/([\\w\\.]+)/i // Cobalt\n ], [NAME, [VERSION, /[^\\d\\.]+./, EMPTY]]\n ],\n\n cpu : [[\n\n /\\b((amd|x|x86[-_]?|wow|win)64)\\b/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i, // IA32 (quicktime)\n /\\b((i[346]|x)86)(pc)?\\b/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?[89]e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /( (ce|mobile); ppc;|\\/[\\w\\.]+arm\\b)/i\n ], [[ARCHITECTURE, 'arm']], [\n\n / sun4\\w[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n /\\b(avr32|ia64(?=;)|68k(?=\\))|\\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\\b|pa-risc)/i,\n /((ppc|powerpc)(64)?)( mac|;|\\))/i, // PowerPC\n /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i // Alpha\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n /mc680.0/i\n ], [[ARCHITECTURE, '68k']], [\n /winnt.+\\[axp/i\n ], [[ARCHITECTURE, 'alpha']]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[ptx]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-(?![lr])\\w+|sc[g-]?[\\d]+a?|galaxy nexus)/i,\n /samsung[- ]((?!sm-[lr]|browser)[-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /(?:\\/|\\()(ip(?:hone|od)[\\w, ]*)[\\/\\);]/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\b(?:ios|apple\\w+)\\/.+[\\(\\/](ipad)/i, // iPad\n /\\b(ipad)[\\d,]*[;\\] ].+(mac |i(pad)?)os/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n /(macintosh);/i\n ], [MODEL, [VENDOR, APPLE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [\n\n // Honor\n /\\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\\)|;)/i\n ], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [\n /honor([-\\w ]+)[;\\)]/i\n ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [\n\n // Huawei\n /\\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\\w\\. ]*(?= bui|\\)))\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei) ?([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}e?-[atu]?[ln][\\dx][\\dc][adnt]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /oid[^\\)]+; (2[\\dbc]{4}(182|283|rp\\w{2})[cgl]|m2105k81a?c)(?: bui|\\))/i,\n /\\b(?:xiao)?((?:red)?mi[-_ ]?pad[\\w- ]*)(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n // Xiaomi Redmi / POCO / Black Shark / Qin\n /oid[^\\)]+; (redmi[\\-_ ]?(?:note|k)?[\\w_ ]+|m?[12]\\d[01]\\d\\w{3,6}|poco[\\w ]+|(shark )?\\w{3}-[ah]0|qin ?[1-3](s\\+|ultra| pro)?)( bui|; wv|\\))/i,\n // Xiaomi Mi\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\\d{0,2}\\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\\))/i,\n / ([\\w ]+) miui\\/v?\\d/i\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n\n // OnePlus\n /droid.+; (cph2[3-6]\\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\\d|p[g-l]\\w[1m]10)\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007|a101op)\\b/i\n ], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [\n /\\b(opd2(\\d{3}a?))(?: bui|\\))/i\n ], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['203', '304', '403', '404', '413', '415'], '*' : OPPO }], [TYPE, TABLET]], [\n\n // BLU\n /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\\w\\+ ]*)(?: bui|\\))/i // Vivo series\n ], [MODEL, [VENDOR, 'BLU'], [TYPE, MOBILE]], [ \n\n // Vivo\n /; vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[1-3]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\\d{3,4}(?:f[cu]|xu|[av])|yt\\d?-[jx]?\\d+[lfmx])( bui|;|\\)|\\/)/i,\n /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\\w- ]+?)|tb[\\w-]{6,7})( bui|;|\\)|\\/)/i\n ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [ \n /lenovo[-_ ]?([-\\w ]+?)(?: bui|\\)|\\/)/i\n ], [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ]([\\w\\s]+)(\\)| bui)/i,\n /((?:moto(?! 360)[-\\w\\(\\) ]+|xt\\d{3,4}[cgkosw\\+]?[-\\d]*|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /\\b(?:lg)?([vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Nokia\n /(nokia) (t[12][01])/i\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n /(?:maemo|nokia).*(n900|lumia \\d+|rm-\\d+)/i,\n /nokia[-_ ]?(([-\\w\\. ]*?))( bui|\\)|;|\\/)/i\n ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [\n\n // Google\n /(pixel (c|tablet))\\b/i // Google Pixel C/Tablet\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n // Google Pixel\n /droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\\d ]*a?( pro)?( xl)?( fold)?( \\(5g\\))?)( bui|\\))/i\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n /(google) (pixelbook( go)?)/i\n ], [VENDOR, MODEL], [\n\n // Sony\n /droid.+; (a?\\d[0-2]{2}so|[c-g]\\d{4}|so[-gl]\\w+|xq-\\w\\w\\d\\d)(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi|aeo(?!bc)\\w\\w)( bui|\\))/i, // Kindle Fire without Silk / Echo Show\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /(?:blackberry|\\(bb10;) (\\w+)/i\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\\.))|sony(?!-bra))[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // TCL\n /tcl (xess p17aa)/i,\n /droid [\\w\\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\\w(\\w|\\w\\w))?(\\)| bui)/i\n ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [\n /droid [\\w\\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\\w(\\w|\\w\\w))?(\\)| bui)/i\n ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [\n\n // itel\n /(itel) ((\\w+))/i\n ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n \n // Ulefone\n /; ((?:power )?armor(?:[\\w ]{0,8}))(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [\n\n // Energizer\n /; (energy ?\\w+)(?: bui|\\))/i,\n /; energizer ([\\w ]+)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [\n\n // Cat\n /; cat (b35);/i,\n /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [\n\n // Smartfren\n /((?:new )?andromax[\\w- ]+)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [\n\n // Nothing\n /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i\n ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [\n\n // Archos\n /; (x67 5g|tikeasy \\w+|ac[1789]\\d\\w+)( b|\\))/i,\n /archos ?(5|gamepad2?|([\\w ]*[t1789]|hello) ?\\d+[\\w ]*)( b|\\))/i\n ], [MODEL, [VENDOR, 'Archos'], [TYPE, TABLET]], [\n /archos ([\\w ]+)( b|\\))/i,\n /; (ac[3-6]\\d\\w{2,8})( b|\\))/i \n ], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [\n\n // HMD\n /; (n159v)/i\n ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [\n\n // MIXED\n /(imo) (tab \\w+)/i, // IMO\n /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i // Infinix XPad / Tecno\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan\n // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko\n /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\\w\\+ ]+?)(?: bui|\\)|; r)/i,\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(oppo) ?([\\w ]+) bui/i, // OPPO\n /(hisense) ([ehv][\\w ]+)\\)/i, // Hisense\n /droid[^;]+; (philips)[_ ]([sv-x][\\d]{3,4}[xz]?)/i // Philips\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(kobo)\\s(ereader|touch)/i, // Kobo\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i // Kindle\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /((?:tegranote|shield t(?!.+d tv))[\\w- ]*?)(?: b|\\))/i // Nvidia Tablets\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /(philips)[\\w ]+tv/i, // Philips\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(vizio)(?: |.+model\\/)(\\w+-\\w+)/i, // Vizio\n /tcast.+(lg)e?. ([-\\w]+)/i // LG SmartTV\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey.*devicetype\\/chromecast/i // Google Chromecast Third Generation\n ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /crkey.*devicetype\\/([^/]*)/i // Google Chromecast with specific device type\n ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /fuchsia.*crkey/i // Google Chromecast Nest Hub\n ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast, Linux-based or unknown\n ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /(portaltv)/i // Facebook Portal TV\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]], [\n /droid.+aft(\\w+)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /(shield \\w+ tv)/i // Nvidia Shield TV\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i,\n /(aquos-tv[\\w ]+)\\)/i // Sharp\n ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[\n /(bravia[\\w ]+)( bui|\\))/i // Sony\n ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [\n /(mi(tv|box)-?\\w+) bui/i // Xiaomi\n ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [\n /Hbbtv.*(technisat) (.*);/i // TechniSAT\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w\\+ ]*; *([\\w\\d][^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, /.+\\/(\\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(playstation \\w+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n /(ouya)/i, // Ouya\n /(nintendo) (\\w+)/i, // Nintendo\n /(retroid) (pocket ([^\\)]+))/i, // Retroid Pocket\n /(valve).+(steam deck)/i,\n /droid.+; ((shield|rgcube|gr0006))( bui|\\))/i // Nvidia Portable/Anbernic/Logitech\n ], [[VENDOR, strMapper, { 'Nvidia': 'Shield', 'Anbernic': 'RGCUBE', 'Logitech': 'GR0006' }], MODEL, [TYPE, CONSOLE]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /\\b(sm-[lr]\\d\\d[0156][fnuw]?s?|gear live)\\b/i // Samsung Galaxy Watch\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [\n /((pebble))app/i, // Pebble\n /(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\\w ]*)( bui|\\))/i // Asus ZenWatch / LG Watch / Pixel Watch / Xiaomi Watch\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch\n ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [\n /(watch)(?: ?os[,\\/]|\\d,\\d\\/)[\\d\\.]+/i // Apple Watch\n ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [\n /(opwwe\\d{3})/i // OnePlus Watch\n ], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [\n /(moto 360)/i // Motorola 360\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [\n /(smartwatch 3)/i // Sony SmartWatch\n ], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [\n /(g watch r)/i // LG G Watch R\n ], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n\n ///////////////////\n // XR\n ///////////////////\n\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [\n /(pico) ([\\w ]+) os\\d/i // Pico\n ], [VENDOR, MODEL, [TYPE, XR]], [\n /(quest( \\d| pro)?s?).+vr/i // Meta Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [\n /mobile vr; rv.+firefox/i // Unidentifiable VR device using Firefox Reality / Wolvic\n ], [[TYPE, XR]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n /(aeobc)\\b/i // Echo Dot\n ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [\n /(homepod).+mac os/i // Apple HomePod\n ], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [\n /windows iot/i // Unidentifiable embedded device using Windows IoT\n ], [[TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid.+; ([\\w- ]+) (4k|android|smart|google)[- ]?tv/i // Unidentifiable SmartTV\n ], [MODEL, [TYPE, SMARTTV]], [\n /\\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\\w ]+safari)\\b/i\n ], [[TYPE, SMARTTV]], [\n /droid .+?; ([^;]+?)(?: bui|; wv\\)|\\) applew|; hmsc).+?(mobile|vr|\\d) safari/i\n ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| [ \\w\\/\\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /droid .+?; ([\\w\\. -]+)( bui|\\))/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /(arkweb)\\/([\\w\\.]+)/i // ArkWeb\n ], [NAME, VERSION], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links|dillo)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links/Dillo\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i, // iCab\n\n /\\b(libweb)/i // LibWeb\n ], [NAME, VERSION], [\n /ladybird\\//i\n ], [[NAME, 'LibWeb']], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /(windows nt) (6\\.[23]); arm/i // Windows RT\n ], [[NAME, /N/, 'R'], [VERSION, strMapper, windowsVersionMap]], [\n /(windows (?:phone|mobile|iot))(?: os)?[\\/ ]?([\\d\\.]*( se)?)/i, // Windows IoT/Mobile/Phone\n // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11\n /(windows)[\\/ ](1[01]|2000|3\\.1|7|8(\\.1)?|9[58]|me|server 20\\d\\d( r2)?|vista|xp)/i\n ], [NAME, VERSION], [\n /windows nt ?([\\d\\.\\)]*)(?!.+xbox)/i,\n /\\bwin(?=3| ?9|n)(?:nt| 9x )?([\\d\\.;]*)/i\n ], [[VERSION, /(;|\\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], [\n /(windows ce)\\/?([\\d\\.]*)/i // Windows CE\n ], [NAME, VERSION], [\n\n // iOS/macOS\n /[adehimnop]{4,7}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\\/ ]([\\w\\.]+)/i,\n /\\btvos ?([\\w\\.]+)/i,\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+(haiku|morphos))/i // Mac OS\n ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [\n\n // Google Chromecast\n /android ([\\d\\.]+).*crkey/i // Google Chromecast, Android-based\n ], [VERSION, [NAME, CHROMECAST + ' Android']], [\n /fuchsia.*crkey\\/([\\d\\.]+)/i // Google Chromecast, Fuchsia-based\n ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [\n /crkey\\/([\\d\\.]+).*devicetype\\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker\n ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [\n /linux.*crkey\\/([\\d\\.]+)/i // Google Chromecast, Legacy Linux-based\n ], [VERSION, [NAME, CHROMECAST + ' Linux']], [\n /crkey\\/([\\d\\.]+)/i // Google Chromecast, unknown\n ], [VERSION, [NAME, CHROMECAST]], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86)/i // Android-x86\n ], [VERSION, NAME], [ \n /(ubuntu) ([\\w\\.]+) like android/i // Ubuntu Touch\n ], [[NAME, /(.+)/, '$1 Touch'], VERSION], [\n /(harmonyos)[\\/ ]?([\\d\\.]*)/i, // HarmonyOS\n // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen\n /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\\w*[-\\/\\.; ]?([\\d\\.]*)/i\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile[;\\w ]*|tablet|tv|[^\\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\\w\\.]+)\\).+gecko\\//i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i, // WebOS\n /webos(?:[ \\/]?|\\.tv-20(?=2[2-9]))(\\d[\\d\\.]*)/i\n ], [VERSION, [NAME, 'webOS']], [\n /web0s;.+?(?:chr[o0]me|safari)\\/(\\d+)/i\n // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine\n ], [[VERSION, strMapper, {'25':'120','24':'108','23':'94','22':'87','6':'79','5':'68','4':'53','3':'38','2':'538','1':'537','*':'TV'}], [NAME, 'webOS']], [ \n /watch(?: ?os[,\\/ ]|\\d,\\d\\/)([\\d\\.]+)/i // watchOS\n ], [VERSION, [NAME, 'watchOS']], [\n\n // Google ChromeOS\n /cros [\\w]+(?:\\)| ([\\w\\.]+)\\b)/i // Chromium OS\n ], [VERSION, [NAME, 'Chrome OS']],[\n\n // Smart TVs\n /kepler ([\\w\\.]+); (aft|aeo)/i // Vega OS\n ], [VERSION, [NAME, 'Vega OS']],[\n /(netrange)mmh/i, // Netrange\n /(nettv)\\/(\\d+\\.[\\w\\.]+)/i, // NetTV\n\n // Console\n /(nintendo|playstation) (\\w+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n /(pico) .+os([\\w\\.]+)/i, // Pico\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /linux.+(mint)[\\/\\(\\) ]?([\\w\\.]*)/i, // Mint\n /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\\d\\.]*)/i, // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /\\b(aix)[; ]([1-9\\.]{0,4})/i, // AIX\n /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\\w*| ?)([\\w\\.]*)/i, // Hurd/Linux/MorphOS\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) ?(r\\d)?/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\d\\.]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /\\b(beos|os\\/2|amigaos|openvms|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Factories\n ////////////////\n\n var defaultProps = (function () {\n var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};\n setProps.call(props.init, [\n [BROWSER, [NAME, VERSION, MAJOR, TYPE]],\n [CPU, [ARCHITECTURE]],\n [DEVICE, [TYPE, MODEL, VENDOR]],\n [ENGINE, [NAME, VERSION]],\n [OS, [NAME, VERSION]]\n ]);\n setProps.call(props.isIgnore, [\n [BROWSER, [VERSION, MAJOR]],\n [ENGINE, [VERSION]],\n [OS, [VERSION]]\n ]);\n setProps.call(props.isIgnoreRgx, [\n [BROWSER, / ?browser$/i],\n [OS, / ?os$/i]\n ]);\n setProps.call(props.toString, [\n [BROWSER, [NAME, VERSION]],\n [CPU, [ARCHITECTURE]],\n [DEVICE, [VENDOR, MODEL]],\n [ENGINE, [NAME, VERSION]],\n [OS, [NAME, VERSION]]\n ]);\n return props;\n })();\n\n var createIData = function (item, itemType) {\n\n var init_props = defaultProps.init[itemType],\n is_ignoreProps = defaultProps.isIgnore[itemType] || 0,\n is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0,\n toString_props = defaultProps.toString[itemType] || 0;\n\n function IData () {\n setProps.call(this, init_props);\n }\n\n IData.prototype.getItem = function () {\n return item;\n };\n\n IData.prototype.withClientHints = function () {\n\n // nodejs / non-client-hints browsers\n if (!NAVIGATOR_UADATA) {\n return item\n .parseCH()\n .get();\n }\n\n // browsers based on chromium 85+\n return NAVIGATOR_UADATA\n .getHighEntropyValues(CH_ALL_VALUES)\n .then(function (res) {\n return item\n .setCH(new UACHData(res, false))\n .parseCH()\n .get();\n });\n };\n\n IData.prototype.withFeatureCheck = function () {\n return item.detectFeature().get();\n };\n\n if (itemType != RESULT) {\n IData.prototype.is = function (strToCheck) {\n var is = false;\n for (var i in this) {\n if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {\n is = true;\n if (strToCheck != TYPEOF.UNDEFINED) break;\n } else if (strToCheck == TYPEOF.UNDEFINED && is) {\n is = !is;\n break;\n }\n }\n return is;\n };\n IData.prototype.toString = function () {\n var str = EMPTY;\n for (var i in toString_props) {\n if (typeof(this[toString_props[i]]) !== TYPEOF.UNDEFINED) {\n str += (str ? ' ' : EMPTY) + this[toString_props[i]];\n }\n }\n return str || TYPEOF.UNDEFINED;\n };\n }\n\n IData.prototype.then = function (cb) { \n var that = this;\n var IDataResolve = function () {\n for (var prop in that) {\n if (that.hasOwnProperty(prop)) {\n this[prop] = that[prop];\n }\n }\n };\n IDataResolve.prototype = {\n is : IData.prototype.is,\n toString : IData.prototype.toString,\n withClientHints : IData.prototype.withClientHints,\n withFeatureCheck : IData.prototype.withFeatureCheck\n };\n var resolveData = new IDataResolve();\n cb(resolveData);\n return resolveData;\n };\n\n return new IData();\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n function UACHData (uach, isHttpUACH) {\n uach = uach || {};\n setProps.call(this, CH_ALL_VALUES);\n if (isHttpUACH) {\n setProps.call(this, [\n [BRANDS, itemListToArray(uach[CH])],\n [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],\n [MOBILE, /\\?1/.test(uach[CH_MOBILE])],\n [MODEL, stripQuotes(uach[CH_MODEL])],\n [PLATFORM, stripQuotes(uach[CH_PLATFORM])],\n [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],\n [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],\n [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],\n [BITNESS, stripQuotes(uach[CH_BITNESS])]\n ]);\n } else {\n for (var prop in uach) {\n if(this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];\n }\n }\n }\n\n function UAItem (itemType, ua, rgxMap, uaCH) {\n setProps.call(this, [\n ['itemType', itemType],\n ['ua', ua],\n ['uaCH', uaCH],\n ['rgxMap', rgxMap],\n ['data', createIData(this, itemType)]\n ]);\n return this;\n }\n\n UAItem.prototype.get = function (prop) {\n if (!prop) return this.data;\n return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;\n };\n\n UAItem.prototype.set = function (prop, val) {\n this.data[prop] = val;\n return this;\n };\n\n UAItem.prototype.setCH = function (ch) {\n this.uaCH = ch;\n return this;\n };\n\n UAItem.prototype.detectFeature = function () {\n if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {\n switch (this.itemType) {\n case BROWSER:\n // Brave-specific detection\n if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {\n this.set(NAME, 'Brave');\n }\n break;\n case DEVICE:\n // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData\n if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {\n this.set(TYPE, MOBILE);\n }\n // iPadOS-specific detection: identified as Mac, but has some iOS-only properties\n if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {\n this.set(MODEL, 'iPad')\n .set(TYPE, TABLET);\n }\n break;\n case OS:\n // Chrome-specific detection: check for 'platform' value of navigator.userAgentData\n if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {\n this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);\n }\n break;\n case RESULT:\n var data = this.data;\n var detect = function (itemType) {\n return data[itemType]\n .getItem()\n .detectFeature()\n .get();\n };\n this.set(BROWSER, detect(BROWSER))\n .set(CPU, detect(CPU))\n .set(DEVICE, detect(DEVICE))\n .set(ENGINE, detect(ENGINE))\n .set(OS, detect(OS));\n }\n }\n return this;\n };\n\n UAItem.prototype.parseUA = function () {\n if (this.itemType != RESULT) {\n rgxMapper.call(this.data, this.ua, this.rgxMap);\n }\n switch (this.itemType) {\n case BROWSER:\n this.set(MAJOR, majorize(this.get(VERSION)));\n break;\n case OS:\n if (this.get(NAME) == 'iOS' && this.get(VERSION) == '18.6') {\n // Based on the assumption that iOS version is tightly coupled with Safari version\n var realVersion = /\\) Version\\/([\\d\\.]+)/.exec(this.ua); // Get Safari version\n if (realVersion && parseInt(realVersion[1].substring(0,2), 10) >= 26) {\n this.set(VERSION, realVersion[1]); // Set as iOS version\n }\n }\n break;\n }\n return this;\n };\n\n UAItem.prototype.parseCH = function () {\n var uaCH = this.uaCH,\n rgxMap = this.rgxMap;\n\n switch (this.itemType) {\n case BROWSER:\n case ENGINE:\n var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;\n if (brands) {\n for (var i=0; i<brands.length; i++) {\n var brandName = brands[i].brand || brands[i],\n brandVersion = brands[i].version;\n if (this.itemType == BROWSER && \n !/not.a.brand/i.test(brandName) && \n (!prevName || \n (/Chrom/.test(prevName) && brandName != CHROMIUM) || \n (prevName == EDGE && /WebView2/.test(brandName))\n )) {\n brandName = strMapper(brandName, browserHintsMap);\n prevName = this.get(NAME);\n if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {\n this.set(NAME, brandName)\n .set(VERSION, brandVersion)\n .set(MAJOR, majorize(brandVersion));\n }\n prevName = brandName;\n }\n if (this.itemType == ENGINE && brandName == CHROMIUM) {\n this.set(VERSION, brandVersion);\n }\n }\n }\n break;\n case CPU:\n var archName = uaCH[ARCHITECTURE];\n if (archName) {\n if (archName && uaCH[BITNESS] == '64') archName += '64';\n rgxMapper.call(this.data, archName + ';', rgxMap);\n }\n break;\n case DEVICE:\n if (uaCH[MOBILE]) {\n this.set(TYPE, MOBILE);\n }\n if (uaCH[MODEL]) {\n this.set(MODEL, uaCH[MODEL]);\n if (!this.get(TYPE) || !this.get(VENDOR)) {\n var reParse = {};\n rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);\n if (!this.get(TYPE) && !!reParse.type) {\n this.set(TYPE, reParse.type);\n }\n if (!this.get(VENDOR) && !!reParse.vendor) {\n this.set(VENDOR, reParse.vendor);\n }\n }\n }\n if (uaCH[FORMFACTORS]) {\n var ff;\n if (typeof uaCH[FORMFACTORS] !== 'string') {\n var idx = 0;\n while (!ff && idx < uaCH[FORMFACTORS].length) {\n ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);\n }\n } else {\n ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);\n }\n this.set(TYPE, ff);\n }\n break;\n case OS:\n var osName = uaCH[PLATFORM];\n if(osName) {\n var osVersion = uaCH[PLATFORMVER];\n if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');\n this.set(NAME, osName)\n .set(VERSION, osVersion);\n }\n // Xbox-Specific Detection\n if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {\n this.set(NAME, 'Xbox')\n .set(VERSION, undefined);\n } \n break;\n case RESULT:\n var data = this.data;\n var parse = function (itemType) {\n return data[itemType]\n .getItem()\n .setCH(uaCH)\n .parseCH()\n .get();\n };\n this.set(BROWSER, parse(BROWSER))\n .set(CPU, parse(CPU))\n .set(DEVICE, parse(DEVICE))\n .set(ENGINE, parse(ENGINE))\n .set(OS, parse(OS));\n }\n return this;\n };\n\n function UAParser (ua, extensions, headers) {\n\n if (typeof ua === TYPEOF.OBJECT) {\n if (isExtensions(ua, true)) {\n if (typeof extensions === TYPEOF.OBJECT) {\n headers = extensions; // case UAParser(extensions, headers) \n }\n extensions = ua; // case UAParser(extensions)\n } else {\n headers = ua; // case UAParser(headers)\n extensions = undefined;\n }\n ua = undefined;\n } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {\n headers = extensions; // case UAParser(ua, headers)\n extensions = undefined;\n }\n\n if (headers) {\n if (typeof headers.append === TYPEOF.FUNCTION) {\n // Convert Headers object into a plain object\n var kv = {};\n headers.forEach(function (v, k) { kv[String(k).toLowerCase()] = v; });\n headers = kv;\n } else {\n // Normalize headers field name into lowercase\n var normalized = {};\n for (var header in headers) {\n if (headers.hasOwnProperty(header)) {\n normalized[String(header).toLowerCase()] = headers[header];\n }\n }\n headers = normalized;\n }\n }\n \n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions, headers).getResult();\n }\n\n var userAgent = typeof ua === TYPEOF.STRING ? ua : // Passed user-agent string\n (headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers\n ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent\n EMPTY)), // empty string\n\n httpUACH = new UACHData(headers, true),\n regexMap = extensions ? \n extend(defaultRegexes, extensions) : \n defaultRegexes,\n\n createItemFunc = function (itemType) {\n if (itemType == RESULT) {\n return function () {\n return new UAItem(itemType, userAgent, regexMap, httpUACH)\n .set('ua', userAgent)\n .set(BROWSER, this.getBrowser())\n .set(CPU, this.getCPU())\n .set(DEVICE, this.getDevice())\n .set(ENGINE, this.getEngine())\n .set(OS, this.getOS())\n .get();\n };\n } else {\n return function () {\n return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH)\n .parseUA()\n .get();\n };\n }\n };\n \n // public methods\n setProps.call(this, [\n ['getBrowser', createItemFunc(BROWSER)],\n ['getCPU', createItemFunc(CPU)],\n ['getDevice', createItemFunc(DEVICE)],\n ['getEngine', createItemFunc(ENGINE)],\n ['getOS', createItemFunc(OS)],\n ['getResult', createItemFunc(RESULT)],\n ['getUA', function () { return userAgent; }],\n ['setUA', function (ua) {\n if (isString(ua)) userAgent = trim(ua, UA_MAX_LENGTH);\n return this;\n }]\n ])\n .setUA(userAgent);\n\n return this;\n }\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR, TYPE]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n export {UAParser};",
|
|
119
|
-
"// Generated ESM version of ua-parser-js/enums\n// DO NOT EDIT THIS FILE!\n// Source: /src/enums/ua-parser-enums.js\n\n///////////////////////////////////////////////\n/* Enums for UAParser.js v2.0.9\n https://github.com/faisalman/ua-parser-js\n Author: Faisal Salman <f@faisalman.com>\n AGPLv3 License */\n//////////////////////////////////////////////\n\n/*jshint esversion: 6 */ \n\nconst BrowserName = Object.freeze({\n '115': '115',\n '2345': '2345',\n '360': '360',\n ALIPAY: 'Alipay',\n ALOHA: 'Aloha',\n AMAYA: 'Amaya',\n ANDROID: 'Android Browser',\n ARORA: 'Arora',\n ATLAS: 'Atlas',\n AVANT: 'Avant',\n AVAST: 'Avast Secure Browser',\n AVG: 'AVG Secure Browser',\n AVIRA: 'Avira Secure Browser',\n BAIDU: 'Baidu Browser',\n BASILISK: 'Basilisk',\n BING: 'Bing',\n BLAZER: 'Blazer',\n BOLT: 'Bolt',\n BOWSER: 'Bowser',\n BRAVE: 'Brave',\n CAMINO: 'Camino',\n CHIMERA: 'Chimera',\n CHROME: 'Chrome',\n CHROME_HEADLESS: 'Chrome Headless',\n CHROME_MOBILE: 'Mobile Chrome',\n CHROME_WEBVIEW: 'Chrome WebView',\n CHROMIUM: 'Chromium',\n COBALT: 'Cobalt',\n COC_COC: 'Coc Coc',\n CONKEROR: 'Conkeror',\n DAUM: 'Daum',\n DILLO: 'Dillo',\n DOLPHIN: 'Dolphin',\n DOOBLE: 'Dooble',\n DORIS: 'Doris',\n DRAGON: 'Dragon',\n DUCKDUCKGO: 'DuckDuckGo',\n ECOSIA: 'Ecosia',\n EDGE: 'Edge',\n EDGE_WEBVIEW: 'Edge WebView',\n EDGE_WEBVIEW2: 'Edge WebView2',\n EPIPHANY: 'Epiphany',\n FACEBOOK: 'Facebook',\n FALKON: 'Falkon',\n FIREBIRD: 'Firebird',\n FIREFOX: 'Firefox',\n FIREFOX_FOCUS: 'Firefox Focus',\n FIREFOX_MOBILE: 'Mobile Firefox',\n FIREFOX_REALITY: 'Firefox Reality',\n FENNEC: 'Fennec',\n FLOCK: 'Flock',\n FLOW: 'Flow',\n GO: 'GoBrowser',\n GOOGLE_SEARCH: 'GSA',\n HELIO: 'Helio',\n HEYTAP: 'HeyTap',\n HIBROWSER: 'HiBrowser',\n HONOR: 'Honor',\n HUAWEI: 'Huawei Browser',\n ICAB: 'iCab',\n ICE: 'ICE Browser',\n ICEAPE: 'IceApe',\n ICECAT: 'IceCat',\n ICEDRAGON: 'IceDragon',\n ICEWEASEL: 'IceWeasel',\n IE: 'IE',\n INSTAGRAM: 'Instagram',\n IRIDIUM: 'Iridium',\n IRON: 'Iron',\n JASMINE: 'Jasmine',\n KONQUEROR: 'Konqueror',\n KAKAO: 'KakaoTalk',\n KHTML: 'KHTML',\n K_MELEON: 'K-Meleon',\n KLAR: 'Klar',\n KLARNA: 'Klarna',\n KINDLE: 'Kindle',\n LENOVO: 'Smart Lenovo Browser',\n LADYBIRD: 'Ladybird',\n LG: 'LG Browser',\n LIBREWOLF: 'LibreWolf',\n LIEBAO: 'LBBROWSER',\n LIGHTHOUSE: 'Lighthouse',\n LINE: 'Line',\n LINKEDIN: 'LinkedIn',\n LINKS: 'Links',\n LUAKIT: 'Luakit',\n LUNASCAPE: 'Lunascape',\n LYNX: 'Lynx',\n MAEMO: 'Maemo Browser',\n MAXTHON: 'Maxthon',\n MIDORI: 'Midori',\n MINIMO: 'Minimo',\n MIUI: 'MIUI Browser',\n MOZILLA: 'Mozilla',\n MOSAIC: 'Mosaic',\n NAVER: 'Naver',\n NETFRONT: 'NetFront',\n NETSCAPE: 'Netscape',\n NETSURF: 'Netsurf',\n NOKIA: 'Nokia Browser',\n NORTON: 'Norton Private Browser',\n OBIGO: 'Obigo',\n OCULUS: 'Oculus Browser',\n OMNIWEB: 'OmniWeb',\n OPERA: 'Opera',\n OPERA_COAST: 'Opera Coast',\n OPERA_GX: 'Opera GX',\n OPERA_MINI: 'Opera Mini',\n OPERA_MOBI: 'Opera Mobi',\n OPERA_NEON: 'Opera Neon',\n OPERA_TABLET: 'Opera Tablet',\n OPERA_TOUCH: 'Opera Touch',\n OTTER: 'Otter',\n OVI: 'OviBrowser',\n PALEMOON: 'PaleMoon',\n PHANTOMJS: 'PhantomJS',\n PHOENIX: 'Phoenix',\n PICOBROWSER: 'Pico Browser',\n POLARIS: 'Polaris',\n PUFFIN: 'Puffin',\n QQ: 'QQBrowser',\n QQ_LITE: 'QQBrowserLite',\n QUARK: 'Quark',\n QUPZILLA: 'QupZilla',\n QUTEBROWSER: 'qutebrowser',\n QWANT: 'Qwant',\n REKONQ: 'rekonq',\n ROCKMELT: 'Rockmelt',\n SAFARI: 'Safari',\n SAFARI_MOBILE: 'Mobile Safari',\n SAILFISH: 'Sailfish Browser',\n SAMSUNG: 'Samsung Internet',\n SEAMONKEY: 'SeaMonkey',\n SILK: 'Silk',\n SKYFIRE: 'Skyfire',\n SLEIPNIR: 'Sleipnir',\n SLIMBOAT: 'SlimBoat',\n SLIMBROWSER: 'SlimBrowser',\n SLIMJET: 'Slimjet',\n SNAPCHAT: 'Snapchat',\n SOGOU_EXPLORER: 'Sogou Explorer',\n SOGOU_MOBILE: 'Sogou Mobile',\n STEAM: 'Steam',\n SURF: 'Surf',\n SWIFTFOX: 'Swiftfox',\n TESLA: 'Tesla',\n TIKTOK: 'TikTok',\n TIZEN: 'Tizen Browser',\n TWITTER: 'Twitter',\n UC: 'UCBrowser',\n UP: 'UP.Browser',\n VIVALDI: 'Vivaldi',\n VIVO: 'Vivo Browser',\n W3M: 'w3m',\n WATERFOX: 'Waterfox',\n WEBKIT: 'WebKit',\n WECHAT: 'WeChat',\n WEIBO: 'Weibo',\n WHALE: 'Whale',\n WOLVIC: 'Wolvic',\n YANDEX: 'Yandex',\n ZALO: 'Zalo'\n\n // TODO : test!\n});\n/**\n * @deprecated Use `BrowserName` instead\n */\nconst Browser = BrowserName;\n\nconst BrowserType = Object.freeze({\n CRAWLER: 'crawler',\n CLI: 'cli',\n EMAIL: 'email',\n FETCHER: 'fetcher',\n INAPP: 'inapp',\n MEDIAPLAYER: 'mediaplayer',\n LIBRARY: 'library'\n});\n\nconst CPUArch = Object.freeze({\n '68K': '68k',\n ALPHA: 'alpha',\n ARM : 'arm',\n ARM_64: 'arm64',\n ARM_HF: 'armhf',\n AVR: 'avr',\n AVR_32: 'avr32',\n IA64: 'ia64',\n IRIX: 'irix',\n IRIX_64: 'irix64',\n MIPS: 'mips',\n MIPS_64: 'mips64',\n PA_RISC: 'pa-risc',\n PPC: 'ppc',\n SPARC: 'sparc',\n SPARC_64: 'sparc64',\n X86: 'ia32',\n X86_64: 'amd64'\n});\n/**\n * @deprecated Use `CPUArch` instead\n */\nconst CPU = CPUArch;\n\nconst DeviceType = Object.freeze({\n CONSOLE: 'console',\n DESKTOP: 'desktop',\n EMBEDDED: 'embedded',\n MOBILE: 'mobile',\n SMARTTV: 'smarttv',\n TABLET: 'tablet',\n WEARABLE: 'wearable',\n XR: 'xr'\n});\n/**\n * @deprecated Use `DeviceType` instead\n */\nconst Device = DeviceType;\n\nconst DeviceVendor = Object.freeze({\n ACER: 'Acer',\n ADVAN: 'Advan',\n ALCATEL: 'Alcatel',\n AMAZON: 'Amazon',\n ANBERNIC: 'Anbernic',\n APPLE: 'Apple',\n ARCHOS: 'Archos',\n ASUS: 'ASUS',\n ATT: 'AT&T',\n BENQ: 'BenQ',\n BLACKBERRY: 'BlackBerry',\n BLU: 'BLU',\n CAT: 'Cat',\n DELL: 'Dell',\n ENERGIZER: 'Energizer',\n ESSENTIAL: 'Essential',\n FACEBOOK: 'Facebook',\n FAIRPHONE: 'Fairphone',\n GEEKSPHONE: 'GeeksPhone',\n GENERIC: 'Generic',\n GOOGLE: 'Google',\n HISENSE: 'Hisense',\n HMD: 'HMD',\n HP: 'HP',\n HTC: 'HTC',\n HUAWEI: 'Huawei',\n IMO: 'IMO',\n INFINIX: 'Infinix',\n ITEL: 'itel',\n JOLLA: 'Jolla',\n KOBO: 'Kobo',\n LAVA: 'Lava',\n LENOVO: 'Lenovo',\n LG: 'LG',\n LOGITECH: 'Logitech',\n MEIZU: 'Meizu',\n MICROMAX: 'Micromax',\n MICROSOFT: 'Microsoft',\n MOTOROLA: 'Motorola',\n NEXIAN: 'Nexian',\n NINTENDO: 'Nintendo',\n NOKIA: 'Nokia',\n NOTHING: 'Nothing',\n NVIDIA: 'Nvidia',\n ONEPLUS: 'OnePlus',\n OPPO: 'OPPO',\n OUYA: 'Ouya',\n PALM: 'Palm',\n PANASONIC: 'Panasonic',\n PEBBLE: 'Pebble',\n PHILIPS: 'Philips',\n PICO: 'Pico',\n POLYTRON: 'Polytron',\n REALME: 'Realme',\n RETROID: 'Retroid',\n RIM: 'RIM',\n ROKU: 'Roku',\n SAMSUNG: 'Samsung',\n SHARP: 'Sharp',\n SIEMENS: 'Siemens',\n SMARTFREN: 'Smartfren',\n SONY: 'Sony',\n SPRINT: 'Sprint',\n TCL: 'TCL',\n TECHNISAT: 'TechniSAT',\n TECNO: 'TECNO',\n TESLA: 'Tesla',\n ULEFONE: 'Ulefone',\n VALVE: 'Valve',\n VIVO: 'Vivo',\n VIZIO: 'Vizio',\n VODAFONE: 'Vodafone',\n WIKO: 'Wiko',\n XBOX: 'Xbox',\n XIAOMI: 'Xiaomi',\n ZEBRA: 'Zebra',\n ZTE: 'ZTE',\n\n // TODO : test!\n});\n/**\n * @deprecated Use `DeviceVendor` instead\n */\nconst Vendor = DeviceVendor;\n\nconst EngineName = Object.freeze({\n AMAYA: 'Amaya',\n ARKWEB: 'ArkWeb',\n BLINK: 'Blink',\n DILLO: 'Dillo',\n EDGEHTML: 'EdgeHTML',\n FLOW: 'Flow',\n GECKO: 'Gecko',\n GOANNA: 'Goanna',\n ICAB: 'iCab',\n KHTML: 'KHTML',\n LIBWEB: 'LibWeb',\n LINKS: 'Links',\n LYNX: 'Lynx',\n NETFRONT: 'NetFront',\n NETSURF: 'NetSurf',\n PRESTO: 'Presto',\n SERVO: 'Servo',\n TASMAN: 'Tasman',\n TRIDENT: 'Trident',\n W3M: 'w3m',\n WEBKIT: 'WebKit'\n});\n/**\n * @deprecated Use `EngineName` instead\n */\nconst Engine = EngineName;\n\nconst OSName = Object.freeze({\n AIX: 'AIX',\n AMIGA_OS: 'Amiga OS',\n ANDROID: 'Android',\n ANDROID_X86: 'Android-x86',\n ARCAOS: 'ArcaOS',\n ARCH: 'Arch',\n BADA: 'Bada',\n BEOS: 'BeOS',\n BLACKBERRY: 'BlackBerry',\n CENTOS: 'CentOS',\n CHROME_OS: 'Chrome OS',\n CHROMECAST: 'Chromecast',\n CHROMECAST_ANDROID: 'Chromecast Android',\n CHROMECAST_FUCHSIA: 'Chromecast Fuchsia',\n CHROMECAST_LINUX: 'Chromecast Linux',\n CHROMECAST_SMARTSPEAKER: 'Chromecast SmartSpeaker',\n CONTIKI: 'Contiki',\n DEBIAN: 'Debian',\n DEEPIN: 'Deepin',\n DRAGONFLY: 'DragonFly',\n ELEMENTARY_OS: 'elementary OS',\n FEDORA: 'Fedora',\n FIREFOX_OS: 'Firefox OS',\n FREEBSD: 'FreeBSD',\n FUCHSIA: 'Fuchsia',\n GENTOO: 'Gentoo',\n GHOSTBSD: 'GhostBSD',\n GNU: 'GNU',\n HAIKU: 'Haiku',\n HARMONYOS: 'HarmonyOS',\n HP_UX: 'HP-UX',\n HURD: 'Hurd',\n IOS: 'iOS',\n JOLI: 'Joli',\n KAIOS: 'KaiOS',\n KNOPPIX: 'Knoppix',\n KUBUNTU: 'Kubuntu',\n LINPUS: 'Linpus',\n LINSPIRE: 'Linspire',\n LINUX: 'Linux',\n MACOS: 'macOS',\n MAEMO: 'Maemo',\n MAGEIA: 'Mageia',\n MANDRIVA: 'Mandriva',\n MANJARO: 'Manjaro',\n MEEGO: 'MeeGo',\n MINIX: 'Minix',\n MINT: 'Mint',\n MORPH_OS: 'Morph OS',\n NETBSD: 'NetBSD',\n NETRANGE: 'NetRange',\n NETTV: 'NetTV',\n NINTENDO: 'Nintendo',\n OPENHARMONY: 'OpenHarmony',\n OPENBSD: 'OpenBSD',\n OPENVMS: 'OpenVMS',\n OS2: 'OS/2',\n PALM: 'Palm',\n PC_BSD: 'PC-BSD',\n PCLINUXOS: 'PCLinuxOS',\n PICO: 'Pico',\n PLAN9: 'Plan9',\n PLAYSTATION: 'PlayStation',\n QNX: 'QNX',\n RASPBIAN: 'Raspbian',\n REDHAT: 'RedHat',\n RIM_TABLET_OS: 'RIM Tablet OS',\n RISC_OS: 'RISC OS',\n SABAYON: 'Sabayon',\n SAILFISH: 'Sailfish',\n SERENITYOS: 'SerenityOS',\n SERIES40: 'Series40',\n SLACKWARE: 'Slackware',\n SOLARIS: 'Solaris',\n SUSE: 'SUSE',\n SYMBIAN: 'Symbian',\n TIZEN: 'Tizen',\n UBUNTU: 'Ubuntu',\n UBUNTU_TOUCH: 'Ubuntu Touch',\n UNIX: 'Unix',\n VECTORLINUX: 'VectorLinux',\n VEGA_OS: 'Vega OS',\n WATCHOS: 'watchOS',\n WEBOS: 'WebOS',\n WINDOWS: 'Windows',\n WINDOWS_CE: 'Windows CE',\n WINDOWS_IOT: 'Windows IoT',\n WINDOWS_MOBILE: 'Windows Mobile',\n WINDOWS_PHONE: 'Windows Phone',\n WINDOWS_RT: 'Windows RT',\n XBOX: 'Xbox',\n XUBUNTU: 'Xubuntu',\n ZENWALK: 'Zenwalk'\n\n // TODO : test!\n});\n/**\n * @deprecated Use `OSName` instead\n */\nconst OS = OSName;\n\n/*////////////////////////////////\n * Enums for Extensions submodule\n *///////////////////////////////\n\nconst Extension = Object.freeze({\n BrowserName: {\n CLI: {\n CURL: 'curl',\n ELINKS: 'ELinks',\n HTTPIE: 'HTTPie',\n LYNX: 'Lynx',\n POWERSHELL: 'PowerShell',\n WGET: 'Wget'\n },\n Crawler: {\n AHREFS_BOT: 'AhrefsBot',\n AI2_BOT: 'AI2Bot',\n AIHIT_BOT: 'aiHitBot',\n ALGOLIA_CRAWLER: 'Algolia Crawler',\n APPLE_BOT: 'Applebot',\n APPLE_BOT_EXTENDED: 'Applebot-Extended',\n ASK_TEOMA: 'Teoma',\n AMAZON_BOT: 'Amazonbot',\n AMAZON_CONTXBOT: 'contxbot',\n ANTHROPIC_AI: 'anthropic-ai',\n ANTHROPIC_CLAUDE_BOT: 'ClaudeBot',\n ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot',\n ANTHROPIC_CLAUDE_WEB: 'Claude-Web',\n ATLASSIAN_BOT: 'atlassian-bot',\n ARCHIVEORG_BOT: 'archive.org_bot',\n BAIDU_ADS: 'Baidu-ADS',\n BAIDU_SPIDER: 'Baiduspider',\n BAIDU_SPIDER_ADS: 'Baiduspider-ads',\n BAIDU_SPIDER_CPRO: 'Baiduspider-cpro',\n BAIDU_SPIDER_FAVO: 'Baiduspider-favo',\n BAIDU_SPIDER_IMAGE: 'Baiduspider-image',\n BAIDU_SPIDER_NEWS: 'Baiduspider-news',\n BAIDU_SPIDER_RENDER: 'Baiduspider-render',\n BAIDU_SPIDER_VIDEO: 'Baiduspider-video',\n BLEX_BOT: 'BLEXBot',\n BOTIFY: 'botify',\n BRAVE_BOT: 'Bravebot',\n BYTEDANCE_BYTESPIDER: 'Bytespider',\n BYTEDANCE_TIKTOKSPIDER: 'TikTokSpider',\n CLOUDFLARE_AUTORAG: 'Cloudflare-AutoRAG',\n COMMON_CRAWL_CCBOT: 'CCBot',\n COCCOC_BOT_WEB: 'coccocbot-web',\n COCCOC_BOT_IMAGE: 'coccocbot-image',\n COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',\n COTOYOGI: 'Cotoyogi',\n COVEO_BOT: 'Coveobot',\n CRITEO_BOT: 'CriteoBot',\n DATAFORSEO_BOT: 'DataForSeoBot',\n DAUM: 'Daum',\n DAUM_DAUMOA: 'Daumoa',\n DAUM_DAUMOA_IMAGE: 'Daumoa-image',\n DEEPSEEK_BOT: 'DeepSeekBot',\n DIFFBOT: 'Diffbot',\n DUCKDUCKGO_BOT: 'DuckDuckBot',\n DUCKDUCKGO_FAVICONS_BOT: 'DuckDuckGo-Favicons-Bot',\n ELASTIC: 'Elastic',\n ELASTIC_SWIFTYPE_BOT: 'Swiftbot',\n EXALEAD_EXABOT: 'Exabot',\n FIRECRAWL_AGENT: 'FirecrawlAgent',\n FREESPOKE: 'Freespoke',\n GOOGLE_ADSBOT: 'AdsBot-Google',\n GOOGLE_ADSBOT_MOBILE: 'Adsbot-Google-Mobile',\n GOOGLE_ADSENSE: 'AdSense',\n GOOGLE_APIS: 'APIs-Google',\n GOOGLE_BOT: 'Googlebot',\n GOOGLE_BOT_IMAGE: 'Googlebot-Image',\n GOOGLE_BOT_NEWS: 'Googlebot-News',\n GOOGLE_BOT_VIDEO: 'Googlebot-Video',\n GOOGLE_CLOUDVERTEXBOT: 'Google-CloudVertexBot',\n GOOGLE_EXTENDED: 'Google-Extended',\n GOOGLE_INSPECTIONTOOL: 'Google-InspectionTool',\n GOOGLE_NOTEBOOKLM: 'Google-NotebookLM',\n GOOGLE_OTHER: 'GoogleOther',\n GOOGLE_OTHER_IMAGE: 'GoogleOther-Image',\n GOOGLE_OTHER_VIDEO: 'GoogleOther-Video',\n GOOGLE_SAFETY: 'Google-Safety',\n GOOGLE_STOREBOT: 'Storebot-Google',\n HIVE_IMAGESIFTBOT: 'ImagesiftBot',\n HUAWEI_PANGUBOT: 'PanguBot',\n HUAWEI_PETALBOT: 'PetalBot',\n HUGGINGFACE_BOT: 'HuggingFace-Bot',\n HUNTER_VELENPUBLICWEBCRAWLER: 'VelenPublicWebCrawler',\n IA_ARCHIVER: 'ia_archiver',\n IASK_BOT: 'iAskBot',\n KAGI_BOT: 'Kagibot',\n KANGAROO_BOT: 'Kangaroo Bot',\n LINE_SPIDER: 'Linespider',\n LINKEDIN_BOT: 'LinkedInBot',\n MAGPIE_CRAWLER: 'magpie-crawler',\n MARGINALIA: 'marginalia',\n META_EXTERNALAGENT: 'meta-externalagent',\n META_FACEBOOKBOT: 'FacebookBot',\n META_FACEBOOKCATALOG: 'facebookcatalog',\n META_FACEBOOKEXTERNALHIT: 'facebookexternalhit',\n MAJESTIC_MJ12BOT: 'MJ12bot',\n MICROSOFT_BINGBOT: 'Bingbot',\n MICROSOFT_MSNBOT: 'msnbot',\n MICROSOFT_ADIDXBOT: 'adidxbot',\n MOJEEK_BOT: 'MojeekBot',\n MOZ_DOTBOT: 'DotBot',\n ONCRAWL: 'OnCrawl',\n ONESPOT_SCRAPERBOT: 'Onespot-ScraperBot',\n OPENAI_GPTBOT: 'GPTBot',\n OPENAI_SEARCH_BOT: 'OAI-SearchBot',\n PERPLEXITY_BOT: 'PerplexityBot',\n QIHOO_360_SPIDER: '360Spider',\n QWANT_BOT: 'Qwantbot',\n QWANT_BOT_NEWS: 'Qwantbot-news',\n REPLICATE_BOT: 'Replicate-Bot',\n RUNPOD_BOT: 'RunPod-Bot',\n SB_INTUITIONS_BOT: 'SBIntuitionsBot',\n SEEKPORT_BOT: 'SeekportBot',\n SEMRUSH_BOT: 'SemrushBot',\n SEMRUSH_BOT_BACKLINK: 'SemrushBot-BA',\n SEMRUSH_BOT_CONTENTSHAKE: 'SemrushBot-OCOB',\n SEMRUSH_BOT_SEO_CHECKER: 'SemrushBot-SI',\n SEMRUSH_BOT_SWA: 'SemrushBot-SWA',\n SEZNAM_BOT: 'SeznamBot',\n SITEIMPROVE: 'Siteimprove',\n SOGOU_PIC_SPIDER: 'Sogou Pic Spider',\n SOGOU_WEB_SPIDER: 'Sogou web spider',\n STARTPAGE: 'Startpage',\n SURLY_BOT: 'SurdotlyBot',\n TIMPI_BOT: 'Timpibot',\n TOGETHER_BOT: 'Together-Bot',\n TURNITIN_BOT: 'TurnitinBot',\n TWIN_AGENT: 'TwinAgent',\n VERCEL_V0BOT: 'v0bot',\n WEBZIO: 'webzio',\n WEBZIO_EXTENDED: 'Webzio-Extended',\n WEBZIO_OMGILI: 'omgili',\n WEBZIO_OMGILI_BOT: 'omgilibot',\n XAI_BOT: 'xAI-Bot',\n YAHOO_JAPAN: 'Y!J-BRW',\n YAHOO_SLURP: 'Yahoo! Slurp',\n YANDEX_ACCESSIBILITY_BOT: 'YandexAccessibilityBot',\n YANDEX_ADDITIONAL_BOT: 'YandexAdditionalBot',\n YANDEX_ADNET: 'YandexAdNet',\n YANDEX_BLOGS: 'YandexBlogs',\n YANDEX_BOT: 'YandexBot',\n YANDEX_BOT_MIRRORDETECTOR: 'YandexBot MirrorDetector',\n YANDEX_COMBOT: 'YandexComBot',\n YANDEX_FAVICONS: 'YandexFavicons',\n YANDEX_IMAGE_RESIZER: 'YandexImageResizer',\n YANDEX_IMAGES: 'YandexImages',\n YANDEX_MARKET: 'YandexMarket',\n YANDEX_MEDIA: 'YandexMedia',\n YANDEX_METRIKA: 'YandexMetrika',\n YANDEX_MOBILE_BOT: 'YandexMobileBot',\n YANDEX_MOBILE_SCREENSHOT_BOT: 'YandexMobileScreenShotBot',\n YANDEX_NEWS: 'YandexNews',\n YANDEX_ONTODB: 'YandexOntoDB',\n YANDEX_ONTODB_API: 'YandexOntoDBAPI',\n YANDEX_PARTNER: 'YandexPartner',\n YANDEX_RCA: 'YandexRCA',\n YANDEX_RENDERRESOURCES_BOT: 'YandexRenderResourcesBot',\n YANDEX_SCREENSHOT_BOT: 'YandexScreenshotBot',\n YANDEX_SPRAV_BOT: 'YandexSpravBot',\n YANDEX_TRACKER: 'YandexTracker',\n YANDEX_VERTICALS: 'YandexVerticals',\n YANDEX_VERTIS: 'YandexVertis',\n YANDEX_VIDEO: 'YandexVideo',\n YANDEX_VIDEO_PARSER: 'YandexVideoParser',\n YANDEX_WEBMASTER: 'YandexWebmaster',\n YEP_BOT: 'YepBot',\n YETI: 'Yeti',\n YISOU_SPIDER: 'YisouSpider',\n YOU_BOT: 'YouBot',\n ZHIPU_CHATGLM_SPIDER: 'ChatGLM-Spider',\n ZUM_BOT: 'ZumBot'\n },\n Email: {\n AIRMAIL: 'Airmail',\n ALPINE: 'Alpine',\n ANDROID_MAIL: 'Android',\n APPLE_MAIL: 'Mail',\n AQUA_MAIL: 'AquaMail',\n BALSA: 'Balsa',\n BARCA: 'Barca',\n BLUEMAIL: 'BlueMail',\n CANARY: 'Canary',\n CLAWS_MAIL: 'Claws Mail',\n DAUM_MAIL: 'DaumMail',\n EM_CLIENT: 'eM Client',\n EUDORA: 'Eudora',\n EVOLUTION: 'Evolution',\n FAIR_EMAIL: 'FairEmail',\n FOXMAIL: 'Foxmail',\n GEARY: 'Geary',\n GNUS: 'Gnus',\n HORDE_IMP: 'Horde::IMP',\n IBM_NOTES: 'Lotus-Notes',\n INCREDIMAIL: 'IncrediMail',\n K9_MAIL: 'K-9 Mail',\n KMAIL: 'KMail',\n KMAIL2: 'kmail2',\n KONTACT: 'Kontact',\n MAILBIRD: 'Mailbird',\n MAILMATE: 'MailMate',\n MAILSPRING: 'Mailspring',\n MICROSOFT_OUTLOOK: 'Microsoft Outlook',\n MICROSOFT_OUTLOOK_MAC: 'MacOutlook',\n MUTT: 'Mutt',\n NAVER_MAILAPP: 'NaverMailApp',\n NEWTON: 'Newton',\n NINE: 'Nine',\n NYLAS_MAIL: 'NylasMail',\n OUTLOOK_EXPRESS: 'Outlook-Express',\n PEGASUS_MAIL: 'Pegasus Mail',\n POCOMAIL: 'PocoMail',\n POLYMAIL: 'Polymail',\n POSTBOX: 'Postbox',\n PROTON_MAIL: 'ProtonMail',\n PROTON_MAIL_BRIDGE: 'ProtonMail Bridge',\n QUALA_MAIL: 'Quala',\n R2MAIL2: 'R2Mail2',\n RAINLOOP: 'RainLoop',\n ROUNDCUBE: 'Roundcube Webmail',\n SAMSUNG_EMAIL: 'SamsungEmail',\n SPARK_MAIL: 'SparkDesktop',\n SPARROW: 'Sparrow',\n SPICEBIRD: 'Spicebird',\n SQUIRRELMAIL: 'SquirrelMail',\n SYLPHEED: 'Sylpheed',\n THE_BAT: 'The Bat!',\n THUNDERBIRD: 'Thunderbird',\n TROJITA: 'Trojita',\n TURNPIKE: 'Turnpike',\n TUTANOTA: 'tutanota-desktop',\n WANDERLUST: 'Wanderlust',\n WINDOWS_LIVE_MAIL: 'Windows-Live-Mail',\n YAHOO_MAIL: 'Yahoo Mail',\n YAHOO_MAIL_IOS: 'Yahoo Mail',\n ZIMBRA: 'Zimbra',\n ZOHO_MAIL: 'ZohoMail-Desktop'\n },\n Fetcher: {\n AHREFS_SITEAUDIT: 'AhrefsSiteAudit',\n AMAZON_NOVA_ACT: 'NovaAct',\n ANTHROPIC_CLAUDE_USER: 'Claude-User',\n ASANA: 'Asana',\n BETTER_UPTIME_BOT: 'Better Uptime Bot',\n BITLY_BOT: 'bitlybot',\n BLUESKY: 'Bluesky',\n BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot',\n COHERE_AI: 'Cohere-AI',\n DISCORD_BOT: 'Discordbot',\n DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',\n FLIPBOARD_PROXY: 'FlipboardProxy',\n GOOGLE_CHROME_LIGHTHOUSE: 'Lighthouse',\n GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',\n GOOGLE_GEMINI_DEEP_RESEARCH: 'Gemini-Deep-Research',\n GOOGLE_IMAGEPROXY: 'GoogleImageProxy',\n GOOGLE_PAGERENDERER: 'Google-PageRenderer',\n GOOGLE_READ_ALOUD: 'Google-Read-Aloud',\n GOOGLE_PRODUCER: 'GoogleProducer',\n GOOGLE_SITE_VERIFICATION: 'Google-Site-Verification',\n HUBSPOT_PAGE_FETCHER: 'HubSpot Page Fetcher',\n IFRAMELY: 'Iframely',\n KAKAOTALK_SCRAP: 'kakaotalk-scrap',\n KEYBASE_BOT: 'KeybaseBot',\n META_EXTERNALFETCHER: 'meta-externalfetcher',\n META_WHATSAPP: 'WhatsApp',\n MICROSOFT_BINGPREVIEW: 'BingPreview',\n MICROSOFT_PREVIEW: 'MicrosoftPreview',\n MISTRALAI_USER: 'MistralAI-User',\n NAVER_BLUENO: 'Blueno',\n ONCRAWL_ROGERBOT: 'rogerbot',\n OPENAI_CHATGPT_USER: 'ChatGPT-User',\n PERPLEXITY_USER: 'Perplexity-User',\n PINTEREST_BOT: 'Pinterestbot',\n SEMRUSH_SITEAUDITBOT: 'SiteAuditBot',\n SLACK_BOT: 'Slackbot',\n SLACK_BOT_LINKEXPANDING: 'Slackbot-LinkExpanding',\n SLACK_IMGPROXY: 'Slack-ImgProxy',\n SNAP_URL_PREVIEW: 'Snap URL Preview',\n SKYPE_URIPREVIEW: 'SkypeUriPreview',\n TELEGRAM_BOT: 'TelegramBot',\n UPTIMEROBOT: 'UptimeRobot',\n VERCEL_FAVICON_BOT: 'vercel-favicon-bot',\n VERCEL_SCREENSHOT_BOT: 'vercel-screenshot-bot',\n VERCEL_BOT: 'Vercelbot',\n VERCEL_FLAGS: 'vercelflags',\n VERCEL_TRACING: 'verceltracing',\n X_TWITTERBOT: 'Twitterbot',\n YANDEX_CALENDAR: 'YandexCalendar',\n YANDEX_DIRECT: 'YandexDirect',\n YANDEX_DIRECTDYN: 'YandexDirectDyn',\n YANDEX_DIRECTFETCHER: 'YaDirectFetcher',\n YANDEX_FORDOMAIN: 'YandexForDomain',\n YANDEX_PAGECHECKER: 'YandexPagechecker',\n YANDEX_SEARCHSHOP: 'YandexSearchShop',\n YANDEX_SITELINKS: 'YandexSitelinks',\n YANDEX_USERPROXY: 'YandexUserproxy',\n ZOOMINFO_BOT: 'Zoombot'\n },\n InApp: {\n DISCORD: 'Discord',\n EVERNOTE: 'Evernote',\n FIGMA: 'Figma',\n FLIPBOARD: 'Flipboard',\n MATTERMOST: 'Mattermost',\n TEAMS: 'Teams',\n NOTION: 'Notion',\n POSTMAN: 'Postman',\n RAMBOX: 'Rambox',\n ROCKETCHAT: 'Rocket.Chat',\n SLACK: 'Slack',\n TIKTOK_LITE: 'TikTok Lite',\n VSCODE: 'VS Code',\n YAHOO_JAPAN: 'Yahoo! Japan'\n },\n Library: {\n ADOBE_AIR: 'AdobeAIR',\n AIOHTTP: 'aiohttp',\n APACHE_HTTPCLIENT: 'Apache-HttpClient',\n AXIOS: 'axios',\n BUN: 'Bun',\n DART: 'Dart',\n DENO: 'Deno',\n GO_HTTP_CLIENT: 'go-http-client',\n GOT: 'got',\n GUZZLEHTTP: 'GuzzleHttp',\n HACKNEY: 'hackney',\n HTTP_RB: 'http.rb',\n JAVA: 'Java',\n JAVA_HTTPCLIENT: 'Java-http-client',\n JETTY: 'Jetty',\n JSDOM: 'jsdom',\n LIBWWW_PERL: 'libwww-perl',\n LUA_RESTY_HTTP: 'lua-resty-http',\n NEEDLE: 'Needle',\n NUTCH: 'Nutch',\n NODE_FETCH: 'node-fetch',\n NODE_JS: 'Node.js',\n NODE_SUPERAGENT: 'node-superagent',\n OKHTTP: 'OkHttp',\n OCAML_COHTTP: 'ocaml-cohttp',\n PHP_SOAP: 'PHP-SOAP',\n POSTMAN_RUNTIME: 'PostmanRuntime',\n PYTHON_HTTPX: 'python-httpx',\n PYTHON_URLLIB: 'python-urllib',\n PYTHON_URLLIB3: 'python-urllib3',\n PYTHON_REQUESTS: 'python-requests',\n REST_CLIENT: 'rest-client',\n SCRAPY: 'Scrapy',\n UNDICI: 'undici'\n }\n },\n DeviceVendor: {\n Vehicle: {\n BMW: 'BMW',\n BYD: 'BYD',\n JEEP: 'Jeep',\n RIVIAN: 'Rivian',\n TESLA: 'Tesla',\n VOLVO: 'Volvo'\n }\n }\n});\n\nexport { \n Browser,// deprecated\n CPU, // deprecated\n Device, // deprecated\n Vendor, // deprecated\n Engine, // deprecated\n OS, // deprecated\n BrowserName,\n BrowserType, \n CPUArch,\n DeviceType, \n DeviceVendor,\n EngineName,\n OSName,\n Extension\n};",
|
|
120
|
-
"// Generated ESM version of ua-parser-js/device-detection\n// DO NOT EDIT THIS FILE!\n// Source: /src/device-detection/device-detection.js\n\n/////////////////////////////////////////////////////\n/* device-detection submodule of UAParser.js v2.0.9\n https://github.com/faisalman/ua-parser-js\n Author: Faisal Salman <f@faisalman.com>\n AGPLv3 License */\n////////////////////////////////////////////////////\n\n/*jshint esversion: 6 */ \n\nimport { UAParser } from '../main/ua-parser.mjs';\nimport { CPUArch, OSName } from '../enums/ua-parser-enums.mjs';\n\nconst getDeviceVendor = (model) => new UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).getDevice().vendor;\n\nconst isAppleSilicon = (val) => {\n const { os, cpu } = typeof val !== 'string' ? val : {\n os: new UAParser(val).getOS(),\n cpu: new UAParser(val).getCPU() \n };\n if (os.is(OSName.MACOS)) {\n if (cpu.is(CPUArch.ARM)) {\n return true;\n } else if (typeof window !== 'undefined') {\n try {\n const canvas = document.createElement('canvas');\n const webgl = canvas.getContext('webgl2') || \n canvas.getContext('webgl') || \n canvas.getContext('experimental-webgl');\n return webgl\n .getParameter(webgl.getExtension('WEBGL_debug_renderer_info').UNMASKED_RENDERER_WEBGL)\n .match(/apple m\\d/i);\n } catch {\n return false;\n }\n }\n }\n return false;\n}\n\nexport { \n getDeviceVendor,\n isAppleSilicon\n}",
|
|
121
|
-
"// Generated ESM version of ua-parser-js/extensions\n// DO NOT EDIT THIS FILE!\n// Source: /src/extensions/ua-parser-extensions.js\n\n///////////////////////////////////////////////\n/* Extensions for UAParser.js v2.0.9\n https://github.com/faisalman/ua-parser-js\n Author: Faisal Salman <f@faisalman.com>\n AGPLv3 License */\n//////////////////////////////////////////////\n\n/*jshint esversion: 6 */ \n\nconst MODEL = 'model';\nconst NAME = 'name';\nconst TYPE = 'type';\nconst VENDOR = 'vendor';\nconst VERSION = 'version';\nconst MOBILE = 'mobile';\nconst TABLET = 'tablet';\nconst CRAWLER = 'crawler';\nconst CLI = 'cli';\nconst EMAIL = 'email';\nconst FETCHER = 'fetcher';\nconst INAPP = 'inapp';\nconst MEDIAPLAYER = 'mediaplayer';\nconst LIBRARY = 'library';\n\n// Helper to normalize specific email client names\nconst normalizeEmailName = function (str) {\n const map = {\n 'YahooMobile': 'Yahoo Mail',\n 'YahooMail': 'Yahoo Mail',\n 'K-9': 'K-9 Mail',\n 'K-9 Mail': 'K-9 Mail',\n 'Zdesktop': 'Zimbra',\n 'zdesktop': 'Zimbra'\n };\n return map[str] || str;\n};\n\n//////////////////////\n// COMMAND LINE APPS\n/////////////////////\n\nconst CLIs = Object.freeze({\n browser : [\n // wget / curl / Lynx / ELinks / HTTPie / PowerShell\n [/(wget|curl|lynx|elinks|httpie|powershell)[\\/ ]\\(?([\\w\\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]\n ]\n});\n\n////////////////////////\n// CRAWLERS / SPIDERS\n///////////////////////\n\nconst Crawlers = Object.freeze({\n browser : [\n [\n // AhrefsBot - https://ahrefs.com/robot\n // Amazonbot - https://developer.amazon.com/amazonbot\n // Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0\n // Bravebot - https://search.brave.com/help/brave-search-crawler\n // CCBot - https://commoncrawl.org/faq\n // contxbot - https://affiliate-program.amazon.com/help/node/topic/GT98G5PPRERNVZ2C\n // Coveobot - https://connect.coveo.com/s/article/19648\n // CriteoBot - https://www.criteo.com/criteo-crawler/\n // Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot\n // DuckDuckBot - http://duckduckgo.com/duckduckbot.html\n // FacebookBot - https://developers.facebook.com/docs/sharing/bot/\n // GPTBot - https://platform.openai.com/docs/gptbot\n // iAskBot - https://iask.ai\n // Kagibot - https://kagi.com/bot\n // Kangaroo Bot - https://kangaroollm.com.au/kangaroo-bot/\n // LinkedInBot - http://www.linkedin.com\n // MJ12bot - https://mj12bot.com/\n // MojeekBot - https://www.mojeek.com/bot.html\n // Onespot - https://www.onespot.com/identifying-traffic.html\n // OpenAI's SearchGPT - https://platform.openai.com/docs/bots\n // PerplexityBot - https://perplexity.ai/perplexitybot\n // SBIntuitionsBot - https://www.sbintuitions.co.jp/bot/\n // SeznamBot - http://napoveda.seznam.cz/seznambot-intro\n // SurdotlyBot - http://sur.ly/bot.html\n // Swiftbot - https://swiftype.com/swiftbot\n // YepBot - https://yep.com/yepbot/\n /((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\\/([\\w\\.-]+)/i,\n\n // Algolia Crawler\n /(algolia crawler(?: renderscript)?)\\/?([\\w\\.]*)/i,\n\n // Applebot - http://apple.com/go/applebot\n /(applebot(?:-extended)?)\\/?([\\w\\.]*)/i,\n\n // Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001\n /(baiduspider[-imagevdonwsfcpr]{0,7})\\/?([\\w\\.]*)/i,\n\n // ClaudeBot (Anthropic)\n /(claude(?:bot|-searchbot|-web)|anthropic-ai)\\/?([\\w\\.]*)/i, \n\n // Coc Coc Bot - https://help.coccoc.com/en/search-engine\n /(coccocbot-(?:image|web))\\/([\\w\\.]+)/i, \n\n // Daum\n /(daum(?:oa)?(?:-image)?)[ \\/]([\\w\\.]+)/i,\n\n // Facebook / Meta \n // https://developers.facebook.com/docs/sharing/webmasters/web-crawlers\n /(facebook(?:externalhit|catalog)|meta-externalagent)\\/([\\w\\.]+)/i,\n\n // Googlebot - http://www.google.com/bot.html\n /(google(?:bot|other|-inspectiontool)(?:-image|-video|-news)?|storebot-google)\\/?([\\w\\.]*)/i, \n\n // Internet Archive (archive.org)\n /(ia_archiver|archive\\.org_bot)\\/?([\\w\\.]*)/i,\n\n // OnCrawl\n /(oncrawl) mobile\\/([\\w\\.]+)/i,\n\n // Qwantbot - https://help.qwant.com/bot\n /(qwantbot(?:-news)?)[-\\w]*\\/?([\\w\\.]*)/i,\n\n // SemrushBot - http://www.semrush.com/bot.html\n /((?:semrush|splitsignal)bot[-abcfimostw]*)\\/?([\\w\\.-]*)/i,\n\n // Sogou Spider\n /(sogou (?:pic|head|web|orion|news) spider)\\/([\\w\\.]+)/i, \n\n // Yahoo! Japan - https://support.yahoo-net.jp/PccSearch/s/article/H000007955\n /(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\\/([\\w\\.]+)/i, \n\n // Yandex Bots - https://yandex.com/bots\n /(yandex(?:(?:mobile)?(?:accessibility|additional|com|renderresources|screenshot|sprav)?bot(?!.+mirror)|image(?:s|resizer)|adnet|blogs|favicons|market|media|metrika|news|ontodb(?:api)?|partner|rca|tracker|turbo|verti(?:cal)?s|webmaster|video(?:parser)?))\\/([\\w\\.]+)/i,\n\n // Yeti (Naver)\n /(yeti)\\/([\\w\\.]+)/i,\n\n // aiHitBot / Algolia Crawler / BLEXBot / Cloudflare AutoRAG / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot\n // Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/\n // Freespoke - https://docs.freespoke.com/search/bot/\n /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cloudflare-autorag|cotoyogi|(?:firecrawl|twin)agent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|webzio-extended)\\/?([\\w\\.]*)/i\n ],\n [NAME, VERSION, [TYPE, CRAWLER]],\n\n [\n // YandexBot MirrorDetector\n /(yandexbot\\/([\\w\\.]+); mirrordetector)/i\n ],\n [[NAME, /\\/.+;/ig, ''], VERSION, [TYPE, CRAWLER]],\n\n [\n // Google Bots\n /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|notebooklm|safety))/i,\n\n // AI2Bot - https://allenai.org/crawler\n // DataForSeoBot - https://dataforseo.com/dataforseo-bot\n // Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot\n // ImagesiftBot - https://imagesift.com/about\n // Siteimprove - https://help.siteimprove.com/support/solutions/articles/80000448553\n // TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html\n // v0bot - https://vercel.com/docs/bot-management\n // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp\n // Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider\n /\\b((ai2|aspiegel|atlassian-|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\\/s)|marginalia|siteimprove(?=bot|\\.com)|teoma|webzio|yahoo! slurp)/i\n ], \n [NAME, [TYPE, CRAWLER]]\n ]\n});\n\n//////////////////\n// EXTRA DEVICES\n/////////////////\n\nconst ExtraDevices = Object.freeze({\n device : [[ \n /(nook)[\\w ]+build\\/(\\w+)/i, // Nook\n /(dell) (strea[kpr\\d ]*[\\dko])/i, // Dell Streak\n /(le[- ]+pan)[- ]+(\\w{1,9}) bui/i, // Le Pan Tablets\n /(trinity)[- ]*(t\\d{3}) bui/i, // Trinity Tablets\n /(gigaset)[- ]+(q\\w{1,9}) bui/i, // Gigaset Tablets\n /(vodafone) ([\\w ]+)(?:\\)| bui)/i // Vodafone\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(u304aa)/i // AT&T\n ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [\n\n /\\bsie-(\\w*)/i // Siemens\n ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n\n /\\b(rct\\w+) b/i // RCA Tablets\n ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [\n\n /\\b(venue[\\d ]{2,7}) b/i // Dell Venue Tablets\n ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [\n\n /\\b(q(?:mv|ta)\\w+) b/i // Verizon Tablet\n ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [\n\n /\\b(?:barnes[& ]+noble |bn[rt])([\\w\\+ ]*) b/i // Barnes & Noble Tablet\n ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [\n\n /\\b(tm\\d{3}\\w+) b/i\n ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [\n\n /\\b(k88) b/i // ZTE K Series Tablet\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [\n\n /\\b(nx\\d{3}j) b/i // ZTE Nubia\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n\n /\\b(gen\\d{3}) b.+49h/i // Swiss GEN Mobile\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [\n\n /\\b(zur\\d{3}) b/i // Swiss ZUR Tablet\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [\n\n /^((zeki)?tb.*\\b) b/i // Zeki Tablets\n ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [\n\n /\\b([yr]\\d{2}) b/i,\n /\\b(?:dragon[- ]+touch |dt)(\\w{5}) b/i // Dragon Touch Tablet\n ], [MODEL, [VENDOR, 'Dragon Touch'], [TYPE, TABLET]], [\n\n /\\b(ns-?\\w{0,9}) b/i // Insignia Tablets\n ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [\n\n /\\b((nxa|next)-?\\w{0,9}) b/i // NextBook Tablets\n ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [\n\n /\\b(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones\n ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [\n\n /\\b(lvtel\\-)?(v1[12]) b/i // LvTel Phones\n ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [\n\n /\\b(ph-1) /i // Essential PH-1\n ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [\n\n /\\b(v(100md|700na|7011|917g).*\\b) b/i // Envizen Tablets\n ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [\n\n /\\b(trio[-\\w\\. ]+) b/i // MachSpeed Tablets\n ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [\n\n /\\btu_(1491) b/i // Rotor Tablets\n ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]]\n ]\n});\n\n//////////////\n// EMAIL APPS\n//////////////\n\nconst Emails = Object.freeze({\n browser : [\n // 1. Specific Android Mail Rule\n [/(android)\\/([\\w\\.-]+email)/i], \n [NAME, VERSION, [TYPE, EMAIL]], \n\n // 2. Standard Email Clients\n [\n new RegExp(\n '(' +\n // Clients ending in 'mail' (Case 1: Prefix + optional space + [e]mail)\n // Covers: AirMail, Claws Mail, FairEmail, SamsungEmail, Yahoo Mail, etc.\n '(?:air|aqua|blue|claws|daum|fair|fox|k-9|mac|nylas|pegasus|poco|poly|proton|samsung|squirrel|yahoo) ?e?mail(?:-desktop| app| bridge)?|' +\n // Standalone / Specific Names\n 'microsoft outlook|r2mail2|spicebird|turnpike|yahoomobile|' +\n // Microsoft & Outlook Variants\n '(?:microsoft )?outlook(?:-express)?|macoutlook|windows-live-mail|' +\n // Specific Clients\n 'alpine|balsa|barca|canary|emclient|eudora|evolution|geary|gnus|' +\n 'horde::imp|incredimail|kmail2?|kontact|lotus-notes|' +\n 'mail(?:bird|mate|spring)|mutt|navermailapp|newton|nine|postbox|' +\n 'rainloop|roundcube webmail|spar(?:row|kdesktop)|sylpheed|' +\n 'the bat!|thunderbird|trojita|tutanota-desktop|wanderlust|' +\n 'zdesktop|zohomail-desktop' +\n ')' +\n // Separator\n '(?:m.+ail; |[\\\\/ ])' +\n // Version (Updated to allow hyphens for Turnpike)\n '([\\\\w\\\\.-]+)', \n 'i'\n )\n ], \n [\n [NAME, normalizeEmailName], \n VERSION, \n [TYPE, EMAIL]\n ],\n\n // 3. Apple Mail Context\n [/(mail)\\/([\\w\\.]+) cf/i], \n [NAME, VERSION, [TYPE, EMAIL]],\n \n // 4. Zimbra Server\n [/(zimbra)\\/([\\w\\.-]+)/i], \n [NAME, VERSION, [TYPE, EMAIL]]\n ]\n});\n\n///////////////////////\n// ON-DEMAND SCRAPERS\n//////////////////////\n\nconst Fetchers = Object.freeze({\n browser : [\n [\n // Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot / WhatsApp\n // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit\n // Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot\n // ChatGPT-User - https://platform.openai.com/docs/plugins/bot\n // DuckAssistBot - https://duckduckgo.com/duckassistbot/\n // FlipboardProxy - https://about.flipboard.com/proxy-service/\n // Google Site Verifier / Meta / Yahoo! Japan\n // Iframely - https://iframely.com/docs/about\n // Perplexity-User - https://docs.perplexity.ai/guides/bots\n // MistralAI-User - https://docs.mistral.ai/robots/\n // Yandex Bots - https://yandex.com/bots\n /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|flipboardproxy|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher|whatsapp)\\/([\\w\\.]+)/i,\n\n // Bluesky\n /(bluesky) cardyb\\/([\\w\\.]+)/i,\n\n // Nova Act - https://github.com/aws/nova-act\n /agent-(novaact)\\/([\\w\\.]+)/i,\n\n // Skype\n /(skypeuripreview) preview\\/([\\w\\.]+)/i,\n\n // Slackbot - https://api.slack.com/robots\n /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\\w\\.]+)/i\n ], \n [NAME, VERSION, [TYPE, FETCHER]],\n\n [\n // Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots\n /((?:better uptime |keybase|telegram|vercel)bot|lighthouse$|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i\n ], \n [NAME, [TYPE, FETCHER]],\n ],\n\n os : [\n [/whatsapp\\/[\\d\\.]+ (a|i)/i],\n [[NAME, os => os == 'A' ? 'Android' : 'iOS' ]]\n ]\n});\n\n////////////////////\n// IN-APP BROWSERS\n///////////////////\n\nconst InApps = Object.freeze({\n browser : [[\n // Discord/Figma/Flipboard/Mattermost/Notion/Postman/Rambox/Rocket.Chat/Slack/Teams\n /\\b(discord|figma|mattermost|notion|postman|rambox|rocket.chat|slack|teams)\\/([\\w\\.]+).+(electron\\/|; ios)/i,\n /(flipboard)\\/([\\w\\.]+)/i\n ], [NAME, VERSION, [TYPE, INAPP]], [\n\n // Evernote/Teams on mobile\n /(evernote) win/i,\n /(teams)mobile-(ios|and)/i\n ], [NAME, [TYPE, INAPP]], [\n\n // Slack\n /chatlyio\\/([\\d\\.]+)/i], \n [VERSION, [NAME, 'Slack'], [TYPE, INAPP]], [\n\n // TikTok Lite\n /ultralite app_version\\/([\\w\\.]+)/i], \n [VERSION, [NAME, 'TikTok Lite'], [TYPE, INAPP]], [\n\n // VS Code\n /\\) code\\/([\\d\\.]+).+electron\\//i], \n [VERSION, [NAME, 'VS Code'], [TYPE, INAPP]], [\n\n // Yahoo! Japan\n /jp\\.co\\.yahoo\\.(?:android\\.yjtop|ipn\\.appli)\\/([\\d\\.]+)/i], \n [VERSION, [NAME, 'Yahoo! Japan'], [TYPE, INAPP]]\n ]\n});\n\n//////////////////////\n// MEDIA PLAYER APPS\n/////////////////////\n\nconst MediaPlayers = Object.freeze({\n browser : [[\n /(apple(?:coremedia|tv))\\/([\\w\\._]+)/i, // Generic Apple CoreMedia\n /(coremedia) v([\\w\\._]+)/i, \n // Ares/Nexplayer/OSSProxy\n /(ares|clementine|music player daemon|nexplayer|ossproxy) ([\\w\\.-]+)/i, \n // Aqualung/Lyssna/BSPlayer/Clementine/MPD\n // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/GnomeMplayer/MoC\n // NSPlayer/PSP-InternetRadioPlayer/Videos\n // Nero Home/Nero Scout/Nokia\n // QuickTime/RealMedia/RadioApp/RadioClientApplication/\n // SoundTap/Totem/Stagefright/Streamium\n // XBMC/gvfs/Xine/XMMS/irapp\n /^(aqualung|audacious|audimusicstream|amarok|bass|bsplayer|core|gnomemplayer|gvfs|irapp|lyssna|music on console|nero (?:home|scout)|nokia\\d+|nsplayer|psp-internetradioplayer|quicktime|rma|radioapp|radioclientapplication|soundtap|stagefright|streamium|totem|videos|xbmc|xine|xmms)\\/([\\w\\.-]+)/i,\n /(lg player|nexplayer) ([\\d\\.]+)/i,\n /player\\/(nexplayer|lg player) ([\\w\\.-]+)/i, // NexPlayer/LG Player\n /(gstreamer) souphttpsrc.+libsoup\\/([\\w\\.-]+)/i, // Gstreamer\n /(htc streaming player) [\\w_]+ \\/ ([\\d\\.]+)/i, // HTC Streaming Player\n /(lavf)([\\d\\.]+)/i, // Lavf (FFMPEG)\n // MPlayer SVN\n /(mplayer)(?: |\\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\\d+(?:-\\d+[\\w\\.-]+))/i,\n / (songbird)\\/([\\w\\.-]+)/i, // Songbird/Philips-Songbird\n /(winamp)(?:3 version|mpeg| ) ([\\w\\.-]+)/i, // Winamp\n /(vlc)(?:\\/| media player - version )([\\w\\.-]+)/i, // VLC Videolan\n /^(foobar2000|itunes|smp)\\/([\\d\\.]+)/i, // Foobar2000/iTunes/SMP\n /com\\.(riseupradioalarm)\\/([\\d\\.]*)/i, // RiseUP Radio Alarm\n /(mplayer)(?:\\s|\\/| unknown-)([\\w\\.\\-]+)/i, // MPlayer\n // Windows Media Server\n /(windows)\\/([\\w\\.-]+) upnp\\/[\\d\\.]+ dlnadoc\\/[\\d\\.]+ home media server/i\n ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [\n\n /(flrp)\\/([\\w\\.-]+)/i // Flip Player\n ], [[NAME, 'Flip Player'], VERSION, [TYPE, MEDIAPLAYER]], [\n // FStream/NativeHost/QuerySeekSpider\n // MPlayer (no other info)/Media Player Classic/Nero ShowTime\n // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)\n // inlight radio / YourMuze\n /(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i \n ], [NAME, [TYPE, MEDIAPLAYER]], [\n\n /(htc_one_s|windows-media-player|wmplayer)\\/([\\w\\.-]+)/i, // HTC One S / Windows Media Player\n ], [[NAME, /[_-]/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [\n\n /(rad.io|radio.(?:de|at|fr)) ([\\d\\.]+)/i // Rad.io\n ], [[NAME, 'rad.io'], VERSION, [TYPE, MEDIAPLAYER]]\n ]\n});\n\n/////////////\n// LIBRARIES\n//////////////\n\nconst Libraries = Object.freeze({\n browser : [\n [\n // Apache-HttpClient/Axios/Bun/Dart/go-http-client/got/GuzzleHttp/hackney/http.rb/Java[-HttpClient]/Jetty/jsdom/libwww-perl/lua-resty-http/Needle/Node.js/node-fetch/ocaml-cohttp/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/rest-client/Scrapy/superagent\n /^((?:apache|go|java)-http-?client|axios|bun|dart|deno|got|(?:guzzle|lua-resty-|ocaml-co|ok)http|hackney|http\\.rb|java|jetty|libwww-perl|needle|node(?:\\.js|-fetch|-superagent)|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|rest-client|scrapy)\\/([\\w\\.]+)/i,\n /(adobeair|aiohttp|jsdom)\\/([\\w\\.]+)/i,\n /(nutch)-([\\w\\.-]+)(\\(|$)/i,\n /\\((java)\\/([\\w\\.]+)/i\n ], [NAME, VERSION, [TYPE, LIBRARY]], [\n /(node-fetch|undici)/i\n ], [NAME, [TYPE, LIBRARY]]\n ]\n});\n\n/////////////\n// VEHICLES\n////////////\n\nconst Vehicles = Object.freeze({\n device : [\n [/aftlbt962e2/i], // BMW\n [[VENDOR, 'BMW']],\n\n [/dilink.+(byd) auto/i], // BYD\n [VENDOR],\n\n [/aftlft962x3/i], // Jeep\n [[VENDOR, 'Jeep'], [MODEL, 'Wagooner']],\n \n [/(rivian) (r1t)/i], // Rivian\n [VENDOR, MODEL],\n\n [/vcc.+netfront/i], // Volvo\n [[VENDOR, 'Volvo']]\n ]\n});\n\n//////////\n// BOTS\n/////////\n\nconst Bots = Object.freeze({\n browser : [\n ...CLIs.browser,\n ...Fetchers.browser,\n ...Crawlers.browser,\n ...Libraries.browser\n ],\n os : [\n ...Fetchers.os\n ]\n});\n\nexport { \n Bots,\n CLIs,\n Crawlers,\n ExtraDevices,\n Emails,\n Fetchers,\n InApps,\n Libraries,\n MediaPlayers,\n Vehicles\n};\n",
|
|
122
|
-
"// Generated ESM version of ua-parser-js/bot-detection\n// DO NOT EDIT THIS FILE!\n// Source: /src/bot-detection/bot-detection.js\n\n//////////////////////////////////////////////////\n/* bot-detection submodule of UAParser.js v2.0.9\n https://github.com/faisalman/ua-parser-js\n Author: Faisal Salman <f@faisalman.com>\n AGPLv3 License */\n/////////////////////////////////////////////////\n\n/*jshint esversion: 6 */ \n\nimport { UAParser } from '../main/ua-parser.mjs';\nimport { Bots, Crawlers, Fetchers } from '../extensions/ua-parser-extensions.mjs';\nimport { BrowserType, Extension } from '../enums/ua-parser-enums.mjs';\nconst { Crawler, Fetcher } = Extension.BrowserName;\n\nclass BotList {\n constructor(ext, prop, list) {\n this.ext = ext;\n this.prop = prop;\n this.list = list.map(x => x.toLowerCase());\n }\n includes(ua) {\n return this.list.includes(\n (typeof ua === 'string' ? \n new UAParser(ua, this.ext).getBrowser() : \n ua.browser\n )[this.prop]?.toLowerCase());\n }\n}\n\nconst BotTypes = new BotList(Bots, 'type', [\n BrowserType.CLI, \n BrowserType.CRAWLER, \n BrowserType.FETCHER, \n BrowserType.LIBRARY\n]);\n\nconst AIAssistants = new BotList(Fetchers, 'name', [\n\n // Amazon\n Fetcher.AMAZON_NOVA_ACT,\n\n // Anthropic\n Fetcher.ANTHROPIC_CLAUDE_USER,\n\n // Cohere\n Fetcher.COHERE_AI,\n\n // DuckDuckGo\n Fetcher.DUCKDUCKGO_ASSISTBOT,\n\n // Google\n Fetcher.GOOGLE_GEMINI_DEEP_RESEARCH,\n\n // Mistral AI\n Fetcher.MISTRALAI_USER,\n\n // OpenAI\n Fetcher.OPENAI_CHATGPT_USER,\n\n // Perplexity\n Fetcher.PERPLEXITY_USER\n]);\n\nconst AICrawlers = new BotList(Crawlers, 'name', [\n\n // AI2\n Crawler.AI2_BOT,\n\n // Amazon\n Crawler.AMAZON_BOT,\n\n // Anthropic\n Crawler.ANTHROPIC_AI,\n Crawler.ANTHROPIC_CLAUDE_BOT,\n Crawler.ANTHROPIC_CLAUDE_SEARCHBOT,\n Crawler.ANTHROPIC_CLAUDE_WEB,\n\n // Apple\n Crawler.APPLE_BOT,\n Crawler.APPLE_BOT_EXTENDED,\n\n // Atlassian\n Crawler.ATLASSIAN_BOT,\n\n // Brave\n Crawler.BRAVE_BOT,\n\n // ByteDance\n Crawler.BYTEDANCE_BYTESPIDER,\n Crawler.BYTEDANCE_TIKTOKSPIDER,\n\n // Cloudflare\n Crawler.CLOUDFLARE_AUTORAG,\n\n // Cohere\n Crawler.COHERE_TRAINING_DATA_CRAWLER,\n\n // Common Crawl\n Crawler.COMMON_CRAWL_CCBOT, \n\n // Coveo\n Crawler.COVEO_BOT,\n\n // DataForSeo\n Crawler.DATAFORSEO_BOT,\n\n // DeepSeek\n Crawler.DEEPSEEK_BOT,\n\n // Diffbot\n Crawler.DIFFBOT,\n\n // Google\n Crawler.GOOGLE_EXTENDED,\n Crawler.GOOGLE_NOTEBOOKLM,\n Crawler.GOOGLE_OTHER,\n Crawler.GOOGLE_OTHER_IMAGE,\n Crawler.GOOGLE_OTHER_VIDEO,\n Crawler.GOOGLE_CLOUDVERTEXBOT,\n\n // Hive AI\n Crawler.HIVE_IMAGESIFTBOT,\n\n // Huawei\n Crawler.HUAWEI_PETALBOT,\n Crawler.HUAWEI_PANGUBOT,\n\n // Hugging Face\n Crawler.HUGGINGFACE_BOT,\n\n // Kangaroo\n Crawler.KANGAROO_BOT,\n\n // Mendable.ai\n Crawler.FIRECRAWL_AGENT,\n\n // Meta\n Crawler.META_FACEBOOKBOT,\n Crawler.META_EXTERNALAGENT,\n\n // OpenAI\n Crawler.OPENAI_GPTBOT,\n Crawler.OPENAI_SEARCH_BOT,\n\n // Perplexity\n Crawler.PERPLEXITY_BOT,\n\n // Replicate\n Crawler.REPLICATE_BOT,\n\n // Runpod\n Crawler.RUNPOD_BOT,\n\n // SB Intuitions\n Crawler.SB_INTUITIONS_BOT,\n\n // Semrush\n Crawler.SEMRUSH_BOT_CONTENTSHAKE,\n Crawler.SEMRUSH_BOT_SWA,\n\n // Timpi\n Crawler.TIMPI_BOT,\n\n // Together AI\n Crawler.TOGETHER_BOT,\n\n // Velen.io\n Crawler.HUNTER_VELENPUBLICWEBCRAWLER,\n\n // Vercel\n Crawler.VERCEL_V0BOT,\n\n // Webz.io\n Crawler.WEBZIO_OMGILI,\n Crawler.WEBZIO_OMGILI_BOT,\n Crawler.WEBZIO_EXTENDED,\n\n // X\n Crawler.XAI_BOT,\n\n // You.com\n Crawler.YOU_BOT,\n\n // Zhipu AI\n Crawler.ZHIPU_CHATGLM_SPIDER\n]);\n\nconst isBot = ua => BotTypes.includes(ua);\nconst isAIAssistant = ua => AIAssistants.includes(ua);\nconst isAICrawler = ua => AICrawlers.includes(ua);\n\nexport {\n isAIAssistant, \n isAICrawler,\n isBot\n}",
|
|
123
|
-
"/*! isStandalonePWA 0.1.1\n Detect if PWA is running in standalone mode\n https://github.com/faisalman/is-standalone-pwa\n Author: Faisal Salman <f@faisalman.com>\n MIT License */\nexport function isStandalonePWA() {\n var _a;\n return typeof window !== 'undefined' &&\n ((window === null || window === void 0 ? void 0 : window.matchMedia('(display-mode: standalone)').matches) ||\n ((_a = window.navigator) === null || _a === void 0 ? void 0 : _a.standalone) ||\n document.referrer.startsWith('android-app://') ||\n (window === null || window === void 0 ? void 0 : window.Windows) ||\n /trident.+(msapphost|webview)\\//i.test(navigator.userAgent) ||\n document.referrer.startsWith('app-info://platform/microsoft-store'));\n}\n;\n",
|
|
124
|
-
"/*! detectEurope.js v0.1.2\n Determine whether a user is from the European Union (EU) area\n https://github.com/faisalman/detect-europe-js\n Author: Faisal Salman <f@faisalman.com>\n MIT License */\nconst TIMEZONE = {\n ANDORRA: {\n ANDORRA: 'Europe/Andorra'\n },\n AUSTRIA: {\n VIENNA: 'Europe/Vienna'\n },\n BELGIUM: {\n BRUSSELS: 'Europe/Brussels'\n },\n BULGARIA: {\n SOFIA: 'Europe/Sofia'\n },\n CROATIA: {\n ZAGREB: 'Europe/Zagreb'\n },\n CYPRUS: {\n NICOSIA_EUROPE: 'Europe/Nicosia',\n NICOSIA_ASIA: 'Asia/Nicosia',\n FAMAGUSTA: 'Asia/Famagusta'\n },\n CZECHIA: {\n PRAGUE: 'Europe/Prague'\n },\n DENMARK: {\n COPENHAGEN: 'Europe/Copenhagen',\n FAROE: 'Atlantic/Faroe'\n },\n ESTONIA: {\n TALLINN: 'Europe/Tallinn'\n },\n FINLAND: {\n HELSINKI: 'Europe/Helsinki',\n MARIEHAMN: 'Europe/Mariehamn'\n },\n FRANCE: {\n PARIS: 'Europe/Paris',\n CAYENNE: 'America/Cayenne',\n GUADELOUPE: 'America/Guadeloupe',\n MARIGOT: 'America/Marigot',\n MARTINIQUE: 'America/Martinique',\n MAYOTTE: 'Indian/Mayotte',\n REUNION: 'Indian/Reunion'\n },\n GERMANY: {\n BERLIN: 'Europe/Berlin',\n BUSINGEN: 'Europe/Busingen'\n },\n GREECE: {\n ATHENS: 'Europe/Athens'\n },\n HUNGARY: {\n BUDAPEST: 'Europe/Budapest'\n },\n ICELAND: {\n REYKJAVIK: 'Atlantic/Reykjavik'\n },\n IRELAND: {\n DUBLIN: 'Europe/Dublin'\n },\n ITALY: {\n ROME: 'Europe/Rome'\n },\n LATVIA: {\n RIGA: 'Europe/Riga'\n },\n LIECHTENSTEIN: {\n VADUZ: 'Europe/Vaduz'\n },\n LITHUANIA: {\n VILNIUS: 'Europe/Vilnius'\n },\n LUXEMBOURG: {\n LUXEMBOURG: 'Europe/Luxembourg'\n },\n MALTA: {\n MALTA: 'Europe/Malta'\n },\n MONACO: {\n MONACO: 'Europe/Monaco'\n },\n NETHERLANDS: {\n AMSTERDAM: 'Europe/Amsterdam',\n ARUBA: 'America/Aruba',\n CURACAO: 'America/Curacao',\n KRALENDIJK: 'America/Kralendijk',\n LOWER_PRINCES: 'America/Lower_Princes'\n },\n NORWAY: {\n OSLO: 'Europe/Oslo',\n JAN_MAYEN: 'Atlantic/Jan_Mayen',\n LONGYEARBYEN: 'Arctic/Longyearbyen'\n },\n POLAND: {\n WARSAW: 'Europe/Warsaw'\n },\n PORTUGAL: {\n LISBON: 'Europe/Lisbon',\n AZORES: 'Atlantic/Azores',\n MADEIRA: 'Atlantic/Madeira'\n },\n ROMANIA: {\n BUCHAREST: 'Europe/Bucharest'\n },\n SAN_MARINO: {\n SAN_MARINO: 'Europe/San_Marino'\n },\n SLOVAKIA: {\n BRATISLAVA: 'Europe/Bratislava'\n },\n SLOVENIA: {\n LJUBLJANA: 'Europe/Ljubljana'\n },\n SPAIN: {\n MADRID: 'Europe/Madrid',\n CANARY: 'Atlantic/Canary',\n CEUTA: 'Africa/Ceuta'\n },\n SWEDEN: {\n STOCKHOLM: 'Europe/Stockholm'\n },\n SWITZERLAND: {\n ZURICH: 'Europe/Zurich'\n },\n VATICAN: {\n VATICAN: 'Europe/Vatican'\n }\n};\nconst EU_TIMEZONE = [\n TIMEZONE.AUSTRIA.VIENNA,\n TIMEZONE.BELGIUM.BRUSSELS,\n TIMEZONE.BULGARIA.SOFIA,\n TIMEZONE.CROATIA.ZAGREB,\n TIMEZONE.CYPRUS.NICOSIA_EUROPE,\n TIMEZONE.CYPRUS.NICOSIA_ASIA,\n TIMEZONE.CYPRUS.FAMAGUSTA,\n TIMEZONE.CZECHIA.PRAGUE,\n TIMEZONE.DENMARK.COPENHAGEN,\n TIMEZONE.ESTONIA.TALLINN,\n TIMEZONE.FINLAND.HELSINKI,\n TIMEZONE.FINLAND.MARIEHAMN,\n TIMEZONE.FRANCE.PARIS,\n TIMEZONE.GERMANY.BERLIN,\n TIMEZONE.GREECE.ATHENS,\n TIMEZONE.HUNGARY.BUDAPEST,\n TIMEZONE.IRELAND.DUBLIN,\n TIMEZONE.ITALY.ROME,\n TIMEZONE.LATVIA.RIGA,\n TIMEZONE.LITHUANIA.VILNIUS,\n TIMEZONE.LUXEMBOURG.LUXEMBOURG,\n TIMEZONE.MALTA.MALTA,\n TIMEZONE.NETHERLANDS.AMSTERDAM,\n TIMEZONE.POLAND.WARSAW,\n TIMEZONE.PORTUGAL.LISBON,\n TIMEZONE.ROMANIA.BUCHAREST,\n TIMEZONE.SLOVAKIA.BRATISLAVA,\n TIMEZONE.SLOVENIA.LJUBLJANA,\n TIMEZONE.SPAIN.MADRID,\n TIMEZONE.SWEDEN.STOCKHOLM,\n TIMEZONE.FRANCE.CAYENNE,\n TIMEZONE.FRANCE.GUADELOUPE,\n TIMEZONE.FRANCE.MARIGOT,\n TIMEZONE.FRANCE.MARTINIQUE,\n TIMEZONE.FRANCE.MAYOTTE,\n TIMEZONE.FRANCE.REUNION,\n TIMEZONE.PORTUGAL.AZORES,\n TIMEZONE.PORTUGAL.MADEIRA,\n TIMEZONE.SPAIN.CANARY\n];\nconst EEA_EFTA_TIMEZONE = [\n TIMEZONE.ICELAND.REYKJAVIK,\n TIMEZONE.LIECHTENSTEIN.VADUZ,\n TIMEZONE.NORWAY.OSLO,\n TIMEZONE.NORWAY.JAN_MAYEN\n];\nconst EEA_TIMEZONE = [\n ...EU_TIMEZONE,\n ...EEA_EFTA_TIMEZONE\n];\nconst EFTA_TIMEZONE = [\n TIMEZONE.SWITZERLAND.ZURICH,\n ...EEA_EFTA_TIMEZONE\n];\nconst SCHENGEN_TIMEZONE = [\n TIMEZONE.AUSTRIA.VIENNA,\n TIMEZONE.BELGIUM.BRUSSELS,\n TIMEZONE.BULGARIA.SOFIA,\n TIMEZONE.CROATIA.ZAGREB,\n TIMEZONE.CZECHIA.PRAGUE,\n TIMEZONE.DENMARK.COPENHAGEN,\n TIMEZONE.ESTONIA.TALLINN,\n TIMEZONE.FINLAND.HELSINKI,\n TIMEZONE.FINLAND.MARIEHAMN,\n TIMEZONE.FRANCE.PARIS,\n TIMEZONE.GERMANY.BERLIN,\n TIMEZONE.GREECE.ATHENS,\n TIMEZONE.HUNGARY.BUDAPEST,\n TIMEZONE.ITALY.ROME,\n TIMEZONE.LATVIA.RIGA,\n TIMEZONE.LITHUANIA.VILNIUS,\n TIMEZONE.LUXEMBOURG.LUXEMBOURG,\n TIMEZONE.MALTA.MALTA,\n TIMEZONE.NETHERLANDS.AMSTERDAM,\n TIMEZONE.POLAND.WARSAW,\n TIMEZONE.PORTUGAL.LISBON,\n TIMEZONE.PORTUGAL.AZORES,\n TIMEZONE.PORTUGAL.MADEIRA,\n TIMEZONE.ROMANIA.BUCHAREST,\n TIMEZONE.SLOVAKIA.BRATISLAVA,\n TIMEZONE.SLOVENIA.LJUBLJANA,\n TIMEZONE.SPAIN.MADRID,\n TIMEZONE.SPAIN.CANARY,\n TIMEZONE.SWEDEN.STOCKHOLM,\n TIMEZONE.ANDORRA.ANDORRA,\n TIMEZONE.GERMANY.BUSINGEN,\n TIMEZONE.ICELAND.REYKJAVIK,\n TIMEZONE.LIECHTENSTEIN.VADUZ,\n TIMEZONE.MONACO.MONACO,\n TIMEZONE.NORWAY.OSLO,\n TIMEZONE.SAN_MARINO.SAN_MARINO,\n TIMEZONE.SPAIN.CEUTA,\n TIMEZONE.SWITZERLAND.ZURICH,\n TIMEZONE.VATICAN.VATICAN\n];\nconst isTimezoneIn = (tz) => { var _a; return typeof window !== 'undefined' && ((_a = window === null || window === void 0 ? void 0 : window.Intl) === null || _a === void 0 ? void 0 : _a.DateTimeFormat) && tz.includes(Intl.DateTimeFormat().resolvedOptions().timeZone); };\nconst isFromEU = () => isTimezoneIn(EU_TIMEZONE);\nconst isFromEEA = () => isTimezoneIn(EEA_TIMEZONE);\nconst isFromEFTA = () => isTimezoneIn(EFTA_TIMEZONE);\nconst isFromSchengen = () => isTimezoneIn(SCHENGEN_TIMEZONE);\nexport { isFromEU, isFromEEA, isFromEFTA, isFromSchengen };\n",
|
|
125
|
-
"// Generated ESM version of ua-parser-js/browser-detection\n// DO NOT EDIT THIS FILE!\n// Source: /src/browser-detection/browser-detection.js\n\n//////////////////////////////////////////////////////\n/* browser-detection submodule of UAParser.js v2.0.9\n https://github.com/faisalman/ua-parser-js\n Author: Faisal Salman <f@faisalman.com>\n AGPLv3 License */\n/////////////////////////////////////////////////////\n\n/*jshint esversion: 6 */ \n\nimport { UAParser } from '../main/ua-parser.mjs';\nimport { EngineName } from '../enums/ua-parser-enums.mjs';\nimport { isStandalonePWA } from 'is-standalone-pwa';\nimport { isFromEU } from 'detect-europe-js';\n\nconst isChromeFamily = val => !!(\n (typeof val === 'string' ? \n new UAParser(val).getEngine() : \n val.engine\n )?.is(EngineName.BLINK));\n\nconst isElectron = () => !!(\n process?.versions?.hasOwnProperty('electron') || // node.js\n / electron\\//i.test(navigator?.userAgent)); // browser\n\nexport { \n isChromeFamily,\n isElectron,\n isFromEU,\n isStandalonePWA\n}",
|
|
126
|
-
"/*! isFrozenUA\n A freeze-test for your user-agent string\n https://github.com/faisalman/ua-is-frozen\n Author: Faisal Salman <f@faisalman.com>\n MIT License */\nfunction isFrozenUA(ua) {\n return /^Mozilla\\/5\\.0 \\((Windows NT 10\\.0; Win64; x64|Macintosh; Intel Mac OS X 10_15_7|X11; Linux x86_64|X11; CrOS x86_64 14541\\.0\\.0|Fuchsia|Linux; Android 10; K)\\) AppleWebKit\\/537\\.36 \\(KHTML, like Gecko\\) Chrome\\/\\d+\\.0\\.0\\.0 (Mobile )?Safari\\/537\\.36/.test(ua);\n}\nexport { isFrozenUA };\n",
|
|
127
|
-
"import type { BrowserName, BrowserType, CPUArch, DeviceType, DeviceVendor, EngineName, Extension, OSName } from \"ua-parser-js/enums\"\n\nimport { UAParser } from \"ua-parser-js\"\nimport { isAppleSilicon } from \"ua-parser-js/device-detection\"\nimport { isFrozenUA } from \"ua-parser-js/helpers\"\nimport { isAIAssistant, isAICrawler, isBot } from \"ua-parser-js/bot-detection\"\nimport { isChromeFamily, isElectron, isFromEU, isStandalonePWA } from \"ua-parser-js/browser-detection\"\n\nimport { Bots, CLIs, Crawlers, Emails, ExtraDevices, Fetchers, InApps, Libraries, MediaPlayers, Vehicles } from \"ua-parser-js/extensions\"\n\nimport type { IResult } from \"ua-parser-js\"\n\ninterface NetworkInformation {\n downlink: number\n downlinkMax: number\n effectiveType: \"slow-2g\" | \"2g\" | \"3g\" | \"4g\"\n rtt: number\n saveData: boolean\n type: \"bluetooth\" | \"cellular\" | \"ethernet\" | \"none\" | \"wifi\" | \"wimax\" | \"other\" | \"unknown\"\n}\nconst getNetworkInformation = (): NetworkInformation | undefined => {\n let connection: NetworkInformation | undefined;\n if (\"connection\" in navigator) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n connection = navigator.connection as NetworkInformation;\n } else if (\"mozConnection\" in navigator) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n connection = navigator.mozConnection as NetworkInformation;\n } else if (\"webkitConnection\" in navigator) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n connection = navigator.webkitConnection as NetworkInformation;\n }\n return connection;\n};\n\n/**\n * Describe navigator-level device and network metadata.\n */\nexport interface DeviceNavigatorInfo {\n oscpu: string | undefined\n deviceMemory: number | undefined\n hardwareConcurrency: number | undefined\n maxTouchPoints: number | undefined\n platform: Navigator['platform']\n\n devicePosture: \"continuous\" | \"folded\" | undefined\n connectionDownlink: NetworkInformation['downlink'] | undefined\n connectionDownlinkMax: NetworkInformation['downlinkMax'] | undefined\n connectionEffectiveType: NetworkInformation['effectiveType'] | undefined\n connectionRtt: NetworkInformation['rtt'] | undefined\n connectionSaveData: NetworkInformation['saveData'] | undefined\n connectionType: NetworkInformation['type'] | undefined\n online: boolean\n cookiesEnabled: boolean\n language: string\n languages: string[]\n pdfViewerEnabled: boolean\n}\n/**\n * Collect device information from the Navigator API.\n */\nexport const getDeviceNavigatorInfo = (): DeviceNavigatorInfo => {\n const connection = getNetworkInformation();\n\n return {\n oscpu: \"oscpu\" in navigator ? String(navigator.oscpu) : undefined,\n hardwareConcurrency: \"hardwareConcurrency\" in navigator ? Number.parseInt(String(navigator.hardwareConcurrency), 10) : undefined,\n deviceMemory: \"deviceMemory\" in navigator ? Number.parseFloat(String(navigator.deviceMemory)) : undefined,\n maxTouchPoints: navigator.maxTouchPoints,\n platform: navigator.platform,\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n devicePosture: \"devicePosture\" in navigator ? (navigator.devicePosture as { type: \"continuous\" | \"folded\" }).type : undefined,\n connectionDownlink: connection?.downlink ?? undefined,\n connectionDownlinkMax: connection?.downlinkMax ?? undefined,\n connectionEffectiveType: connection?.effectiveType ?? undefined,\n connectionRtt: connection?.rtt ?? undefined,\n connectionSaveData: connection?.saveData ?? undefined,\n connectionType: connection?.type ?? undefined,\n online: navigator.onLine,\n cookiesEnabled: navigator.cookieEnabled,\n language: navigator.language,\n languages: [...navigator.languages],\n pdfViewerEnabled: navigator.pdfViewerEnabled,\n }\n}\n\n/**\n * Describe device metadata parsed from a user-agent string.\n */\nexport interface DeviceUserAgentInfo {\n ua: string\n uaIsFrozen: boolean\n\n cpuArchitecture: typeof CPUArch[keyof typeof CPUArch] | undefined\n\n osName: typeof OSName[keyof typeof OSName] | undefined\n osVersion: IResult['os']['version'] | undefined\n\n engineName: typeof EngineName[keyof typeof EngineName] | undefined\n engineVersion: IResult['engine']['version'] | undefined\n\n browserName:\n | typeof BrowserName[keyof typeof BrowserName]\n | typeof Extension['BrowserName']['CLI'][keyof typeof Extension['BrowserName']['CLI']]\n | typeof Extension['BrowserName']['Crawler'][keyof typeof Extension['BrowserName']['Crawler']]\n | typeof Extension['BrowserName']['Email'][keyof typeof Extension['BrowserName']['Email']]\n | typeof Extension['BrowserName']['Fetcher'][keyof typeof Extension['BrowserName']['Fetcher']]\n | typeof Extension['BrowserName']['InApp'][keyof typeof Extension['BrowserName']['InApp']]\n | typeof Extension['BrowserName']['Library'][keyof typeof Extension['BrowserName']['Library']]\n | undefined\n browserVersion: IResult['browser']['version'] | undefined\n browserMajor: IResult['browser']['major'] | undefined\n browserType: typeof BrowserType[keyof typeof BrowserType] | undefined\n browserIsAiAssistant: boolean\n browserIsAiCrawler: boolean\n browserIsBot: boolean\n browserIsChromeFamily: boolean\n browserIsElectron: boolean\n browserIsFromEU: boolean\n browserIsStandalonePWA: boolean\n\n deviceType: typeof DeviceType[keyof typeof DeviceType] | undefined\n deviceVendor:\n | typeof DeviceVendor[keyof typeof DeviceVendor]\n | typeof Extension['DeviceVendor']['Vehicle'][keyof typeof Extension['DeviceVendor']['Vehicle']]\n | undefined\n deviceModel: IResult['device']['model'] | undefined\n deviceIsAppleSilicon: boolean\n}\n/**\n * Parse the user-agent string into normalized device metadata.\n *\n * @see {@link https://docs.uaparser.dev/ | UAParser.js}\n */\nexport const parseUserAgent = (userAgent: string): DeviceUserAgentInfo => {\n // @ts-expect-error - UAParser.js type definitions has unknown issue with extensions\n const parser = new UAParser([Bots, CLIs, Crawlers, Emails, ExtraDevices, Fetchers, InApps, Libraries, MediaPlayers, Vehicles])\n parser.setUA(userAgent)\n const result = parser.getResult()\n\n let browserIsElectron: boolean\n try {\n browserIsElectron = isElectron()\n } catch {\n browserIsElectron = false\n }\n\n let browserIsStandalonePWA: boolean\n try {\n browserIsStandalonePWA = isStandalonePWA()\n } catch {\n browserIsStandalonePWA = false\n }\n\n return {\n ua: userAgent,\n uaIsFrozen: isFrozenUA(userAgent),\n\n cpuArchitecture: result.cpu.architecture,\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n osName: result.os.name as typeof OSName[keyof typeof OSName],\n osVersion: result.os.version,\n\n engineName: result.engine.name,\n engineVersion: result.engine.version,\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n browserName: result.browser.name as typeof BrowserName[keyof typeof BrowserName],\n browserVersion: result.browser.version,\n browserMajor: result.browser.major,\n browserType: result.browser.type,\n browserIsAiAssistant: isAIAssistant(userAgent),\n browserIsAiCrawler: isAICrawler(userAgent),\n browserIsBot: isBot(userAgent),\n browserIsChromeFamily: isChromeFamily(userAgent),\n browserIsElectron,\n browserIsFromEU: isFromEU(),\n browserIsStandalonePWA,\n\n deviceType: result.device.type,\n // oxlint-disable-next-line no-unsafe-type-assertion\n deviceVendor: result.device.vendor as typeof DeviceVendor[keyof typeof DeviceVendor],\n deviceModel: result.device.model,\n deviceIsAppleSilicon: isAppleSilicon(userAgent),\n }\n}\n\nconst getSafeAreaInset = (edge: \"top\" | \"bottom\" | \"left\" | \"right\"): number => {\n const style = getComputedStyle(document.documentElement);\n\n // 尝试 env(),现代 Safari\n let value = style.getPropertyValue(`env(safe-area-inset-${edge})`);\n if (value === \"\") {\n // 尝试 constant(),旧版 iOS\n value = style.getPropertyValue(`constant(safe-area-inset-${edge})`);\n }\n\n return value !== \"\" ? Number.parseFloat(value) : 0;\n}\n\n/**\n * Describe screen, viewport, and safe-area metadata.\n */\nexport interface DeviceScreenInfo {\n pixelRatio: number\n orientationOriginal: OrientationType | 'unknown'\n orientationCalculated: 'portrait' | 'landscape'\n\n screenWidth: number\n screenHeight: number\n screenAvailableWidth: number\n screenAvailableHeight: number\n browserWidth: number\n browserHeight: number\n /**\n * With scrollbar.\n */\n viewportWidth: number\n /**\n * With scrollbar.\n */\n viewportHeight: number\n /**\n * Without scrollbar.\n */\n viewportAvailableWidth: number\n /**\n * Without scrollbar.\n */\n viewportAvailableHeight: number\n /**\n * Without scrollbar.\n */\n visualViewportWidth: number | undefined\n /**\n * Without scrollbar.\n */\n visualViewportHeight: number | undefined\n visualViewportOffsetLeft: number | undefined\n visualViewportOffsetTop: number | undefined\n visualViewportPageLeft: number | undefined\n visualViewportPageTop: number | undefined\n visualViewportScale: number | undefined\n safeAreaTop: number\n safeAreaBottom: number\n safeAreaLeft: number\n safeAreaRight: number\n contentWidth: number\n contentHeight: number\n}\n/**\n * Collect screen and viewport information from the current window.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Window/visualViewport}\n */\nexport const getDeviceScreenInfo = (): DeviceScreenInfo => {\n return {\n pixelRatio: window.devicePixelRatio,\n orientationOriginal: window.screen.orientation?.type || 'unknown',\n orientationCalculated: window.innerWidth > window.innerHeight ? 'landscape' : 'portrait',\n\n screenWidth: window.screen.width,\n screenHeight: window.screen.height,\n screenAvailableWidth: window.screen.availWidth,\n screenAvailableHeight: window.screen.availHeight,\n browserWidth: window.outerWidth,\n browserHeight: window.outerHeight,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n viewportAvailableWidth: document.documentElement.clientWidth,\n viewportAvailableHeight: document.documentElement.clientHeight,\n visualViewportWidth: window.visualViewport?.width,\n visualViewportHeight: window.visualViewport?.height,\n visualViewportOffsetLeft: window.visualViewport?.offsetLeft,\n visualViewportOffsetTop: window.visualViewport?.offsetTop,\n visualViewportPageLeft: window.visualViewport?.pageLeft,\n visualViewportPageTop: window.visualViewport?.pageTop,\n visualViewportScale: window.visualViewport?.scale,\n safeAreaTop: getSafeAreaInset('top'),\n safeAreaBottom: getSafeAreaInset('bottom'),\n safeAreaLeft: getSafeAreaInset('left'),\n safeAreaRight: getSafeAreaInset('right'),\n contentWidth: document.documentElement.scrollWidth,\n contentHeight: document.documentElement.scrollHeight\n };\n}\n\n/**\n * Describe merged device information from navigator, UA, and screen.\n */\nexport interface DeviceInfo {\n navigator: DeviceNavigatorInfo\n userAgent: DeviceUserAgentInfo\n screen: DeviceScreenInfo\n}\n/**\n * Get merged device information from navigator, user-agent, and screen.\n */\nexport const getDeviceInfo = (userAgent: string): DeviceInfo => {\n const navigatorInfo = getDeviceNavigatorInfo();\n const userAgentInfo = parseUserAgent(userAgent);\n const screenInfo = getDeviceScreenInfo();\n\n return {\n navigator: navigatorInfo,\n userAgent: userAgentInfo,\n screen: screenInfo\n };\n}\n",
|
|
128
|
-
"// oxlint-disable no-unsafe-member-access\n// oxlint-disable no-undef\n// oxlint-disable no-typeof-undefined\n\nimport type { StringAutoCompletable } from \"#Source/type/index.ts\"\nimport type { Use } from \"./basic.ts\"\n\nimport { useFactory } from \"./basic.ts\"\n\n/**\n * Define built-in and custom runtime keys.\n */\nexport type Runtime =\n | StringAutoCompletable\n | \"browser\"\n | \"nodejs\"\n | \"deno\"\n | \"bun\"\n | \"web-worker\"\n | \"service-worker\"\n | \"unknown\"\n\ninterface RuntimeRegistryItem {\n runtime: Runtime\n detect: () => boolean\n // oxlint-disable-next-line no-explicit-any\n getGlobalContext: () => any\n // oxlint-disable-next-line no-explicit-any\n use: Use<any>\n}\nconst internalRuntimeRegistry = new Map<Runtime, RuntimeRegistryItem>();\n/**\n * Check whether a runtime is registered.\n */\nexport const isRuntimeRegistered = (runtime: Runtime): boolean => {\n return internalRuntimeRegistry.has(runtime);\n};\n/**\n * Register a runtime detector and context provider.\n */\nexport const registerRuntime = (item: RuntimeRegistryItem): void => {\n internalRuntimeRegistry.set(item.runtime, item);\n};\n/**\n * Unregister a runtime by key.\n */\nexport const unregisterRuntime = (name: Runtime): void => {\n internalRuntimeRegistry.delete(name);\n};\n/**\n * List all registered runtime keys.\n */\nexport const listRuntimes = (): Runtime[] => {\n return Array.from(internalRuntimeRegistry.keys());\n}\n\n/**\n * Check if the environment is a browser.\n */\nexport const isBrowser = (): boolean => {\n return typeof window !== \"undefined\" && typeof window.document !== \"undefined\"\n}\n/**\n * Describe runtime context values available in browser.\n */\nexport interface RuntimeContextBrowser {\n global: Window & typeof globalThis\n self: Window & typeof globalThis\n window: Window & typeof globalThis\n globalThis: typeof globalThis\n importMeta: ImportMeta\n}\n/**\n * Return browser runtime context values.\n */\nexport const getRuntimeContextBrowser = (): RuntimeContextBrowser => {\n return { global: window, self, window, globalThis, importMeta: import.meta }\n}\n/**\n * Execute logic with browser runtime context when available.\n */\nexport const useBrowser: Use<RuntimeContextBrowser> = useFactory(getRuntimeContextBrowser, isBrowser)\nregisterRuntime({\n runtime: \"browser\",\n detect: isBrowser,\n getGlobalContext: getRuntimeContextBrowser,\n use: useBrowser,\n});\n\n/**\n * Check if the environment is Node.js.\n */\nexport const isNodejs = (): boolean => {\n return typeof process !== \"undefined\" && process.versions !== null && process.versions.node !== null\n}\n/**\n * Describe runtime context values available in Node.js.\n */\nexport interface RuntimeContextNodejs {\n global: typeof globalThis\n globalThis: typeof globalThis\n}\n/**\n * Return Node.js runtime context values.\n */\nexport const getRuntimeContextNodejs = (): RuntimeContextNodejs => {\n return { global: globalThis, globalThis }\n}\n/**\n * Execute logic with Node.js runtime context when available.\n */\nexport const useNodejs: Use<RuntimeContextNodejs> = useFactory(getRuntimeContextNodejs, isNodejs)\nregisterRuntime({\n runtime: \"nodejs\",\n detect: isNodejs,\n getGlobalContext: getRuntimeContextNodejs,\n use: useNodejs,\n});\n\n/**\n * Check if the environment is Deno.\n */\nexport const isDeno = (): boolean => {\n // @ts-expect-error Deno is not defined in some environments\n return typeof Deno !== \"undefined\" && typeof Deno.version !== \"undefined\" && typeof Deno.version.deno !== \"undefined\"\n}\n/**\n * Describe runtime context values available in Deno.\n */\nexport interface RuntimeContextDeno {\n global: typeof globalThis\n globalThis: typeof globalThis\n}\n/**\n * Return Deno runtime context values.\n */\nexport const getRuntimeContextDeno = (): RuntimeContextDeno => {\n return { global: globalThis, globalThis }\n};\n/**\n * Execute logic with Deno runtime context when available.\n */\nexport const useDeno: Use<RuntimeContextDeno> = useFactory(getRuntimeContextDeno, isDeno)\nregisterRuntime({\n runtime: \"deno\",\n detect: isDeno,\n getGlobalContext: getRuntimeContextDeno,\n use: useDeno,\n});\n\n/**\n * Check if the environment is Bun.\n */\nexport const isBun = (): boolean => {\n return typeof Bun !== \"undefined\" && typeof Bun.version !== \"undefined\" && typeof Bun.version !== \"undefined\"\n}\n/**\n * Describe runtime context values available in Bun.\n */\nexport interface RuntimeContextBun {\n global: typeof globalThis\n Bun: typeof Bun\n globalThis: typeof globalThis\n importMeta: ImportMeta\n}\n/**\n * Return Bun runtime context values.\n */\nexport const getRuntimeContextBun = (): RuntimeContextBun => {\n return { global: globalThis, Bun, globalThis, importMeta: import.meta }\n};\n/**\n * Execute logic with Bun runtime context when available.\n */\nexport const useBun: Use<RuntimeContextBun> = useFactory(getRuntimeContextBun, isBun)\nregisterRuntime({\n runtime: \"bun\",\n detect: isBun,\n getGlobalContext: getRuntimeContextBun,\n use: useBun,\n});\n\n/**\n * Check if the environment is a Web Worker.\n */\nexport const isWebWorker = (): boolean => {\n return (\n typeof self !== \"undefined\" &&\n typeof WorkerGlobalScope !== \"undefined\" &&\n self instanceof WorkerGlobalScope &&\n (\n typeof ServiceWorkerGlobalScope === \"undefined\" ||\n !(self instanceof ServiceWorkerGlobalScope)\n )\n )\n}\n/**\n * Describe runtime context values available in Web Worker.\n */\nexport interface RuntimeContextWebWorker {\n global: typeof globalThis\n self: WorkerGlobalScope & typeof globalThis\n globalThis: typeof globalThis\n}\n/**\n * Return Web Worker runtime context values.\n */\nexport const getRuntimeContextWebWorker = (): RuntimeContextWebWorker => {\n // @ts-expect-error - self is not defined in some environments\n return { global: self, self, globalThis }\n}\n/**\n * Execute logic with Web Worker runtime context when available.\n */\nexport const useWebWorker: Use<RuntimeContextWebWorker> = useFactory(getRuntimeContextWebWorker, isWebWorker)\nregisterRuntime({\n runtime: \"web-worker\",\n detect: isWebWorker,\n getGlobalContext: getRuntimeContextWebWorker,\n use: useWebWorker,\n});\n\n/**\n * Check if the environment is a Service Worker.\n */\nexport const isServiceWorker = (): boolean => {\n return (\n typeof self !== \"undefined\" &&\n typeof ServiceWorkerGlobalScope !== \"undefined\" &&\n self instanceof ServiceWorkerGlobalScope\n )\n}\n/**\n * Describe runtime context values available in Service Worker.\n */\nexport interface RuntimeContextServiceWorker {\n global: typeof globalThis\n self: ServiceWorkerGlobalScope & typeof globalThis\n globalThis: typeof globalThis\n}\n/**\n * Return Service Worker runtime context values.\n */\nexport const getServiceWorkerContext = (): RuntimeContextServiceWorker => {\n // @ts-expect-error - self is not defined in some environments\n return { global: self, self, globalThis }\n};\n/**\n * Execute logic with Service Worker runtime context when available.\n */\nexport const useServiceWorker: Use<RuntimeContextServiceWorker> = useFactory(getServiceWorkerContext, isServiceWorker)\nregisterRuntime({\n runtime: \"service-worker\",\n detect: isServiceWorker,\n getGlobalContext: getServiceWorkerContext,\n use: useServiceWorker,\n});\n\n/**\n * Check if the environment is unknown.\n */\nexport const isUnknown = (): boolean => {\n return getRuntimeRegistryItem().runtime === \"unknown\";\n}\n/**\n * Describe runtime context values for unknown runtime.\n */\nexport interface RuntimeContextUnknown {\n global: unknown\n}\n/**\n * Return unknown runtime context values.\n */\nexport const getRuntimeContextUnknown = (): RuntimeContextUnknown => {\n return { global: undefined }\n};\n/**\n * Execute logic with unknown runtime context when available.\n */\nexport const useUnknown: Use<RuntimeContextUnknown> = useFactory(getRuntimeContextUnknown, isUnknown)\nregisterRuntime({\n runtime: \"unknown\",\n detect: isUnknown,\n getGlobalContext: getRuntimeContextUnknown,\n use: useUnknown,\n});\n\n/**\n * Get the current runtime environment.\n */\nexport const getRuntimeRegistryItem = (): RuntimeRegistryItem => {\n // 如果不是其它任何 Runtime,则是 unknown\n // 这样写可以兼容用户自行注册的 Runtime\n for (const [name, item] of internalRuntimeRegistry) {\n if (name === \"unknown\") {\n continue;\n }\n if (item.detect() === true) {\n return item;\n }\n }\n return internalRuntimeRegistry.get(\"unknown\")!;\n}\n\n/**\n * Get the key of the current runtime environment.\n */\nexport const getRuntime = (): RuntimeRegistryItem['runtime'] => {\n return getRuntimeRegistryItem().runtime;\n};\n\n/**\n * Define detection results for registered runtimes.\n */\nexport type RuntimeFlags = Record<Runtime, boolean>;\n/**\n * Define a function type that resolves all runtime flags.\n */\nexport type GetRuntimeFlags = () => RuntimeFlags;\n/**\n * Get the runtime flags for all registered runtimes.\n */\nexport const getRuntimeFlags: GetRuntimeFlags = (): RuntimeFlags => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const flags = {} as RuntimeFlags;\n\n for (const [name, item] of internalRuntimeRegistry) {\n flags[name] = item.detect() === true;\n }\n\n return flags\n}\n\n/**\n * Check if the current runtime satisfies the specified runtime.\n */\nexport const isSatisfiesRuntime = (runtime: Runtime): boolean => {\n const runtimeRegistryItem = internalRuntimeRegistry.get(runtime);\n if (runtimeRegistryItem === undefined) {\n throw new Error(`Runtime \"${runtime}\" is not registered.`);\n }\n return runtimeRegistryItem.detect() === true;\n}\n\n/**\n * Check if the current runtime satisfies the specified runtimes condition.\n */\nexport const isSatisfiesRuntimes = (condition: Partial<RuntimeFlags>): boolean => {\n let result: boolean = true\n Object.keys(condition).forEach(runtime => {\n const runtimeRegistryItem = internalRuntimeRegistry.get(runtime);\n if (runtimeRegistryItem === undefined) {\n throw new Error(`Runtime \"${runtime}\" is not registered.`);\n }\n if (runtimeRegistryItem.detect() !== condition[runtime]) {\n result = false\n }\n })\n return result\n}\n\n/**\n * Map runtime keys to their typed context payloads.\n */\nexport interface RuntimeContexts {\n browser: RuntimeContextBrowser\n nodejs: RuntimeContextNodejs\n deno: RuntimeContextDeno\n bun: RuntimeContextBun\n \"web-worker\": RuntimeContextWebWorker\n \"service-worker\": RuntimeContextServiceWorker\n unknown: RuntimeContextUnknown\n}\n/**\n * Define handler options for runtime-conditional execution.\n */\nexport type UseRuntimesOptions<R> = {\n // 这里用 unknown 更合理,但 unknown 会有类型问题无法解决,暂时不得不用 any\n // 若有解决方案请替换回 unknown\n // oxlint-disable-next-line no-explicit-any\n [K in Runtime]?: (context: K extends keyof RuntimeContexts ? RuntimeContexts[K] : any) => R\n} & {\n default?: (() => R)\n}\n/**\n * Execute a runtime-specific handler with fallback support.\n */\nexport const useRuntimes = <R>(options: UseRuntimesOptions<R>): R => {\n const runtimeRegisterItem = getRuntimeRegistryItem()\n const runtime = runtimeRegisterItem.runtime\n\n if (options[runtime] !== undefined) {\n return options[runtime](runtimeRegisterItem.getGlobalContext())\n }\n if (options.default !== undefined) {\n return options.default()\n } else {\n throw new Error(`Neither runtime-specific nor default handler provided for runtime: ${String(runtime)}`)\n }\n}\n",
|
|
129
|
-
"import { useFactory } from \"./basic.ts\"\n\nimport type { Use } from \"./basic.ts\"\n\nimport type { StringAutoCompletable } from \"../type/string.ts\"\n\n/**\n * Define built-in and custom feature keys for capability detection.\n */\nexport type Feature =\n | StringAutoCompletable\n | \"process\"\n | \"navigator\"\n | \"permissions\"\n | \"document\"\n | \"css\"\n\ninterface FeatureRegistryItem {\n feature: Feature\n detect: () => boolean\n}\nconst internalFeatureRegistry = new Map<Feature, FeatureRegistryItem>();\n/**\n * Check whether a feature is registered.\n */\nexport const isFeatureRegistered = (feature: Feature): boolean => {\n return internalFeatureRegistry.has(feature);\n};\n/**\n * Register a feature detector.\n */\nexport const registerFeature = (item: FeatureRegistryItem): void => {\n internalFeatureRegistry.set(item.feature, item);\n};\n/**\n * Unregister a feature detector.\n */\nexport const unregisterFeature = (feature: Feature): void => {\n internalFeatureRegistry.delete(feature);\n};\n/**\n * List all registered feature keys.\n */\nexport const listFeatures = (): Feature[] => {\n return Array.from(internalFeatureRegistry.keys());\n}\n\n/**\n * Get a feature registry item by feature key.\n */\nexport const getFeatureRegistryItem = (feature: Feature): FeatureRegistryItem | undefined => {\n return internalFeatureRegistry.get(feature);\n}\n\n/**\n * Define detection results for registered features.\n */\nexport type FeatureFlags = Record<Feature, boolean>;\n/**\n * Get the flags for all registered features.\n */\nexport const getFeatureFlags = (): FeatureFlags => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const flags: FeatureFlags = {} as FeatureFlags;\n\n for (const [name, item] of internalFeatureRegistry) {\n flags[name] = item.detect();\n }\n\n return flags;\n}\n\n/**\n * Check if the current environment satisfies the specified feature.\n */\nexport const isSatisfiesFeature = (feature: Feature): boolean => {\n const featureRegistryItem = getFeatureRegistryItem(feature);\n if (featureRegistryItem === undefined) {\n throw new Error(`Feature \"${feature}\" is not registered.`);\n }\n return featureRegistryItem.detect() === true;\n}\n\n/**\n * Check if the current environment satisfies the specified feature conditions.\n */\nexport const isSatisfiesFeatures = (condition: Partial<FeatureFlags>): boolean => {\n let result = true;\n Object.keys(condition).forEach((feature) => {\n const featureRegistryItem = getFeatureRegistryItem(feature as Feature);\n if (featureRegistryItem === undefined) {\n throw new Error(`Feature \"${feature}\" is not registered.`);\n }\n if (featureRegistryItem.detect() !== condition[feature]) {\n result = false;\n }\n });\n return result;\n}\n\n/**\n * Check if the `process` object is available in the environment.\n */\nexport const supportProcess = (): boolean => {\n return typeof process !== \"undefined\" && process !== null && typeof process === \"object\"\n}\n/**\n * Get the `process` object from the current environment.\n */\nexport const getProcess = (): NodeJS.Process => {\n return globalThis.process\n}\n/**\n * Get the `process` object if it is available, otherwise throw an error.\n */\nexport const ensureProcess = (): NodeJS.Process => {\n if (supportProcess() === true) {\n return getProcess()\n } else {\n throw new Error(\"The process object is not supported in the current environment.\")\n }\n}\n/**\n * Execute a function with the `process` object if it is available.\n */\nexport const useProcess: Use<NodeJS.Process> = useFactory(getProcess, supportProcess)\nregisterFeature({\n feature: \"process\",\n detect: supportProcess,\n})\n\n/**\n * Check if the `navigator` object is available in the environment.\n */\nexport const supportNavigator = (): boolean => {\n return typeof navigator !== \"undefined\" && navigator !== null && typeof navigator === \"object\"\n}\n/**\n * Get the `navigator` object from the current environment.\n */\nexport const getNavigator = (): Navigator => {\n return globalThis.navigator\n}\n/**\n * Get the `navigator` object if it is available, otherwise throw an error.\n */\nexport const ensureNavigator = (): Navigator => {\n if (supportNavigator() === true) {\n return getNavigator()\n } else {\n throw new Error(\"The navigator object is not supported in the current environment.\")\n }\n}\n/**\n * Execute a function with the `navigator` object if it is available.\n */\nexport const useNavigator: Use<Navigator> = useFactory(getNavigator, supportNavigator)\nregisterFeature({\n feature: \"navigator\",\n detect: supportNavigator,\n})\n\n/**\n * Check if the `clipboard` API is available in the environment.\n */\nexport const supportClipboard = (): boolean => {\n return supportNavigator() && \"clipboard\" in navigator\n}\n/**\n * Get the `clipboard` API from the current environment.\n */\nexport const getClipboard = (): Clipboard => {\n return navigator.clipboard\n}\n/**\n * Get the `clipboard` API if it is available, otherwise throw an error.\n */\nexport const ensureClipboard = (): Clipboard => {\n if (supportClipboard() === true) {\n return getClipboard()\n } else {\n throw new Error(\"The clipboard API is not supported in the current environment.\")\n }\n}\n/**\n * Execute a function with the `clipboard` API if it is available.\n */\nexport const useClipboard: Use<Clipboard> = useFactory(getClipboard, supportClipboard)\nregisterFeature({\n feature: \"clipboard\",\n detect: supportClipboard,\n})\n\n/**\n * Check if the `permissions` API is available in the environment.\n */\nexport const supportPermissions = (): boolean => {\n return supportNavigator() && \"permissions\" in navigator\n}\n/**\n * Get the `permissions` API from the current environment.\n */\nexport const getPermissions = (): Permissions => {\n return navigator.permissions\n}\n/**\n * Get the `permissions` API if it is available, otherwise throw an error.\n */\nexport const ensurePermissions = (): Permissions => {\n if (supportPermissions() === true) {\n return getPermissions()\n } else {\n throw new Error(\"The permissions API is not supported in the current environment.\")\n }\n}\n/**\n * Execute a function with the `permissions` API if it is available.\n */\nexport const usePermissions: Use<Permissions> = useFactory(getPermissions, supportPermissions)\nregisterFeature({\n feature: \"permissions\",\n detect: supportPermissions,\n})\n\n/**\n * Check if the `document` object is available in the environment.\n */\nexport const supportDocument = (): boolean => {\n return typeof document !== \"undefined\" && document !== null && typeof document === \"object\"\n}\n/**\n * Get the `document` object from the current environment.\n */\nexport const getDocument = (): Document => {\n return globalThis.document\n}\n/**\n * Get the `document` object if it is available, otherwise throw an error.\n */\nexport const ensureDocument = (): Document => {\n if (supportDocument() === true) {\n return getDocument()\n } else {\n throw new Error(\"The document object is not supported in the current environment.\")\n }\n}\n/**\n * Execute a function with the `document` object if it is available.\n */\nexport const useDocument: Use<Document> = useFactory(getDocument, supportDocument)\nregisterFeature({\n feature: \"document\",\n detect: supportDocument,\n})\n\n/**\n * Check if the `CSS` object is available in the environment.\n */\nexport const supportCSS = (): boolean => {\n return typeof CSS !== \"undefined\" && CSS !== null && typeof CSS === \"object\"\n}\n/**\n * Get the `CSS` object from the current environment.\n */\nexport const getCSS = (): typeof CSS => {\n return globalThis.CSS\n}\n/**\n * Get the `CSS` object if it is available, otherwise throw an error.\n */\nexport const ensureCSS = (): typeof CSS => {\n if (supportCSS() === true) {\n return getCSS()\n } else {\n throw new Error(\"The CSS object is not supported in the current environment.\")\n }\n}\n/**\n * Execute a function with the `CSS` object if it is available.\n */\nexport const useCSS: Use<typeof CSS> = useFactory(getCSS, supportCSS)\nregisterFeature({\n feature: \"css\",\n detect: supportCSS,\n})\n",
|
|
130
|
-
"import type { StandardSchemaV1 } from \"@standard-schema/spec\"\n\nimport { isPromise } from \"#Source/basic/index.ts\"\nimport { parse } from \"@dotenvx/dotenvx\"\nimport { useRuntimes } from \"./runtime.ts\"\n\n/**\n * Define a key-value map for environment variables.\n */\nexport type AnyVariable = Record<string, string>\n/**\n * Define options for parsing dotenv-style variable content.\n */\nexport interface ParseVariableOptions {\n variableContent: string\n}\n/**\n * Parses an environment variable string into an object.\n */\nexport const parseVariable = (options: ParseVariableOptions): AnyVariable => {\n const { variableContent } = options;\n const dotenvParseOutput = parse(variableContent);\n return dotenvParseOutput;\n}\n\n/**\n * Describe a writable host for resolved environment variables.\n */\nexport interface VariableHost {\n /**\n * Can be used to change the default timezone at runtime\n *\n * @see {@link NodeJS.ProcessEnv}, {@link Bun.Env}\n */\n TZ?: string | undefined\n /**\n * @see {@link Bun.Env}\n */\n NODE_ENV?: string | undefined\n /**\n * @see {@link ImportMetaEnv}\n */\n [key: string]: string | undefined\n}\n/**\n * Get the variable host for the current runtime.\n */\nexport const getVariableHost = (): VariableHost => {\n const variableHost = useRuntimes<VariableHost>({\n browser: (context) => {\n return context.importMeta.env;\n },\n nodejs: (context) => {\n return context.global.process.env;\n },\n bun: (context) => {\n return context.global.process.env;\n }\n })\n return variableHost\n}\n\n/**\n * Define options for loading parsed variables into a host.\n */\nexport interface LoadVariableOptions {\n variable: AnyVariable\n variablePrefixs: string[]\n variableHost: VariableHost\n}\n/**\n * Define the result of loading variables into host storage.\n */\nexport interface LoadVariableResult {\n variable: AnyVariable\n variableLoaded: AnyVariable\n variableHost: VariableHost\n}\n/**\n * Load environment variables from the provided `variable` object to the `variableHost`.\n * Variables without prefix will be ignored.\n *\n * @see {@link https://github.com/vitejs/vite/blob/main/packages/vite/src/node/env.ts#L27-L95}\n */\nexport const loadVariable = (options: LoadVariableOptions): LoadVariableResult => {\n const { variable, variablePrefixs, variableHost } = options\n\n const variableLoaded: AnyVariable = {}\n\n // only keys that start with prefix are exposed to client\n for (const [key, value] of Object.entries(variable)) {\n if (variablePrefixs.some(prefix => key.startsWith(prefix))) {\n variableHost[key] = value\n variableLoaded[key] = value\n }\n }\n\n // check if there are actual env variables starting with variablePrefix\n // these are typically provided inline and should be prioritized\n for (const key in variableHost) {\n if (variablePrefixs.some(prefix => key.startsWith(prefix))) {\n variableLoaded[key] = String(variableHost[key])\n }\n }\n\n return {\n variable,\n variableLoaded,\n variableHost\n }\n}\n\n/**\n * Define options for validating variables with a standard schema.\n */\nexport interface VerifyVariableOptions<VariableSchema extends StandardSchemaV1> {\n variable: AnyVariable\n variableSchema: VariableSchema\n}\n/**\n * Verifies the provided variable against the given schema.\n *\n * @see {@link https://github.com/t3-oss/t3-env}\n */\nexport const verifyVariable = <VariableSchema extends StandardSchemaV1>(\n options: VerifyVariableOptions<VariableSchema>\n): StandardSchemaV1.InferOutput<VariableSchema> => {\n const { variable, variableSchema } = options\n\n const validateResult = variableSchema['~standard'].validate(variable)\n\n if (isPromise(validateResult)) {\n throw new Error(\"Validation result is a promise, expected synchronous validation.\")\n }\n\n if (validateResult.issues !== undefined) {\n throw new Error(`Variable validation failed: ${JSON.stringify(validateResult.issues)}`)\n }\n\n const value = validateResult.value\n return value\n}\n\n/**\n * Gets the hosted variable.\n */\nexport const getVariableHosted = (): AnyVariable => {\n const variableHost = getVariableHost();\n // oxlint-disable-next-line no-unsafe-type-assertion\n return variableHost as AnyVariable\n}\n\n/**\n * Define options for parsing, loading, and validating variables.\n */\nexport interface GetVariableOptions<VariableSchema extends StandardSchemaV1> {\n variableContent?: ParseVariableOptions[\"variableContent\"] | undefined\n variablePrefixs?: LoadVariableOptions[\"variablePrefixs\"] | undefined\n variableHost?: LoadVariableOptions[\"variableHost\"] | undefined\n variableSchema: VerifyVariableOptions<VariableSchema>[\"variableSchema\"]\n}\n/**\n * Gets the variable based on the provided options.\n */\nexport const getVariable = <VariableSchema extends StandardSchemaV1>(\n options: GetVariableOptions<VariableSchema>\n): StandardSchemaV1.InferOutput<VariableSchema> => {\n const hasVariableContent = options.variableContent !== undefined;\n\n const parseResult = parseVariable({ variableContent: options.variableContent ?? \"\" })\n\n const loadResult = loadVariable({\n variable: parseResult,\n variablePrefixs: options.variablePrefixs ?? [],\n variableHost: options.variableHost ?? getVariableHost()\n })\n\n const variableToVerify = hasVariableContent === true\n ? loadResult.variableLoaded\n // oxlint-disable-next-line no-unsafe-type-assertion\n : loadResult.variableHost as AnyVariable;\n const verifyResult = verifyVariable({\n variable: variableToVerify,\n variableSchema: options.variableSchema\n })\n\n return verifyResult\n}\n\n/**\n * Define options used to construct a variable manager.\n */\nexport interface VariableManagerOptions<VariableSchema extends StandardSchemaV1> {\n variableContent?: ParseVariableOptions[\"variableContent\"] | undefined\n variablePrefixs?: LoadVariableOptions[\"variablePrefixs\"] | undefined\n variableHost?: LoadVariableOptions[\"variableHost\"] | undefined\n variableSchema: VariableSchema\n}\n/**\n * Manage typed environment variables with cached access.\n */\nexport class VariableManager<VariableSchema extends StandardSchemaV1> {\n private options: VariableManagerOptions<VariableSchema>\n private variableSchema: VariableSchema\n private variable: StandardSchemaV1.InferOutput<VariableSchema>\n\n constructor(options: VariableManagerOptions<VariableSchema>) {\n this.options = options;\n this.variableSchema = options.variableSchema;\n this.variable = this.getFreshVariable();\n }\n\n /**\n * Refresh variables from current options and schema.\n */\n getFreshVariable(): StandardSchemaV1.InferOutput<VariableSchema> {\n const variable = getVariable({\n variableContent: this.options.variableContent,\n variablePrefixs: this.options.variablePrefixs,\n variableHost: this.options.variableHost,\n variableSchema: this.variableSchema\n });\n return variable;\n }\n\n /**\n * Return the schema used by this manager.\n */\n getSchema(): VariableSchema {\n return this.variableSchema;\n }\n\n /**\n * Return the cached variable snapshot.\n */\n getVariable(): StandardSchemaV1.InferOutput<VariableSchema> {\n return this.variable;\n }\n}\n",
|
|
131
|
-
"import { getDeviceInfo } from \"./device.ts\"\nimport { getFeatureFlags } from \"./feature.ts\"\nimport { getGeoInfo } from \"./geo.ts\"\nimport { getRuntimeFlags } from \"./runtime.ts\"\nimport { getVariableHosted } from \"./variable.ts\"\n\nimport type { AnyVariable } from \"./variable.ts\"\nimport type { DeviceInfo } from \"./device.ts\"\nimport type { FeatureFlags } from \"./feature.ts\"\nimport type { GeoInfo } from \"./geo.ts\"\nimport type { RuntimeFlags } from \"./runtime.ts\"\n\n/**\n * Describe a consolidated environment snapshot.\n */\nexport interface Snapshot {\n geo: GeoInfo\n device: DeviceInfo\n runtime: RuntimeFlags\n feature: FeatureFlags\n variable: AnyVariable\n timestamp: number\n}\n\n/**\n * Collect a consolidated environment snapshot.\n */\nexport const getSnapshot = async (): Promise<Snapshot> => {\n const geoInfo = await getGeoInfo();\n const deviceInfo = getDeviceInfo(navigator.userAgent);\n const runtimeFlags = getRuntimeFlags();\n const featureFlags = getFeatureFlags();\n const variable = getVariableHosted();\n const timestamp = Date.now();\n\n return {\n geo: geoInfo,\n device: deviceInfo,\n runtime: runtimeFlags,\n feature: featureFlags,\n variable: variable,\n timestamp: timestamp\n };\n}\n\n/**\n * Print the consolidated environment snapshot to console.\n */\nexport const printSnapshot = async (): Promise<void> => {\n const snap = await getSnapshot();\n\n console.group('[detect]');\n console.table(snap.geo);\n console.table(snap.device);\n console.table(snap.runtime);\n console.table(snap.feature);\n console.table(snap.variable);\n console.log('time:', new Date(snap.timestamp).toISOString());\n console.groupEnd();\n}\n",
|
|
132
|
-
"import type {\n BrowserExceptionRecord,\n BrowserExceptionRecordInput,\n ExceptionRecord,\n ExceptionRecordInput,\n NodejsExceptionRecord,\n NodejsExceptionRecordInput,\n} from \"./types.ts\"\n\nconst internalIsErrorLike = (exception: unknown): exception is { message: string } => {\n if (exception instanceof Error) {\n return true\n }\n\n if (typeof exception !== \"object\" || exception === null) {\n return false\n }\n\n if ((\"message\" in exception) === false) {\n return false\n }\n\n const { message } = exception as { message?: unknown }\n return typeof message === \"string\"\n}\n\nconst internalGetExceptionMessage = (exception: unknown): string | undefined => {\n if (internalIsErrorLike(exception)) {\n return exception.message\n }\n\n if (typeof exception === \"string\") {\n return exception\n }\n\n return undefined\n}\n\n/**\n * 将异常输入标准化为共享异常记录。\n */\nexport const normalizeExceptionRecord = (input: ExceptionRecordInput): ExceptionRecord => {\n const {\n runtime,\n source,\n exception,\n message,\n timestamp,\n originalEvent,\n }: ExceptionRecordInput = input\n\n return {\n runtime,\n source,\n exception,\n message: message ?? internalGetExceptionMessage(exception),\n timestamp: timestamp ?? Date.now(),\n originalEvent,\n }\n}\n\n/**\n * 将浏览器异常输入标准化为浏览器异常记录。\n */\nexport const normalizeBrowserExceptionRecord = (input: BrowserExceptionRecordInput): BrowserExceptionRecord => {\n const {\n source,\n filename,\n lineno,\n colno,\n } = input\n\n return {\n ...normalizeExceptionRecord({\n ...input,\n runtime: \"browser\",\n }),\n runtime: \"browser\",\n source,\n filename,\n lineno,\n colno,\n }\n}\n\n/**\n * 将 Nodejs 异常输入标准化为 Nodejs 异常记录。\n */\nexport const normalizeNodejsExceptionRecord = (input: NodejsExceptionRecordInput): NodejsExceptionRecord => {\n const {\n source,\n origin,\n promise,\n } = input\n\n return {\n ...normalizeExceptionRecord({\n ...input,\n runtime: \"nodejs\",\n }),\n runtime: \"nodejs\",\n source,\n origin,\n promise,\n }\n}\n",
|
|
133
|
-
"import { useBrowser } from \"#Source/environment/index.ts\"\n\nimport { normalizeBrowserExceptionRecord } from \"./normalize.ts\"\nimport type {\n BrowserExceptionRecord,\n ExceptionListenerCleanup,\n ObserveExceptionsOptions,\n} from \"./types.ts\"\n\n/**\n * 表示浏览器侧异常监听回调。\n */\nexport type BrowserExceptionListener = (record: BrowserExceptionRecord) => void\n\n/**\n * 监听浏览器侧通过 `error` 事件暴露的全局异常。\n */\nexport const onBrowserGlobalError = (\n listener: BrowserExceptionListener,\n options?: ObserveExceptionsOptions | undefined,\n): ExceptionListenerCleanup => {\n return useBrowser(({ window }) => {\n const internalListener = (event: ErrorEvent): void => {\n listener(normalizeBrowserExceptionRecord({\n source: \"browser.global-error\",\n exception: event.error ?? event.message,\n message: event.message,\n timestamp: options?.captureTimestamp?.() ?? Date.now(),\n originalEvent: event,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n }))\n }\n\n window.addEventListener(\"error\", internalListener)\n\n return () => {\n window.removeEventListener(\"error\", internalListener)\n }\n }, () => {\n return (): void => {\n return undefined\n }\n })\n}\n\ntype InternalBrowserOnErrorListener = (\n message: string | Event,\n source?: string | undefined,\n lineno?: number | undefined,\n colno?: number | undefined,\n error?: Error | undefined,\n) => boolean\ninterface InternalBrowserOnErrorState {\n previousOnError: OnErrorEventHandler | null\n currentOnError: OnErrorEventHandler\n listeners: Set<InternalBrowserOnErrorListener>\n}\nconst internalBrowserOnErrorStateMap = new WeakMap<Window, InternalBrowserOnErrorState>()\nconst internalGetBrowserOnErrorState = (window: Window): InternalBrowserOnErrorState => {\n const existingState = internalBrowserOnErrorStateMap.get(window)\n\n if (existingState !== undefined) {\n return existingState\n }\n\n const internalListeners = new Set<InternalBrowserOnErrorListener>()\n const internalPreviousOnError = window.onerror\n const internalCurrentOnError: OnErrorEventHandler = (message, source, lineno, colno, error): boolean => {\n let internalHandled = false\n\n for (const internalListener of internalListeners) {\n internalHandled = internalListener(message, source, lineno, colno, error) || internalHandled\n }\n\n if (typeof internalPreviousOnError === \"function\") {\n internalHandled = internalPreviousOnError(message, source, lineno, colno, error) === true || internalHandled\n }\n\n return internalHandled\n }\n\n const internalState: InternalBrowserOnErrorState = {\n previousOnError: internalPreviousOnError,\n currentOnError: internalCurrentOnError,\n listeners: internalListeners,\n }\n\n internalBrowserOnErrorStateMap.set(window, internalState)\n\n // oxlint-disable-next-line prefer-add-event-listener\n window.onerror = internalCurrentOnError\n\n return internalState\n}\n/**\n * 监听浏览器侧通过 `window.onerror` 暴露的全局异常。\n */\nexport const onBrowserWindowOnError = (\n listener: BrowserExceptionListener,\n options?: ObserveExceptionsOptions | undefined,\n): ExceptionListenerCleanup => {\n return useBrowser(({ window }) => {\n const internalOnErrorState = internalGetBrowserOnErrorState(window)\n const internalListener: InternalBrowserOnErrorListener = (message, source, lineno, colno, error): boolean => {\n listener(normalizeBrowserExceptionRecord({\n source: \"browser.window-onerror\",\n exception: error ?? message,\n message: typeof message === \"string\" ? message : undefined,\n timestamp: options?.captureTimestamp?.() ?? Date.now(),\n originalEvent: { message, source, lineno, colno, error },\n filename: source,\n lineno,\n colno,\n }))\n\n return false\n }\n\n internalOnErrorState.listeners.add(internalListener)\n\n return () => {\n internalOnErrorState.listeners.delete(internalListener)\n\n if (internalOnErrorState.listeners.size !== 0) {\n return\n }\n\n internalBrowserOnErrorStateMap.delete(window)\n\n if (window.onerror === internalOnErrorState.currentOnError) {\n // oxlint-disable-next-line prefer-add-event-listener\n window.onerror = internalOnErrorState.previousOnError\n }\n }\n }, () => {\n return (): void => {\n return undefined\n }\n })\n}\n\n/**\n * 监听浏览器侧未处理 Promise 拒绝。\n */\nexport const onBrowserUnhandledRejection = (\n listener: BrowserExceptionListener,\n options?: ObserveExceptionsOptions | undefined,\n): ExceptionListenerCleanup => {\n return useBrowser(({ window }) => {\n const internalListener = (event: PromiseRejectionEvent): void => {\n listener(normalizeBrowserExceptionRecord({\n source: \"browser.unhandled-rejection\",\n exception: event.reason,\n timestamp: options?.captureTimestamp?.() ?? Date.now(),\n originalEvent: event,\n }))\n }\n\n window.addEventListener(\"unhandledrejection\", internalListener)\n\n return () => {\n window.removeEventListener(\"unhandledrejection\", internalListener)\n }\n }, () => {\n return (): void => {\n return undefined\n }\n })\n}\n\n/**\n * 表示批量监听浏览器异常时可选的配置。\n *\n * 未显式传入时,三个浏览器入口默认都会启用;仅当对应选项为 `false` 时才跳过该入口。\n */\nexport interface ObserveBrowserExceptionsOptions extends ObserveExceptionsOptions {\n includeGlobalError?: boolean | undefined\n includeWindowOnError?: boolean | undefined\n includeUnhandledRejection?: boolean | undefined\n}\n\n/**\n * 批量监听浏览器侧全局异常入口。\n *\n * 默认会同时监听 `error`、`window.onerror` 和 `unhandledrejection`。\n * 如需关闭某个入口,请将对应的 `include*` 选项显式设为 `false`。\n */\nexport const observeBrowserExceptions = (\n listener: BrowserExceptionListener,\n options?: ObserveBrowserExceptionsOptions | undefined,\n): ExceptionListenerCleanup => {\n const {\n includeGlobalError,\n includeWindowOnError,\n includeUnhandledRejection,\n } = options ?? {}\n\n const cleanups: ExceptionListenerCleanup[] = []\n\n if (includeGlobalError !== false) {\n cleanups.push(onBrowserGlobalError(listener, options))\n }\n\n if (includeWindowOnError !== false) {\n cleanups.push(onBrowserWindowOnError(listener, options))\n }\n\n if (includeUnhandledRejection !== false) {\n cleanups.push(onBrowserUnhandledRejection(listener, options))\n }\n\n return () => {\n for (const cleanup of cleanups) {\n cleanup()\n }\n }\n}\n",
|
|
134
|
-
"import { useNodejs } from \"#Source/environment/index.ts\"\n\nimport { normalizeNodejsExceptionRecord } from \"./normalize.ts\"\nimport type {\n ExceptionListenerCleanup,\n NodejsExceptionRecord,\n ObserveExceptionsOptions,\n} from \"./types.ts\"\n\n/**\n * 表示 Nodejs 侧异常监听回调。\n */\nexport type NodejsExceptionListener = (record: NodejsExceptionRecord) => void\n\n/**\n * 监听 Node.js 的 `uncaughtExceptionMonitor` 事件。\n */\nexport const onNodejsUncaughtExceptionMonitor = (\n listener: NodejsExceptionListener,\n options?: ObserveExceptionsOptions | undefined,\n): ExceptionListenerCleanup => {\n return useNodejs((context) => {\n const currentProcess = context.globalThis.process\n const internalListener = (exception: unknown, origin: unknown): void => {\n listener(normalizeNodejsExceptionRecord({\n source: \"nodejs.uncaught-exception-monitor\",\n exception,\n timestamp: options?.captureTimestamp?.() ?? Date.now(),\n originalEvent: { exception, origin },\n origin: typeof origin === \"string\" ? origin : undefined,\n }))\n }\n\n currentProcess.on(\"uncaughtExceptionMonitor\", internalListener)\n\n return () => {\n if (typeof currentProcess.off === \"function\") {\n currentProcess.off(\"uncaughtExceptionMonitor\", internalListener)\n return\n }\n\n currentProcess.removeListener?.(\"uncaughtExceptionMonitor\", internalListener)\n }\n }, () => {\n return (): void => {\n return undefined\n }\n })\n}\n\n/**\n * 监听 Node.js 的 `uncaughtException` 事件。\n */\nexport const onNodejsUncaughtException = (\n listener: NodejsExceptionListener,\n options?: ObserveExceptionsOptions | undefined,\n): ExceptionListenerCleanup => {\n return useNodejs((context) => {\n const currentProcess = context.globalThis.process\n const internalListener = (exception: unknown, origin: unknown): void => {\n listener(normalizeNodejsExceptionRecord({\n source: \"nodejs.uncaught-exception\",\n exception,\n timestamp: options?.captureTimestamp?.() ?? Date.now(),\n originalEvent: { exception, origin },\n origin: typeof origin === \"string\" ? origin : undefined,\n }))\n }\n\n currentProcess.on(\"uncaughtException\", internalListener)\n\n return () => {\n if (typeof currentProcess.off === \"function\") {\n currentProcess.off(\"uncaughtException\", internalListener)\n return\n }\n\n currentProcess.removeListener?.(\"uncaughtException\", internalListener)\n }\n }, () => {\n return (): void => {\n return undefined\n }\n })\n}\n\n/**\n * 监听 Node.js 的 `unhandledRejection` 事件。\n */\nexport const onNodejsUnhandledRejection = (\n listener: NodejsExceptionListener,\n options?: ObserveExceptionsOptions | undefined,\n): ExceptionListenerCleanup => {\n return useNodejs((context) => {\n const currentProcess = context.globalThis.process\n const internalListener = (reason: unknown, promise: unknown): void => {\n listener(normalizeNodejsExceptionRecord({\n source: \"nodejs.unhandled-rejection\",\n exception: reason,\n timestamp: options?.captureTimestamp?.() ?? Date.now(),\n originalEvent: { reason, promise },\n promise: promise instanceof Promise ? promise : undefined,\n }))\n }\n\n currentProcess.on(\"unhandledRejection\", internalListener)\n\n return () => {\n if (typeof currentProcess.off === \"function\") {\n currentProcess.off(\"unhandledRejection\", internalListener)\n return\n }\n\n currentProcess.removeListener?.(\"unhandledRejection\", internalListener)\n }\n }, () => {\n return (): void => {\n return undefined\n }\n })\n}\n\n/**\n * 表示批量监听 Nodejs 异常时可选的配置。\n *\n * 未显式传入时,三个 Node.js 入口默认都会启用;仅当对应选项为 `false` 时才跳过该入口。\n */\nexport interface ObserveNodejsExceptionsOptions extends ObserveExceptionsOptions {\n includeUncaughtExceptionMonitor?: boolean | undefined\n includeUncaughtException?: boolean | undefined\n includeUnhandledRejection?: boolean | undefined\n}\n\n/**\n * 批量监听 Nodejs 侧全局异常入口。\n *\n * 默认会同时监听 `uncaughtExceptionMonitor`、`uncaughtException` 和 `unhandledRejection`。\n * 如需关闭某个入口,请将对应的 `include*` 选项显式设为 `false`。\n */\nexport const observeNodejsExceptions = (\n listener: NodejsExceptionListener,\n options?: ObserveNodejsExceptionsOptions | undefined,\n): ExceptionListenerCleanup => {\n const {\n includeUncaughtExceptionMonitor,\n includeUncaughtException,\n includeUnhandledRejection\n } = options ?? {}\n\n const cleanups: ExceptionListenerCleanup[] = []\n\n if (includeUncaughtExceptionMonitor !== false) {\n cleanups.push(onNodejsUncaughtExceptionMonitor(listener, options))\n }\n\n if (includeUncaughtException !== false) {\n cleanups.push(onNodejsUncaughtException(listener, options))\n }\n\n if (includeUnhandledRejection !== false) {\n cleanups.push(onNodejsUnhandledRejection(listener, options))\n }\n\n return () => {\n for (const cleanup of cleanups) {\n cleanup()\n }\n }\n}\n",
|
|
135
|
-
"import type { InternalSubscriberEntryMap } from \"./internal.ts\"\nimport type { BaseEvents, SubscriberEntry } from \"./common.ts\"\n\n/**\n * 表示 EventManager 的构造选项。\n */\nexport interface EventManagerOptions<Events extends BaseEvents> {\n /**\n * 在订阅者执行出错时接收错误与对应订阅项。\n */\n onSubscriberError?: (subscriberEntry: SubscriberEntry<Events, keyof Events>, error: unknown) => void\n}\n\n/**\n * 管理同一事件表下的订阅、取消订阅与事件派发。\n */\nexport class EventManager<Events extends BaseEvents> {\n protected options: EventManagerOptions<Events>\n /**\n * 每一类事件对应一个内部订阅映射,映射中的 key 是订阅者函数,value 是 SubscriberEntry 对象。\n */\n protected subscribers: {\n [K in keyof Events]?: InternalSubscriberEntryMap<Events, K> | undefined\n }\n\n constructor(options?: EventManagerOptions<Events>) {\n this.options = options ?? {}\n this.subscribers = {}\n }\n\n protected internalHandleSubscriberError(\n subscriberEntry: SubscriberEntry<Events, keyof Events>,\n error: unknown,\n ): void {\n if (this.options.onSubscriberError !== undefined) {\n this.options.onSubscriberError(subscriberEntry, error)\n } else {\n console.error(`Error occurred while emitting event \"${String(subscriberEntry.event)}\":`, error)\n }\n }\n\n /**\n * 检查某个事件是否已经注册给定订阅者。\n */\n has<K extends keyof Events>(event: K, subscriber: Events[K]): boolean {\n const subscriberEntryMap = this.subscribers[event]\n if (subscriberEntryMap === undefined) {\n return false\n }\n\n const has = subscriberEntryMap.has(subscriber)\n return has\n }\n\n protected internalSubscribe<K extends keyof Events>(event: K, subscriber: Events[K], once: boolean): SubscriberEntry<Events, K> {\n const subscriberEntryMap = this.subscribers[event] ?? new Map<Events[K], SubscriberEntry<Events, K>>()\n this.subscribers[event] = subscriberEntryMap\n\n const existingSubscriberEntry = subscriberEntryMap.get(subscriber)\n if (existingSubscriberEntry !== undefined) {\n return existingSubscriberEntry\n }\n\n const unsubscribe = (): void => {\n this.unsubscribe(event, subscriber)\n }\n const newSubscriberEntry: SubscriberEntry<Events, K> = {\n event,\n once,\n subscriber,\n unsubscribe,\n }\n subscriberEntryMap.set(subscriber, newSubscriberEntry)\n\n return newSubscriberEntry\n }\n\n /**\n * 为指定事件添加常规订阅者。\n */\n subscribe<K extends keyof Events>(event: K, subscriber: Events[K]): SubscriberEntry<Events, K> {\n return this.internalSubscribe(event, subscriber, false)\n }\n\n /**\n * 为指定事件添加只触发一次的订阅者。\n */\n subscribeOnce<K extends keyof Events>(event: K, subscriber: Events[K]): SubscriberEntry<Events, K> {\n return this.internalSubscribe(event, subscriber, true)\n }\n\n /**\n * 移除指定事件上的给定订阅者。\n */\n unsubscribe<K extends keyof Events>(event: K, subscriber: Events[K]): this {\n const subscriberEntryMap = this.subscribers[event]\n if (subscriberEntryMap === undefined) {\n return this\n }\n\n subscriberEntryMap.delete(subscriber)\n if (subscriberEntryMap.size === 0) {\n delete this.subscribers[event]\n }\n\n return this\n }\n\n /**\n * 移除指定事件上的全部订阅者。\n */\n removeSubscribersOfEvent<K extends keyof Events>(event: K): this {\n delete this.subscribers[event]\n return this\n }\n\n /**\n * 移除当前管理器上的全部订阅者。\n */\n removeAllSubscribers(): this {\n this.subscribers = {}\n return this\n }\n\n /**\n * 同步派发指定事件。\n */\n emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): boolean {\n const subscriberEntryMap = this.subscribers[event]\n if (subscriberEntryMap === undefined) {\n return false\n }\n\n // Create a copy of the subscriber entries to avoid issues when\n // subscribers are modified during event emission\n const subscriberEntries = [...subscriberEntryMap.values()]\n for (const subscriberEntry of subscriberEntries) {\n try {\n subscriberEntry.subscriber(...args)\n } catch (exception) {\n this.internalHandleSubscriberError(subscriberEntry, exception)\n } finally {\n if (subscriberEntry.once === true) {\n subscriberEntry.unsubscribe()\n }\n }\n }\n\n return true\n }\n\n /**\n * 按订阅顺序异步派发指定事件。\n */\n async emitAsync<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): Promise<boolean> {\n const subscriberEntryMap = this.subscribers[event]\n if (subscriberEntryMap === undefined) {\n return false\n }\n\n const subscriberEntries = [...subscriberEntryMap.values()]\n for (const subscriberEntry of subscriberEntries) {\n try {\n const result = subscriberEntry.subscriber(...args)\n await Promise.resolve(result)\n } catch (exception) {\n this.internalHandleSubscriberError(subscriberEntry, exception)\n } finally {\n if (subscriberEntry.once === true) {\n subscriberEntry.unsubscribe()\n }\n }\n }\n\n return true\n }\n\n /**\n * 并发等待所有订阅者完成后结束异步派发。\n */\n async emitConcurrentAsync<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): Promise<boolean> {\n const subscriberEntryMap = this.subscribers[event]\n if (subscriberEntryMap === undefined) {\n return false\n }\n\n const promises = [...subscriberEntryMap.values()].map(async subscriberEntry => {\n try {\n const result = subscriberEntry.subscriber(...args)\n await Promise.resolve(result)\n } catch (exception) {\n this.internalHandleSubscriberError(subscriberEntry, exception)\n } finally {\n if (subscriberEntry.once === true) {\n subscriberEntry.unsubscribe()\n }\n }\n })\n await Promise.all(promises)\n\n return true\n }\n}\n",
|
|
136
|
-
"import type { InternalProxySubscriberEntryMap } from \"./internal.ts\"\nimport type {\n BaseEvents,\n SubscriberEntry,\n} from \"./common.ts\"\n\n/**\n * 表示 InstanceEventProxy 用于接入底层事件目标的适配器。\n */\nexport interface InstanceEventProxyTargetAdapter<Events extends BaseEvents> {\n emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): boolean\n subscribe<K extends keyof Events>(event: K, subscriber: Events[K]): void\n unsubscribe<K extends keyof Events>(event: K, subscriber: Events[K]): void\n}\n\n/**\n * 表示 InstanceEventProxy 的构造选项。\n */\nexport interface InstanceEventProxyOptions<Events extends BaseEvents> {\n targetAdapter: InstanceEventProxyTargetAdapter<Events>\n /**\n * 在代理管理的订阅者执行出错时接收错误与对应订阅项。\n */\n onSubscriberError?: (subscriberEntry: SubscriberEntry<Events, keyof Events>, error: unknown) => void\n}\n\n/**\n * 将单个事件目标适配为可管理下游订阅关系的代理。\n */\nexport class InstanceEventProxy<Events extends BaseEvents> {\n protected options: InstanceEventProxyOptions<Events>\n protected subscribers: InternalProxySubscriberEntryMap<Events>\n\n constructor(options: InstanceEventProxyOptions<Events>) {\n this.options = options\n this.subscribers = {}\n }\n\n /**\n * 检查某个事件是否已经管理给定订阅者。\n */\n has<K extends keyof Events>(\n event: K, subscriber: Events[K]\n ): boolean {\n const proxySubscriberEntry = this.subscribers[event]\n if (proxySubscriberEntry === undefined) {\n return false\n }\n\n const has = proxySubscriberEntry.managedSubscribers.has(subscriber)\n return has\n }\n\n protected internalSubscribe<K extends keyof Events>(\n event: K, subscriber: Events[K], once: boolean\n ): SubscriberEntry<Events, K> {\n let proxySubscriberEntry = this.subscribers[event]\n\n if (proxySubscriberEntry === undefined) {\n const managedSubscribers = new Map<Events[K], SubscriberEntry<Events, K>>()\n // oxlint-disable-next-line no-unsafe-type-assertion\n const proxySubscriber = ((...args: Parameters<Events[K]>) => {\n const managedSubscriberEntries = [...managedSubscribers.values()]\n for (const managedSubscriberEntry of managedSubscriberEntries) {\n try {\n managedSubscriberEntry.subscriber(...args)\n } catch (exception) {\n if (this.options.onSubscriberError !== undefined) {\n this.options.onSubscriberError(managedSubscriberEntry, exception)\n } else {\n console.error(`Error occurred while emitting event \"${String(event)}\":`, exception)\n }\n } finally {\n if (managedSubscriberEntry.once === true) {\n managedSubscriberEntry.unsubscribe()\n }\n }\n }\n }) as Events[K]\n\n proxySubscriberEntry = {\n proxySubscriber,\n managedSubscribers\n }\n this.subscribers[event] = proxySubscriberEntry\n this.options.targetAdapter.subscribe(event, proxySubscriber)\n }\n\n const existingSubscriberEntry = proxySubscriberEntry.managedSubscribers.get(subscriber)\n if (existingSubscriberEntry !== undefined) {\n return existingSubscriberEntry\n }\n\n const unsubscribe = (): void => {\n this.unsubscribe(event, subscriber)\n }\n const newSubscriberEntry: SubscriberEntry<Events, K> = {\n event,\n once,\n subscriber,\n unsubscribe,\n }\n proxySubscriberEntry.managedSubscribers.set(subscriber, newSubscriberEntry)\n\n return newSubscriberEntry\n }\n\n /**\n * 为指定事件添加常规订阅者,并在首次接入时创建底层代理订阅。\n */\n subscribe<K extends keyof Events>(\n event: K, subscriber: Events[K]\n ): SubscriberEntry<Events, K> {\n return this.internalSubscribe(event, subscriber, false)\n }\n\n /**\n * 为指定事件添加只触发一次的订阅者。\n */\n subscribeOnce<K extends keyof Events>(\n event: K, listener: Events[K]\n ): SubscriberEntry<Events, K> {\n return this.internalSubscribe(event, listener, true)\n }\n\n /**\n * 移除指定事件上的给定订阅者。\n */\n unsubscribe<K extends keyof Events>(\n event: K, listener: Events[K]\n ): this {\n const proxySubscriberEntry = this.subscribers[event]\n if (proxySubscriberEntry === undefined) {\n return this\n }\n\n proxySubscriberEntry.managedSubscribers.delete(listener)\n if (proxySubscriberEntry.managedSubscribers.size === 0) {\n this.options.targetAdapter.unsubscribe(event, proxySubscriberEntry.proxySubscriber)\n delete this.subscribers[event]\n }\n\n return this\n }\n\n /**\n * 移除指定事件上的全部代理订阅者。\n */\n removeSubscribersOfEvent<K extends keyof Events>(\n event: K\n ): this {\n const proxySubscriberEntry = this.subscribers[event]\n if (proxySubscriberEntry === undefined) {\n return this\n }\n\n proxySubscriberEntry.managedSubscribers.clear()\n this.options.targetAdapter.unsubscribe(event, proxySubscriberEntry.proxySubscriber)\n delete this.subscribers[event]\n\n return this\n }\n\n /**\n * 移除代理当前管理的全部订阅者。\n */\n removeAllSubscribers(): this {\n const events = Object.keys(this.subscribers)\n\n for (const event of events) {\n this.removeSubscribersOfEvent(event)\n }\n this.subscribers = {}\n\n return this\n }\n\n /**\n * 通过底层适配器派发指定事件。\n */\n emit<K extends keyof Events>(\n event: K, ...args: Parameters<Events[K]>\n ): boolean {\n return this.options.targetAdapter.emit(event, ...args)\n }\n}\n",
|
|
137
|
-
"import type { InternalProxySubscriberEntryMap } from \"./internal.ts\"\nimport type {\n BaseEvents,\n SubscriberEntry,\n} from \"./common.ts\"\n\n/**\n * 表示 ClassEventProxy 用于接入目标实例及其事件系统的适配器。\n */\nexport interface ClassEventProxyTargetAdapter<Target, Events extends BaseEvents> {\n emit<K extends keyof Events>(target: Target, event: K, ...args: Parameters<Events[K]>): boolean\n subscribe<K extends keyof Events>(target: Target, event: K, subscriber: Events[K]): void\n unsubscribe<K extends keyof Events>(target: Target, event: K, subscriber: Events[K]): void\n}\n\n/**\n * 表示 ClassEventProxy 的构造选项。\n */\nexport interface ClassEventProxyOptions<Target, Events extends BaseEvents> {\n targetAdapter: ClassEventProxyTargetAdapter<Target, Events>\n /**\n * 在代理管理的订阅者执行出错时接收错误与对应订阅项。\n */\n onSubscriberError?: (subscriberEntry: SubscriberEntry<Events, keyof Events>, error: unknown) => void\n}\n\n/**\n * 将一组目标实例的事件系统适配为统一的代理订阅模型。\n */\nexport class ClassEventProxy<Target, Events extends BaseEvents> {\n protected options: ClassEventProxyOptions<Target, Events>\n protected subscribers: Map<Target, InternalProxySubscriberEntryMap<Events>>\n\n constructor(options: ClassEventProxyOptions<Target, Events>) {\n this.options = options\n this.subscribers = new Map()\n }\n\n /**\n * 检查给定目标和事件上是否已经管理指定订阅者。\n */\n has<K extends keyof Events>(\n target: Target, event: K, subscriber: Events[K]\n ): boolean {\n const proxySubscriberEntryMap = this.subscribers.get(target)\n if (proxySubscriberEntryMap === undefined) {\n return false\n }\n\n const proxySubscriberEntry = proxySubscriberEntryMap[event]\n if (proxySubscriberEntry === undefined) {\n return false\n }\n\n const has = proxySubscriberEntry.managedSubscribers.has(subscriber)\n return has\n }\n\n protected internalSubscribe<K extends keyof Events>(\n target: Target, event: K, subscriber: Events[K], once: boolean\n ): SubscriberEntry<Events, K> {\n const proxySubscriberEntryMap = this.subscribers.get(target) ?? ({} as InternalProxySubscriberEntryMap<Events>)\n this.subscribers.set(target, proxySubscriberEntryMap)\n\n let proxySubscriberEntry = proxySubscriberEntryMap[event]\n\n if (proxySubscriberEntry === undefined) {\n const managedSubscribers = new Map<Events[K], SubscriberEntry<Events, K>>()\n // oxlint-disable-next-line no-unsafe-type-assertion\n const proxySubscriber = ((...args: Parameters<Events[K]>) => {\n const managedSubscriberEntries = [...managedSubscribers.values()]\n for (const managedSubscriberEntry of managedSubscriberEntries) {\n try {\n managedSubscriberEntry.subscriber(...args)\n } catch (exception) {\n if (this.options.onSubscriberError !== undefined) {\n this.options.onSubscriberError(managedSubscriberEntry, exception)\n } else {\n console.error(`Error occurred while emitting event \"${String(event)}\" of target:`, exception)\n }\n } finally {\n if (managedSubscriberEntry.once === true) {\n managedSubscriberEntry.unsubscribe()\n }\n }\n }\n }) as Events[K]\n\n proxySubscriberEntry = {\n proxySubscriber,\n managedSubscribers\n }\n proxySubscriberEntryMap[event] = proxySubscriberEntry\n this.options.targetAdapter.subscribe(target, event, proxySubscriber)\n }\n\n const existingSubscriberEntry = proxySubscriberEntry.managedSubscribers.get(subscriber)\n if (existingSubscriberEntry !== undefined) {\n return existingSubscriberEntry\n }\n\n const unsubscribe = (): void => {\n this.unsubscribe(target, event, subscriber)\n }\n const newSubscriberEntry: SubscriberEntry<Events, K> = {\n event,\n once,\n subscriber,\n unsubscribe,\n }\n proxySubscriberEntry.managedSubscribers.set(subscriber, newSubscriberEntry)\n\n return newSubscriberEntry\n }\n\n /**\n * 为指定目标事件添加常规订阅者,并在首次接入时创建底层代理订阅。\n */\n subscribe<K extends keyof Events>(\n target: Target, event: K, subscriber: Events[K]\n ): SubscriberEntry<Events, K> {\n return this.internalSubscribe(target, event, subscriber, false)\n }\n\n /**\n * 为指定目标事件添加只触发一次的订阅者。\n */\n subscribeOnce<K extends keyof Events>(\n target: Target, event: K, listener: Events[K]\n ): SubscriberEntry<Events, K> {\n return this.internalSubscribe(target, event, listener, true)\n }\n\n /**\n * 移除指定目标事件上的给定订阅者。\n */\n unsubscribe<K extends keyof Events>(\n target: Target, event: K, listener: Events[K]\n ): this {\n const proxySubscriberEntryMap = this.subscribers.get(target)\n if (proxySubscriberEntryMap === undefined) {\n return this\n }\n\n const proxySubscriberEntry = proxySubscriberEntryMap[event]\n if (proxySubscriberEntry === undefined) {\n return this\n }\n\n proxySubscriberEntry.managedSubscribers.delete(listener)\n if (proxySubscriberEntry.managedSubscribers.size === 0) {\n this.options.targetAdapter.unsubscribe(target, event, proxySubscriberEntry.proxySubscriber)\n delete proxySubscriberEntryMap[event]\n if (Object.keys(proxySubscriberEntryMap).length === 0) {\n this.subscribers.delete(target)\n }\n }\n\n return this\n }\n\n /**\n * 移除指定目标某个事件上的全部代理订阅者。\n */\n removeSubscribersOfEvent<K extends keyof Events>(\n target: Target, event: K\n ): this {\n const proxySubscriberEntryMap = this.subscribers.get(target)\n if (proxySubscriberEntryMap === undefined) {\n return this\n }\n\n const proxySubscriberEntry = proxySubscriberEntryMap[event]\n if (proxySubscriberEntry === undefined) {\n return this\n }\n\n proxySubscriberEntry.managedSubscribers.clear()\n this.options.targetAdapter.unsubscribe(target, event, proxySubscriberEntry.proxySubscriber)\n delete proxySubscriberEntryMap[event]\n if (Object.keys(proxySubscriberEntryMap).length === 0) {\n this.subscribers.delete(target)\n }\n\n return this\n }\n\n /**\n * 移除指定目标上的全部代理订阅者。\n */\n removeSubscribersOfTarget(target: Target): this {\n const proxySubscriberEntryMap = this.subscribers.get(target)\n if (proxySubscriberEntryMap === undefined) {\n return this\n }\n\n const events = Object.keys(proxySubscriberEntryMap)\n for (const event of events) {\n this.removeSubscribersOfEvent(target, event)\n }\n this.subscribers.delete(target)\n\n return this\n }\n\n /**\n * 移除当前代理管理的全部目标订阅关系。\n */\n removeAllSubscribers(): this {\n const targets = Array.from(this.subscribers.keys())\n\n for (const target of targets) {\n this.removeSubscribersOfTarget(target)\n }\n this.subscribers.clear()\n\n return this\n }\n\n /**\n * 通过底层适配器向指定目标派发事件。\n */\n emit<K extends keyof Events>(\n target: Target, event: K, ...args: Parameters<Events[K]>\n ): boolean {\n return this.options.targetAdapter.emit(target, event, ...args)\n }\n}\n",
|
|
138
|
-
"/**\n * 定义惰性单例工厂函数类型。\n */\nexport type SingletonFactory<T> = () => T\n\n/**\n * 创建一个会缓存首次结果的单例工厂。\n *\n * @example\n * ```\n * // Scenario 1: object values are created once and then reused.\n * let calls = 0\n * const getConfig = getSingletonFactory(() => {\n * calls += 1\n * return { env: \"test\" }\n * })\n *\n * const example1 = getConfig()\n * const example2 = getConfig()\n * const example3 = example1 === example2\n * const example4 = calls\n *\n * // Expect: true\n * example3\n * // Expect: 1\n * example4\n *\n * // Scenario 2: primitive values are also cached after the first read.\n * let count = 0\n * const getPort = getSingletonFactory(() => {\n * count += 1\n * return 3000\n * })\n *\n * const example5 = getPort()\n * const example6 = getPort()\n * const example7 = count\n *\n * // Expect: 3000\n * example5\n * // Expect: 3000\n * example6\n * // Expect: 1\n * example7\n * ```\n */\nexport const getSingletonFactory = <T>(make: () => T): SingletonFactory<T> => {\n let singleton: T | undefined = undefined\n return () => {\n if (singleton === undefined) {\n singleton = make()\n }\n return singleton\n }\n}\n",
|
|
139
|
-
"/**\n * 定义创建具名单例项时使用的选项。\n */\nexport interface SingletonOptions<Name extends string, Value> {\n name: Name\n value: () => Value\n}\n\n/**\n * 表示一个具名且按需初始化的单例项。\n */\nexport class SingletonItem<Name extends string, Value> {\n private name: Name\n private value: () => Value\n\n private cache: Value | null = null\n\n /**\n * 使用名称和值工厂创建单例项。\n */\n constructor(options: SingletonOptions<Name, Value>) {\n this.name = options.name\n this.value = options.value\n }\n\n /**\n * 获取该单例项的名称。\n */\n getName(): Name {\n return this.name\n }\n\n /**\n * 获取该单例项的值,并在首次访问时完成初始化。\n */\n getValue(): Value {\n if (this.cache === null) {\n this.cache = this.value()\n }\n return this.cache\n }\n}\n\n/**\n * 创建一个具名单例项实例。\n *\n * @example\n * ```\n * // Scenario 1: the item keeps a stable name and caches the computed value.\n * let calls = 0\n * const item = singletonItem(\"token\", () => {\n * calls += 1\n * return \"secret\"\n * })\n *\n * const example1 = item.getValue()\n * const example2 = item.getValue()\n * const example3 = item.getName()\n * const example4 = example1 === example2\n * const example5 = calls\n *\n * // Expect: \"token\"\n * example3\n * // Expect: true\n * example4\n * // Expect: 1\n * example5\n *\n * // Scenario 2: different items keep independent caches.\n * let leftCalls = 0\n * let rightCalls = 0\n * const left = singletonItem(\"left\", () => {\n * leftCalls += 1\n * return 1\n * })\n * const right = singletonItem(\"right\", () => {\n * rightCalls += 1\n * return 2\n * })\n *\n * const example6 = left.getValue()\n * const example7 = right.getValue()\n * const example8 = leftCalls\n * const example9 = rightCalls\n *\n * // Expect: 1\n * example6\n * // Expect: 2\n * example7\n * // Expect: 1\n * example8\n * // Expect: 1\n * example9\n * ```\n */\nexport const singletonItem = <Name extends string, Value>(\n name: Name,\n value: () => Value\n): SingletonItem<Name, Value> => {\n return new SingletonItem({ name, value })\n}\n\ntype TupleToUnion<T> = T extends unknown[] ? T[number] : never\ntype GetName<Items> = Items extends []\n ? []\n : (\n Items extends [infer x, ...infer xs]\n ? (\n x extends SingletonItem<infer Name, unknown>\n ? [Name, ...GetName<xs>]\n : never\n )\n : never\n )\ntype GetValue<Items, Name> = Items extends []\n ? never\n : (\n Items extends [infer x, ...infer xs]\n ? (\n x extends SingletonItem<infer name, infer value>\n ? (\n name extends Name\n ? (Name extends name\n ? value\n : GetValue<xs, Name>\n )\n : GetValue<xs, Name>\n )\n : never\n )\n : never\n )\n\n/**\n * 表示一个可按名称检索单例值的集合。\n */\nexport class SingletonCollection<Item extends Array<SingletonItem<string, unknown>>> {\n private map: Map<string, SingletonItem<string, unknown>>\n\n /**\n * 使用一组单例项创建集合。\n */\n constructor(items: [...Item]) {\n this.map = new Map()\n items.forEach(item => this.map.set(item.getName(), item))\n }\n\n /**\n * 按名称获取集合中的单例值。\n *\n * @throws 当名称不存在于集合中时抛出错误。\n */\n getItem<Name extends TupleToUnion<GetName<Item>>>(name: Name): GetValue<Item, Name> {\n const item = this.map.get(name)\n if (item === undefined) {\n throw new Error(`GlobalService: item ${String(name)} not found`)\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n return item.getValue() as GetValue<Item, Name>\n }\n}\n\n/**\n * 从多个单例项创建单例集合。\n *\n * @example\n * ```\n * // Scenario 1: different names resolve to their corresponding cached values.\n * const item1 = singletonItem(\"count\", () => 1)\n * const item2 = singletonItem(\"label\", () => \"ok\")\n * const collection = singletonCollection([item1, item2])\n *\n * const example1 = collection.getItem(\"count\")\n * const example2 = collection.getItem(\"label\")\n *\n * // Expect: 1\n * example1\n * // Expect: \"ok\"\n * example2\n *\n * // Scenario 2: reading the same name repeatedly returns the same cached value.\n * let calls = 0\n * const item3 = singletonItem(\"config\", () => {\n * calls += 1\n * return { enabled: true }\n * })\n * const collection2 = singletonCollection([item3])\n *\n * const example3 = collection2.getItem(\"config\")\n * const example4 = collection2.getItem(\"config\")\n * const example5 = example3 === example4\n * const example6 = calls\n *\n * // Expect: true\n * example5\n * // Expect: 1\n * example6\n * ```\n */\nexport const singletonCollection = <Item extends Array<SingletonItem<string, unknown>>>(\n items: [...Item]\n): SingletonCollection<Item> => {\n return new SingletonCollection(items)\n}\n",
|
|
140
|
-
"/**\n * Define supported log level identifiers.\n */\nexport const LOG_TYPES = [\"log\", \"info\", \"warn\", \"error\", \"debug\"] as const\n/**\n * Represent the union type of all supported log levels.\n */\nexport type LogType = typeof LOG_TYPES[number]\n",
|
|
141
|
-
"import type { LogRecord } from \"./log-record.ts\"\n\n/**\n * Describe options consumed by log emitters.\n */\nexport interface LogEmitterOptions extends Omit<LogRecord, \"type\"> {\n}\n/**\n * Define the base emitter contract for dispatching formatted logs.\n */\nexport abstract class LogEmitter {\n readonly tags: string[]\n readonly messages: unknown[]\n\n readonly formattedMessages: string[]\n\n constructor(options: LogEmitterOptions) {\n this.tags = options.tags ?? []\n this.messages = options.messages ?? []\n\n this.formattedMessages = []\n this.formattedMessages.push(this.tags.map(tag => `[${tag}]`).join(\"\"))\n this.formattedMessages.push(this.messages.map(message => String(message)).join(\" \"))\n }\n\n abstract emit(): void\n}\n\n/**\n * Emit `log` records via `console.log`.\n */\nexport class ConsoleLogLogEmitter extends LogEmitter {\n emit(): void {\n console.log(this.formattedMessages.join(\" \"))\n }\n}\n\n/**\n * Emit `info` records via `console.info`.\n */\nexport class ConsoleInfoLogEmitter extends LogEmitter {\n emit(): void {\n console.info(this.formattedMessages.join(\" \"))\n }\n}\n\n/**\n * Emit `warn` records via `console.warn`.\n */\nexport class ConsoleWarnLogEmitter extends LogEmitter {\n emit(): void {\n console.warn(this.formattedMessages.join(\" \"))\n }\n}\n\n/**\n * Emit `error` records via `console.error`.\n */\nexport class ConsoleErrorLogEmitter extends LogEmitter {\n emit(): void {\n console.error(this.formattedMessages.join(\" \"))\n }\n}\n\n/**\n * Emit `debug` records via `console.debug`.\n */\nexport class ConsoleDebugLogEmitter extends LogEmitter {\n emit(): void {\n console.debug(this.formattedMessages.join(\" \"))\n }\n}\n",
|
|
142
|
-
"import type { LogRecord } from \"./log-record.ts\"\n\n/**\n * Describe a schedulable log emission task.\n */\nexport interface LogTask {\n record: LogRecord\n emit: () => void\n}\n/**\n * Represent supported scheduling strategies.\n */\nexport type LogSchedulerStrategy = \"immediate\"\n/**\n * Describe options used to configure a log scheduler.\n */\nexport interface LogSchedulerOptions {\n strategy: LogSchedulerStrategy\n}\n/**\n * Queue and dispatch log tasks based on scheduling strategy.\n */\nexport class LogScheduler {\n protected strategy: LogSchedulerStrategy\n\n protected taskQueue: LogTask[][]\n\n constructor(options: LogSchedulerOptions) {\n this.strategy = options.strategy\n\n this.taskQueue = []\n }\n\n /**\n * Check if there are any tasks in the queue.\n */\n hasTasks(): boolean {\n return this.taskQueue.length !== 0\n }\n\n /**\n * Enqueue tasks and run immediately when strategy requires.\n */\n enqueue(task: LogTask[]): void {\n this.taskQueue.push(task)\n if (this.strategy === \"immediate\") {\n this.run()\n }\n }\n\n /**\n * Flush queued tasks in insertion order.\n */\n run(): void {\n const tasksToRun = [...this.taskQueue].flat()\n this.taskQueue = []\n for (const task of tasksToRun) {\n task.emit()\n }\n }\n}\n\n/**\n * Get the singleton global `LogScheduler` instance.\n */\nexport const getGlobalLogScheduler: () => LogScheduler = (\n () => {\n let instance: LogScheduler | undefined = undefined\n return (): LogScheduler => {\n instance = instance ?? new LogScheduler({ strategy: \"immediate\" })\n return instance\n }\n }\n)()\n",
|
|
143
|
-
"\nconst internalUUID_REGEXP = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n\n/**\n * 判断输入值是否为合法的 UUID 字符串。\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = isUuid(\"550e8400-e29b-41d4-a716-446655440000\")\n * // Expect: false\n * const example2 = isUuid(\"not-a-uuid\")\n * ```\n */\nexport const isUuid = (input: string): boolean => {\n return internalUUID_REGEXP.test(input)\n}\n\n/**\n * 断言输入值是合法的 UUID 字符串。\n *\n * 当输入值不满足 UUID 格式时,该函数会抛出 TypeError,适合在标识边界层做快速失败。\n *\n * @example\n * ```\n * // Expect: no throw\n * const example1 = assertUuid(\"550e8400-e29b-41d4-a716-446655440000\")\n * // Expect: throws TypeError\n * const example2 = () => assertUuid(\"not-a-uuid\")\n * ```\n *\n * @throws {TypeError} when input is not a valid UUID\n */\nexport const assertUuid = (input: string): void => {\n if (isUuid(input) === false) {\n throw new TypeError(`Expected a valid UUID string, got: ${input}`)\n }\n}\n\n/**\n * 读取合法 UUID 字符串中的版本号。\n *\n * 该函数会先校验输入格式;如果输入不是合法 UUID,则会抛出 TypeError。\n *\n * @example\n * ```\n * // Expect: 4\n * const example1 = getUuidVersion(\"550e8400-e29b-41d4-a716-446655440000\")\n * // Expect: 1\n * const example2 = getUuidVersion(\"123e4567-e89b-12d3-a456-426614174000\")\n * ```\n *\n * @throws {TypeError} when input is not a valid UUID\n */\nexport const getUuidVersion = (input: string): number => {\n assertUuid(input)\n return Number.parseInt(input[14]!, 16)\n}\n\n/**\n * 生成 UUID v4 字符串。\n *\n * 当运行时提供 Web Crypto 能力时,优先使用安全随机源;否则回退到兼容性方案。\n *\n * @example\n * ```\n * const uuid = generateUuidV4()\n * // Expect: true\n * const example1 = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid)\n * ```\n */\nexport const generateUuidV4 = (): string => {\n if (globalThis.crypto !== undefined) {\n const { crypto } = globalThis\n\n if (typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID()\n }\n\n if (typeof crypto.getRandomValues === \"function\" && typeof Uint8Array === \"function\") {\n const buffer = new Uint8Array(16)\n crypto.getRandomValues(buffer)\n\n buffer[6] = (buffer[6]! & 0x0F) | 0x40\n buffer[8] = (buffer[8]! & 0x3F) | 0x80\n\n const hex = [...buffer].map(value => value.toString(16).padStart(2, \"0\")).join(\"\")\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`\n }\n }\n\n const fallbackUUID = (): string => {\n const random = (value: number): string => {\n return ((value ^ ((Math.random() * 16) >> (value / 4))) & 15).toString(16)\n }\n\n return \"10000000-1000-4000-8000-100000000000\".replaceAll(/[018]/g, (char: string) => random(Number(char)))\n }\n\n return fallbackUUID()\n}\n\n/**\n * 通过 URL.createObjectURL 侧向取得一个 UUID v4 风格的字符串。\n *\n * 该函数依赖 Blob 与 URL API,适合浏览器等具备对象 URL 能力的环境。\n * 如果只需要常规 UUID v4,优先使用 generateUuidV4。\n *\n * @example\n * ```\n * const uuid = generateUuidV4FromUrl()\n * // Expect: true\n * const example1 = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid)\n * // Expect: 36\n * const example2 = uuid.length\n * ```\n */\nexport const generateUuidV4FromUrl = (): string => {\n const tempURL = URL.createObjectURL(new Blob())\n const uuidInUrl = tempURL\n URL.revokeObjectURL(tempURL)\n const uuid = uuidInUrl.slice(uuidInUrl.lastIndexOf(\"/\") + 1)\n return uuid\n}\n\nconst internalUUIDv7RandomMask74 = (1n << 74n) - 1n\nconst internalUUIDv7RandomMask48 = (1n << 48n) - 1n\nlet internalUUIDv7LastTimestamp = -1n\nlet internalUUIDv7MonotonicValue = 0n\n\nconst internalUUIDv7FillRandom = (buffer: Uint8Array): void => {\n if (globalThis.crypto !== undefined) {\n const { crypto } = globalThis\n if (typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(buffer)\n return\n }\n }\n\n console.warn(\"generateUuidV7 requires crypto.getRandomValues\")\n for (let i = 0; i < 10; i = i + 1) {\n buffer[i] = Math.floor(Math.random() * 256)\n }\n}\n\nconst internalUUIDv7NextRandom74 = (timestamp: bigint): bigint => {\n if (timestamp !== internalUUIDv7LastTimestamp) {\n const randomValues = new Uint8Array(10)\n internalUUIDv7FillRandom(randomValues)\n\n const randomHex = Array.from(randomValues, value => value.toString(16).padStart(2, \"0\")).join(\"\")\n internalUUIDv7MonotonicValue = BigInt(`0x${randomHex}`) & internalUUIDv7RandomMask74\n internalUUIDv7LastTimestamp = timestamp\n return internalUUIDv7MonotonicValue\n }\n\n internalUUIDv7MonotonicValue = (internalUUIDv7MonotonicValue + 1n) & internalUUIDv7RandomMask74\n return internalUUIDv7MonotonicValue\n}\n\n/**\n * 生成 UUID v7 字符串。\n *\n * 结果以前导时间戳编码排序信息,适合需要近似按生成时间排序的标识场景。\n *\n * @example\n * ```\n * const uuid = generateUuidV7()\n * // Expect: true\n * const example1 = /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid)\n * ```\n */\nexport const generateUuidV7 = (): string => {\n const timestamp = BigInt(Date.now())\n const random74 = internalUUIDv7NextRandom74(timestamp)\n const timeHex = timestamp.toString(16).padStart(12, \"0\")\n\n const randAValue = Number((random74 >> 62n) & 0xFFFn)\n const randBValue = Number((random74 >> 48n) & 0x3FFFn)\n const trailingValue = random74 & internalUUIDv7RandomMask48\n\n const randA = ((0x7 << 12) | randAValue) & 0xFFFF\n const randB = ((0x2 << 14) | randBValue) & 0xFFFF\n const trailingHex = trailingValue.toString(16).padStart(12, \"0\")\n\n return `${timeHex.slice(0, 8)}-${timeHex.slice(8, 12)}-${randA.toString(16).padStart(4, \"0\")}-${randB.toString(16).padStart(4, \"0\")}-${trailingHex}`\n}\n",
|
|
144
|
-
"import { generateUuidV7 } from \"./uuid.ts\"\n\nconst INTERNAL_ID: unique symbol = Symbol(\"INTERNAL_ID\")\ntype IdentifierSeed = string | number | symbol\n\n/**\n * Represent a logical identity value.\n *\n * @example\n * ```\n * const userId = generateId(\"user:1\")\n * const example1 = isId(userId)\n * // Expect: true\n *\n * const example2 = String(userId)\n * // Expect: starts with \"Symbol-ID-\"\n * ```\n */\nexport interface Id {\n [INTERNAL_ID]: string\n [Symbol.toPrimitive]: (hint: string) => string\n}\n\nconst internalIdPacket: Record<IdentifierSeed, Id> = {}\n\n/**\n * 根据种子生成 `Id`,或在未提供种子时生成一个新的 `Id`。\n *\n * 当传入种子时,同一种子会复用同一个 `Id` 实例;未传入种子时,每次都会得到新的 `Id`。\n *\n * @example\n * ```\n * const stableA = generateId(\"user:1\")\n * const stableB = generateId(\"user:1\")\n * const example1 = Object.is(stableA, stableB)\n * // Expect: true\n *\n * const freshA = generateId()\n * const freshB = generateId()\n * const example2 = Object.is(freshA, freshB)\n * // Expect: false\n * ```\n */\nexport const generateId = (seed?: IdentifierSeed | undefined): Id => {\n if (seed === undefined) {\n const id = {\n [INTERNAL_ID]: generateUuidV7(),\n [Symbol.toPrimitive]: (): string => {\n return idToString(id)\n },\n }\n return id\n }\n\n const id = internalIdPacket[seed] ?? {\n [INTERNAL_ID]: generateUuidV7(),\n [Symbol.toPrimitive]: (): string => {\n return idToString(id)\n },\n }\n internalIdPacket[seed] = id\n\n return id\n}\n\n/**\n * 判断一个值是否为 `Id`。\n */\nexport const isId = (target: unknown): target is Id => {\n return typeof target === \"object\" && target !== null && INTERNAL_ID in target\n}\n\ntype AssertId = (target: unknown) => asserts target is Id\n\n/**\n * 断言一个值是 `Id`。\n *\n * @throws {TypeError} 当 target 不是 `Id` 时抛出\n */\nexport const assertId: AssertId = (target: unknown): void => {\n if (isId(target) === false) {\n throw new TypeError(`Expected Id, got: ${String(target)}`)\n }\n}\n\n/**\n * 按引用身份比较两个 `Id` 值是否为同一个实例。\n */\nexport const isSameId = (a: Id, b: Id): boolean => {\n return Object.is(a, b)\n}\n\n/**\n * 按内部标识值比较两个 `Id` 是否相等。\n */\nexport const isEqualId = (a: Id, b: Id): boolean => {\n return a[INTERNAL_ID] === b[INTERNAL_ID]\n}\n\n/**\n * 将 `Id` 转换为可读字符串。\n *\n * 返回值格式为 `Symbol-ID-<uuid>`。\n *\n * @example\n * ```\n * const userId = generateId(\"user:1\")\n * const example1 = idToString(userId)\n * // Expect: starts with \"Symbol-ID-\"\n *\n * const anonymousId = generateId()\n * const example2 = idToString(anonymousId)\n * // Expect: matches the format \"Symbol-ID-<uuid>\"\n * ```\n */\nexport const idToString = (id: Id): string => {\n assertId(id)\n return `Symbol-ID-${id[INTERNAL_ID]}`\n}\n",
|
|
145
|
-
"import { generateUuidV4FromUrl } from \"#Source/identifier/index.ts\"\nimport { getGlobalLogScheduler } from \"./log-scheduler.ts\"\n\nimport type { LogRecord } from \"./log-record.ts\"\nimport type { LogTask } from \"./log-scheduler.ts\"\nimport type { LogType } from \"./log-type.ts\"\nimport {\n ConsoleDebugLogEmitter,\n ConsoleErrorLogEmitter,\n ConsoleInfoLogEmitter,\n ConsoleLogLogEmitter,\n ConsoleWarnLogEmitter,\n} from \"./log-emitter.ts\"\nimport type { LogEmitter, LogEmitterOptions } from \"./log-emitter.ts\"\n\nconst globalLogScheduler = getGlobalLogScheduler()\n\n/**\n * Describe an object that exposes a `Logger` instance.\n */\nexport interface LoggerFriendly {\n logger: Logger\n}\n/**\n * Describe options that may provide an existing `Logger`.\n */\nexport interface LoggerFriendlyOptions {\n logger?: Logger | undefined\n}\n\n/**\n * Describe an emitter registration for a specific log type.\n */\nexport interface LogEmitterItem {\n logType: LogType\n // oxlint-disable-next-line no-explicit-any\n LogEmitter: new (...args: any[]) => LogEmitter\n injectOptions?: ((options: LogEmitterOptions) => LogEmitterOptions) | undefined\n}\n/**\n * Define the default console-based emitters.\n */\nconst DEFAULT_CONSOLE_LOG_EMITTER_ITEMS: LogEmitterItem[] = [\n {\n logType: \"log\",\n LogEmitter: ConsoleLogLogEmitter,\n },\n {\n logType: \"info\",\n LogEmitter: ConsoleInfoLogEmitter,\n },\n {\n logType: \"warn\",\n LogEmitter: ConsoleWarnLogEmitter,\n },\n {\n logType: \"error\",\n LogEmitter: ConsoleErrorLogEmitter,\n },\n {\n logType: \"debug\",\n LogEmitter: ConsoleDebugLogEmitter,\n },\n]\n\n/**\n * Describe runtime logger configuration values.\n */\nexport interface LoggerConfigs {\n enabled: boolean\n autoSend: boolean\n filter: ((logRecord: LogRecord) => boolean)\n emitters: LogEmitterItem[]\n}\n/**\n * Describe options used to construct a `Logger`.\n */\nexport interface LoggerOptions {\n name?: string | undefined\n parent?: Logger | undefined\n configs?: Partial<LoggerConfigs> | undefined\n}\n/**\n * 表示支持层级继承、标签管理与延迟发送的日志记录器。\n *\n * 规范:\n * - 初始配置的优先级为 parentConfigs -> configs -> 默认值。\n * - 当 parent 为 undefined 时,parentConfigs 也应该是 undefined。\n * - 更新 parent 时,parentConfigs 也应该同步更新。\n * - 作为 parent 修改自己的 configs 时,不会影响 child 的 configs。\n * - 作为 child 可以独立修改自己的 configs,也可以将 parentConfigs 应用到自己的 configs。\n */\nexport class Logger implements Disposable {\n /**\n * 从选项中解析 logger;如果未提供,则基于全局 logger 派生一个新 logger。\n *\n * @example\n * ```\n * // Expect: example1 === customLogger\n * const customLogger = new Logger({ name: \"Custom\" })\n * const example1 = Logger.fromOptions({ logger: customLogger })\n *\n * // Expect: example2 !== globalLogger\n * // Expect: example2.hasParent() === true\n * const globalLogger = getGlobalLogger()\n * const example2 = Logger.fromOptions({})\n *\n * class CustomClass implements LoggerFriendly {\n * logger: Logger\n *\n * constructor(options: LoggerFriendlyOptions) {\n * this.logger = Logger.fromOptions(options)\n * }\n * }\n *\n * // Expect: example3.logger instanceof Logger\n * const example3 = new CustomClass({ logger: customLogger })\n * ```\n */\n static fromOptions(options: LoggerFriendlyOptions): Logger {\n if (options.logger !== undefined) {\n return options.logger\n }\n\n const parent = getGlobalLogger()\n const logger = Logger.derive(parent)\n return logger\n }\n\n /**\n * Create a child logger from a parent logger.\n */\n static derive(parentLogger: Logger): Logger {\n const logger = new Logger({ parent: parentLogger })\n return logger\n }\n\n protected name: string\n protected parent?: Logger | undefined\n protected childs: Logger[]\n protected parentConfigs?: LoggerConfigs | undefined\n protected configs: LoggerConfigs\n\n protected instanceTags: string[]\n protected sessionTags: string[]\n protected onceTags: string[]\n\n private logTasks: LogTask[]\n private cachedLogMethodMap: Map<string, (...messages: unknown[]) => this>\n\n constructor(options: LoggerOptions) {\n this.name = options.name ?? \"Unnamed\"\n this.parent = options.parent\n this.childs = []\n const parentConfigs = options.parent?.getConfigs()\n const configs = options.configs\n this.parentConfigs = parentConfigs\n this.configs = {\n enabled: parentConfigs?.enabled ?? configs?.enabled ?? true,\n autoSend: parentConfigs?.autoSend ?? configs?.autoSend ?? true,\n filter: parentConfigs?.filter ?? configs?.filter ?? ((): boolean => true),\n emitters: parentConfigs?.emitters ?? configs?.emitters ?? DEFAULT_CONSOLE_LOG_EMITTER_ITEMS\n }\n\n this.instanceTags = []\n this.sessionTags = []\n this.onceTags = []\n\n this.logTasks = []\n this.cachedLogMethodMap = new Map()\n }\n\n /**\n * Get the logger display name.\n */\n getName(): string {\n return this.name\n }\n\n /**\n * Set the logger display name.\n */\n setName(name: string): this {\n this.name = name\n return this\n }\n\n /**\n * Check whether the logger currently has a parent.\n */\n hasParent(): boolean {\n return this.parent !== undefined\n }\n\n /**\n * Set or clear the parent logger.\n */\n setParent(parentLogger?: Logger | undefined): this {\n this.parent = parentLogger\n this.parentConfigs = parentLogger?.getConfigs()\n return this\n }\n\n /**\n * Get merged effective configs from parent and local overrides.\n */\n getConfigs(): LoggerConfigs {\n return { ...this.parentConfigs, ...this.configs }\n }\n\n /**\n * Update local configs and refresh inherited configs on child loggers.\n */\n setConfigs(configs: Partial<LoggerConfigs>): this {\n this.configs = { ...this.getConfigs(), ...configs }\n for (const child of this.childs) {\n child.setParent(this)\n }\n return this\n }\n\n /**\n * Apply current parent configs onto local configs.\n */\n useParentConfigs(): this {\n if (this.parentConfigs !== undefined) {\n this.setConfigs(this.parentConfigs)\n }\n return this\n }\n\n /**\n * Get all configured emitter registrations.\n */\n getAllLogEmitters(): LogEmitterItem[] {\n const emitters = this.getConfigs().emitters\n return emitters\n }\n\n /**\n * Get emitter registrations for a specific log type.\n */\n getLogEmitters(logType: LogType): LogEmitterItem[] {\n const emitters = this.getConfigs().emitters\n const filteredEmitters = emitters.filter(item => item.logType === logType)\n return filteredEmitters\n }\n\n /**\n * 支持为同一类型的 Log 添加多个 LogEmitter。\n */\n addLogEmitters(logEmitters: LogEmitterItem[]): this {\n const newEmitters = [...this.getConfigs().emitters]\n for (const item of logEmitters) {\n if (!newEmitters.some((e) => e.logType === item.logType && e.LogEmitter === item.LogEmitter)) {\n newEmitters.push(item)\n }\n }\n this.setConfigs({\n emitters: newEmitters\n })\n return this\n }\n\n /**\n * Remove matched emitter registrations.\n */\n removeLogEmitters(logEmitters: LogEmitterItem[]): this {\n const emitters = this.getConfigs().emitters\n const remainingEmitters = emitters.filter((item) => {\n return !logEmitters.some((e) => e.logType === item.logType && e.LogEmitter === item.LogEmitter)\n })\n this.setConfigs({\n emitters: remainingEmitters\n })\n return this\n }\n\n /**\n * Invoke all emitters that match the record log type.\n */\n invokeLogEmitter(record: LogRecord): void {\n const { type } = record\n if (type === undefined) {\n return\n }\n const logEmitterList = this.getLogEmitters(type)\n if (logEmitterList.length === 0) {\n return\n }\n logEmitterList.forEach((item) => {\n const injectOptions = item.injectOptions ?? (<T>(v: T): T => v)\n const LogEmitter = item.LogEmitter\n const logEmitter = new LogEmitter(injectOptions(record))\n logEmitter.emit()\n })\n }\n\n /**\n * Get full hierarchical name tags from root to current logger.\n */\n getNameTags(): string[] {\n const names = [...this.parent?.getNameTags() ?? [], this.getName()]\n return names\n }\n\n /**\n * Add persistent instance tags.\n */\n addInstanceTags(tags: string[]): this {\n this.instanceTags.push(...tags)\n return this\n }\n\n /**\n * Remove matched instance tags.\n */\n removeInstanceTags(tags: string[]): this {\n this.instanceTags = this.instanceTags.filter(tag => !tags.includes(tag))\n return this\n }\n\n /**\n * Get current instance tags.\n */\n getInstanceTags(): string[] {\n return this.instanceTags\n }\n\n /**\n * Clear all instance tags.\n */\n clearInstanceTags(): this {\n this.instanceTags = []\n return this\n }\n\n /**\n * Add session tags used until `tagEnd` is called.\n */\n addSessionTags(tags: string[]): this {\n this.sessionTags.push(...tags)\n return this\n }\n\n /**\n * Remove matched session tags.\n */\n removeSessionTags(tags: string[]): this {\n this.sessionTags = this.sessionTags.filter(tag => !tags.includes(tag))\n return this\n }\n\n /**\n * Get current session tags.\n */\n getSessionTags(): string[] {\n return this.sessionTags\n }\n\n /**\n * Clear all session tags.\n */\n clearSessionTags(): this {\n this.sessionTags = []\n return this\n }\n\n /**\n * Start and automatically end a session tag scope on dispose.\n */\n autoTag(tags: string[]): Disposable {\n this.tagStart(tags)\n return {\n [Symbol.dispose]: (): void => {\n this.tagEnd()\n },\n }\n }\n\n /**\n * Start a session tag scope.\n */\n tagStart(tags: string[]): this {\n this.addSessionTags(tags)\n return this\n }\n\n /**\n * End the current session tag scope.\n */\n tagEnd(): this {\n this.clearSessionTags()\n return this\n }\n\n /**\n * Add one-shot tags consumed by the next log call.\n */\n addOnceTags(tags: string[]): this {\n this.onceTags.push(...tags)\n return this\n }\n\n /**\n * Get current one-shot tags.\n */\n getOnceTags(): string[] {\n return this.onceTags\n }\n\n /**\n * Clear all one-shot tags.\n */\n clearOnceTags(): this {\n this.onceTags = []\n return this\n }\n\n /**\n * Build and cache a log method bound to type and prefix.\n */\n private makeLogMethod(logType: LogType, prefix: string): ((...args: unknown[]) => this) {\n const cachedLogMethodKey = `${logType}-${prefix}`\n const cachedLogMethod = this.cachedLogMethodMap.get(cachedLogMethodKey)\n if (cachedLogMethod !== undefined) {\n return cachedLogMethod\n }\n\n const newMethod = (...messages: unknown[]): this => {\n const configs = this.getConfigs()\n if (configs.enabled === false) {\n return this\n }\n\n const tags = [\n prefix,\n ...this.getNameTags(),\n ...this.getInstanceTags(),\n ...this.getSessionTags(),\n ...this.getOnceTags()\n ]\n const logRecord: LogRecord = {\n type: logType,\n tags: tags,\n messages,\n }\n\n // oxlint-disable-next-line no-array-callback-reference\n if (configs.filter(logRecord) === false) {\n return this\n }\n\n this.logTasks.push({\n record: logRecord,\n emit: () => {\n this.invokeLogEmitter(logRecord)\n }\n })\n if (configs.autoSend === true) {\n this.send()\n }\n this.clearOnceTags()\n return this\n }\n this.cachedLogMethodMap.set(cachedLogMethodKey, newMethod)\n\n return newMethod\n }\n\n /**\n * Queue a `log` level record.\n */\n log(...messages: unknown[]): this {\n return this.makeLogMethod(\"log\", \"🟢\")(...messages)\n }\n\n /**\n * Queue an `info` level record.\n */\n info(...messages: unknown[]): this {\n return this.makeLogMethod(\"info\", \"🔵\")(...messages)\n }\n\n /**\n * Queue a `warn` level record.\n */\n warn(...messages: unknown[]): this {\n return this.makeLogMethod(\"warn\", \"🟡\")(...messages)\n }\n\n /**\n * Queue an `error` level record.\n */\n error(...messages: unknown[]): this {\n return this.makeLogMethod(\"error\", \"🔴\")(...messages)\n }\n\n /**\n * Queue a `debug` level record.\n */\n debug(...messages: unknown[]): this {\n return this.makeLogMethod(\"debug\", \"🟤\")(...messages)\n }\n\n /**\n * Create a child logger configured for manual batched sending.\n */\n batch(id?: string | undefined): Logger {\n const logger = Logger.derive(this)\n logger.setConfigs({ autoSend: false })\n logger.addInstanceTags([id ?? generateUuidV4FromUrl()])\n return logger\n }\n\n /**\n * Flush queued records to the global scheduler.\n */\n send(): void {\n globalLogScheduler.enqueue(this.logTasks)\n this.logTasks = []\n }\n\n /**\n * Flush queued records when used with `using` disposal.\n */\n [Symbol.dispose](): void {\n this.send()\n }\n}\n\n/**\n * Get the singleton global `Logger` instance.\n */\nexport const getGlobalLogger: () => Logger = (\n () => {\n let instance: Logger | undefined = undefined\n return (): Logger => {\n instance = instance ?? new Logger({ name: \"GlobalLogger\" })\n return instance\n }\n }\n)()\n",
|
|
146
|
-
"\ntype Listener = () => void\n/**\n * 管理绑定到 `AbortSignal` 实例上的监听器。\n */\nexport class AbortSignalListenerManager {\n readonly abortSignalMap: WeakMap<AbortSignal, {\n syntheticListener: Listener\n managedListenerSet: Set<Listener>\n }>\n\n constructor() {\n this.abortSignalMap = new WeakMap()\n }\n\n /**\n * 检查某个监听器当前是否由指定 `AbortSignal` 管理。\n */\n hasEventListener(abortSignal: AbortSignal, listener: Listener): boolean {\n const listeners = this.abortSignalMap.get(abortSignal)\n if (listeners === undefined) {\n return false\n }\n return listeners.managedListenerSet.has(listener)\n }\n\n /**\n * 为 `AbortSignal` 添加一个受管监听器。\n */\n addEventListener(abortSignal: AbortSignal, listener: Listener): this {\n let listeners = this.abortSignalMap.get(abortSignal)\n if (listeners === undefined) {\n listeners = {\n syntheticListener: (): void => {\n // 在调用受管监听器之前,先将它们复制到一个新的数组中,以避免在调用过程中被修改。\n const managedListenerSet = [...listeners?.managedListenerSet ?? []]\n for (const managedListener of managedListenerSet) {\n managedListener()\n }\n },\n managedListenerSet: new Set(),\n }\n this.abortSignalMap.set(abortSignal, listeners)\n abortSignal.addEventListener(\"abort\", listeners.syntheticListener)\n }\n if (listeners.managedListenerSet.has(listener) === false) {\n listeners.managedListenerSet.add(listener)\n }\n\n return this\n }\n\n /**\n * 从 `AbortSignal` 移除一个受管监听器。\n */\n removeEventListener(abortSignal: AbortSignal, listener: Listener): this {\n const listeners = this.abortSignalMap.get(abortSignal)\n if (listeners === undefined) {\n return this\n }\n listeners.managedListenerSet.delete(listener)\n if (listeners.managedListenerSet.size === 0) {\n abortSignal.removeEventListener(\"abort\", listeners.syntheticListener)\n this.abortSignalMap.delete(abortSignal)\n }\n return this\n }\n}\n\n/**\n * 获取全局单例的 `AbortSignalListenerManager` 实例。\n */\nexport const getGlobalAbortSignalListenerManager: () => AbortSignalListenerManager = (\n () => {\n let instance: AbortSignalListenerManager | undefined = undefined\n return (): AbortSignalListenerManager => {\n instance = instance ?? new AbortSignalListenerManager()\n return instance\n }\n }\n)()\n",
|
|
147
|
-
"import { getGlobalAbortSignalListenerManager } from \"./abort-signal-listener-manager.ts\"\n\n/**\n * 表示支持的中止感知输入。\n */\nexport type Abortable = AbortSignal | AbortController | AbortManager\n\n/**\n * 表示可能包含 `abortSignal` 的选项对象。\n */\nexport interface WithAbortSignal {\n abortSignal?: AbortSignal | undefined\n}\n/**\n * 从选项类型中移除 `abortSignal` 字段。\n */\nexport type WithoutAbortSignal<T> = Omit<T, \"abortSignal\">\n\n/**\n * 从中止感知输入中解析出 `AbortSignal`。\n */\nexport const getAbortSignal = (abortable: Abortable): AbortSignal => {\n if (abortable instanceof AbortSignal) {\n return abortable\n }\n else if (abortable instanceof AbortController) {\n return abortable.signal\n }\n else if (abortable instanceof AbortManager) {\n return abortable.abortSignal\n }\n else {\n throw new TypeError(\"Unsupported abortable type.\")\n }\n}\n/**\n * 检查中止感知输入是否已经中止。\n */\nexport const isAborted = (abortable: Abortable): boolean => {\n const signal = getAbortSignal(abortable)\n return signal.aborted\n}\n\n/**\n * 表示暴露 `AbortManager` 与 `abort` 操作的对象。\n */\nexport interface AbortFriendly {\n readonly abortManager: AbortManager\n\n /**\n * 此方法中应该将 {@link abortManager} 中止。\n */\n abort: (reason: string) => void\n}\n/**\n * 表示可提供上游 `AbortManager` 的选项。\n */\nexport interface AbortFriendlyOptions {\n abortManager?: AbortManager | undefined\n}\n\n/**\n * 定义支持的中止判定模式。\n */\nexport const ABORT_MANAGER_MODE = {\n ALL: \"all\",\n ANY: \"any\",\n} as const\n/**\n * 表示 `AbortManager` 使用的中止模式。\n */\nexport type AbortManagerMode = typeof ABORT_MANAGER_MODE[keyof typeof ABORT_MANAGER_MODE]\ninterface Upstream {\n abortable: Abortable\n listener: () => void\n connect: () => void\n disconnect: () => void\n remove: () => void\n}\n/**\n * 表示 `AbortManager` 的构造选项。\n */\nexport interface AbortManagerOptions extends AbortFriendlyOptions {\n /**\n * 如果为 true,则在中止后移除全部上游。\n *\n * @default true\n */\n autoRemoveUpstreamsAfterAbort?: boolean | undefined\n}\n/**\n * 协调一个或多个上游中止源的下游中止状态。\n */\nexport class AbortManager implements AbortFriendly {\n readonly abortManager: AbortManager\n readonly abortController: AbortController\n readonly abortSignal: AbortSignal\n protected upstreamMap: Map<Abortable, Upstream>\n protected mode: AbortManagerMode\n protected autoRemoveUpstreamsAfterAbort: boolean\n\n constructor(options: AbortManagerOptions) {\n this.abortManager = this\n this.abortController = new AbortController()\n this.abortSignal = this.abortController.signal\n this.upstreamMap = new Map()\n this.mode = ABORT_MANAGER_MODE.ALL\n this.autoRemoveUpstreamsAfterAbort = options.autoRemoveUpstreamsAfterAbort ?? true\n\n const abortManagerFromOptions = options.abortManager\n if (abortManagerFromOptions !== undefined) {\n this.addUpstreams([abortManagerFromOptions])\n }\n }\n\n /**\n * 检查当前管理器是否已经中止。\n */\n isAborted(): boolean {\n return this.abortSignal.aborted\n }\n\n /**\n * 设置中止判定模式。\n */\n setMode(mode: AbortManagerMode): this {\n this.mode = mode\n return this\n }\n\n /**\n * 添加需要观察的上游中止源。\n */\n addUpstreams(abortables: Abortable[]): this {\n const globalAbortSignalListenerManager = getGlobalAbortSignalListenerManager()\n\n abortables\n .forEach((abortable) => {\n const abortSignal = getAbortSignal(abortable)\n const listener = (): void => {\n this.tryToAbort() // 任一上游中止后都应重新尝试判定是否中止\n }\n const connect = (): void => {\n globalAbortSignalListenerManager.addEventListener(abortSignal, listener)\n }\n const disconnect = (): void => {\n globalAbortSignalListenerManager.removeEventListener(abortSignal, listener)\n }\n const remove = (): void => {\n disconnect()\n this.upstreamMap.delete(abortable)\n }\n this.upstreamMap.set(abortable, {\n abortable,\n listener,\n connect,\n disconnect,\n remove,\n })\n connect()\n })\n\n // 添加上游后,立即重新判定是否需要中止\n this.tryToAbort()\n\n return this\n }\n\n /**\n * 移除指定的上游中止源。\n */\n removeUpstreams(abortables: Abortable[]): this {\n abortables\n .forEach((abortable) => {\n const upstream = this.upstreamMap.get(abortable)\n if (upstream !== undefined) {\n upstream.remove()\n }\n })\n\n // 移除上游后,立即重新判定是否需要中止\n this.tryToAbort()\n\n return this\n }\n\n /**\n * 移除全部已注册的上游中止源。\n */\n removeAllUpstreams(): this {\n const upstreamAbortables = Array.from(this.upstreamMap.keys())\n this.removeUpstreams(upstreamAbortables)\n\n return this\n }\n\n /**\n * 根据当前模式评估上游状态,并在满足条件时中止。\n */\n tryToAbort(): void {\n const upstreams = Array.from(this.upstreamMap.values())\n\n let shouldAbort: boolean\n if (this.mode === ABORT_MANAGER_MODE.ALL) {\n shouldAbort = upstreams.every(upstream => isAborted(upstream.abortable))\n }\n else if (this.mode === ABORT_MANAGER_MODE.ANY) {\n shouldAbort = upstreams.some(upstream => isAborted(upstream.abortable))\n }\n else {\n throw new TypeError(\"Unsupported mode.\")\n }\n\n // 满足中止条件且当前尚未中止时,执行中止\n if (shouldAbort === true && this.abortSignal.aborted === false) {\n this.abort(`Abort by upstream, mode: ${this.mode}.`)\n }\n }\n\n /**\n * 使用给定原因中止当前管理器。\n */\n abort(reason: string): void {\n this.abortController.abort(reason)\n if (this.autoRemoveUpstreamsAfterAbort === true) {\n this.removeAllUpstreams()\n }\n }\n}\n\n/**\n * 基于单个上游中止源创建 `AbortManager`。\n */\nexport const fromAbortable = (abortable: Abortable): AbortManager => {\n const abortManager = new AbortManager({})\n abortManager.addUpstreams([abortable])\n return abortManager\n}\n\n/**\n * 创建在任一上游中止时中止的 `AbortManager`。\n */\nexport const any = (abortables: Array<Abortable | undefined | null>): AbortManager => {\n const abortManager = new AbortManager({})\n abortManager.setMode(ABORT_MANAGER_MODE.ANY)\n abortManager.addUpstreams(abortables.filter(item => item !== undefined && item !== null))\n return abortManager\n}\n\n/**\n * 创建在全部上游中止时中止的 `AbortManager`。\n */\nexport const all = (abortables: Array<Abortable | undefined | null>): AbortManager => {\n const abortManager = new AbortManager({})\n abortManager.setMode(ABORT_MANAGER_MODE.ALL)\n abortManager.addUpstreams(abortables.filter(item => item !== undefined && item !== null))\n return abortManager\n}\n\n/**\n * 从可能携带 `abortSignal` 的选项对象创建 `AbortManager`。\n */\nexport const fromWithAbortSignal = <T extends WithAbortSignal>(options: T): AbortManager => {\n const { abortSignal } = options\n const abortManager = new AbortManager({})\n if (abortSignal !== undefined) {\n abortManager.addUpstreams([abortSignal])\n }\n return abortManager\n}\n\n/**\n * 从中止友好的选项对象创建 `AbortManager`。\n */\nexport const fromAbortFriendlyOptions = <T extends AbortFriendlyOptions>(options: T): AbortManager => {\n const abortManager = new AbortManager({ ...options })\n return abortManager\n}\n",
|
|
148
|
-
"export const FLAG_DICT = {\n /**\n * 当前节点没有任何特性。\n */\n None: 0,\n /**\n * 当前节点的值是可变的。值的变化可以通过此节点继续传递。\n */\n Mutable: 1,\n /**\n * 当前节点的值可能发生了变化,待确定。\n */\n Pending: 2,\n /**\n * 当前节点的值发生了变化。\n */\n Dirty: 4,\n /**\n * 当前节点正在进行观察。当上游节点的值发生变化时应该通知当前节点。\n */\n Watching: 8,\n\n /**\n * 当前节点正在进行依赖收集。\n *\n * 目前只考虑到以下用途:\n *\n * 1. 用于防止在某节点依赖收集过程中依赖发生变化导致该节点重复运行。\n * ```\n * const count = signal(0);\n * effect(() => {\n * count(count() + 1);\n * })\n * ```\n */\n Tracking: 16,\n /**\n * 当前节点正在进行依赖收集,且正在尝试复用现存连接。\n */\n TrackingReusing: 32,\n} as const;\n\nexport const hasMutable = (flags: number): boolean => {\n return (flags & FLAG_DICT.Mutable) !== 0;\n}\nexport const setMutable = (flags?: number | undefined): number => {\n return flags === undefined ? FLAG_DICT.Mutable : (flags | FLAG_DICT.Mutable);\n}\nexport const unsetMutable = (flags: number): number => {\n return flags & ~FLAG_DICT.Mutable;\n}\nexport const toggleMutable = (flags: number): number => {\n return flags ^ FLAG_DICT.Mutable;\n}\nexport const hasDirty = (flags: number): boolean => {\n return (flags & FLAG_DICT.Dirty) !== 0;\n}\nexport const setDirty = (flags?: number | undefined): number => {\n return flags === undefined ? FLAG_DICT.Dirty : (flags | FLAG_DICT.Dirty);\n}\nexport const unsetDirty = (flags: number): number => {\n return flags & ~FLAG_DICT.Dirty;\n}\nexport const toggleDirty = (flags: number): number => {\n return flags ^ FLAG_DICT.Dirty;\n}\nexport const hasPending = (flags: number): boolean => {\n return (flags & FLAG_DICT.Pending) !== 0;\n}\nexport const setPending = (flags?: number | undefined): number => {\n return flags === undefined ? FLAG_DICT.Pending : (flags | FLAG_DICT.Pending);\n}\nexport const unsetPending = (flags: number): number => {\n return flags & ~FLAG_DICT.Pending;\n}\nexport const togglePending = (flags: number): number => {\n return flags ^ FLAG_DICT.Pending;\n}\nexport const hasWatching = (flags: number): boolean => {\n return (flags & FLAG_DICT.Watching) !== 0;\n}\nexport const setWatching = (flags?: number | undefined): number => {\n return flags === undefined ? FLAG_DICT.Watching : (flags | FLAG_DICT.Watching);\n}\nexport const unsetWatching = (flags: number): number => {\n return flags & ~FLAG_DICT.Watching;\n}\nexport const toggleWatching = (flags: number): number => {\n return flags ^ FLAG_DICT.Watching;\n}\nexport const hasTracking = (flags: number): boolean => {\n return (flags & FLAG_DICT.Tracking) !== 0;\n}\nexport const setTracking = (flags?: number | undefined): number => {\n return flags === undefined ? FLAG_DICT.Tracking : (flags | FLAG_DICT.Tracking);\n}\nexport const unsetTracking = (flags: number): number => {\n return flags & ~FLAG_DICT.Tracking;\n}\nexport const toggleTracking = (flags: number): number => {\n return flags ^ FLAG_DICT.Tracking;\n}\nexport const hasTrackingReusing = (flags: number): boolean => {\n return (flags & FLAG_DICT.TrackingReusing) !== 0;\n}\nexport const setTrackingReusing = (flags?: number): number => {\n return flags === undefined ? FLAG_DICT.TrackingReusing : (flags | FLAG_DICT.TrackingReusing);\n}\nexport const unsetTrackingReusing = (flags: number): number => {\n return flags & ~FLAG_DICT.TrackingReusing;\n}\nexport const toggleTrackingReusing = (flags: number): number => {\n return flags ^ FLAG_DICT.TrackingReusing;\n}\n\nexport class Flags {\n private flags: number;\n\n constructor() {\n this.flags = FLAG_DICT.None;\n }\n\n static clone(flags: Flags): Flags {\n const newFlags = new Flags();\n newFlags.set(flags.get());\n return newFlags;\n }\n\n get(): number {\n return this.flags;\n }\n\n set(flags: number): this {\n this.flags = flags;\n return this;\n }\n\n clear(): this {\n this.flags = FLAG_DICT.None;\n return this;\n }\n\n hasMutable(): boolean {\n return hasMutable(this.flags);\n }\n setMutable(): this {\n this.flags = setMutable(this.flags);\n return this;\n }\n unsetMutable(): this {\n this.flags = unsetMutable(this.flags);\n return this;\n }\n toggleMutable(): this {\n this.flags = toggleMutable(this.flags);\n return this;\n }\n\n hasDirty(): boolean {\n return hasDirty(this.flags);\n }\n setDirty(): this {\n this.flags = setDirty(this.flags);\n return this;\n }\n unsetDirty(): this {\n this.flags = unsetDirty(this.flags);\n return this;\n }\n toggleDirty(): this {\n this.flags = toggleDirty(this.flags);\n return this;\n }\n\n hasPending(): boolean {\n return hasPending(this.flags);\n }\n setPending(): this {\n this.flags = setPending(this.flags);\n return this;\n }\n unsetPending(): this {\n this.flags = unsetPending(this.flags);\n return this;\n }\n togglePending(): this {\n this.flags = togglePending(this.flags);\n return this;\n }\n\n hasWatching(): boolean {\n return hasWatching(this.flags);\n }\n setWatching(): this {\n this.flags = setWatching(this.flags);\n return this;\n }\n unsetWatching(): this {\n this.flags = unsetWatching(this.flags);\n return this;\n }\n toggleWatching(): this {\n this.flags = toggleWatching(this.flags);\n return this;\n }\n\n hasTracking(): boolean {\n return hasTracking(this.flags);\n }\n setTracking(): this {\n this.flags = setTracking(this.flags);\n return this;\n }\n unsetTracking(): this {\n this.flags = unsetTracking(this.flags);\n return this;\n }\n toggleTracking(): this {\n this.flags = toggleTracking(this.flags);\n return this;\n }\n\n hasTrackingReusing(): boolean {\n return hasTrackingReusing(this.flags);\n }\n setTrackingReusing(): this {\n this.flags = setTrackingReusing(this.flags);\n return this;\n }\n unsetTrackingReusing(): this {\n this.flags = unsetTrackingReusing(this.flags);\n return this;\n }\n toggleTrackingReusing(): this {\n this.flags = toggleTrackingReusing(this.flags);\n return this;\n }\n\n toString(): string {\n if (this.flags === FLAG_DICT.None) {\n return 'Flags(None)';\n }\n\n const activeFlags: string[] = [];\n\n if (this.hasMutable()) {\n activeFlags.push('Mutable')\n };\n if (this.hasPending()) {\n activeFlags.push('Pending')\n };\n if (this.hasDirty()) {\n activeFlags.push('Dirty')\n };\n if (this.hasWatching()) {\n activeFlags.push('Watching')\n };\n if (this.hasTracking()) {\n activeFlags.push('Tracking')\n };\n if (this.hasTrackingReusing()) {\n activeFlags.push('TrackingReusing')\n };\n\n return `Flags(${activeFlags.join(' | ')})`;\n }\n}\n\nexport const flags = (flags?: number | undefined): Flags => {\n const f = new Flags();\n if (flags !== undefined) {\n f.set(flags);\n }\n return f;\n}\n",
|
|
149
|
-
"import type { Flags } from './flags.ts'\n\nexport interface Node {\n /**\n * 当前节点的上游连接链中的第一个连接。\n */\n headDepLink?: Link | undefined;\n /**\n * 当前节点的上游连接链中的最后一个连接。\n */\n tailDepLink?: Link | undefined;\n\n /**\n * 当前节点的下游连接链中的第一个连接。\n */\n headSubLink?: Link | undefined;\n /**\n * 当前节点的下游连接链中的最后一个连接。\n */\n tailSubLink?: Link | undefined;\n\n /**\n * 当前节点的标记。\n */\n flags: Flags;\n}\n/**\n * 连接用于表示某个节点(下游节点)依赖了某个节点(上游节点)。\n *\n * 多个连接连在一起形成连接链,连接链只有两种情况:\n *\n * 1. 下游连接链:链中所有连接的上游节点相同,通过该链可以找到该上游节点的所有下游节点。\n * 2. 上游连接链:链中所有连接的下游节点相同,通过该链可以找到该下游节点的所有上游节点。\n */\nexport interface Link {\n /**\n * 连接中的上游节点。\n */\n dep: Node;\n /**\n * 连接中的上游节点的下游连接链中的上一个连接。(上一个下游连接)\n */\n prevSubLink?: Link | undefined;\n /**\n * 连接中的上游节点的下游连接链中的下一个连接。(下一个下游连接)\n */\n nextSubLink?: Link | undefined;\n\n /**\n * 连接中的下游节点。\n */\n sub: Node;\n /**\n * 连接中的下游节点的上游连接链中的上一个连接。(上一个上游连接)\n */\n prevDepLink?: Link | undefined;\n /**\n * 连接中的下游节点的上游连接链中的下一个连接。(下一个上游连接)\n */\n nextDepLink?: Link | undefined;\n}\n\nexport interface CreateReactiveSystemOptions {\n /**\n * 当节点的上游节点发生变化时此回调会执行。\n */\n onDepChanged?: (sub: Node) => void;\n /**\n * 当节点的下游节点发生变化时此回调会执行。\n */\n onSubChanged?: (dep: Node) => void;\n /**\n * 当节点拥有第一个上游节点时此回调会执行。\n */\n onHasDep?: (sub: Node, dep: Node) => void;\n /**\n * 当节点不再拥有任何上游节点时此回调会执行。\n */\n onNoDep?: (sub: Node, dep: Node) => void;\n /**\n * 当节点拥有第一个下游节点时此回调会执行。\n */\n onHasSub?: (dep: Node, sub: Node) => void;\n /**\n * 当节点不再拥有任何下游节点时此回调会执行。\n */\n onNoSub?: (dep: Node, sub: Node) => void;\n\n /**\n * 当节点的值需要更新时此回调会执行,返回值表示更新前后值是否变化。\n */\n update(sub: Node): boolean;\n /**\n * 当节点的上游节点的值发生变化后此回调会执行。\n *\n * 注意:只有包含 Watching 标记的节点会触发此方法。\n */\n notify(node: Node): void;\n}\nexport interface ReactiveSystem {\n /**\n * 获取节点的上游连接。\n */\n getDepLinksOfNode(node: Node): Link[];\n /**\n * 获取节点的下游连接。\n */\n getSubLinksOfNode(node: Node): Link[];\n /**\n * 获取节点的上游节点。\n */\n getDepsOfNode(node: Node): Node[];\n /**\n * 获取节点的下游节点。\n */\n getSubsOfNode(node: Node): Node[];\n /**\n * 判断连接是否是节点的上游连接。\n */\n isDepLinkOfNode(link: Link, node: Node): boolean;\n /**\n * 判断连接是否是节点的下游连接。\n */\n isSubLinkOfNode(link: Link, node: Node): boolean;\n /**\n * 判断节点是否是目标节点的上游节点。\n */\n isDepOfNode(node: Node, targetNode: Node): boolean;\n /**\n * 判断节点是否是目标节点的下游节点。\n */\n isSubOfNode(node: Node, targetNode: Node): boolean;\n /**\n * 获取两个节点之间的连接(从上游节点的下游连接链中查找)。\n */\n getLinkBetweenFromDep(dep: Node, sub: Node): Link | undefined;\n /**\n * 获取两个节点之间的连接(从下游节点的上游连接链中查找)。\n */\n getLinkBetweenFromSub(dep: Node, sub: Node): Link | undefined;\n /**\n * 判断两个节点之间是否存在连接(从上游节点的下游连接链中查找)。\n */\n hasLinkBetweenFromDep(dep: Node, sub: Node): boolean;\n /**\n * 判断两个节点之间是否存在连接(从下游节点的上游连接链中查找)。\n */\n hasLinkBetweenFromSub(dep: Node, sub: Node): boolean;\n /**\n * 为两个节点建立连接。\n */\n addLinkBetween(dep: Node, sub: Node): Link;\n /**\n * 为两个节点移除连接(从上游节点的下游连接链中查找)。\n */\n removeLinkBetweenFromDep(dep: Node, sub: Node): void;\n /**\n * 为两个节点移除连接(从下游节点的上游连接链中查找)。\n */\n removeLinkBetweenFromSub(dep: Node, sub: Node): void;\n /**\n * 移除连接。\n */\n removeLink(link: Link): void;\n /**\n * 为节点移除所有上游连接。\n */\n removeAllDepLinksOfNode(node: Node): Node[];\n /**\n * 为节点移除所有下游连接。\n */\n removeAllSubLinksOfNode(node: Node): Node[];\n\n /**\n * 获取当前正在进行依赖收集的节点。\n */\n getActiveNodeAsSub(): Node | undefined;\n /**\n * 设置当前正在进行依赖收集的节点。\n */\n setActiveNodeAsSub(nodeAsSub: Node | undefined): Node | undefined;\n /**\n * 设置当前正在进行依赖收集的节点为空。\n */\n setNoActiveNodeAsSub(): undefined;\n /**\n * 重置当前正在进行依赖收集的节点。\n */\n resetActiveNodeAsSub(): Node | undefined;\n /**\n * 将指定节点作为当前正在进行依赖收集的节点执行指定函数。\n */\n withActiveNodeAsSub<T>(nodeAsSub: Node | undefined, fn: () => T): T;\n /**\n * 以无当前正在进行依赖收集的节点的状态执行指定函数。\n */\n withoutActiveNodeAsSub<T>(fn: () => T): T;\n /**\n * 断言当前没有正在进行依赖收集的节点。\n */\n assertWithoutActiveNodeAsSub(): void;\n /**\n * 开始对节点(作为下游节点)进行依赖收集。\n */\n startTracking(node: Node): void;\n /**\n * 结束对节点(作为下游节点)进行依赖收集。\n */\n endTracking(node: Node): void;\n /**\n * 对节点(作为下游节点)进行依赖收集。\n */\n withTracking<T>(node: Node, fn: () => T): T;\n /**\n * 以无当前正在进行依赖收集的节点的状态执行指定函数。\n */\n withoutTracking<T>(fn: () => T): T;\n /**\n * 断言当前没有正在进行依赖收集的节点。\n */\n assertWithoutTracking(): void;\n /**\n * 为两个节点建立连接(依赖收集优化版)。\n */\n addLinkBetweenOptimizedForTracking(dep: Node, sub: Node): Link;\n /**\n * 将节点作为当前正在进行依赖收集的节点的上游节点。\n */\n track(node: Node): void;\n /**\n * 将节点作为当前正在进行依赖收集的节点的上游节点。\n */\n trackNearestMutableOrWatching(node: Node): void;\n\n /**\n * 当节点的值发生变化后,调用此方法更新直接下游节点的标记。\n */\n shallowPropagate(node: Node): void;\n /**\n * 当节点的值发生变化后,调用此方法更新所有下游节点的标记。\n */\n deeeeepPropagate(node: Node): void;\n /**\n * 解决节点的 Pending 标记。\n */\n resolvePending(node: Node): void;\n}\nexport const createReactiveSystem = (options: CreateReactiveSystemOptions): ReactiveSystem => {\n const {\n onDepChanged,\n onSubChanged,\n onHasDep,\n onNoDep,\n onHasSub,\n onNoSub,\n update,\n notify\n } = options;\n\n /**\n * 获取目标节点的所有上游连接。\n *\n * 依赖收集过程中会尝试复用现存连接,该机制会导致在未完全完成依赖收集前,连接链中可能出现\n * 未经验证的连接。此方法只会返回经过验证的连接。\n */\n const getDepLinksOfNode = (node: Node): Link[] => {\n const depLinks: Link[] = [];\n let currentDepLink = node.headDepLink;\n const tailDepLink = node.tailDepLink;\n while (currentDepLink !== undefined) {\n depLinks.push(currentDepLink);\n const isValidLastDepLink = currentDepLink === tailDepLink;\n if (isValidLastDepLink === true) {\n break;\n } else {\n currentDepLink = currentDepLink.nextDepLink;\n }\n }\n return depLinks;\n }\n\n /**\n * 获取目标节点的所有下游连接。\n *\n * 依赖收集过程中会尝试复用现存连接,该机制会导致在未完全完成依赖收集前,连接链中可能出现\n * 未经验证的连接。此方法只会返回经过验证的连接。\n */\n const getSubLinksOfNode = (node: Node): Link[] => {\n const subLinks: Link[] = [];\n let currentSubLink = node.headSubLink;\n const tailSubLink = node.tailSubLink;\n while (currentSubLink !== undefined) {\n subLinks.push(currentSubLink);\n const isValidLastSubLink = currentSubLink === tailSubLink;\n if (isValidLastSubLink === true) {\n break;\n } else {\n currentSubLink = currentSubLink.nextSubLink;\n }\n }\n return subLinks;\n }\n\n const getDepsOfNode = (node: Node): Node[] => {\n const depLinks = getDepLinksOfNode(node);\n const deps = depLinks.map(link => link.dep);\n return deps;\n }\n\n const getSubsOfNode = (node: Node): Node[] => {\n const subLinks = getSubLinksOfNode(node);\n const subs = subLinks.map(link => link.sub);\n return subs;\n }\n\n const isDepLinkOfNode = (link: Link, node: Node): boolean => {\n let currentDepLink = node.headDepLink;\n const tailDepLink = node.tailDepLink;\n while (currentDepLink !== undefined) {\n if (currentDepLink === link) {\n return true;\n }\n const isValidLastDepLink = currentDepLink === tailDepLink;\n if (isValidLastDepLink === true) {\n break;\n } else {\n currentDepLink = currentDepLink.nextDepLink;\n }\n }\n return false;\n }\n\n const isSubLinkOfNode = (link: Link, node: Node): boolean => {\n let currentSubLink = node.headSubLink;\n const tailSubLink = node.tailSubLink;\n while (currentSubLink !== undefined) {\n if (currentSubLink === link) {\n return true;\n }\n const isValidLastSubLink = currentSubLink === tailSubLink;\n if (isValidLastSubLink === true) {\n break;\n } else {\n currentSubLink = currentSubLink.nextSubLink;\n }\n }\n return false;\n }\n\n const isDepOfNode = (node: Node, targetNode: Node): boolean => {\n let currentDepLink = targetNode.headDepLink;\n const tailDepLink = targetNode.tailDepLink;\n while (currentDepLink !== undefined) {\n if (currentDepLink.dep === node) {\n return true;\n }\n const isValidLastDepLink = currentDepLink === tailDepLink;\n if (isValidLastDepLink === true) {\n break;\n } else {\n currentDepLink = currentDepLink.nextDepLink;\n }\n }\n return false;\n }\n\n const isSubOfNode = (node: Node, targetNode: Node): boolean => {\n let currentSubLink = targetNode.headSubLink;\n const tailSubLink = targetNode.tailSubLink;\n while (currentSubLink !== undefined) {\n if (currentSubLink.sub === node) {\n return true;\n }\n const isValidLastSubLink = currentSubLink === tailSubLink;\n if (isValidLastSubLink === true) {\n break;\n } else {\n currentSubLink = currentSubLink.nextSubLink;\n }\n }\n return false;\n }\n\n const getLinkBetweenFromDep = (dep: Node, sub: Node): Link | undefined => {\n let currentSubLink = dep.headSubLink;\n const tailSubLink = dep.tailSubLink;\n while (currentSubLink !== undefined) {\n if (currentSubLink.sub === sub) {\n return currentSubLink;\n }\n const isValidLastSubLink = currentSubLink === tailSubLink;\n if (isValidLastSubLink === true) {\n break;\n } else {\n currentSubLink = currentSubLink.nextSubLink;\n }\n }\n return undefined;\n }\n\n const getLinkBetweenFromSub = (dep: Node, sub: Node): Link | undefined => {\n let currentDepLink = sub.headDepLink;\n const tailDepLink = sub.tailDepLink;\n while (currentDepLink !== undefined) {\n if (currentDepLink.dep === dep) {\n return currentDepLink;\n }\n const isValidLastDepLink = currentDepLink === tailDepLink;\n if (isValidLastDepLink === true) {\n break;\n } else {\n currentDepLink = currentDepLink.nextDepLink;\n }\n }\n return undefined;\n }\n\n const hasLinkBetweenFromDep = (dep: Node, sub: Node): boolean => {\n const link = getLinkBetweenFromDep(dep, sub);\n return link !== undefined;\n }\n\n const hasLinkBetweenFromSub = (dep: Node, sub: Node): boolean => {\n const link = getLinkBetweenFromSub(dep, sub);\n return link !== undefined;\n }\n\n const addLinkBetween = (dep: Node, sub: Node): Link => {\n /**\n * 检查是否存在重复连接。\n */\n const existLink = getLinkBetweenFromSub(dep, sub);\n if (existLink !== undefined) {\n return existLink;\n }\n\n /**\n * 建立新连接。\n */\n const newLink: Link = {\n dep,\n prevSubLink: undefined,\n nextSubLink: undefined,\n\n sub,\n prevDepLink: undefined,\n nextDepLink: undefined,\n };\n\n const tailDepLinkOfSub = sub.tailDepLink;\n if (tailDepLinkOfSub !== undefined) {\n tailDepLinkOfSub.nextDepLink = newLink;\n newLink.prevDepLink = tailDepLinkOfSub;\n } else {\n sub.headDepLink = newLink;\n }\n sub.tailDepLink = newLink;\n\n const tailSubLinkOfDep = dep.tailSubLink;\n if (tailSubLinkOfDep !== undefined) {\n tailSubLinkOfDep.nextSubLink = newLink;\n newLink.prevSubLink = tailSubLinkOfDep;\n } else {\n dep.headSubLink = newLink;\n }\n dep.tailSubLink = newLink;\n\n /**\n * 连接全部更新完成之后,触发回调,优先通知上游节点。\n */\n onSubChanged?.(dep);\n const isFirstSub = tailSubLinkOfDep === undefined;\n if (isFirstSub === true) {\n onHasSub?.(dep, sub);\n }\n onDepChanged?.(sub);\n const isFirstDep = tailDepLinkOfSub === undefined;\n if (isFirstDep === true) {\n onHasDep?.(sub, dep);\n }\n\n return newLink;\n }\n\n const removeLinkBetweenFromDep = (dep: Node, sub: Node): void => {\n const linkFromDep = getLinkBetweenFromDep(dep, sub);\n if (linkFromDep !== undefined) {\n removeLink(linkFromDep);\n }\n }\n\n const removeLinkBetweenFromSub = (dep: Node, sub: Node): void => {\n const linkFromSub = getLinkBetweenFromSub(dep, sub);\n if (linkFromSub !== undefined) {\n removeLink(linkFromSub);\n }\n }\n\n const removeLink = (link: Link): void => {\n const prevDepLink = link.prevDepLink;\n const dep = link.dep;\n const nextDepLink = link.nextDepLink;\n const prevSubLink = link.prevSubLink;\n const sub = link.sub;\n const nextSubLink = link.nextSubLink;\n\n /**\n * 处理上游连接链。\n */\n\n if (nextDepLink !== undefined) {\n // 如果当前连接的下一个连接存在,则将当前连接的下一个连接的上一个连接指向当前连接的上一个连接\n nextDepLink.prevDepLink = prevDepLink;\n } else {\n // 如果当前连接的下一个连接不存在,则将当前连接的上一个连接作为最后一个连接\n sub.tailDepLink = prevDepLink;\n }\n if (prevDepLink !== undefined) {\n // 如果当前连接的上一个连接存在,则将当前连接的上一个连接的下一个连接指向当前连接的下一个连接\n prevDepLink.nextDepLink = nextDepLink;\n } else {\n // 如果当前连接的上一个连接不存在,则将当前连接的下一个连接作为第一个连接\n sub.headDepLink = nextDepLink;\n }\n\n /**\n * 处理下游连接链。\n */\n\n if (nextSubLink !== undefined) {\n // 如果当前连接的下一个连接存在,则将当前连接的下一个连接的上一个连接指向当前连接的上一个连接\n nextSubLink.prevSubLink = prevSubLink;\n } else {\n // 如果当前连接的下一个连接不存在,则将当前连接的上一个连接作为最后一个连接\n dep.tailSubLink = prevSubLink;\n }\n if (prevSubLink !== undefined) {\n // 如果当前连接的上一个连接存在,则将当前连接的上一个连接的下一个连接指向当前连接的下一个连接\n prevSubLink.nextSubLink = nextSubLink;\n } else {\n // 如果当前连接的上一个连接不存在,则将当前连接的下一个连接作为第一个连接\n dep.headSubLink = nextSubLink;\n }\n\n /**\n * 连接全部更新完成之后,触发回调,优先通知上游节点。\n */\n onSubChanged?.(dep);\n if (dep.headSubLink === undefined && dep.tailSubLink === undefined) {\n onNoSub?.(dep, sub);\n }\n onDepChanged?.(sub);\n if (sub.headDepLink === undefined && sub.tailDepLink === undefined) {\n onNoDep?.(sub, dep);\n }\n\n /**\n * 彻底断引用,防止内存泄漏。\n */\n link.prevDepLink = undefined;\n // oxlint-disable-next-line no-unsafe-type-assertion\n link.dep = undefined as unknown as Node; // type cast\n link.nextDepLink = undefined;\n link.prevSubLink = undefined;\n // oxlint-disable-next-line no-unsafe-type-assertion\n link.sub = undefined as unknown as Node; // type cast\n link.nextSubLink = undefined;\n }\n\n const removeAllDepLinksOfNode = (node: Node): Node[] => {\n const depNodes = [];\n let currentDepLink = node.headDepLink;\n while (currentDepLink !== undefined) {\n depNodes.push(currentDepLink.dep);\n const nextDepLink = currentDepLink.nextDepLink;\n removeLink(currentDepLink);\n currentDepLink = nextDepLink;\n }\n return depNodes;\n }\n\n const removeAllSubLinksOfNode = (node: Node): Node[] => {\n const subNodes = [];\n let currentSubLink = node.headSubLink;\n while (currentSubLink !== undefined) {\n subNodes.push(currentSubLink.sub);\n const nextSubLink = currentSubLink.nextSubLink;\n removeLink(currentSubLink);\n currentSubLink = nextSubLink;\n }\n return subNodes;\n }\n\n const prevActiveNodeAsSubStack: Array<Node | undefined> = [];\n let activeNodeAsSub: Node | undefined = undefined;\n const getActiveNodeAsSub = (): Node | undefined => {\n return activeNodeAsSub;\n }\n const setActiveNodeAsSub = (nodeAsSub: Node | undefined): Node | undefined => {\n prevActiveNodeAsSubStack.push(activeNodeAsSub);\n activeNodeAsSub = nodeAsSub;\n return activeNodeAsSub;\n }\n const setNoActiveNodeAsSub = (): undefined => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return setActiveNodeAsSub(undefined) as undefined;\n }\n const resetActiveNodeAsSub = (): Node | undefined => {\n activeNodeAsSub = prevActiveNodeAsSubStack.pop();\n return activeNodeAsSub;\n }\n const withActiveNodeAsSub = <T>(nodeAsSub: Node | undefined, fn: () => T): T => {\n setActiveNodeAsSub(nodeAsSub);\n try {\n return fn();\n } finally {\n resetActiveNodeAsSub();\n }\n }\n const withoutActiveNodeAsSub = <T>(fn: () => T): T => {\n return withActiveNodeAsSub(undefined, fn);\n }\n const assertWithoutActiveNodeAsSub = (): void => {\n const currentActiveNodeAsSub = getActiveNodeAsSub();\n if (currentActiveNodeAsSub !== undefined) {\n throw new Error(`Expected no active node as sub, but got one.`);\n }\n }\n\n const startTracking = (nodeAsSub: Node): void => {\n setActiveNodeAsSub(nodeAsSub);\n\n const flags = nodeAsSub.flags;\n flags.unsetPending().unsetDirty().setTracking();\n }\n const endTracking = (nodeAsSub: Node): void => {\n const flags = nodeAsSub.flags;\n if (flags.hasTrackingReusing() === true) {\n const firstRedundantDepLink = nodeAsSub.tailDepLink?.nextDepLink;\n if (firstRedundantDepLink !== undefined) {\n let toRemove: Link | undefined = firstRedundantDepLink;\n while (toRemove !== undefined) {\n const nextToRemove: Link | undefined = toRemove.nextDepLink;\n removeLink(toRemove);\n toRemove = nextToRemove;\n }\n }\n }\n flags.unsetTrackingReusing().unsetTracking();\n\n resetActiveNodeAsSub();\n }\n const withTracking = <T>(node: Node, fn: () => T): T => {\n startTracking(node);\n try {\n return fn();\n } finally {\n endTracking(node);\n }\n }\n const withoutTracking = <T>(fn: () => T): T => {\n return withoutActiveNodeAsSub(() => {\n return fn();\n });\n }\n const assertWithoutTracking = (): void => {\n try {\n assertWithoutActiveNodeAsSub();\n } catch {\n throw new Error(`Expected no active node as sub for tracking, but got one.`);\n }\n }\n /**\n * 依赖收集的目标是:在完成一次依赖收集之后,对于所有在依赖收集执行过程中被访问过的节点(上游节点),\n * 都与进行依赖收集的节点(下游节点)建立且仅建立一个连接。\n */\n const addLinkBetweenOptimizedForTracking = (dep: Node, sub: Node): Link => {\n let existingDepLinkToCompare: Link | undefined;\n\n const subFlags = sub.flags;\n if (subFlags.hasTracking() === true && subFlags.hasTrackingReusing() === false) {\n subFlags.setTrackingReusing();\n sub.tailDepLink = sub.headDepLink;\n existingDepLinkToCompare = sub.tailDepLink;\n } else {\n existingDepLinkToCompare = sub.tailDepLink?.nextDepLink;\n }\n\n /**\n * 检查是否可以复用现存连接。\n */\n\n if (existingDepLinkToCompare !== undefined && existingDepLinkToCompare.dep === dep) {\n // 如果可以,则复用该连接\n sub.tailDepLink = existingDepLinkToCompare;\n // 触发回调\n onDepChanged?.(sub);\n return existingDepLinkToCompare;\n } else {\n // 否则,建立新连接\n const newLink = addLinkBetween(dep, sub);\n return newLink;\n }\n }\n const track = (node: Node): void => {\n const targetSub = getActiveNodeAsSub();\n if (targetSub !== undefined) {\n addLinkBetweenOptimizedForTracking(node, targetSub);\n }\n }\n const trackNearestMutableOrWatching = (node: Node): void => {\n let targetSub = getActiveNodeAsSub();\n while (targetSub !== undefined) {\n const flags = targetSub.flags;\n if (flags.hasMutable() === true || flags.hasWatching() === true) {\n addLinkBetweenOptimizedForTracking(node, targetSub);\n break;\n }\n targetSub = targetSub.headSubLink?.sub;\n }\n }\n\n const shallowPropagate = (node: Node): void => {\n // 从头到尾遍历目标节点下游连接链中的所有下游节点,更新其标记。\n\n let currentSubLink: Link | undefined = node.headSubLink;\n while (currentSubLink !== undefined) {\n const sub = currentSubLink.sub;\n const flags = sub.flags;\n let isChangeToDirty = false;\n\n if (flags.hasPending() === true && flags.hasDirty() === false) {\n // 如果包含 Pending 标记,且不包含 Dirty 标记,为其添加 Dirty 标记,移除 Pending 标记\n flags.setDirty().unsetPending();\n isChangeToDirty = true;\n } else {\n // 如果是其它情况,则处理下一个连接\n currentSubLink = currentSubLink.nextSubLink;\n continue;\n }\n\n if (isChangeToDirty === true) {\n // 如果检查过程中被标记为 Dirty,则酌情触发 notify 回调\n const shouldNotify = flags.hasWatching() === true && flags.hasTracking() === false;\n if (shouldNotify === true) {\n notify(sub);\n }\n }\n\n // 当前连接处理完成,处理下一个连接\n currentSubLink = currentSubLink.nextSubLink;\n }\n }\n\n interface InternalStack<T> {\n value: T;\n prev: InternalStack<T> | undefined;\n }\n\n const deeeeepPropagate = (node: Node): void => {\n let currentSubLink = node.headSubLink;\n let nextSubLink = currentSubLink?.nextSubLink;\n let unhandledSubLinkStack: InternalStack<Link | undefined> | undefined = undefined;\n\n while (currentSubLink !== undefined) {\n const sub = currentSubLink.sub;\n\n let flags = sub.flags;\n let shouldNotify = flags.hasWatching();\n let shouldDownward = flags.hasMutable();\n\n if (flags.hasTracking() === false && flags.hasDirty() === false && flags.hasPending() === false) {\n /**\n * 进入此分支的 flags:\n * 1. 不包含 Tracking 标记。\n * 2. 不包含 Dirty 标记或 Pending 标记。\n *\n * 说明:上游节点的变更首次传递到该节点。\n *\n * 此时,添加 Pending 标记,根据其它标记决定是否需要 Notify,根据其它标记决定是否需要 Downward。\n */\n flags.setPending();\n shouldNotify = shouldNotify;\n shouldDownward = shouldDownward;\n } else if (flags.hasTracking() === false) {\n /**\n * 进入此分支的 flags:\n * 1. 不包含 Tracking 标记。\n * 2. 包含 Dirty 标记或 Pending 标记。\n *\n * 说明:上游节点的变更已经传递到该节点。\n *\n * 此时,什么都不做,不需要修改标记,不需要 Notify,不需要 Downward。\n */\n flags = flags;\n shouldNotify = false;\n shouldDownward = false;\n } else if (flags.hasDirty() === false && flags.hasPending() === false) {\n /**\n * 进入此分支的 flags:\n * 1. 包含 Tracking 标记。\n * 2. 不包含 Dirty 标记或 Pending 标记。\n *\n * 说明:上游节点的变更首次传递到该节点,且该节点正在进行依赖收集。\n *\n * 此时,添加 Pending 标记,不需要 Notify,根据其它标记决定是否需要 Downward。\n */\n flags.setPending();\n shouldNotify = false;\n shouldDownward = shouldDownward;\n } else {\n /**\n * 进入此分支的 flags:\n * 1. 包含 Tracking 标记。\n * 2. 包含 Dirty 标记或 Pending 标记。\n *\n * 说明:上游节点的变更已经传递到该节点,且该节点正在进行依赖收集。\n *\n * 此时,不需要修改标记,不需要 Notify,不需要 Downward。\n */\n flags = flags;\n shouldNotify = false;\n shouldDownward = false;\n }\n\n if (shouldNotify === true) {\n notify(sub);\n }\n\n if (shouldDownward === true) {\n const headSubLinkOfSub = sub.headSubLink;\n if (headSubLinkOfSub !== undefined) {\n currentSubLink = headSubLinkOfSub;\n const nextSubLinkOfSub = headSubLinkOfSub.nextSubLink;\n if (nextSubLinkOfSub !== undefined) {\n unhandledSubLinkStack = { value: nextSubLink, prev: unhandledSubLinkStack };\n nextSubLink = nextSubLinkOfSub;\n }\n continue;\n }\n }\n\n currentSubLink = nextSubLink\n if (currentSubLink !== undefined) {\n nextSubLink = currentSubLink.nextSubLink;\n continue;\n }\n\n if (unhandledSubLinkStack !== undefined) {\n currentSubLink = unhandledSubLinkStack.value;\n unhandledSubLinkStack = unhandledSubLinkStack.prev;\n if (currentSubLink !== undefined) {\n nextSubLink = currentSubLink.nextSubLink;\n }\n }\n }\n }\n\n const resolvePending = (node: Node): void => {\n let currentDepLink = node.headDepLink;\n let unhandledDepLinkStack: InternalStack<Link> | undefined = undefined;\n\n while (currentDepLink !== undefined) {\n const currentSub: Node = currentDepLink.sub;\n const currentDep: Node = currentDepLink.dep;\n const subFlags = currentSub.flags;\n const depFlags = currentDep.flags;\n\n if (depFlags.hasMutable() === true && depFlags.hasDirty() === true) {\n /**\n * 当前下游节点不包含 Dirty 标记,当前上游节点包含 Dirty 标记。\n *\n * 更新当前上游节点,若值有变化,则将状态向直接下游节点传播。\n */\n const valueChanged = update(currentDep);\n if (valueChanged === true) {\n shallowPropagate(currentDep);\n }\n } else if (depFlags.hasMutable() === true && depFlags.hasPending() === true) {\n /**\n * 当前下游节点不包含 Dirty 标记,当前上游节点包含 Pending 标记。\n *\n * 继续检查当前上游节点的上游节点。\n */\n unhandledDepLinkStack = { value: currentDepLink, prev: unhandledDepLinkStack };\n currentDepLink = currentDep.headDepLink;\n continue;\n }\n\n if (subFlags.hasPending() === true) {\n const nextDepLink = currentDepLink.nextDepLink;\n if (nextDepLink !== undefined) {\n currentDepLink = nextDepLink;\n continue;\n }\n }\n\n if (unhandledDepLinkStack !== undefined) {\n currentDepLink = unhandledDepLinkStack.value;\n unhandledDepLinkStack = unhandledDepLinkStack.prev;\n\n /**\n * 当一个连接先被存起来,后续又被取出来处理时,说明其所有上游节点都已经处理完成,\n * 因此可以将其 Pending 标记移除。\n */\n currentDepLink.dep.flags.unsetPending();\n } else {\n /**\n * 所有连接都处理完成,可以安全移除当前连接的下游节点的 Pending 标记。\n */\n currentDepLink.sub.flags.unsetPending();\n break;\n }\n }\n }\n\n return {\n getDepLinksOfNode,\n getSubLinksOfNode,\n getDepsOfNode,\n getSubsOfNode,\n isDepLinkOfNode,\n isSubLinkOfNode,\n isDepOfNode,\n isSubOfNode,\n getLinkBetweenFromDep,\n getLinkBetweenFromSub,\n hasLinkBetweenFromDep,\n hasLinkBetweenFromSub,\n addLinkBetween,\n removeLinkBetweenFromDep,\n removeLinkBetweenFromSub,\n removeLink,\n removeAllDepLinksOfNode,\n removeAllSubLinksOfNode,\n\n getActiveNodeAsSub,\n setActiveNodeAsSub,\n setNoActiveNodeAsSub,\n resetActiveNodeAsSub,\n withActiveNodeAsSub,\n withoutActiveNodeAsSub,\n assertWithoutActiveNodeAsSub,\n startTracking,\n endTracking,\n withTracking,\n withoutTracking,\n assertWithoutTracking,\n addLinkBetweenOptimizedForTracking,\n track,\n trackNearestMutableOrWatching,\n\n shallowPropagate,\n deeeeepPropagate,\n resolvePending,\n };\n}\n",
|
|
150
|
-
"import type { Flags } from \"./flags.ts\"\nimport { createReactiveSystem } from \"./reactive-system.ts\"\nimport { flags } from \"./flags.ts\"\nimport type { Link, Node, ReactiveSystem } from \"./reactive-system.ts\"\n\nexport interface BaseReactorOptions {\n name?: string | undefined;\n\n onDepChanged?: (() => void) | undefined;\n onSubChanged?: (() => void) | undefined;\n onHasDep?: ((dep: BaseReactor) => void) | undefined;\n onNoDep?: ((dep: BaseReactor) => void) | undefined;\n onHasSub?: ((sub: BaseReactor) => void) | undefined;\n onNoSub?: ((sub: BaseReactor) => void) | undefined;\n\n onDispose?: (() => void) | undefined;\n}\nexport abstract class BaseReactor<V = unknown> implements Node {\n headDepLink?: Link | undefined;\n tailDepLink?: Link | undefined;\n headSubLink?: Link | undefined\n tailSubLink?: Link | undefined\n flags: Flags;\n\n protected value: V;\n\n protected _name: string | undefined;\n\n protected _onDepChanged?: (() => void) | undefined;\n protected _onSubChanged?: (() => void) | undefined;\n protected _onHasDep?: ((dep: BaseReactor) => void) | undefined;\n protected _onNoDep?: ((dep: BaseReactor) => void) | undefined;\n protected _onHasSub?: ((sub: BaseReactor) => void) | undefined;\n protected _onNoSub?: ((sub: BaseReactor) => void) | undefined;\n\n protected _onDispose?: (() => void) | undefined;\n\n constructor(options: BaseReactorOptions) {\n this.flags = flags();\n\n // undefined 可能是使用者期待的合法值,因此这里使用 VOID 占位\n // oxlint-disable-next-line no-unsafe-type-assertion\n this.value = VOID as V;\n\n this._name = options.name;\n\n this._onDepChanged = options.onDepChanged;\n this._onSubChanged = options.onSubChanged;\n this._onHasDep = options.onHasDep;\n this._onNoDep = options.onNoDep;\n this._onHasSub = options.onHasSub;\n this._onNoSub = options.onNoSub;\n\n this._onDispose = options.onDispose;\n }\n\n getName(): string | undefined {\n return this._name;\n }\n\n setName(name: string | undefined): void {\n this._name = name;\n }\n\n abstract trackThis(): void;\n\n /**\n * Reactor 在运行过程中状态可能会发生变化,此方法用于将状态重置。比如:\n * 在错误发生时调用。\n */\n abstract reset(): void;\n\n /**\n * 删除当前 Reactor 与其它 Reactor 之间的所有连接,将状态重置,删除有必要删除的资源,\n * 目标是使当前 Reactor 可以被安全地丢弃而不会引起内存泄漏。\n */\n abstract dispose(): void;\n\n triggerOnDepChanged(): void {\n this._onDepChanged?.();\n };\n\n triggerOnSubChanged(): void {\n this._onSubChanged?.();\n };\n\n triggerOnHasDep(dep: BaseReactor): void {\n this._onHasDep?.(dep);\n };\n\n triggerOnNoDep(dep: BaseReactor): void {\n this._onNoDep?.(dep);\n };\n\n triggerOnHasSub(sub: BaseReactor): void {\n this._onHasSub?.(sub);\n };\n\n triggerOnNoSub(sub: BaseReactor): void {\n this._onNoSub?.(sub);\n this.dispose();\n };\n\n triggerOnDispose(): void {\n this._onDispose?.();\n }\n}\n\nconst VOID = Symbol(\"void\") as unknown;\nconst isVoid = (value: unknown): boolean => {\n return value === VOID;\n}\n\nlet queue: Effect[] = [];\nconst flush = (): void => {\n const tempFlushQueue = queue;\n queue = [];\n try {\n while (tempFlushQueue.length !== 0) {\n const effect = tempFlushQueue.shift()!;\n effect.run();\n }\n } catch {\n while (tempFlushQueue.length !== 0) {\n const effect = tempFlushQueue.shift()!;\n effect.reset();\n }\n }\n}\n\nlet batchDepth = 0;\nexport const flushBatch = (): void => {\n if (batchDepth === 0) {\n flush();\n }\n}\nexport const startBatch = (): void => {\n batchDepth = batchDepth + 1;\n}\nexport const endBatch = (): void => {\n batchDepth = batchDepth - 1;\n if (batchDepth < 0) {\n throw new Error(\"endBatch called without matching startBatch\");\n }\n flushBatch();\n}\nexport const batch = (fn: () => void): void => {\n startBatch();\n try {\n fn();\n } finally {\n endBatch();\n }\n}\n\nexport const reactiveSystem: ReactiveSystem = createReactiveSystem({\n onDepChanged: (sub: Node) => {\n if (sub instanceof BaseReactor) {\n return sub.triggerOnDepChanged();\n }\n },\n onSubChanged: (dep: Node) => {\n if (dep instanceof BaseReactor) {\n return dep.triggerOnSubChanged();\n }\n },\n onHasDep: (sub: Node, dep: Node) => {\n if (sub instanceof BaseReactor && dep instanceof BaseReactor) {\n return sub.triggerOnHasDep(dep);\n }\n },\n onNoDep: (sub: Node, dep: Node) => {\n if (sub instanceof BaseReactor && dep instanceof BaseReactor) {\n return sub.triggerOnNoDep(dep);\n }\n },\n onHasSub: (dep: Node, sub: Node) => {\n if (dep instanceof BaseReactor && sub instanceof BaseReactor) {\n return dep.triggerOnHasSub(sub);\n }\n },\n onNoSub: (dep: Node, sub: Node) => {\n if (dep instanceof BaseReactor && sub instanceof BaseReactor) {\n return dep.triggerOnNoSub(sub);\n }\n },\n\n update(node: Signal | Derived | Computed) {\n return node.update();\n },\n notify(node: Effect) {\n const nodes = []\n let currentNode: Effect | undefined = node\n while (currentNode !== undefined) {\n if (currentNode.flags.hasWatching() === false) {\n break\n }\n currentNode.notify();\n nodes.push(currentNode);\n const nextNode: Node | undefined = currentNode?.headSubLink?.sub\n currentNode = nextNode instanceof Effect ? nextNode : undefined\n }\n queue.push(...nodes.toReversed());\n },\n});\nconst {\n removeAllDepLinksOfNode,\n removeAllSubLinksOfNode,\n\n withTracking,\n track,\n trackNearestMutableOrWatching,\n\n shallowPropagate,\n deeeeepPropagate,\n resolvePending,\n} = reactiveSystem\n\nconst defaultIsEqual = <V>(oldValue: V, newValue: V): boolean => {\n return Object.is(oldValue, newValue);\n}\n\nexport interface BaseSignalValueGetterContext { }\nexport interface InitializingSignalValueGetterContext extends BaseSignalValueGetterContext {\n isInitializingRun: true;\n}\nexport interface UpdatingSignalValueGetterContext<V> extends BaseSignalValueGetterContext {\n isInitializingRun: false;\n previousValue: V;\n}\nexport type SignalValueGetterContext<V> =\n | InitializingSignalValueGetterContext\n | UpdatingSignalValueGetterContext<V>;\nexport type SignalValueInitializer<V> = (context: InitializingSignalValueGetterContext) => V;\nexport type SignalValueUpdater<V> = (context: UpdatingSignalValueGetterContext<V>) => V;\nexport type SignalValueGetter<V> = (context: SignalValueGetterContext<V>) => V;\nexport interface SignalOptions<V> extends BaseReactorOptions {\n isEqual?: ((oldValue: V, newValue: V) => boolean) | undefined;\n}\n/**\n * Signal 的值只有在被获取的时候才会更新。\n */\nexport class Signal<V = unknown> extends BaseReactor<V> {\n private readonly isEqual: (oldValue: V, newValue: V) => boolean;\n\n private valueGetter: SignalValueGetter<V>;\n\n constructor(valueInitializer: SignalValueInitializer<V>, options: SignalOptions<V>) {\n super(options);\n this.headSubLink = undefined;\n this.tailSubLink = undefined;\n this.flags = this.getInitialFlags();\n\n this.isEqual = options.isEqual ?? defaultIsEqual;\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n this.valueGetter = valueInitializer as SignalValueGetter<V>;\n }\n\n private getInitialFlags(): Flags {\n // 值在创建时尚未计算,因此初始时添加 Dirty 标记\n return flags().setMutable().setDirty();\n }\n\n trackThis(): void {\n trackNearestMutableOrWatching(this);\n }\n\n reset(): void {\n this.flags = this.getInitialFlags();\n }\n\n dispose(): void {\n removeAllDepLinksOfNode(this);\n removeAllSubLinksOfNode(this);\n this.reset();\n this.triggerOnDispose();\n }\n\n private internalGet(options: { shouldTrack: boolean }): V {\n const { shouldTrack } = options;\n if (shouldTrack === true) {\n this.trackThis();\n }\n\n let valueChanged = false\n\n // 如果包含 Dirty 标记,则进行更新\n const shouldUpdate = this.flags.hasDirty();\n if (shouldUpdate === true) {\n valueChanged = this.update()\n }\n\n // 如果值变化,则通知下游(仅通知直接下游)\n if (valueChanged === true) {\n shallowPropagate(this);\n }\n\n return this.value;\n }\n\n get(): V {\n return this.internalGet({ shouldTrack: true });\n }\n\n getWithoutTrack(): V {\n return this.internalGet({ shouldTrack: false });\n }\n\n private internalSet(options: { valueUpdater: SignalValueUpdater<V> }): void {\n const { valueUpdater } = options;\n\n // 将新值暂存起来,等用到的时候再执行更新\n // oxlint-disable-next-line no-unsafe-type-assertion\n this.valueGetter = valueUpdater as SignalValueGetter<V>;\n // 为当前节点添加 Dirty 标记\n this.flags.setDirty();\n\n // 更新所有下游节点的标记\n deeeeepPropagate(this);\n\n // 执行更新队列\n flushBatch();\n }\n\n set(value: V): void {\n return this.internalSet({ valueUpdater: () => value });\n }\n\n setWithoutCalculate(valueUpdater: SignalValueUpdater<V>): void {\n return this.internalSet({ valueUpdater });\n }\n\n /**\n * 返回值表示更新前后值是否变化。\n */\n update(): boolean {\n this.flags.unsetDirty();\n\n const isInitializingRun = isVoid(this.value) === true;\n\n if (isInitializingRun === true) {\n const newValue = this.valueGetter({ isInitializingRun: true });\n this.value = newValue;\n\n return true;\n } else {\n const oldValue = this.value;\n const newValue = this.valueGetter({ isInitializingRun: false, previousValue: oldValue });\n this.value = newValue;\n\n const valueChanged = this.isEqual(oldValue, newValue) === false\n return valueChanged;\n }\n }\n}\n\nexport interface BaseDerivedValueGetterContext { }\nexport interface InitializingSignalValueGetterContext extends BaseDerivedValueGetterContext {\n isInitializingRun: true;\n}\nexport interface UpdatingDerivedValueGetterContext<V> extends BaseDerivedValueGetterContext {\n isInitializingRun: false;\n previousValue: V;\n}\nexport type DerivedValueGetterContext<V> =\n | InitializingSignalValueGetterContext\n | UpdatingDerivedValueGetterContext<V>;\nexport type DerivedValueUpdater<V> = (context: UpdatingDerivedValueGetterContext<V>) => V;\nexport type DerivedValueGetter<V> = (context: DerivedValueGetterContext<V>) => V;\nexport interface DerivedOptions<V> extends BaseReactorOptions {\n isEqual?: ((oldValue: V, newValue: V) => boolean) | undefined;\n}\n/**\n * Derived 的值只有在被获取的时候才会更新。\n * Derived 的值只有在上游节点的值发生变化时才会更新。\n * Derived 的下游节点全部解除连接时会自动与所有上游节点解除连接,并回到初始状态。\n */\nexport class Derived<V = unknown> extends BaseReactor<V> {\n private readonly isEqual: (oldValue: V, newValue: V) => boolean;\n\n private readonly valueGetter: DerivedValueGetter<V>;\n private manualValueGetter: DerivedValueGetter<V> | undefined;\n\n constructor(valueGetter: DerivedValueGetter<V>, options: DerivedOptions<V>) {\n super(options);\n this.headDepLink = undefined;\n this.tailDepLink = undefined;\n this.headSubLink = undefined;\n this.tailSubLink = undefined;\n this.flags = this.getInitialFlags();\n\n this.isEqual = options.isEqual ?? defaultIsEqual;\n\n this.valueGetter = valueGetter;\n this.manualValueGetter = undefined;\n }\n\n private getInitialFlags(): Flags {\n // 值在创建时尚未计算,因此初始时添加 Dirty 标记\n return flags().setMutable().setDirty();\n }\n\n trackThis(): void {\n trackNearestMutableOrWatching(this);\n }\n\n reset(): void {\n this.flags = this.getInitialFlags();\n }\n\n dispose(): void {\n removeAllDepLinksOfNode(this);\n removeAllSubLinksOfNode(this);\n this.reset();\n this.triggerOnDispose();\n }\n\n private internalGet(options: { shouldTrack: boolean }): V {\n const { shouldTrack } = options;\n if (shouldTrack === true) {\n this.trackThis();\n }\n\n let valueChanged = false;\n\n // 如果包含 Pending 标记,则进行解决\n const shouldResolve = this.flags.hasPending();\n if (shouldResolve === true) {\n resolvePending(this);\n }\n\n // 如果包含 Dirty 标记,则进行更新\n const shouldUpdate = this.flags.hasDirty();\n if (shouldUpdate === true) {\n valueChanged = this.update()\n }\n\n // 如果值变化,则通知下游(仅通知直接下游)\n if (valueChanged === true) {\n shallowPropagate(this);\n }\n\n return this.value;\n }\n\n get(): V {\n return this.internalGet({ shouldTrack: true });\n }\n\n getWithoutTrack(): V {\n return this.internalGet({ shouldTrack: false });\n }\n\n private internalSet(options: { valueUpdater: DerivedValueUpdater<V> }): void {\n const { valueUpdater } = options;\n\n // 将新值暂存起来,等用到的时候再执行更新\n // oxlint-disable-next-line no-unsafe-type-assertion\n this.manualValueGetter = valueUpdater as DerivedValueGetter<V>;\n // 为当前节点添加 Dirty 标记\n this.flags.setDirty();\n\n // 更新所有下游节点的标记\n deeeeepPropagate(this);\n\n // 执行更新队列\n flushBatch();\n }\n\n set(value: V): void {\n return this.internalSet({ valueUpdater: () => value });\n }\n\n setWithoutCalculate(valueUpdater: DerivedValueUpdater<V>): void {\n return this.internalSet({ valueUpdater });\n }\n\n /**\n * 返回值表示更新前后值是否变化。\n */\n private manualUpdate(): boolean {\n const manualValueGetter = this.manualValueGetter;\n if (manualValueGetter === undefined) {\n throw new Error(\"Derived: manualValueGetter is undefined.\");\n }\n this.manualValueGetter = undefined;\n\n this.flags.unsetDirty();\n\n const isInitializingRun = isVoid(this.value) === true;\n\n if (isInitializingRun === true) {\n const newValue = manualValueGetter({ isInitializingRun: true });\n this.value = newValue;\n\n return true;\n } else {\n const oldValue = this.value;\n const newValue = manualValueGetter({ isInitializingRun: false, previousValue: oldValue });\n this.value = newValue;\n\n const valueChanged = this.isEqual(oldValue, newValue) === false\n return valueChanged;\n }\n }\n\n /**\n * 返回值表示更新前后值是否变化。\n */\n update(): boolean {\n if (this.manualValueGetter !== undefined) {\n return this.manualUpdate();\n }\n\n const result = withTracking(this, () => {\n this.flags.unsetDirty();\n\n const isInitializingRun = isVoid(this.value) === true;\n\n if (isInitializingRun === true) {\n const newValue = this.valueGetter({ isInitializingRun: true });\n this.value = newValue;\n\n return true;\n } else {\n const oldValue = this.value;\n const newValue = this.valueGetter({ isInitializingRun: false, previousValue: oldValue });\n this.value = newValue;\n\n const valueChanged = this.isEqual(oldValue, newValue) === false\n return valueChanged;\n }\n\n })\n return result;\n }\n}\n\nexport interface BaseComputedValueGetterContext { }\nexport interface InitializingComputedValueGetterContext extends BaseComputedValueGetterContext {\n isInitializingRun: true;\n}\nexport interface UpdatingComputedValueGetterContext<V> extends BaseComputedValueGetterContext {\n isInitializingRun: false;\n previousValue: V;\n}\nexport type ComputedValueGetterContext<V> =\n | InitializingComputedValueGetterContext\n | UpdatingComputedValueGetterContext<V>;\nexport type ComputedValueGetter<V> = (context: ComputedValueGetterContext<V>) => V;\nexport interface ComputedOptions<V> extends BaseReactorOptions {\n isEqual?: ((oldValue: V, newValue: V) => boolean) | undefined;\n}\n/**\n * Computed 的值只有在被获取的时候才会更新。\n * Computed 的值只有在上游节点的值发生变化时才会更新。\n * Computed 的下游节点全部解除连接时会自动与所有上游节点解除连接,并回到初始状态。\n */\nexport class Computed<V = unknown> extends BaseReactor<V> {\n private readonly isEqual: (oldValue: V, newValue: V) => boolean;\n\n private readonly valueGetter: ComputedValueGetter<V>;\n\n constructor(valueGetter: ComputedValueGetter<V>, options: ComputedOptions<V>) {\n super(options);\n this.headDepLink = undefined;\n this.tailDepLink = undefined;\n this.headSubLink = undefined;\n this.tailSubLink = undefined;\n this.flags = this.getInitialFlags();\n\n this.isEqual = options.isEqual ?? defaultIsEqual;\n\n this.valueGetter = valueGetter;\n }\n\n private getInitialFlags(): Flags {\n // 值在创建时尚未计算,因此初始时添加 Dirty 标记\n return flags().setMutable().setDirty();\n }\n\n trackThis(): void {\n trackNearestMutableOrWatching(this);\n }\n\n reset(): void {\n this.flags = this.getInitialFlags();\n }\n\n dispose(): void {\n removeAllDepLinksOfNode(this);\n removeAllSubLinksOfNode(this);\n this.reset();\n this.triggerOnDispose();\n }\n\n private internalGet(options: { shouldTrack: boolean }): V {\n const { shouldTrack } = options;\n if (shouldTrack === true) {\n this.trackThis();\n }\n\n let valueChanged = false;\n\n // 如果包含 Pending 标记,则进行解决\n const shouldResolve = this.flags.hasPending();\n if (shouldResolve === true) {\n resolvePending(this);\n }\n\n // 如果包含 Dirty 标记,则进行更新\n const shouldUpdate = this.flags.hasDirty();\n if (shouldUpdate === true) {\n valueChanged = this.update()\n }\n\n // 如果值变化,则通知下游(仅通知直接下游)\n if (valueChanged === true) {\n shallowPropagate(this);\n }\n\n return this.value;\n }\n\n get(): V {\n return this.internalGet({ shouldTrack: true });\n }\n\n getWithoutTrack(): V {\n return this.internalGet({ shouldTrack: false });\n }\n\n /**\n * 返回值表示更新前后值是否变化。\n */\n update(): boolean {\n const result = withTracking(this, () => {\n this.flags.unsetDirty();\n\n const isInitializingRun = isVoid(this.value) === true;\n\n if (isInitializingRun === true) {\n const newValue = this.valueGetter({ isInitializingRun: true });\n this.value = newValue;\n return true;\n } else {\n const oldValue = this.value;\n const newValue = this.valueGetter({ isInitializingRun: false, previousValue: oldValue });\n this.value = newValue;\n\n const valueChanged = this.isEqual(oldValue, newValue) === false\n return valueChanged;\n }\n\n })\n return result;\n }\n}\n\n\nexport type CleanupFn = () => void;\nexport interface BaseEffectValueGetterContext {\n setCleanup: (cleanup: CleanupFn) => void;\n}\nexport interface InitializingEffectValueGetterContext extends BaseEffectValueGetterContext {\n isInitializingRun: true;\n}\nexport interface UpdatingEffectValueGetterContext<V> extends BaseEffectValueGetterContext {\n isInitializingRun: false;\n previousValue: V;\n}\nexport type EffectValueGetterContext<V> =\n | InitializingEffectValueGetterContext\n | UpdatingEffectValueGetterContext<V>;\nexport type EffectValueGetter<V> = (context: EffectValueGetterContext<V>) => V;\nexport interface EffectOptions extends BaseReactorOptions {\n}\n/**\n * Effect 会在创建时立即执行一次传入的函数。\n * Effect 会在每次上游节点的值发生变化时重新执行传入的函数。\n * Effect 在任意时刻最多只能一个待运行。\n * Effect 可以与 Effect 建立连接。\n * 作为上游节点的 Effect 在没有下游节点时会自动与所有上游节点解除连接,并将标记清空。\n */\nexport class Effect<V = void> extends BaseReactor<V> {\n private readonly valueGetter: EffectValueGetter<V>;\n private cleanupFn: CleanupFn | undefined;\n\n constructor(valueGetter: EffectValueGetter<V>, options: EffectOptions) {\n super(options);\n this.headDepLink = undefined;\n this.tailDepLink = undefined;\n this.headSubLink = undefined;\n this.tailSubLink = undefined;\n this.flags = this.getInitialFlags();\n\n this.valueGetter = valueGetter;\n this.cleanupFn = undefined;\n\n this.trackThis();\n this.runWithTracking();\n }\n\n private getInitialFlags(): Flags {\n // 在创建完成后即进入观察状态,因此初始时添加 Watching 标记\n return flags().setWatching();\n }\n\n trackThis(): void {\n track(this);\n }\n\n private cleanup(): void {\n this.cleanupFn?.();\n this.cleanupFn = undefined;\n }\n\n private runWithTracking(): V {\n const result = withTracking(this, () => {\n this.cleanup();\n\n const isInitializingRun = isVoid(this.value) === true;\n\n if (isInitializingRun === true) {\n const context: EffectValueGetterContext<V> = {\n setCleanup: (cleanup) => {\n this.cleanupFn = cleanup;\n },\n isInitializingRun,\n }\n const value = this.valueGetter(context);\n this.value = value;\n return value;\n } else {\n const context: EffectValueGetterContext<V> = {\n setCleanup: (cleanup) => {\n this.cleanupFn = cleanup;\n },\n isInitializingRun,\n previousValue: this.value,\n }\n const value = this.valueGetter(context);\n this.value = value;\n return value;\n }\n })\n\n return result;\n }\n\n reset(): void {\n this.flags = this.getInitialFlags();\n }\n\n dispose(): void {\n this.cleanup();\n removeAllDepLinksOfNode(this);\n removeAllSubLinksOfNode(this);\n this.reset();\n this.triggerOnDispose();\n }\n\n notify(): void {\n this.flags.unsetWatching();\n }\n\n run(): void {\n // 如果包含 Pending 标记,则进行解决\n const shouldResolve = this.flags.hasPending();\n if (shouldResolve === true) {\n resolvePending(this);\n }\n\n // order matters:\n // - 需要在 resolvePending 之后,因为:resolvePending 时可能触发 shallowPropagate,\n // 进而触发 notify,notify 只会作用于包含 Watching 标记的节点。\n // - 需要在 runWithTracking 之前,因为:Signal 只会 track 包含 Watching 标记的 Effect。\n this.flags.setWatching();\n\n // 如果包含 Dirty 标记,则进行更新\n const shouldRun = this.flags.hasDirty();\n if (shouldRun === true) {\n this.runWithTracking();\n }\n }\n}\n\nexport interface BaseEffectScopeValueGetterContext extends BaseEffectValueGetterContext { }\nexport interface InitializingEffectScopeValueGetterContext\n extends BaseEffectScopeValueGetterContext, InitializingEffectValueGetterContext { }\nexport interface UpdatingEffectScopeValueGetterContext<V>\n extends BaseEffectScopeValueGetterContext, UpdatingEffectValueGetterContext<V> {\n}\nexport type EffectScopeValueGetterContext<V> =\n | InitializingEffectScopeValueGetterContext\n | UpdatingEffectScopeValueGetterContext<V>;\nexport type EffectScopeValueGetter<V> = (context: EffectScopeValueGetterContext<V>) => V;\nexport interface EffectScopeOptions extends BaseReactorOptions {\n}\nexport class EffectScope<V = void> extends BaseReactor<V> {\n private readonly valueGetter: EffectScopeValueGetter<V>;\n private cleanupFn: CleanupFn | void;\n\n constructor(valueGetter: EffectScopeValueGetter<V>, options: EffectScopeOptions) {\n super(options);\n this.headDepLink = undefined;\n this.tailDepLink = undefined;\n this.headSubLink = undefined;\n this.tailSubLink = undefined;\n this.flags = this.getInitialFlags();\n\n this.valueGetter = valueGetter;\n this.cleanupFn = undefined;\n\n this.trackThis();\n this.runWithTracking();\n }\n\n private getInitialFlags(): Flags {\n // 只负责管理作用域,不需要添加任何标记\n return flags();\n }\n\n private cleanup(): void {\n this.cleanupFn?.();\n this.cleanupFn = undefined;\n }\n\n private runWithTracking(): V {\n const result = withTracking(this, () => {\n this.cleanup();\n\n const isInitializingRun = isVoid(this.value) === true;\n\n if (isInitializingRun === true) {\n const context: EffectScopeValueGetterContext<V> = {\n setCleanup: (cleanup) => {\n this.cleanupFn = cleanup;\n },\n isInitializingRun,\n }\n const value = this.valueGetter(context);\n this.value = value;\n return value;\n } else {\n const context: EffectScopeValueGetterContext<V> = {\n setCleanup: (cleanup) => {\n this.cleanupFn = cleanup;\n },\n isInitializingRun,\n previousValue: this.value,\n }\n const value = this.valueGetter(context);\n this.value = value;\n return value;\n }\n })\n\n return result;\n }\n\n trackThis(): void {\n track(this);\n }\n\n reset(): void {\n this.flags = this.getInitialFlags();\n }\n\n dispose(): void {\n this.cleanup();\n removeAllDepLinksOfNode(this);\n removeAllSubLinksOfNode(this);\n this.reset();\n this.triggerOnDispose();\n }\n}\n\nexport interface BaseTriggerValueGetterContext {\n setCleanup: (cleanup: CleanupFn) => void;\n}\nexport interface InitializingTriggerValueGetterContext extends BaseTriggerValueGetterContext {\n isInitializingRun: true;\n}\nexport interface UpdatingTriggerValueGetterContext<V> extends BaseTriggerValueGetterContext {\n isInitializingRun: false;\n previousValue: V;\n}\nexport type TriggerValueGetterContext<V> =\n | InitializingTriggerValueGetterContext\n | UpdatingTriggerValueGetterContext<V>\nexport type TriggerValueGetter<V> = (context: TriggerValueGetterContext<V>) => V;\nexport interface TriggerOptions extends BaseReactorOptions {\n}\nexport class Trigger<V = void> extends BaseReactor<V> {\n private readonly valueGetter: TriggerValueGetter<V>;\n private cleanupFn: CleanupFn | void;\n\n constructor(valueGetter: TriggerValueGetter<V>, options: TriggerOptions) {\n super(options);\n this.headDepLink = undefined;\n this.tailDepLink = undefined;\n this.headSubLink = undefined;\n this.tailSubLink = undefined;\n this.flags = this.getInitialFlags();\n\n this.valueGetter = valueGetter;\n this.cleanupFn = undefined;\n\n this.runWithTracking();\n }\n\n private getInitialFlags(): Flags {\n return flags().setWatching();\n }\n\n private cleanup(): void {\n this.cleanupFn?.();\n this.cleanupFn = undefined;\n }\n\n private runWithTracking(): V {\n // 以依赖收集的方式获取目标 Signals\n const result = withTracking(this, () => {\n this.cleanup();\n\n const isInitializingRun = isVoid(this.value) === true;\n\n if (isInitializingRun === true) {\n const context: TriggerValueGetterContext<V> = {\n isInitializingRun,\n setCleanup: (cleanup) => {\n this.cleanupFn = cleanup;\n },\n }\n const value = this.valueGetter(context);\n this.value = value;\n return value\n } else {\n const context: TriggerValueGetterContext<V> = {\n isInitializingRun,\n setCleanup: (cleanup) => {\n this.cleanupFn = cleanup;\n },\n previousValue: this.value,\n }\n const value = this.valueGetter(context);\n this.value = value;\n return value\n }\n\n })\n\n // 移除目标 Singals 与当前 Signal 之间的连接,并触发更新机制\n const targetDeps = removeAllDepLinksOfNode(this);\n targetDeps.forEach(dep => {\n deeeeepPropagate(dep);\n shallowPropagate(dep);\n })\n\n // 执行更新队列\n flushBatch();\n\n this.dispose();\n\n return result;\n }\n\n trackThis(): void {\n track(this);\n }\n\n reset(): void {\n this.flags = this.getInitialFlags();\n }\n\n dispose(): void {\n this.cleanup();\n removeAllDepLinksOfNode(this);\n removeAllSubLinksOfNode(this);\n this.reset();\n this.triggerOnDispose();\n }\n}\n\nexport const isReactor = (target: unknown): target is BaseReactor => {\n return target instanceof BaseReactor;\n}\n\nexport const isSignal = <V>(target: unknown): target is Signal<V> => {\n return target instanceof Signal;\n}\nexport const signal = <V>(valueInitializer: SignalValueInitializer<V>, options?: SignalOptions<V>): Signal<V> => {\n return new Signal(valueInitializer, options ?? {});\n}\nexport const isDerived = <V>(target: unknown): target is Derived<V> => {\n return target instanceof Derived;\n}\nexport const derived = <V>(valueGetter: DerivedValueGetter<V>, options?: DerivedOptions<V>): Derived<V> => {\n return new Derived(valueGetter, options ?? {});\n}\nexport const isComputed = <V>(target: unknown): target is Computed<V> => {\n return target instanceof Computed;\n}\nexport const computed = <V>(valueGetter: ComputedValueGetter<V>, options?: ComputedOptions<V>): Computed<V> => {\n return new Computed(valueGetter, options ?? {});\n}\nexport const isEffect = <V>(target: unknown): target is Effect<V> => {\n return target instanceof Effect;\n}\nexport const effect = <V>(valueGetter: EffectValueGetter<V>, options?: EffectOptions): Effect<V> => {\n return new Effect(valueGetter, options ?? {});\n}\nexport const isEffectScope = <V>(target: unknown): target is EffectScope<V> => {\n return target instanceof EffectScope;\n}\nexport const effectScope = <V>(valueGetter: EffectScopeValueGetter<V>, options?: EffectScopeOptions): EffectScope<V> => {\n return new EffectScope(valueGetter, options ?? {});\n}\nexport const isTrigger = <V>(target: unknown): target is Trigger<V> => {\n return target instanceof Trigger;\n}\nexport const trigger = <V>(valueGetter: TriggerValueGetter<V>, options?: TriggerOptions): Trigger<V> => {\n return new Trigger(valueGetter, options ?? {});\n}\n\nexport type ValueReactor<V = unknown> = Signal<V> | Derived<V> | Computed<V>;\nexport type ActionReactor<V = unknown> = Effect<V> | EffectScope<V> | Trigger<V>;\nexport const isValueReactor = <V>(target: unknown): target is ValueReactor<V> => {\n return isSignal(target) || isDerived(target) || isComputed(target);\n}\nexport const isActionReactor = <V>(target: unknown): target is ActionReactor<V> => {\n return isEffect(target) || isEffectScope(target) || isTrigger(target);\n}\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyReactor = BaseReactor<any>\n// oxlint-disable-next-line no-explicit-any\nexport type AnyValueReactor = ValueReactor<any>\n// oxlint-disable-next-line no-explicit-any\nexport type AnyActionReactor = ActionReactor<any>\n\nexport type ValueOfReactor<R extends AnyReactor> = R extends BaseReactor<infer V> ? V : never;\nexport type ValueOfValueReactor<R extends AnyValueReactor> = R extends ValueReactor<infer V> ? V : never;\nexport type ValueOfActionReactor<R extends AnyActionReactor> = R extends ActionReactor<infer V> ? V : never;\n",
|
|
151
|
-
"import type { ValueReactor } from \"../reactor-core/index.ts\"\n\nimport { effect } from \"../reactor-core/index.ts\"\n\nexport type ValueInitializer<V> = () => V;\n/**\n * This initializer can be used to create a Signal with an undefined initial value which\n * is casted to the desired type T. So the real value getter function will not be called\n * until the Signal is actually used.\n *\n * Every signal should always have a valid value (or value getter which returns a valid value).\n * When using the castValueInitializer, the real value should be set as soon as possible.\n */\nexport const castValueInitializer = <V>(): ValueInitializer<V> => {\n return (): V => {\n // oxlint-disable-next-line no-unsafe-return no-unsafe-type-assertion\n return undefined as unknown as V\n }\n}\n\nexport type Unsubscribe = () => void\nexport interface SubscribeOptions<V> {\n target: ValueReactor<V>;\n subscriber: (value: V) => void;\n}\n/**\n * Subscribes to a ValueReactor and invokes the subscriber when the reactor's value\n * changes.\n *\n * The initial value is skipped; the subscriber is called only on subsequent updates.\n */\nexport const subscribe = <V>(\n options: SubscribeOptions<V>\n): Unsubscribe => {\n const { target, subscriber } = options\n\n const e = effect((context) => {\n const { isInitializingRun } = context\n const value = target.get()\n if (isInitializingRun === false) {\n subscriber(value)\n }\n })\n const unsubscribe = (): void => {\n e.dispose()\n }\n return unsubscribe\n}\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyValueReactorArray = Array<ValueReactor<any>>;\nexport type GetValuesInArray<T extends AnyValueReactorArray> = {\n [K in keyof T]: T[K] extends ValueReactor<infer U> ? U : never\n}\nexport interface GetValuesInArrayOptions<T extends AnyValueReactorArray> {\n target: T;\n withoutTrack?: boolean;\n}\n/**\n * Gets the current values from an array of ValueReactors.\n */\nexport const getValuesInArray = <T extends AnyValueReactorArray>(\n options: GetValuesInArrayOptions<T>\n): GetValuesInArray<T> => {\n const valueReactors = options.target;\n const withoutTrack = options?.withoutTrack ?? false;\n // oxlint-disable-next-line no-unsafe-type-assertion\n const values = valueReactors.map((vr) => {\n // oxlint-disable-next-line no-unsafe-return\n return withoutTrack ? vr.getWithoutTrack() : vr.get()\n }) as unknown as GetValuesInArray<T>\n return values\n}\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyValueReactorObject = Record<string, ValueReactor<any>>;\nexport type GetValuesInObject<T extends AnyValueReactorObject> = {\n [K in keyof T]: T[K] extends ValueReactor<infer U> ? U : never\n}\nexport interface GetValueInObjectOptions<T extends AnyValueReactorObject> {\n target: T;\n withoutTrack?: boolean;\n}\n/**\n * Gets the current values from an object of ValueReactors.\n */\nexport const getValuesInObject = <T extends AnyValueReactorObject>(\n options: GetValueInObjectOptions<T>\n): GetValuesInObject<T> => {\n const valueReactors = options.target;\n const withoutTrack = options?.withoutTrack ?? false;\n // oxlint-disable-next-line no-unsafe-type-assertion\n const values = {} as GetValuesInObject<T>\n for (const key of Object.keys(valueReactors)) {\n const valueReactor = valueReactors[key]!\n // oxlint-disable-next-line no-unsafe-assignment\n const value = withoutTrack ? valueReactor.getWithoutTrack() : valueReactor.get()\n // oxlint-disable-next-line no-unsafe-assignment no-unsafe-member-access no-unsafe-type-assertion\n values[key as unknown as keyof GetValuesInObject<T>] = value\n }\n return values\n}\n",
|
|
152
|
-
"import type { Signal, ValueReactor } from \"../reactor-core/index.ts\"\n\nimport { signal } from \"../reactor-core/index.ts\"\nimport { subscribe } from \"./utility.ts\"\n\nexport interface FromPromiseSyncOptions<V> {\n target: Promise<V>;\n}\n/**\n * Converts a Promise into a Signal that updates its value\n * when the Promise resolves.\n *\n * @see {@link fromPromiseAsync} for an async version.\n */\nexport const fromPromiseSync = <V>(\n options: FromPromiseSyncOptions<V>\n): Signal<V | undefined> => {\n const { target } = options\n\n const result = signal<V | undefined>(() => undefined)\n void target.then((value) => {\n return result.set(value)\n })\n return result\n}\n\nexport interface FromPromiseAsyncOptions<V> {\n target: Promise<V>;\n}\n/**\n * Converts a Promise into a Signal that is initialized\n * with the resolved value of the Promise.\n *\n * @see {@link fromPromiseSync} for a sync version.\n */\nexport const fromPromiseAsync = async <V>(\n options: FromPromiseAsyncOptions<V>\n): Promise<Signal<V>> => {\n const { target } = options\n\n const value = await target\n const result = signal<V>(() => value)\n return result\n}\n\nexport interface ToPromiseOptions<V> {\n target: ValueReactor<V>;\n}\n/**\n * Converts a ValueReactor into a Promise that resolves\n * with the next value emitted by the ValueReactor.\n */\nexport const toPromise = async <V>(\n options: ToPromiseOptions<V>\n): Promise<V> => {\n const { target } = options\n\n let _resolve: (value: V) => void\n const promise = new Promise<V>((resolve) => {\n _resolve = resolve\n })\n const unsubscribe = subscribe({\n target,\n subscriber: (value) => {\n unsubscribe()\n _resolve(value)\n }\n })\n return await promise\n}\n",
|
|
153
|
-
"import type { Signal } from \"../reactor-core/index.ts\"\n\nimport { signal } from \"../reactor-core/index.ts\"\n\nexport interface TimerOptions {\n delay: number\n interval: number\n initialValue?: number\n step?: number\n}\n/**\n * Creates a signal that starts emitting values after a specified delay,\n * and continues to emit incremented values at specified intervals.\n *\n * The value starts at 0, becomes 1 after the delay, and increments by 1.\n */\nexport const timer = (\n options: TimerOptions\n): Signal<number> => {\n const { delay, interval, initialValue = 0, step = 1 } = options\n\n const result = signal<number>(() => initialValue, {\n onDispose: () => {\n clearTimeout(timeoutId)\n clearInterval(intervalId)\n }\n })\n\n let intervalId: ReturnType<typeof setInterval> | undefined = undefined\n const timeoutId = setTimeout(() => {\n result.set(result.getWithoutTrack() + step)\n intervalId = setInterval(() => {\n result.set(result.getWithoutTrack() + step)\n }, interval)\n }, delay)\n\n return result\n}\n\nexport interface IntervalOptions {\n interval: number\n initialValue?: number\n step?: number\n}\n/**\n * Creates a signal that increments its value at specified intervals.\n *\n * The value starts at 0 and increments by 1 every interval.\n */\nexport const interval = (\n options: IntervalOptions\n): Signal<number> => {\n const { interval, initialValue = 0, step = 1 } = options\n\n const result = signal<number>(() => initialValue, {\n onDispose: () => {\n clearInterval(intervalId)\n }\n })\n\n const intervalId = setInterval(() => {\n result.set(result.getWithoutTrack() + step)\n }, interval)\n\n return result\n}\n",
|
|
154
|
-
"import type { AnyValueReactorArray, AnyValueReactorObject, GetValuesInArray, GetValuesInObject } from \"./utility.ts\"\nimport type { Effect, Signal, ValueReactor } from \"../reactor-core/index.ts\"\n\nimport { castValueInitializer, getValuesInArray, getValuesInObject } from \"./utility.ts\"\nimport { effect, signal } from \"../reactor-core/index.ts\"\n\nexport type CombineLatestArray<T extends AnyValueReactorArray> = Signal<GetValuesInArray<T>>;\nexport interface CombineLatestArrayOptions<T extends AnyValueReactorArray> {\n target: T;\n}\n/**\n * Combines multiple ValueReactors into a Signal that emits the latest values\n * from each ValueReactor whenever any of them updates.\n */\nexport const combineLatestArray = <T extends AnyValueReactorArray>(\n options: CombineLatestArrayOptions<T>\n): CombineLatestArray<T> => {\n const { target } = options;\n\n const result = signal(castValueInitializer<GetValuesInArray<T>>(), {\n onDispose: () => {\n e.dispose()\n }\n })\n\n const e = effect(() => {\n result.set(getValuesInArray({ target }))\n })\n\n return result\n}\n\nexport type CombineLatestObject<T extends AnyValueReactorObject> = Signal<GetValuesInObject<T>>;\nexport interface CombineLatestObjectOptions<T extends AnyValueReactorObject> {\n target: T;\n}\n/**\n * Combines multiple ValueReactors in an object into a Signal that emits the latest values\n * from each ValueReactor whenever any of them updates.\n */\nexport const combineLatestObject = <T extends AnyValueReactorObject>(\n options: CombineLatestObjectOptions<T>\n): CombineLatestObject<T> => {\n const { target } = options;\n\n const result = signal(castValueInitializer<GetValuesInObject<T>>(), {\n onDispose: () => {\n e.dispose()\n }\n })\n\n const e = effect(() => {\n result.set(getValuesInObject({ target }))\n })\n\n return result\n}\n\nexport type MergeArray<T extends AnyValueReactorArray> = Signal<GetValuesInArray<T>[number]>;\nexport interface MergeArrayOptions<T extends AnyValueReactorArray> {\n target: T;\n}\n/**\n * Merges multiple ValueReactors into a Signal that emits values\n * from any of the ValueReactors as they update.\n */\nexport const mergeArray = <T extends AnyValueReactorArray>(\n options: MergeArrayOptions<T>\n): MergeArray<T> => {\n const { target } = options;\n\n const result = signal(castValueInitializer<GetValuesInArray<T>[number]>(), {\n onDispose: () => {\n for (const e of effects) {\n e.dispose()\n }\n }\n });\n\n const effects: Effect[] = [];\n for (const valueReactor of target) {\n const e = effect(() => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const value = valueReactor.get() as GetValuesInArray<T>[number];\n result.set(value)\n })\n effects.push(e)\n }\n\n return result\n}\n\nexport interface WithLatestFromOptions<T, U> {\n target: ValueReactor<T>;\n other: ValueReactor<U>;\n}\n/**\n * Combines two ValueReactors into a Signal that emits the latest values\n * from the source ValueReactor along with the latest value from the other ValueReactor.\n */\nexport const withLatestFrom = <T, U>(\n options: WithLatestFromOptions<T, U>\n): Signal<[T, U]> => {\n const { target, other } = options;\n\n const result = signal(castValueInitializer<[T, U]>(), {\n onDispose: () => {\n eTarget.dispose()\n eOther.dispose()\n }\n })\n\n let lastOther = other.get()\n const eOther = effect(() => {\n const b = other.get()\n lastOther = b\n })\n const eTarget = effect(() => {\n const a = target.get()\n result.set([a, lastOther])\n })\n\n return result\n}\n\nexport interface ZipOptions<VA, VB> {\n a: ValueReactor<VA>;\n b: ValueReactor<VB>;\n}\n/**\n * Zips two ValueReactors into a Signal that emits pairs of values.\n * Each time both ValueReactors have new values, a new pair is emitted.\n */\nexport const zip = <VA, VB>(\n options: ZipOptions<VA, VB>\n): Signal<[VA, VB]> => {\n const valueReactorA = options.a;\n const valueReactorB = options.b;\n\n let lastA = valueReactorA.getWithoutTrack()\n let lastB = valueReactorB.getWithoutTrack()\n\n const result = signal<[VA, VB]>(() => [lastA, lastB], {\n onDispose: () => {\n e.dispose()\n }\n })\n\n const queueA: VA[] = []\n const queueB: VB[] = []\n\n const e = effect(() => {\n const a = valueReactorA.get()\n const b = valueReactorB.get()\n\n if (a !== lastA) {\n queueA.push(a)\n lastA = a\n }\n if (b !== lastB) {\n queueB.push(b)\n lastB = b\n }\n\n if (queueA.length !== 0 && queueB.length !== 0) {\n const va = queueA.shift()\n const vb = queueB.shift()\n // oxlint-disable-next-line no-unsafe-type-assertion\n result.set([va, vb] as [VA, VB])\n }\n })\n\n return result\n}\n",
|
|
155
|
-
"import type { Signal, ValueReactor } from \"../reactor-core/index.ts\"\n\nimport { castValueInitializer } from \"./utility.ts\"\nimport { effect, signal } from \"../reactor-core/index.ts\"\n\nexport interface CloneOptions<V> {\n target: ValueReactor<V>;\n}\n/**\n * Creates a Signal that mirrors the value of the target ValueReactor.\n */\nexport const clone = <V>(\n options: CloneOptions<V>\n): Signal<V> => {\n const { target } = options;\n\n const result = signal(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n result.set(value)\n })\n\n return result\n}\n\nexport interface PartitionOptions<V> {\n target: ValueReactor<V>;\n predicate: (value: V) => boolean;\n}\n/**\n * Partitions values from a ValueReactor into two Signals based on a predicate function.\n * The first Signal emits values that satisfy the predicate, while the second Signal\n * emits values that do not satisfy the predicate.\n */\nexport const partition = <V>(\n options: PartitionOptions<V>\n): [Signal<V | undefined>, Signal<V | undefined>] => {\n const { target, predicate } = options;\n\n const trueSignal = signal(castValueInitializer<V | undefined>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n const falseSignal = signal(castValueInitializer<V | undefined>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (predicate(value) === true) {\n trueSignal.set(value)\n } else {\n falseSignal.set(value)\n }\n })\n\n return [trueSignal, falseSignal]\n}\n",
|
|
156
|
-
"import type { AnyValueReactor, Signal, ValueOfValueReactor, ValueReactor } from \"../reactor-core/index.ts\"\n\nimport { castValueInitializer } from \"./utility.ts\"\nimport { effect, signal } from \"../reactor-core/index.ts\"\n\nexport interface TapOptions<R extends AnyValueReactor> {\n target: R;\n tapper?: ((value: ValueOfValueReactor<R>) => void) | undefined;\n}\n/**\n * Taps into the value changes of a ValueReactor without modifying its value.\n */\nexport const tap = <R extends AnyValueReactor>(\n options: TapOptions<R>\n): R => {\n const { target, tapper = (value: ValueOfValueReactor<R>): void => console.log(value) } = options;\n\n effect(() => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const value = target.get() as ValueOfValueReactor<R>\n tapper(value)\n })\n\n return target\n}\n\nexport interface WithHistoryOptions<V> {\n target: ValueReactor<V>;\n}\n/**\n * Creates a signal that maintains a history of values from a ValueReactor.\n * The history is stored in an array, with each new value appended to the end.\n *\n * Note: This implementation does not limit the size of the history array. Use\n * with caution to avoid excessive memory usage.\n */\nexport const withHistory = <V>(\n options: WithHistoryOptions<V>\n): Signal<V[]> => {\n const { target } = options;\n\n const result = signal(castValueInitializer<V[]>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const history: V[] = []\n const eTarget = effect(() => {\n history.push(target.get())\n result.set([...history])\n })\n\n return result\n}\n\nexport interface BufferByCountOptions<V> {\n target: ValueReactor<V>;\n count: number;\n}\n/**\n * Buffers values from a ValueReactor and emits them as an array\n * when the number of buffered values reaches the specified count.\n */\nexport const bufferByCount = <V>(\n options: BufferByCountOptions<V>\n): Signal<V[]> => {\n const { target, count } = options;\n\n if (count <= 0) {\n throw new Error(\"bufferByCount operator requires count to be greater than 0\")\n }\n\n const result = signal<V[]>(() => [], {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const bufferedValues: V[] = []\n const eTarget = effect(() => {\n bufferedValues.push(target.get())\n if (bufferedValues.length >= count) {\n result.set([...bufferedValues])\n bufferedValues.length = 0\n }\n })\n\n return result\n}\n\nexport interface BufferByTimeOptions<V> {\n target: ValueReactor<V>;\n time: number;\n}\n/**\n * Buffers values from a ValueReactor and emits them as an array\n * at specified time intervals.\n */\nexport const bufferByTime = <V>(\n options: BufferByTimeOptions<V>\n): Signal<V[]> => {\n const { target, time } = options;\n\n if (time <= 0) {\n throw new Error(\"bufferByTime operator requires timeInMilliseconds to be greater than 0\")\n }\n\n const result = signal<V[]>(() => [], {\n onDispose: () => {\n eTarget.dispose()\n clearInterval(intervalId)\n }\n })\n\n const bufferedValues: V[] = []\n const eTarget = effect(() => {\n bufferedValues.push(target.get())\n })\n\n const intervalId = setInterval(() => {\n result.set([...bufferedValues])\n bufferedValues.length = 0\n }, time)\n\n return result\n}\n\nexport interface BufferByTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Buffers values from a ValueReactor and emits them as an array when the trigger ValueReactor changes.\n */\nexport const bufferByTrigger = <VTarget, VTrigger>(\n options: BufferByTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget[]> => {\n const { target, trigger } = options;\n\n const result = signal(castValueInitializer<VTarget[]>(), {\n onDispose: () => {\n eTarget.dispose()\n eTrigger.dispose()\n }\n })\n\n const bufferedValues: VTarget[] = []\n const eTarget = effect(() => {\n bufferedValues.push(target.get())\n })\n\n const eTrigger = effect(() => {\n trigger.get()\n result.set([...bufferedValues])\n bufferedValues.length = 0\n })\n\n return result\n}\n\nexport interface BufferByToggleOptions<VTarget, VOpen, VClose> {\n target: ValueReactor<VTarget>;\n open: ValueReactor<VOpen>;\n close: ValueReactor<VClose>;\n}\n/**\n * Buffers values from a ValueReactor and emits them as an array\n * when the open ValueReactor emits a value, and stops buffering\n * when the close ValueReactor emits a value.\n */\nexport const bufferByToggle = <VTarget, VOpen, VClose>(\n options: BufferByToggleOptions<VTarget, VOpen, VClose>\n): Signal<VTarget[]> => {\n const { target, open, close } = options;\n\n const result = signal(castValueInitializer<VTarget[]>(), {\n onDispose: () => {\n eTarget.dispose()\n eOpen.dispose()\n eClose.dispose()\n }\n })\n\n const bufferedValues: VTarget[] = []\n let buffering = false\n\n const eOpen = effect(() => {\n open.get()\n buffering = true\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (buffering === true) {\n bufferedValues.push(value)\n }\n })\n\n const eClose = effect(() => {\n close.get()\n if (buffering === true) {\n result.set([...bufferedValues])\n bufferedValues.length = 0\n buffering = false\n }\n })\n\n return result\n}\n\nexport interface BufferByDynamicOptions<VTarget, VDynamic> {\n target: ValueReactor<VTarget>;\n dynamic: (value: VTarget) => ValueReactor<VDynamic>;\n}\n/**\n * Buffers values from a ValueReactor and emits them as an array\n * when the ValueReactor returned by the `dynamic` function emits a value.\n * The `dynamic` function is called each time the buffer is emitted\n * to get a new ValueReactor for the next buffer.\n */\nexport const bufferByDynamic = <VTarget, VDynamic>(\n options: BufferByDynamicOptions<VTarget, VDynamic>\n): Signal<VTarget[]> => {\n const { target, dynamic } = options;\n\n const result = signal(castValueInitializer<VTarget[]>(), {\n onDispose: () => {\n eTarget.dispose()\n eDynamic.dispose()\n }\n })\n\n const bufferedValues: VTarget[] = []\n const eTarget = effect(() => {\n const value = target.get()\n bufferedValues.push(value)\n })\n\n let trigger: ValueReactor<VDynamic> | undefined = undefined\n const eDynamic = effect(() => {\n trigger?.dispose()\n const targetValue = target.getWithoutTrack()\n trigger = dynamic(targetValue)\n trigger.get()\n result.set([...bufferedValues])\n bufferedValues.length = 0\n })\n\n return result\n}\n\nexport interface GroupToArrayByOptions<V, K> {\n target: ValueReactor<V>;\n keyGetter: (value: V) => K;\n}\n/**\n * Groups values from a ValueReactor into an array of arrays based on a key\n * extracted by the keyGetter function.\n */\nexport const groupToArrayBy = <V, K>(\n options: GroupToArrayByOptions<V, K>\n): Signal<V[][]> => {\n const { target, keyGetter } = options;\n\n const result = signal<V[][]>(() => [], {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const groups = new Map<K, V[]>()\n const eTarget = effect(() => {\n const value = target.get()\n const key = keyGetter(value)\n if (groups.has(key) === false) {\n groups.set(key, [])\n result.set([...groups.values()])\n }\n const groupedArray = groups.get(key)!\n groupedArray.push(value)\n })\n\n return result\n}\n\nexport interface GroupToObjectByOptions<V, K extends string | number | symbol> {\n target: ValueReactor<V>;\n keyGetter: (value: V) => K;\n}\n/**\n * Groups values from a ValueReactor into an object where each key maps to an array\n * of values corresponding to that key.\n */\nexport const groupToObjectBy = <V, K extends string | number | symbol>(\n options: GroupToObjectByOptions<V, K>\n): Signal<Record<K, V[]>> => {\n const { target, keyGetter } = options;\n\n const result = signal<Record<K, V[]>>(() => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return {} as Record<K, V[]>\n }, {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const groups = new Map<K, V[]>()\n const eTarget = effect(() => {\n const value = target.get()\n const key = keyGetter(value)\n if (groups.has(key) === false) {\n groups.set(key, [])\n // oxlint-disable-next-line no-unsafe-type-assertion\n result.set(Object.fromEntries(groups.entries()) as Record<K, V[]>)\n }\n const groupedArray = groups.get(key)!\n groupedArray.push(value)\n })\n\n return result\n}\n\n/**\n * Groups values from a ValueReactor into an array of Signals based on a key\n * extracted by the keyGetter function.\n */\nexport const groupToSignalArrayBy = <V, K>(\n target: ValueReactor<V>, keyGetter: (value: V) => K\n): Signal<Array<Signal<V[]>>> => {\n const result = signal<Array<Signal<V[]>>>(() => [], {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const groups = new Map<K, Signal<V[]>>()\n const eTarget = effect(() => {\n const value = target.get()\n const key = keyGetter(value)\n if (groups.has(key) === false) {\n const newGroup = signal<V[]>(() => [])\n groups.set(key, newGroup)\n result.set([...groups.values()])\n }\n const groupedSignal = groups.get(key)!\n const currentArray = groupedSignal.get()\n groupedSignal.set([...currentArray, value])\n })\n\n return result\n}\n\nexport interface GroupToSignalObjectByOptions<V, K extends string | number | symbol> {\n target: ValueReactor<V>;\n keyGetter: (value: V) => K;\n}\n/**\n * Groups values from a ValueReactor into a Signal of an object where each key maps to a Signal\n * of an array of values corresponding to that key.\n */\nexport const groupToSignalObjectBy = <V, K extends string | number | symbol>(\n options: GroupToSignalObjectByOptions<V, K>\n): Signal<Record<K, Signal<V[]>>> => {\n const { target, keyGetter } = options;\n\n const result = signal<Record<K, Signal<V[]>>>(() => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return {} as Record<K, Signal<V[]>>\n }, {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const groups = new Map<K, Signal<V[]>>()\n const eTarget = effect(() => {\n const value = target.get()\n const key = keyGetter(value)\n if (groups.has(key) === false) {\n const newGroup = signal<V[]>(() => [])\n groups.set(key, newGroup)\n // oxlint-disable-next-line no-unsafe-type-assertion\n result.set(Object.fromEntries(groups.entries()) as Record<K, Signal<V[]>>)\n }\n const groupedSignal = groups.get(key)!\n const currentArray = groupedSignal.get()\n groupedSignal.set([...currentArray, value])\n })\n\n return result\n}\n\nexport interface MapOptions<VTarget, VMapped> {\n target: ValueReactor<VTarget>;\n mapper: (value: VTarget) => VMapped;\n}\n/**\n * Maps values from a ValueReactor using the provided mapper function and\n * emits the mapped values as a new Signal.\n */\nexport const map = <VTarget, VMapped>(\n options: MapOptions<VTarget, VMapped>\n): Signal<VMapped> => {\n const { target, mapper } = options;\n\n const result = signal(castValueInitializer<VMapped>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n const newValue = mapper(value)\n result.set(newValue)\n })\n\n return result\n}\n\nexport interface ContextualMapInitializingMapperContext<VTarget> {\n isInitializingRun: true;\n targetValue: VTarget\n}\nexport interface ContextualMapUpdatingMapperContext<VTarget, VMapped> {\n isInitializingRun: false;\n targetValue: VTarget\n previousMappedValue: VMapped\n}\nexport type ContextualMapMapperContextOf<VTarget, VMapped> =\n | ContextualMapInitializingMapperContext<VTarget>\n | ContextualMapUpdatingMapperContext<VTarget, VMapped>;\n\nexport interface ContextualMapOptions<VTarget, VMapped> {\n target: ValueReactor<VTarget>;\n mapper: (context: ContextualMapMapperContextOf<VTarget, VMapped>) => VMapped;\n}\n/**\n * Maps values from a ValueReactor using the provided contextual mapper function and\n * emits the mapped values as a new Signal.\n */\nexport const contextualMap = <VTarget, VMapped>(\n options: ContextualMapOptions<VTarget, VMapped>\n): Signal<VMapped> => {\n const { target, mapper } = options;\n\n const result = signal(castValueInitializer<VMapped>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect((context) => {\n const targetValue = target.get()\n const { isInitializingRun } = context\n if (isInitializingRun === true) {\n const newValue = mapper({\n isInitializingRun,\n targetValue\n })\n result.set(newValue)\n } else {\n const previousMappedValue = result.getWithoutTrack()\n const newValue = mapper({\n isInitializingRun,\n targetValue,\n previousMappedValue\n })\n result.set(newValue)\n }\n })\n\n return result\n}\n\nexport interface MergeMapOptions<VTarget, VMapped> {\n target: ValueReactor<VTarget>;\n mapper: (value: VTarget) => ValueReactor<VMapped>;\n}\n/**\n * Maps each value from a ValueReactor<T> to a ValueReactor<R> using the provided `mapper`,\n * subscribes to every mapped reactor, and merges their emitted values into a single `Signal<R>`.\n */\nexport const mergeMap = <VTarget, VMapped>(\n options: MergeMapOptions<VTarget, VMapped>\n): Signal<VMapped> => {\n const { target, mapper } = options;\n\n const result = signal(castValueInitializer<VMapped>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n const currentMappedReactor = mapper(value);\n\n effect(() => {\n const mappedValue = currentMappedReactor.get()\n result.set(mappedValue)\n })\n })\n\n return result\n}\n\nexport interface SwitchMapOptions<VTarget, VMapped> {\n target: ValueReactor<VTarget>;\n mapper: (value: VTarget) => ValueReactor<VMapped>;\n}\n/**\n * Maps each value from a ValueReactor<T> to a ValueReactor<R> using the provided `mapper`,\n * subscribes only to the latest mapped reactor, and emits its values as a `Signal<R>`.\n */\nexport const switchMap = <VTarget, VMapped>(\n options: SwitchMapOptions<VTarget, VMapped>\n): Signal<VMapped> => {\n const { target, mapper } = options;\n\n const result = signal(castValueInitializer<VMapped>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let lastMappedReactor: ValueReactor<VMapped> | undefined = undefined\n\n const eTarget = effect(() => {\n const value = target.get()\n lastMappedReactor?.dispose()\n lastMappedReactor = mapper(value);\n effect(() => {\n const mappedValue = lastMappedReactor!.get()\n result.set(mappedValue)\n })\n })\n\n return result\n}\n\nexport interface ScanOptions<VTarget, VAccumulated> {\n target: ValueReactor<VTarget>;\n accumulator: (acc: VAccumulated, value: VTarget) => VAccumulated;\n seed: VAccumulated;\n}\n/**\n * Accumulates values from a ValueReactor using the provided accumulator function\n * and emits the accumulated value as a Signal.\n */\nexport const scan = <VTarget, VAccumulated>(\n options: ScanOptions<VTarget, VAccumulated>\n): Signal<VAccumulated> => {\n const { target, accumulator, seed } = options;\n\n const result = signal(() => seed, {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n const newValue = accumulator(result.getWithoutTrack(), value)\n result.set(newValue)\n })\n\n return result\n}\n\nexport interface PairwiseOptions<V> {\n target: ValueReactor<V>;\n}\n/**\n * Emits the previous and current values from a ValueReactor as a tuple.\n * The first emitted tuple will have `undefined` as the previous value.\n */\nexport const pairwise = <V>(\n options: PairwiseOptions<V>\n): Signal<[V | undefined, V]> => {\n const { target } = options;\n\n const result = signal<[V | undefined, V]>(() => [undefined, target.get()], {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let previousValue: V | undefined = undefined\n const eTarget = effect(() => {\n const currentValue = target.get()\n result.set([previousValue, currentValue])\n previousValue = currentValue\n })\n\n return result\n}\n",
|
|
157
|
-
"import type { Signal, SignalValueInitializer, ValueReactor } from \"../reactor-core/index.ts\"\n\nimport { castValueInitializer } from \"./utility.ts\"\nimport { effect, signal } from \"../reactor-core/index.ts\"\n\nexport interface CurrentOptions<V> {\n target: ValueReactor<V>;\n}\n/**\n * Returns a Signal that holds the current value of the target ValueReactor.\n */\nexport const current = <V>(\n options: CurrentOptions<V>\n): Signal<V> => {\n const { target } = options;\n\n const result = signal<V>(() => {\n return target.get()\n })\n\n return result\n}\n\nexport interface NextOptions<V> {\n target: ValueReactor<V>;\n valueInitializer: SignalValueInitializer<V>\n}\n/**\n * Returns a Signal that holds the next value of the target ValueReactor\n * after the initial value.\n *\n * The Signal will update its value only once, upon the next change of\n * the target ValueReactor, and then it will not update anymore.\n */\nexport const next = <V>(\n options: NextOptions<V>\n): Signal<V> => {\n const { target, valueInitializer } = options;\n\n const result = signal(valueInitializer, {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect((context) => {\n const { isInitializingRun } = context\n\n const value = target.get()\n if (isInitializingRun === false) {\n result.set(value)\n eTarget.dispose()\n }\n })\n\n return result\n}\n\nexport interface FilterInitializingFalsyValueGetterContext<V> {\n isInitializingRun: true;\n targetValue: V\n}\nexport interface FilterUpdatingFalsyValueGetterContext<V> {\n isInitializingRun: false;\n targetValue: V\n previousValue: V\n}\nexport type FilterFalsyValueGetterContextOf<V> =\n | FilterInitializingFalsyValueGetterContext<V>\n | FilterUpdatingFalsyValueGetterContext<V>\nexport interface FilterOptions<V> {\n target: ValueReactor<V>;\n truthyPredicate: (value: V) => boolean;\n falsyValueGetter: (context: FilterFalsyValueGetterContextOf<V>) => V;\n}\n/**\n * Returns a Signal that only updates its value from the target\n * ValueReactor when the predicate function returns true.\n */\nexport const filter = <V>(\n options: FilterOptions<V>\n): Signal<V> => {\n const { target, truthyPredicate, falsyValueGetter } = options;\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect((context) => {\n const value = target.get()\n if (truthyPredicate(value) === true) {\n result.set(value)\n } else {\n const { isInitializingRun } = context\n if (isInitializingRun === true) {\n const fallbackValue = falsyValueGetter({\n isInitializingRun,\n targetValue: value\n })\n result.set(fallbackValue)\n } else {\n const fallbackValue = falsyValueGetter({\n isInitializingRun,\n targetValue: value,\n previousValue: result.getWithoutTrack()\n })\n result.set(fallbackValue)\n }\n }\n })\n\n return result\n}\n\nexport interface AuditByCountOptions<V> {\n target: ValueReactor<V>;\n count: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor after every specified count of emissions.\n */\nexport const auditByCount = <V>(\n options: AuditByCountOptions<V>\n): Signal<V> => {\n const { target, count } = options;\n\n if (count <= 0) {\n throw new Error(\"auditByCount operator requires count to be greater than 0\")\n }\n\n\n const result = signal(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let emissionCount = 0\n const eTarget = effect((context) => {\n const latestValue = target.get()\n\n if (context.isInitializingRun === true) {\n result.set(latestValue)\n } else {\n emissionCount = emissionCount + 1\n if (emissionCount >= count) {\n result.set(latestValue)\n emissionCount = 0\n }\n }\n })\n\n return result\n}\n\nexport interface AuditByTimeOptions<V> {\n target: ValueReactor<V>;\n time: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor at specified time intervals.\n */\nexport const auditByTime = <V>(\n options: AuditByTimeOptions<V>\n): Signal<V> => {\n const { target, time } = options;\n\n if (time <= 0) {\n throw new Error(\"auditByTime operator requires timeInMilliseconds to be greater than 0\")\n }\n\n const result = signal<V>(() => target.getWithoutTrack(), {\n onDispose: () => {\n clearInterval(intervalId)\n }\n })\n\n const intervalId = setInterval(() => {\n result.set(target.getWithoutTrack())\n }, time)\n\n return result\n}\n\nexport interface AuditByTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that only updates its value when the trigger\n * ValueReactor emits a value, using the latest value from the target\n * ValueReactor.\n */\nexport const auditByTrigger = <VTarget, VTrigger>(\n options: AuditByTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n }\n })\n\n const eTrigger = effect(() => {\n trigger.get()\n result.set(target.getWithoutTrack())\n })\n\n return result\n}\n\nexport interface AuditByToggleOptions<VTarget, VOpen, VClose> {\n target: ValueReactor<VTarget>;\n open: ValueReactor<VOpen>;\n close: ValueReactor<VClose>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the close ValueReactor emits, but only\n * if auditing was started by the open ValueReactor.\n */\nexport const auditByToggle = <VTarget, VOpen, VClose>(\n options: AuditByToggleOptions<VTarget, VOpen, VClose>\n): Signal<VTarget> => {\n const { target, open, close } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eOpen.dispose()\n eClose.dispose()\n }\n })\n\n let auditValue: VTarget | undefined = undefined\n let auditing = false\n\n const eOpen = effect(() => {\n open.get()\n auditing = true\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (auditing === true) {\n auditValue = value\n }\n })\n\n const eClose = effect(() => {\n close.get()\n if (auditing === true) {\n if (auditValue !== undefined) {\n result.set(auditValue)\n }\n auditing = false\n auditValue = undefined\n }\n })\n\n return result\n}\n\nexport interface AuditByDynamicOptions<VTarget, VDynamic> {\n target: ValueReactor<VTarget>;\n dynamic: (value: VTarget) => ValueReactor<VDynamic>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the ValueReactor returned by the `dynamic`\n * function emits. The `dynamic` function is called each time after emitting\n * to get a new ValueReactor for the next audit period.\n */\nexport const auditByDynamic = <VTarget, VDynamic>(\n options: AuditByDynamicOptions<VTarget, VDynamic>\n): Signal<VTarget> => {\n const { target, dynamic } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eDynamic.dispose()\n }\n })\n\n let trigger: ValueReactor<VDynamic> | undefined = undefined\n const eDynamic = effect(() => {\n trigger?.dispose()\n const targetValue = target.getWithoutTrack()\n trigger = dynamic(targetValue)\n trigger.get()\n result.set(targetValue)\n })\n\n return result\n}\n\nexport interface DebounceByCountOptions<V> {\n target: ValueReactor<V>;\n count: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor after the specified count of emissions\n * without being updated.\n */\nexport const debounceByCount = <V>(\n options: DebounceByCountOptions<V>\n): Signal<V> => {\n const { target, count } = options;\n\n if (count <= 0) {\n throw new Error(\"debounceByCount operator requires count to be greater than 0\")\n }\n\n const result = signal(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let emissionCount = 0\n const eTarget = effect((context) => {\n const latestValue = target.get()\n\n if (context.isInitializingRun === true) {\n result.set(latestValue)\n } else {\n emissionCount = emissionCount + 1\n if (emissionCount >= count) {\n result.set(latestValue)\n emissionCount = 0\n }\n }\n })\n\n return result\n}\n\nexport interface DebounceByTimeOptions<V> {\n target: ValueReactor<V>;\n time: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor after the specified time in milliseconds\n * has passed since the last update.\n */\nexport const debounceByTime = <V>(\n options: DebounceByTimeOptions<V>\n): Signal<V> => {\n const { target, time } = options;\n\n if (time <= 0) {\n throw new Error(\"debounceTime operator requires timeInMilliseconds to be greater than 0\")\n }\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined = undefined\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n clearTimeout(timeoutId)\n }\n })\n\n const eTarget = effect((context) => {\n const latestValue = target.get()\n\n if (context.isInitializingRun === true) {\n result.set(latestValue)\n } else {\n clearTimeout(timeoutId)\n timeoutId = setTimeout(() => {\n result.set(latestValue)\n timeoutId = undefined\n }, time)\n }\n })\n\n return result\n}\n\nexport interface DebounceByTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor whenever the trigger ValueReactor\n * emits a value.\n */\nexport const debounceByTrigger = <VTarget, VTrigger>(\n options: DebounceByTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n }\n })\n\n const eTrigger = effect(() => {\n trigger.get()\n result.set(target.getWithoutTrack())\n })\n\n return result\n}\n\nexport interface DebounceByToggleOptions<VTarget, VOpen, VClose> {\n target: ValueReactor<VTarget>;\n open: ValueReactor<VOpen>;\n close: ValueReactor<VClose>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the close ValueReactor emits, but only\n * if debouncing was started by the open ValueReactor.\n */\nexport const debounceByToggle = <VTarget, VOpen, VClose>(\n options: DebounceByToggleOptions<VTarget, VOpen, VClose>\n): Signal<VTarget> => {\n const { target, open, close } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eOpen.dispose()\n eClose.dispose()\n }\n })\n\n let debounceValue: VTarget | undefined = undefined\n let debouncing = false\n\n const eOpen = effect(() => {\n open.get()\n debouncing = true\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (debouncing === true) {\n debounceValue = value\n }\n })\n\n const eClose = effect(() => {\n close.get()\n if (debouncing === true) {\n if (debounceValue !== undefined) {\n result.set(debounceValue)\n }\n debouncing = false\n debounceValue = undefined\n }\n })\n\n return result\n}\n\nexport interface DebounceByDynamicOptions<VTarget, VDynamic> {\n target: ValueReactor<VTarget>;\n dynamic: (value: VTarget) => ValueReactor<VDynamic>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the ValueReactor returned by the `dynamic`\n * function emits. The `dynamic` function is called each time after emitting\n * to get a new ValueReactor for the next debounce period.\n */\nexport const debounceByDynamic = <VTarget, VDynamic>(\n options: DebounceByDynamicOptions<VTarget, VDynamic>\n): Signal<VTarget> => {\n const { target, dynamic } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eDynamic.dispose()\n }\n })\n\n let trigger: ValueReactor<VDynamic> | undefined = undefined\n const eDynamic = effect(() => {\n trigger?.dispose()\n const targetValue = target.getWithoutTrack()\n trigger = dynamic(targetValue)\n trigger.get()\n result.set(targetValue)\n })\n\n return result\n}\n\nexport interface ThrottleByCountOptions<V> {\n target: ValueReactor<V>;\n count: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor at most once every specified count of emissions.\n */\nexport const throttleByCount = <V>(\n options: ThrottleByCountOptions<V>\n): Signal<V> => {\n const { target, count } = options;\n\n if (count <= 0) {\n throw new Error(\"throttleByCount operator requires count to be greater than 0\")\n }\n\n const result = signal(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let emissionCount = 0\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (emissionCount === 0) {\n result.set(latestValue)\n }\n emissionCount = emissionCount + 1\n if (emissionCount >= count) {\n emissionCount = 0\n }\n })\n\n return result\n}\n\nexport interface ThrottleByTimeOptions<V> {\n target: ValueReactor<V>;\n time: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor at most once every specified time in milliseconds.\n */\nexport const throttleByTime = <V>(\n options: ThrottleByTimeOptions<V>\n): Signal<V> => {\n const { target, time } = options;\n\n if (time <= 0) {\n throw new Error(\"throttleByTime operator requires timeInMilliseconds to be greater than 0\")\n }\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let canEmit = true\n const eTarget = effect(() => {\n const latestValue = target.get()\n\n if (canEmit === true) {\n result.set(latestValue)\n canEmit = false\n setTimeout(() => {\n canEmit = true\n }, time)\n }\n })\n\n return result\n}\n\nexport interface ThrottleByTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor at most once whenever the trigger\n * ValueReactor emits.\n */\nexport const throttleByTrigger = <VTarget, VTrigger>(\n options: ThrottleByTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n eTarget.dispose()\n }\n })\n\n let canEmit = false\n const eTrigger = effect(() => {\n trigger.get()\n canEmit = true\n })\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (canEmit === true) {\n result.set(latestValue)\n canEmit = false\n }\n })\n\n return result\n}\n\nexport interface ThrottleByToggleOptions<VTarget, VOpen, VClose> {\n target: ValueReactor<VTarget>;\n open: ValueReactor<VOpen>;\n close: ValueReactor<VClose>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the close ValueReactor emits, but only\n * if throttling was started by the open ValueReactor.\n */\nexport const throttleByToggle = <VTarget, VOpen, VClose>(\n options: ThrottleByToggleOptions<VTarget, VOpen, VClose>\n): Signal<VTarget> => {\n const { target, open, close } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eOpen.dispose()\n eClose.dispose()\n }\n })\n\n let throttling = false\n\n const eOpen = effect(() => {\n open.get()\n throttling = true\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (throttling === true) {\n result.set(value)\n throttling = false\n }\n })\n\n const eClose = effect(() => {\n close.get()\n throttling = false\n })\n\n return result\n}\n\nexport interface ThrottleByDynamicOptions<VTarget, VDynamic> {\n target: ValueReactor<VTarget>;\n dynamic: (value: VTarget) => ValueReactor<VDynamic>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the ValueReactor returned by the `dynamic`\n * function emits. The `dynamic` function is called each time after emitting\n * to get a new ValueReactor for the next throttle period.\n */\nexport const throttleByDynamic = <VTarget, VDynamic>(\n options: ThrottleByDynamicOptions<VTarget, VDynamic>\n): Signal<VTarget> => {\n const { target, dynamic } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n eTarget.dispose()\n }\n })\n\n let trigger: ValueReactor<VDynamic> | undefined = undefined\n let canEmit = true\n const eTrigger = effect(() => {\n trigger?.dispose()\n const targetValue = target.getWithoutTrack()\n trigger = dynamic(targetValue)\n trigger.get()\n canEmit = true\n })\n\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (canEmit === true) {\n result.set(latestValue)\n canEmit = false\n }\n })\n\n return result\n}\n\nexport interface DistinctOptions<V, K> {\n target: ValueReactor<V>;\n keyGetter?: (value: V) => K;\n}\n/**\n * Returns a Signal that only updates its value with unique values\n * from the target ValueReactor, determined by the key returned from\n * the keyGetter function.\n */\nexport const distinct = <V, K>(\n options: DistinctOptions<V, K>\n): Signal<V> => {\n const { target, keyGetter } = options;\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n const preparedKeyGetter = keyGetter ?? ((value: V): K => (value as unknown) as K)\n\n const keySet = new Set<K>()\n const eTarget = effect(() => {\n const newValue = target.get()\n const key = preparedKeyGetter(newValue);\n if (keySet.has(key) === false) {\n result.set(newValue)\n keySet.add(key)\n }\n })\n\n return result\n}\n\nexport interface DistinctUntilChangedOptions<V, K> {\n target: ValueReactor<V>;\n keyGetter?: (value: V) => K;\n}\n/**\n * Returns a Signal that only updates its value when the key returned\n * from the keyGetter function changes between emissions.\n */\nexport const distinctUntilChanged = <V, K>(\n options: DistinctUntilChangedOptions<V, K>\n): Signal<V> => {\n const { target, keyGetter } = options;\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n const preparedKeyGetter = keyGetter ?? ((value: V): K => (value as unknown) as K)\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n let lastKey: K = Symbol(\"initial-key-for-distinct-until-changed\") as unknown as K\n const eTarget = effect(() => {\n const newValue = target.get()\n const key = preparedKeyGetter(newValue);\n if (key !== lastKey) {\n result.set(newValue)\n lastKey = key\n }\n })\n\n return result\n}\n\nexport interface TakeByPredicateOptions<V> {\n target: ValueReactor<V>;\n predicate: (value: V) => boolean;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor, but only while the predicate function\n * returns true.\n */\nexport const takeByPredicate = <V>(\n options: TakeByPredicateOptions<V>\n): Signal<V> => {\n const { target, predicate } = options;\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (predicate(latestValue) === true) {\n result.set(latestValue)\n } else {\n eTarget.dispose()\n }\n })\n\n return result\n}\n\nexport interface TakeByCountOptions<V> {\n target: ValueReactor<V>;\n count: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor, but only for the first `count` emissions.\n */\nexport const takeByCount = <V>(\n options: TakeByCountOptions<V>\n): Signal<V> => {\n const { target, count } = options;\n\n if (count <= 0) {\n throw new Error(\"takeByCount operator requires count to be greater than 0\")\n }\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let takenCount = 0\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (takenCount < count) {\n result.set(latestValue)\n takenCount = takenCount + 1\n }\n if (takenCount >= count) {\n eTarget.dispose()\n }\n })\n\n return result\n}\n\nexport interface TakeByTimeOptions<T> {\n target: ValueReactor<T>;\n time: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor, but only for the specified time in milliseconds.\n */\nexport const takeByTime = <T>(\n options: TakeByTimeOptions<T>\n): Signal<T> => {\n const { target, time } = options;\n\n if (time <= 0) {\n throw new Error(\"takeByTime operator requires timeInMilliseconds to be greater than 0\")\n }\n\n const result = signal<T>(castValueInitializer<T>(), {\n onDispose: () => {\n eTarget.dispose()\n clearTimeout(timeoutId)\n }\n })\n\n const timeoutId = setTimeout(() => {\n eTarget.dispose()\n }, time)\n\n const eTarget = effect(() => {\n const latestValue = target.get()\n result.set(latestValue)\n })\n\n return result\n}\n\nexport interface TakeByTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor whenever the trigger ValueReactor emits a value.\n */\nexport const takeByTrigger = <VTarget, VTrigger>(\n options: TakeByTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n }\n })\n\n const eTrigger = effect(() => {\n trigger.get()\n result.set(target.getWithoutTrack())\n })\n\n return result\n}\n\nexport interface TakeByToggleOptions<VTarget, VOpen, VClose> {\n target: ValueReactor<VTarget>;\n open: ValueReactor<VOpen>;\n close: ValueReactor<VClose>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the close ValueReactor emits, but only\n * if taking was started by the open ValueReactor.\n */\nexport const takeByToggle = <VTarget, VOpen, VClose>(\n options: TakeByToggleOptions<VTarget, VOpen, VClose>\n): Signal<VTarget> => {\n const { target, open, close } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eOpen.dispose()\n eClose.dispose()\n }\n })\n\n let taking = false\n\n const eOpen = effect(() => {\n open.get()\n taking = true\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (taking === true) {\n result.set(value)\n }\n })\n\n const eClose = effect(() => {\n close.get()\n taking = false\n })\n\n return result\n}\n\nexport interface TakeUntilTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor until the trigger ValueReactor emits a value.\n */\nexport const takeUntilTrigger = <VTarget, VTrigger>(\n options: TakeUntilTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eTrigger.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const latestValue = target.get()\n result.set(latestValue)\n })\n\n const eTrigger = effect((context) => {\n trigger.get()\n if (context.isInitializingRun === false) {\n eTarget.dispose()\n eTrigger.dispose()\n }\n })\n\n return result\n}\n",
|
|
158
|
-
"/**\n * 表示最小堆中的一个节点。\n *\n * `name` 用于在 `indexMap` 中快速定位节点,\n * `endAt` 用作最小堆的排序键,值越小表示越早到期,优先级越高。\n */\ninterface HeapNode<Name extends string> {\n name: Name\n endAt: number\n}\n\n/**\n * 提供一个按 `endAt` 升序排列的最小堆。\n *\n * 该实现同时维护:\n * 1. `heap`:保存二叉堆结构本身,用于快速获取最小值。\n * 2. `indexMap`:记录名称到数组索引的映射,用于按名称 $O(1)$ 定位节点,\n * 从而支持高效的更新和删除。\n *\n * 这个堆特别适合“按时间先后触发”的场景,例如过期调度器。\n */\nexport class MinHeap<Name extends string> {\n /**\n * 使用数组存储完全二叉树结构。\n * 父子节点关系遵循:\n * - parent = Math.floor((index - 1) / 2)\n * - left = index * 2 + 1\n * - right = index * 2 + 2\n */\n private heap: Array<HeapNode<Name>> = []\n\n /**\n * 记录节点名称在 `heap` 数组中的当前位置。\n *\n * 这样删除指定名称的节点时,不需要线性扫描整个堆。\n */\n private indexMap = new Map<Name, number>()\n\n /**\n * 返回当前堆中的节点数量。\n */\n size(): number {\n return this.heap.length\n }\n\n /**\n * 查看堆顶节点但不移除。\n *\n * 堆顶始终是当前 `endAt` 最小的节点,也就是最早应被处理的节点。\n */\n peek(): HeapNode<Name> | undefined {\n return this.heap[0]\n }\n\n /**\n * 向堆中插入一个新节点。\n *\n * 新节点会先追加到数组末尾,再通过上浮恢复最小堆性质。\n */\n push(node: HeapNode<Name>): void {\n const index = this.heap.length\n this.heap.push(node)\n this.indexMap.set(node.name, index)\n this.bubbleUp(index)\n }\n\n /**\n * 按名称移除一个节点。\n *\n * 过程如下:\n * 1. 借助 `indexMap` 找到目标节点位置。\n * 2. 用最后一个节点填补被删除的位置。\n * 3. 根据替换节点与父/子节点的大小关系,分别尝试下沉和上浮,恢复堆结构。\n */\n remove(name: Name): void {\n const index = this.indexMap.get(name)\n if (index === undefined) {\n return\n }\n\n const last = this.heap.pop()!\n this.indexMap.delete(name)\n\n // 被删除节点本来就在数组末尾时,弹出后无需再做任何调整。\n if (index === this.heap.length) {\n return\n }\n\n this.heap[index] = last\n this.indexMap.set(last.name, index)\n\n // 替换进来的节点可能比子节点大,也可能比父节点小,\n // 因此两个方向都尝试一次,以覆盖所有位置变化情况。\n this.bubbleDown(index)\n this.bubbleUp(index)\n }\n\n /**\n * 移除并返回堆顶节点。\n *\n * 当堆为空时返回 `undefined`。\n */\n pop(): HeapNode<Name> | undefined {\n if (this.heap.length === 0) {\n return undefined\n }\n\n const top = this.heap[0]\n if (top === undefined) {\n return undefined\n }\n\n this.remove(top.name)\n return top\n }\n\n /**\n * 交换两个索引位置上的节点,并同步更新它们在 `indexMap` 中的记录。\n */\n private swap(i: number, j: number): void {\n const a = this.heap[i]\n const b = this.heap[j]\n\n if (a === undefined || b === undefined) {\n return\n }\n\n this.heap[i] = b\n this.heap[j] = a\n\n this.indexMap.set(a.name, j)\n this.indexMap.set(b.name, i)\n }\n\n /**\n * 让指定索引处的节点持续向上移动,直到满足最小堆性质。\n *\n * 适用于插入新节点,或某个节点的排序键变小之后的重排。\n */\n private bubbleUp(index: number): void {\n let currentIndex = index\n\n while (currentIndex > 0) {\n const parent = Math.floor((currentIndex - 1) / 2)\n const parentNode = this.heap[parent]\n const currentNode = this.heap[currentIndex]\n\n if (parentNode === undefined || currentNode === undefined) {\n break\n }\n\n if (parentNode.endAt <= currentNode.endAt) {\n break\n }\n\n this.swap(parent, currentIndex)\n currentIndex = parent\n }\n }\n\n /**\n * 让指定索引处的节点持续向下移动,直到满足最小堆性质。\n *\n * 每次从当前节点与左右子节点中选出 `endAt` 最小者,\n * 若最小者不是当前节点,则交换并继续向下检查。\n */\n private bubbleDown(index: number): void {\n const length = this.heap.length\n let currentIndex = index\n\n while (true) {\n let smallest = currentIndex\n const left = currentIndex * 2 + 1\n const right = currentIndex * 2 + 2\n const smallestNode = this.heap[smallest]\n const leftNode = this.heap[left]\n const rightNode = this.heap[right]\n\n if (smallestNode === undefined) {\n break\n }\n\n // 先用左子节点与当前最小值比较。\n if (left < length && leftNode !== undefined && leftNode.endAt < smallestNode.endAt) {\n smallest = left\n }\n\n const nextSmallestNode = this.heap[smallest]\n\n // 再基于最新的最小候选与右子节点比较。\n if (\n right < length &&\n rightNode !== undefined &&\n nextSmallestNode !== undefined &&\n rightNode.endAt < nextSmallestNode.endAt\n ) {\n smallest = right\n }\n\n if (smallest === currentIndex) {\n break\n }\n\n this.swap(currentIndex, smallest)\n currentIndex = smallest\n }\n }\n}\n",
|
|
159
|
-
"import { EventManager } from \"#Source/event/index.ts\"\n\nimport type { BaseEvents, SubscriberEntry } from \"#Source/event/index.ts\"\nimport type { ExpirationManager, ExpirationManagerEvents } from \"./expiration-manager.ts\"\n\n/**\n * 表示一个以秒为单位的剩余时长。\n */\nexport type RemainingTime = number\n\n/**\n * 描述一组按名称索引的派生剩余时长字典。\n */\nexport type RemainingDict<ExpirationName extends string> = {\n [K in ExpirationName]?: RemainingTime | undefined\n}\n\n/**\n * 描述 `RemainingManager` 对外发出的事件表。\n */\nexport interface RemainingManagerEvents<ExpirationName extends string> extends BaseEvents {\n /**\n * 在剩余时间快照发生变化时发出最新结果。\n */\n remaining: (remaining: RemainingDict<ExpirationName>) => void\n}\n\n/**\n * 描述创建 `RemainingManager` 时可用的配置项。\n */\nexport interface RemainingManagerOptions<ExpirationName extends string> {\n /**\n * 提供过期状态真相来源的过期管理器。\n */\n expirationManager: ExpirationManager<ExpirationName>\n\n /**\n * 控制是否在创建后立即启用周期性剩余时间检查。\n */\n enabled?: boolean | undefined\n}\n\nconst isRemainingDictEqual = <ExpirationName extends string>(\n left: RemainingDict<ExpirationName>,\n right: RemainingDict<ExpirationName>,\n): boolean => {\n const leftKeys = Object.keys(left)\n const rightKeys = Object.keys(right)\n\n if (leftKeys.length !== rightKeys.length) {\n return false\n }\n\n for (const key of leftKeys) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const expirationName = key as ExpirationName\n\n if (left[expirationName] !== right[expirationName]) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * 管理基于 `ExpirationManager` 状态派生出的剩余时间查询与周期性通知。\n *\n * `RemainingManager` 不拥有独立的过期真相来源,而是始终从 `ExpirationManager`\n * 读取当前过期状态,并在需要时把这些状态换算为以秒为单位的剩余值。\n *\n * 这里的 `enabled` 只影响内部的周期性检查是否运行,不影响过期状态变化时\n * 立即触发的派生结果更新。\n */\nexport class RemainingManager<ExpirationName extends string = string> {\n readonly expirationManager: ExpirationManager<ExpirationName>\n readonly event: EventManager<RemainingManagerEvents<ExpirationName>>\n\n private enabled: boolean\n private lastEmittedRemainingSnapshot: RemainingDict<ExpirationName>\n private timer: ReturnType<typeof setInterval> | null\n private terminated: boolean\n private readonly expirationStateSubscriberEntry: SubscriberEntry<\n ExpirationManagerEvents<ExpirationName>,\n \"expirationState\"\n >\n\n constructor(options: RemainingManagerOptions<ExpirationName>) {\n const { expirationManager, enabled } = options\n\n this.expirationManager = expirationManager\n this.event = new EventManager()\n\n this.enabled = enabled === true\n this.lastEmittedRemainingSnapshot = {}\n this.timer = null\n this.terminated = false\n this.expirationStateSubscriberEntry = this.expirationManager.event.subscribe(\n \"expirationState\",\n (): void => {\n this.emit()\n },\n )\n\n if (this.enabled === true) {\n this.resume()\n }\n }\n\n /**\n * 返回某个具名过期项当前的秒级剩余时长。\n *\n * 当目标不存在,或其状态不是 `active` 时,返回 `undefined`。\n */\n getRemaining(name: ExpirationName): number | undefined {\n const expirationState = this.expirationManager.getExpirationState(name)\n if (expirationState === undefined) {\n return undefined\n }\n if (expirationState.state !== \"active\") {\n return undefined\n }\n\n return Math.max(0, Math.ceil((expirationState.endAt - this.expirationManager.getNow()) / 1_000))\n }\n\n /**\n * 返回当前所有活跃过期项的秒级剩余时长快照。\n */\n getRemainingSnapshot(): RemainingDict<ExpirationName> {\n const expirationDict = this.expirationManager.getExpirationSnapshot()\n const result: RemainingDict<ExpirationName> = {}\n\n for (const name in expirationDict) {\n if (Object.hasOwn(expirationDict, name) === false) {\n continue\n }\n\n const expirationName = name as ExpirationName\n const remaining = this.getRemaining(expirationName)\n\n if (remaining === undefined) {\n continue\n }\n\n result[expirationName] = remaining\n }\n\n return result\n }\n\n /**\n * 在剩余时间快照发生变化时发出一次 `remaining` 事件。\n *\n * 若当前实例已经终止,或新旧快照完全一致,则不会重复发出事件。\n */\n emit(): void {\n if (this.terminated === true) {\n return\n }\n\n const remainingSnapshot = this.getRemainingSnapshot()\n if (isRemainingDictEqual(this.lastEmittedRemainingSnapshot, remainingSnapshot) === true) {\n return\n }\n\n this.lastEmittedRemainingSnapshot = remainingSnapshot\n this.event.emit(\"remaining\", remainingSnapshot)\n }\n\n /**\n * 启用周期性剩余时间检查。\n *\n * 这不会跳过过期状态变更时本来就会触发的即时派生通知。\n */\n start(): void {\n if (this.terminated === true) {\n return\n }\n\n this.enabled = true\n this.resume()\n }\n\n /**\n * 停止周期性剩余时间检查,并将启用标记设为关闭。\n */\n stop(): void {\n this.enabled = false\n\n if (this.timer === null) {\n return\n }\n\n clearInterval(this.timer)\n this.timer = null\n }\n\n /**\n * 暂停当前周期性定时器,但保留启用标记。\n *\n * 这通常用于由外层过期管理器在暂停期间临时停止派生检查,\n * 以便之后通过 `resume()` 继续运行。\n */\n pause(): void {\n if (this.timer !== null) {\n clearInterval(this.timer)\n this.timer = null\n }\n }\n\n /**\n * 在实例已启用且尚未终止时恢复周期性剩余时间检查。\n */\n resume(): void {\n if (this.terminated === true || this.enabled !== true || this.timer !== null) {\n return\n }\n\n this.timer = setInterval(() => {\n if (Object.keys(this.expirationManager.getExpirationSnapshot()).length === 0) {\n return\n }\n\n this.emit()\n }, 1_000)\n }\n\n /**\n * 终止实例并释放订阅与定时器资源。\n */\n terminate(): void {\n if (this.terminated === true) {\n return\n }\n\n this.terminated = true\n this.expirationStateSubscriberEntry.unsubscribe()\n this.stop()\n }\n}\n",
|
|
160
|
-
"import type { BaseEvents } from \"#Source/event/index.ts\"\nimport { EventManager } from \"#Source/event/index.ts\"\n\nimport { MinHeap } from \"./min-heap.ts\"\nimport { RemainingManager } from \"./remaining-manager.ts\"\n\nconst MAX_SCHEDULER_DELAY = 2_147_483_647\n\n/**\n * 提供当前墙钟时间(wall-clock time)的毫秒值。\n */\nexport interface ExpirationManagerClock {\n /**\n * 返回当前时间戳,单位为毫秒。\n */\n now(): number\n}\n\n/**\n * 表示一个以毫秒为单位的过期时点。\n */\nexport type ExpirationEndAt = number\n\n/**\n * 描述一组按过期名称索引的过期时点字典。\n */\nexport type ExpirationDict<ExpirationName extends string> = {\n [K in ExpirationName]?: ExpirationEndAt | undefined\n}\n\n/**\n * 描述 `ExpirationManager` 对外发出的事件表。\n *\n * 当管理器处于暂停状态时,事件不会立即发出,而是延后并折叠为恢复时的最新快照。\n */\nexport interface ExpirationManagerEvents<ExpirationName extends string> extends BaseEvents {\n /**\n * 在保留的过期状态快照发生可观察变化时发出最新结果。\n */\n expirationState: (expirationState: ExpirationState<ExpirationName>) => void\n}\n\n/**\n * Hold one coalesced emission payload derived from current manager state.\n */\ninterface ExpirationEmission<ExpirationName extends string> {\n expirationState: ExpirationState<ExpirationName>\n}\n\n/**\n * 描述一条被管理器保留的过期状态记录。\n */\nexport interface ExpirationStateItem<ExpirationName extends string> {\n /**\n * 该过期项的名称。\n */\n name: ExpirationName\n\n /**\n * 该过期项对应的绝对到期时点,单位为毫秒。\n */\n endAt: ExpirationEndAt\n\n /**\n * 该过期项当前的状态。\n */\n state: \"active\" | \"expired\" | \"removed\"\n}\n\n/**\n * 描述一组按过期名称索引的保留状态字典。\n */\nexport type ExpirationState<ExpirationName extends string> = {\n [K in ExpirationName]?: ExpirationStateItem<ExpirationName> | undefined\n}\n\n/**\n * 描述创建 `ExpirationManager` 时可用的配置项。\n */\nexport interface ExpirationManagerOptions<ExpirationName extends string> {\n /**\n * 用于初始化管理器的过期项集合。\n */\n initialExpirations?: ExpirationDict<ExpirationName> | undefined\n\n /**\n * 控制是否同时启用派生剩余时间管理器的周期性检查。\n */\n enableRemainingManager?: boolean | undefined\n\n /**\n * 提供自定义时间来源;未提供时默认使用 `Date.now()`。\n */\n clock?: ExpirationManagerClock | undefined\n}\n\n/**\n * 管理具名过期项的状态、事件与定时调度。\n *\n * `ExpirationManager` owns the source-of-truth expiration state dictionary and uses a `MinHeap`\n * to keep the nearest `endAt` value at the top. That makes rescheduling efficient because\n * the manager only needs to inspect the heap root to determine the next wake-up time,\n * instead of scanning all expiration entries on every update.\n *\n * When the next expiration is farther away than the platform timer limit, scheduling is\n * performed in bounded segments until the target timestamp becomes reachable.\n *\n * Pausing does not freeze time or reject writes. State updates may continue while paused,\n * but expiration events and derived remaining events are deferred. Multiple paused-time\n * state changes are coalesced into the latest snapshot and flushed after `resume()`.\n *\n * Remaining time is treated as derived state rather than primary state. The companion\n * `RemainingManager` reads snapshots from `ExpirationManager`, computes second-based\n * remaining values on demand, and can periodically emit those derived values without\n * duplicating expiration ownership.\n */\nexport class ExpirationManager<ExpirationName extends string = string> {\n private expirationState: ExpirationState<ExpirationName>\n\n private clock: ExpirationManagerClock\n private heap: MinHeap<ExpirationName>\n private schedulerTimer: ReturnType<typeof setTimeout> | null\n private paused: boolean\n private terminated: boolean\n private expirationEmissionQueue: Array<ExpirationEmission<ExpirationName>>\n private flushingExpirationEmissionQueue: boolean\n\n readonly event: EventManager<ExpirationManagerEvents<ExpirationName>>\n readonly remainingManager: RemainingManager<ExpirationName>\n\n constructor(options: ExpirationManagerOptions<ExpirationName>) {\n const { initialExpirations, enableRemainingManager, clock } = options\n const initialExpirationSource: ExpirationDict<ExpirationName> = initialExpirations ?? {}\n\n this.expirationState = {}\n\n this.clock = clock ?? {\n now: (): number => Date.now()\n }\n this.heap = new MinHeap()\n this.schedulerTimer = null\n this.paused = false\n this.terminated = false\n this.expirationEmissionQueue = []\n this.flushingExpirationEmissionQueue = false\n\n this.event = new EventManager()\n this.remainingManager = new RemainingManager<ExpirationName>({\n expirationManager: this,\n enabled: enableRemainingManager\n })\n\n this.updateExpirationBatch(initialExpirationSource)\n }\n\n /**\n * 返回当前管理器使用的墙钟时间。\n */\n getNow(): number {\n return this.clock.now()\n }\n\n /**\n * 判断某个具名过期项当前是否仍有保留状态。\n *\n * 只要该名称当前处于 `active`、`expired` 或 `removed` 任一保留状态,就会返回 `true`。\n */\n hasExpiration(name: ExpirationName): boolean {\n return this.expirationState[name] !== undefined\n }\n\n /**\n * 返回某个具名过期项的状态快照。\n */\n getExpirationState(name: ExpirationName): ExpirationStateItem<ExpirationName> | undefined {\n return structuredClone(this.expirationState[name])\n }\n\n /**\n * 返回当前所有活跃过期项的绝对到期时点快照。\n */\n getExpirationSnapshot(): ExpirationDict<ExpirationName> {\n const expirationDict: ExpirationDict<ExpirationName> = {}\n\n for (const name of Object.keys(this.expirationState)) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const expirationName = name as ExpirationName\n const expirationState = this.expirationState[expirationName]\n\n if (expirationState === undefined) {\n continue\n }\n if (expirationState.state !== \"active\") {\n continue\n }\n\n expirationDict[expirationName] = expirationState.endAt\n }\n\n return expirationDict\n }\n\n /**\n * Check whether event emission is currently blocked.\n */\n private isEmissionBlocked(): boolean {\n return this.terminated === true || this.paused === true\n }\n\n /**\n * Flush queued state emissions in order until emission becomes blocked again.\n */\n private flushExpirationEmissionQueue(): void {\n if (this.isEmissionBlocked() === true) {\n return\n }\n if (this.flushingExpirationEmissionQueue === true) {\n return\n }\n\n this.flushingExpirationEmissionQueue = true\n\n try {\n while (true) {\n if (this.isEmissionBlocked() === true) {\n return\n }\n\n const emission = this.expirationEmissionQueue.shift()\n if (emission === undefined) {\n return\n }\n\n this.event.emit(\"expirationState\", emission.expirationState)\n }\n } finally {\n this.flushingExpirationEmissionQueue = false\n }\n }\n\n /**\n * Build the latest event payload from current manager state.\n */\n private createExpirationEmission(): ExpirationEmission<ExpirationName> {\n return {\n expirationState: structuredClone(this.expirationState),\n }\n }\n\n /**\n * Replace any queued paused-time emission with the latest coalesced snapshot.\n */\n private replaceQueuedExpirationEmission(): void {\n const emission = this.createExpirationEmission()\n this.expirationEmissionQueue = [emission]\n }\n\n /**\n * Queue an emission for the current state.\n *\n * While paused, the queue is collapsed to a single latest snapshot so `resume()`\n * only flushes the final observable state.\n */\n private enqueueExpirationEmission(): void {\n if (this.paused === true) {\n this.replaceQueuedExpirationEmission()\n return\n }\n\n const emission = this.createExpirationEmission()\n this.expirationEmissionQueue.push(emission)\n this.flushExpirationEmissionQueue()\n }\n\n /**\n * Mark overdue active entries as expired when their stored timestamps are no longer in the future.\n */\n private updateExpired(now: number): boolean {\n let changed = false\n\n while (true) {\n const top = this.heap.peek()\n if (top === undefined || top.endAt > now) {\n return changed\n }\n\n this.heap.pop()\n const expiration = this.expirationState[top.name]\n if (expiration === undefined) {\n continue\n }\n if (expiration.state === \"active\" && expiration.endAt === top.endAt) {\n this.expirationState[top.name] = { ...expiration, state: \"expired\" }\n changed = true\n }\n }\n }\n\n private tick(): void {\n if (this.terminated === true || this.paused === true) {\n return\n }\n\n const changed = this.updateExpired(this.getNow())\n if (changed === true) {\n this.enqueueExpirationEmission()\n }\n\n this.schedule()\n }\n\n private schedule(): void {\n if (this.terminated === true || this.paused === true) {\n return\n }\n\n if (this.schedulerTimer !== null) {\n clearTimeout(this.schedulerTimer)\n this.schedulerTimer = null\n }\n\n const next = this.heap.peek()\n if (next === undefined) {\n return\n }\n\n const delay = Math.min(MAX_SCHEDULER_DELAY, Math.max(0, next.endAt - this.getNow()))\n this.schedulerTimer = setTimeout(() => this.tick(), delay)\n }\n\n private validateExpirationEndAt(endAt: number): void {\n if (Number.isFinite(endAt) !== true || endAt < 0) {\n throw new RangeError(\"Expiration endAt must be a finite timestamp greater than or equal to 0.\")\n }\n }\n\n private internalUpsertExpiration(name: ExpirationName, endAt: number, now: number): boolean {\n this.validateExpirationEndAt(endAt)\n\n const oldState = this.expirationState[name]\n const newState = { name, endAt, state: endAt <= now ? \"expired\" : \"active\" } as const\n\n if (\n oldState !== undefined &&\n oldState.name === newState.name &&\n oldState.endAt === newState.endAt &&\n oldState.state === newState.state\n ) {\n return false\n }\n\n this.expirationState[name] = newState\n this.heap.remove(name)\n if (newState.state === \"active\") {\n this.heap.push({ name, endAt })\n }\n\n return true\n }\n\n /**\n * 使用毫秒级绝对时点设置或替换一个具名过期项。\n */\n upsertExpiration(name: ExpirationName, endAt: number): void {\n if (this.terminated === true) {\n return\n }\n\n const changed = this.internalUpsertExpiration(name, endAt, this.getNow())\n if (changed === true) {\n this.enqueueExpirationEmission()\n\n this.schedule()\n }\n }\n\n /**\n * 使用毫秒级绝对时点执行一次局部批量更新。\n *\n * 对于 `dict` 中每个被显式提供的键,行为如下:\n * - 数值会把对应过期项设置或替换为给定的绝对 `endAt` 时点。\n * - 显式的 `undefined` 只会在当前状态为 `active` 时把该项标记为 `removed`。\n * - 当前已处于 `expired` 或 `removed` 的项,遇到显式 `undefined` 时保持不变。\n * - `dict` 中未出现的键不会被处理,现有状态保持不变。\n *\n * 当至少有一项真实发生变化时,会在所有显式更新完成后统一发出一次状态变化通知。\n */\n updateExpirationBatch(dict: ExpirationDict<ExpirationName>): void {\n if (this.terminated === true) {\n return\n }\n\n for (const name of Object.keys(dict)) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const expirationName = name as ExpirationName\n const endAt = dict[expirationName]\n\n if (endAt === undefined) {\n continue\n }\n\n this.validateExpirationEndAt(endAt)\n }\n\n let changed = false\n const now = this.getNow()\n for (const name of Object.keys(dict)) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const expirationName = name as ExpirationName\n const endAt = dict[expirationName]\n\n if (endAt === undefined) {\n const expiration = this.expirationState[expirationName]\n if (expiration === undefined) {\n continue\n }\n if (expiration.state === \"active\") {\n this.expirationState[expirationName] = { ...expiration, state: \"removed\" }\n this.heap.remove(expirationName)\n changed = true\n }\n\n continue\n }\n\n changed = this.internalUpsertExpiration(expirationName, endAt, now) || changed\n }\n\n if (changed === true) {\n this.enqueueExpirationEmission()\n\n this.schedule()\n }\n }\n\n /**\n * 将一个当前处于活跃状态的过期项标记为 `removed`。\n *\n * 已经处于 `expired` 或 `removed` 的项不会被再次修改。\n */\n removeExpiration(name: ExpirationName): void {\n if (this.terminated === true) {\n return\n }\n\n const expiration = this.expirationState[name]\n if (expiration === undefined) {\n return\n }\n if (expiration.state !== \"active\") {\n return\n }\n\n this.expirationState[name] = { ...expiration, state: \"removed\" }\n this.heap.remove(name)\n\n this.enqueueExpirationEmission()\n\n this.schedule()\n }\n\n /**\n * 清除所有当前状态为 `expired` 的保留项,并返回清除数量。\n */\n clearExpiredExpirations(): number {\n if (this.terminated === true) {\n return 0\n }\n\n let clearedCount = 0\n\n for (const name of Object.keys(this.expirationState)) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const expirationName = name as ExpirationName\n const expirationState = this.expirationState[expirationName]\n if (expirationState === undefined) {\n continue\n }\n if (expirationState.state !== \"expired\") {\n continue\n }\n\n this.heap.remove(expirationName)\n delete this.expirationState[expirationName]\n clearedCount = clearedCount + 1\n }\n\n if (clearedCount > 0) {\n this.enqueueExpirationEmission()\n }\n\n return clearedCount\n }\n\n /**\n * 清除所有当前状态为 `removed` 的保留项,并返回清除数量。\n */\n clearRemovedExpirations(): number {\n if (this.terminated === true) {\n return 0\n }\n\n let clearedCount = 0\n\n for (const name of Object.keys(this.expirationState)) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const expirationName = name as ExpirationName\n const expirationState = this.expirationState[expirationName]\n if (expirationState === undefined) {\n continue\n }\n if (expirationState.state !== \"removed\") {\n continue\n }\n\n this.heap.remove(expirationName)\n delete this.expirationState[expirationName]\n clearedCount = clearedCount + 1\n }\n\n if (clearedCount > 0) {\n this.enqueueExpirationEmission()\n }\n\n return clearedCount\n }\n\n /**\n * 暂停过期调度与事件发出。\n *\n * 这不会冻结绝对到期时点,也不会阻止状态写入。暂停期间时间仍会继续流逝,\n * 只是过期推进与事件通知会延后到后续恢复时再统一处理。\n */\n pause(): void {\n if (this.terminated === true) {\n return\n }\n\n this.paused = true\n\n if (this.schedulerTimer !== null) {\n clearTimeout(this.schedulerTimer)\n this.schedulerTimer = null\n }\n\n this.remainingManager.pause()\n }\n\n /**\n * 恢复过期调度,并刷新暂停期间积累的最新状态通知。\n *\n * 在暂停期间已经越过其绝对 `endAt` 的项,可能会在恢复后立即转为 `expired`。\n * 若暂停期间发生过多次状态变更,对外只会发出折叠后的最新快照。\n */\n resume(): void {\n if (this.terminated === true) {\n return\n }\n if (this.paused !== true) {\n return\n }\n\n this.paused = false\n\n const changed = this.updateExpired(this.getNow())\n if (changed === true) {\n this.replaceQueuedExpirationEmission()\n }\n\n this.schedule()\n this.remainingManager.resume()\n this.flushExpirationEmissionQueue()\n }\n\n /**\n * 终止当前管理器及其派生剩余时间管理器,并释放它们拥有的定时资源。\n */\n terminate(): void {\n if (this.terminated === true) {\n return\n }\n\n this.terminated = true\n this.paused = true\n\n if (this.schedulerTimer !== null) {\n clearTimeout(this.schedulerTimer)\n this.schedulerTimer = null\n }\n\n this.expirationEmissionQueue = []\n this.remainingManager.terminate()\n }\n}\n",
|
|
161
|
-
"/**\n * 把可读的失败原因拼接到错误消息中。\n *\n * 这里尽量保留基础类型与 `Error.message`,避免把复杂对象直接序列化成噪音文本。\n */\nconst internalAppendReasonMessage = (message: string, reason: unknown): string => {\n if (reason === undefined) {\n return message\n }\n\n if (reason instanceof Error && reason.message !== \"\") {\n return `${message} ${reason.message}`\n }\n\n if (\n typeof reason === \"string\"\n || typeof reason === \"number\"\n || typeof reason === \"boolean\"\n || typeof reason === \"bigint\"\n || typeof reason === \"symbol\"\n ) {\n return `${message} ${String(reason)}`\n }\n\n return message\n}\n\n/**\n * 表示协调原语等待过程中的中止错误。\n */\nexport class CoordinationAbortError extends Error {\n /**\n * 触发中止的操作名称。\n */\n readonly operation: string\n\n /**\n * 中止信号携带的原始原因。\n */\n readonly reason: unknown\n\n /**\n * 创建一个表示等待被主动中止的错误。\n */\n constructor(operation: string, reason: unknown) {\n super(internalAppendReasonMessage(`${operation} aborted.`, reason))\n this.name = \"CoordinationAbortError\"\n Object.setPrototypeOf(this, new.target.prototype)\n this.operation = operation\n this.reason = reason\n }\n}\n\n/**\n * 表示协调原语等待过程中的超时错误。\n */\nexport class CoordinationTimeoutError extends Error {\n /**\n * 发生超时的操作名称。\n */\n readonly operation: string\n\n /**\n * 触发超时时等待的毫秒数。\n */\n readonly timeout: number\n\n /**\n * 创建一个表示等待超时的错误。\n */\n constructor(operation: string, timeout: number) {\n super(`${operation} timeout after ${timeout}ms.`)\n this.name = \"CoordinationTimeoutError\"\n Object.setPrototypeOf(this, new.target.prototype)\n this.operation = operation\n this.timeout = timeout\n }\n}\n\n/**\n * 表示栅栏某一代被参与者破坏后的错误。\n */\nexport class BrokenBarrierError extends Error {\n /**\n * 导致当前栅栏代失效的原始原因。\n */\n readonly reason: unknown\n\n /**\n * 创建一个表示“当前代已被其他参与者破坏”的错误。\n */\n constructor(reason: unknown) {\n super(internalAppendReasonMessage(\"Barrier generation was broken by another participant.\", reason))\n this.name = \"BrokenBarrierError\"\n Object.setPrototypeOf(this, new.target.prototype)\n this.reason = reason\n }\n}\n",
|
|
162
|
-
"/**\n * 表示可挂入等待队列的节点最小结构。\n *\n * 队列本身不关心节点承载的业务数据,只要求节点能记录自己是否在队列中,以及前后相邻节点。\n */\nexport interface InternalWaitQueueEntry<Entry extends InternalWaitQueueEntry<Entry>> {\n isQueued: boolean\n previous: Entry | undefined\n next: Entry | undefined\n}\n\n/**\n * 表示面向等待者节点的双向链表队列。\n */\nexport class InternalWaitQueue<Entry extends InternalWaitQueueEntry<Entry>> {\n private head: Entry | undefined\n private tail: Entry | undefined\n\n private count: number\n\n constructor() {\n this.head = undefined\n this.tail = undefined\n this.count = 0\n }\n\n /**\n * 查看当前队头节点但不移除。\n */\n peek(): Entry | undefined {\n return this.head\n }\n\n /**\n * 读取队列中的节点数量。\n */\n getCount(): number {\n return this.count\n }\n\n /**\n * 判断队列是否为空。\n */\n isEmpty(): boolean {\n return this.head === undefined\n }\n\n /**\n * 把节点追加到队尾。\n */\n enqueue(entry: Entry): void {\n entry.previous = this.tail\n entry.next = undefined\n entry.isQueued = true\n\n if (this.tail === undefined) {\n this.head = entry\n }\n else {\n this.tail.next = entry\n }\n\n this.tail = entry\n this.count = this.count + 1\n }\n\n /**\n * 从队列中移除指定节点。\n *\n * 该操作不要求节点位于队头,因此适合被 timeout 或 abort 的等待者直接自移除。\n */\n remove(entry: Entry): void {\n if (entry.isQueued === false) {\n return\n }\n\n if (entry.previous === undefined) {\n this.head = entry.next\n }\n else {\n entry.previous.next = entry.next\n }\n\n if (entry.next === undefined) {\n this.tail = entry.previous\n }\n else {\n entry.next.previous = entry.previous\n }\n\n entry.previous = undefined\n entry.next = undefined\n entry.isQueued = false\n this.count = this.count - 1\n }\n\n /**\n * 取出并返回队头节点。\n */\n shift(): Entry | undefined {\n const head = this.head\n if (head === undefined) {\n return undefined\n }\n\n this.remove(head)\n return head\n }\n}\n",
|
|
163
|
-
"import { CoordinationAbortError, CoordinationTimeoutError } from \"../errors.ts\"\n\n/**\n * 表示等待节点上与 timeout / abort 绑定相关的内部状态。\n */\nexport interface InternalWaitConstraintsEntry {\n timeoutId: ReturnType<typeof setTimeout> | undefined\n abortSignal: AbortSignal | undefined\n abortListener: (() => void) | undefined\n}\n\n/**\n * 表示等待约束的输入参数。\n */\nexport interface InternalWaitConstraintsOptions {\n timeout?: number | undefined\n abortSignal?: AbortSignal | undefined\n}\n\n/**\n * 表示将等待约束绑定到某个节点时需要提供的回调集合。\n */\nexport interface InternalWaitConstraintBindings {\n abortOperation: string\n timeoutOperation: string\n onAbort: (error: CoordinationAbortError) => void\n onTimeout: (error: CoordinationTimeoutError) => void\n}\n\n/**\n * 断言 timeout 参数是合法的非负有限数值。\n */\nexport const internalAssertTimeoutOption = (operation: string, timeout: number | undefined): void => {\n if (timeout === undefined) {\n return\n }\n\n if (Number.isFinite(timeout) === false || timeout < 0) {\n throw new RangeError(`${operation} timeout must be a finite number greater than or equal to 0.`)\n }\n}\n\n/**\n * 如果传入的 `AbortSignal` 已经处于中止状态,则立即抛出中止错误。\n */\nexport const internalThrowIfAborted = (operation: string, abortSignal: AbortSignal | undefined): void => {\n if (abortSignal?.aborted === true) {\n throw new CoordinationAbortError(operation, abortSignal.reason)\n }\n}\n\n/**\n * 清理已经绑定到等待节点上的超时器与中止监听器。\n *\n * 该函数应当在节点成功结算或失败结算时都被调用,以避免悬挂的定时器与事件监听器泄漏。\n */\nexport const internalCleanupWaitConstraints = (entry: InternalWaitConstraintsEntry): void => {\n if (entry.timeoutId !== undefined) {\n clearTimeout(entry.timeoutId)\n entry.timeoutId = undefined\n }\n\n if (entry.abortSignal !== undefined && entry.abortListener !== undefined) {\n entry.abortSignal.removeEventListener(\"abort\", entry.abortListener)\n entry.abortSignal = undefined\n entry.abortListener = undefined\n }\n}\n\n/**\n * 把 timeout 与 abort 约束绑定到某个等待节点。\n *\n * 绑定本身只负责注册外部约束,真正如何让节点失败由调用方通过 `bindings` 中的回调决定。\n */\nexport const internalBindWaitConstraints = (\n entry: InternalWaitConstraintsEntry,\n options: InternalWaitConstraintsOptions,\n bindings: InternalWaitConstraintBindings,\n): void => {\n const { abortSignal, timeout } = options\n\n if (abortSignal !== undefined) {\n entry.abortSignal = abortSignal\n entry.abortListener = (): void => {\n bindings.onAbort(new CoordinationAbortError(bindings.abortOperation, abortSignal.reason))\n }\n abortSignal.addEventListener(\"abort\", entry.abortListener, { once: true })\n }\n\n if (timeout !== undefined) {\n entry.timeoutId = setTimeout(() => {\n bindings.onTimeout(new CoordinationTimeoutError(bindings.timeoutOperation, timeout))\n }, timeout)\n }\n}\n",
|
|
164
|
-
"import type { InternalWaitQueueEntry } from \"./internal/wait-queue.ts\"\nimport type { InternalWaitConstraintsEntry, InternalWaitConstraintsOptions } from \"./internal/wait-constraints.ts\"\n\nimport { InternalWaitQueue } from \"./internal/wait-queue.ts\"\nimport { BrokenBarrierError, CoordinationAbortError } from \"./errors.ts\"\nimport { internalAssertTimeoutOption, internalBindWaitConstraints, internalCleanupWaitConstraints } from \"./internal/wait-constraints.ts\"\n\n/**\n * 断言栅栏的参与者数量是一个有效的正整数。\n */\nconst internalAssertParticipantCount = (participantCount: number): void => {\n if (\n Number.isFinite(participantCount) === false\n || Number.isInteger(participantCount) === false\n || participantCount <= 0\n ) {\n throw new RangeError(\"Barrier participantCount must be a finite integer greater than 0.\")\n }\n}\n\n/**\n * 表示某一代栅栏中单个等待者对应的内部节点。\n *\n * 每个节点既要能挂入等待队列,也要能绑定超时与中止约束,最终在整代完成或整代破坏时统一结算。\n */\ninterface InternalBarrierQueueEntry extends InternalWaitQueueEntry<InternalBarrierQueueEntry>, InternalWaitConstraintsEntry {\n resolve: (generation: number) => void\n reject: (reason: unknown) => void\n isSettled: boolean\n}\n\n/**\n * 表示调用 `Barrier.signalAndWait()` 时可选的等待约束。\n */\nexport interface BarrierWaitOptions extends InternalWaitConstraintsOptions {\n /**\n * 单次等待允许持续的最长时间,单位为毫秒。\n */\n timeout?: number | undefined\n\n /**\n * 用于主动中止当前等待的信号。\n */\n abortSignal?: AbortSignal | undefined\n}\n\n/**\n * 表示一个循环栅栏,用于让固定数量的参与者在同一同步点会合。\n *\n * 每次当所有参与者都调用 `signalAndWait()` 后,当前这一代会被一次性完成,\n * 所有等待者都会收到相同的代号,然后栅栏自动进入下一代继续复用。\n */\nexport class Barrier {\n private readonly queue: InternalWaitQueue<InternalBarrierQueueEntry>\n\n private internalArrivedCount: number\n\n private internalGeneration: number\n\n private readonly participantCount: number\n\n /**\n * 创建一个需要固定参与者数量才能完成一代的栅栏。\n */\n constructor(participantCount: number) {\n internalAssertParticipantCount(participantCount)\n\n this.queue = new InternalWaitQueue<InternalBarrierQueueEntry>()\n this.internalArrivedCount = 0\n this.internalGeneration = 0\n this.participantCount = participantCount\n }\n\n /**\n * 读取每一代完成所需的参与者总数。\n */\n getParticipantCount(): number {\n return this.participantCount\n }\n\n /**\n * 读取当前所处的代号。\n *\n * 该值会在一代正常完成或被破坏后递增。\n */\n getGeneration(): number {\n return this.internalGeneration\n }\n\n /**\n * 读取当前这一代中仍在等待其余参与者的任务数量。\n */\n getPendingCount(): number {\n return this.queue.getCount()\n }\n\n /**\n * 读取当前这一代距离完成还差多少参与者。\n */\n getRemainingCount(): number {\n return this.participantCount - this.internalArrivedCount\n }\n\n /**\n * 以成功状态完成当前代。\n *\n * 完成时会先重置计数并推进代号,再唤醒所有尚未结算的等待者,确保下一代可以立即开始接收新的参与者。\n */\n private completeGeneration(completedGeneration: number): void {\n this.internalArrivedCount = 0\n this.internalGeneration = this.internalGeneration + 1\n\n while (this.queue.isEmpty() === false) {\n const entry = this.queue.shift()\n if (entry === undefined) {\n return\n }\n\n if (entry.isSettled === true) {\n continue\n }\n\n entry.isSettled = true\n internalCleanupWaitConstraints(entry)\n entry.resolve(completedGeneration)\n }\n }\n\n /**\n * 以失败状态破坏当前代。\n *\n * 触发 abort 或 timeout 的参与者收到其原始错误,其余同代等待者统一收到 `BrokenBarrierError`,\n * 这样调用方可以区分“我自己失败了”与“别人导致这一代失效”。\n */\n private breakGeneration(failingEntry: InternalBarrierQueueEntry, reason: unknown): void {\n if (failingEntry.isSettled === true) {\n return\n }\n\n const brokenReason = new BrokenBarrierError(reason)\n this.internalArrivedCount = 0\n this.internalGeneration = this.internalGeneration + 1\n\n while (this.queue.isEmpty() === false) {\n const entry = this.queue.shift()\n if (entry === undefined) {\n return\n }\n\n if (entry.isSettled === true) {\n continue\n }\n\n entry.isSettled = true\n internalCleanupWaitConstraints(entry)\n\n if (entry === failingEntry) {\n entry.reject(reason)\n }\n else {\n entry.reject(brokenReason)\n }\n }\n }\n\n /**\n * 声明当前参与者已经到达同步点,并等待整代完成。\n *\n * 返回值是本次完成时对应的代号;如果本调用导致最后一个参与者到达,则会立即完成整代并同步返回。\n */\n async signalAndWait(options: BarrierWaitOptions = {}): Promise<number> {\n internalAssertTimeoutOption(\"Barrier wait\", options.timeout)\n\n if (options.abortSignal?.aborted === true) {\n throw new CoordinationAbortError(\"Barrier wait\", options.abortSignal.reason)\n }\n\n const currentGeneration = this.internalGeneration\n this.internalArrivedCount = this.internalArrivedCount + 1\n\n if (this.internalArrivedCount === this.participantCount) {\n this.completeGeneration(currentGeneration)\n return currentGeneration\n }\n\n const generation = await new Promise<number>((resolve, reject) => {\n const entry: InternalBarrierQueueEntry = {\n resolve,\n reject,\n isSettled: false,\n isQueued: false,\n previous: undefined,\n next: undefined,\n timeoutId: undefined,\n abortSignal: undefined,\n abortListener: undefined,\n }\n\n internalBindWaitConstraints(entry, options, {\n abortOperation: \"Barrier wait\",\n timeoutOperation: \"Barrier wait\",\n onAbort: error => {\n this.breakGeneration(entry, error)\n },\n onTimeout: error => {\n this.breakGeneration(entry, error)\n },\n })\n this.queue.enqueue(entry)\n })\n\n return generation\n }\n}\n",
|
|
165
|
-
"import type { InternalWaitQueueEntry } from \"./internal/wait-queue.ts\"\nimport type { InternalWaitConstraintsEntry, InternalWaitConstraintsOptions } from \"./internal/wait-constraints.ts\"\n\nimport { InternalWaitQueue } from \"./internal/wait-queue.ts\"\nimport {\n internalAssertTimeoutOption,\n internalBindWaitConstraints,\n internalCleanupWaitConstraints,\n internalThrowIfAborted,\n} from \"./internal/wait-constraints.ts\"\n\n/**\n * 断言闭锁初始计数为合法的非负整数。\n */\nconst internalAssertInitialCount = (count: number): void => {\n if (\n Number.isFinite(count) === false\n || Number.isInteger(count) === false\n || count < 0\n ) {\n throw new RangeError(\"CountDownLatch initialCount must be a finite integer greater than or equal to 0.\")\n }\n}\n\n/**\n * 断言单次递减步长为合法的正整数。\n */\nconst internalAssertDelta = (count: number): void => {\n if (\n Number.isFinite(count) === false\n || Number.isInteger(count) === false\n || count <= 0\n ) {\n throw new RangeError(\"CountDownLatch count must be a finite integer greater than 0.\")\n }\n}\n\n/**\n * 表示 `CountDownLatch` 等待者在内部队列中的节点。\n */\ninterface InternalCountDownLatchQueueEntry extends InternalWaitQueueEntry<InternalCountDownLatchQueueEntry>, InternalWaitConstraintsEntry {\n resolve: () => void\n reject: (reason: unknown) => void\n isSettled: boolean\n}\n\n/**\n * 表示调用 `CountDownLatch.wait()` 时可选的等待约束。\n */\nexport interface CountDownLatchWaitOptions extends InternalWaitConstraintsOptions {\n /**\n * 等待闭锁打开的最长时间,单位为毫秒。\n */\n timeout?: number | undefined\n\n /**\n * 用于主动取消等待的信号。\n */\n abortSignal?: AbortSignal | undefined\n}\n\n/**\n * 表示一个倒计时闭锁。\n *\n * 闭锁在剩余计数降到 0 前保持关闭,所有等待者都会被挂起;\n * 一旦打开,当前及后续等待都会立即通过,且该实例不会再次关闭。\n */\nexport class CountDownLatch {\n private readonly queue: InternalWaitQueue<InternalCountDownLatchQueueEntry>\n\n private internalRemainingCount: number\n\n /**\n * 使用给定初始计数创建闭锁。\n */\n constructor(initialCount: number) {\n internalAssertInitialCount(initialCount)\n\n this.queue = new InternalWaitQueue<InternalCountDownLatchQueueEntry>()\n this.internalRemainingCount = initialCount\n }\n\n /**\n * 判断闭锁是否已经打开。\n */\n isOpen(): boolean {\n return this.internalRemainingCount === 0\n }\n\n /**\n * 以同步方式检测当前是否可以继续执行而无需等待。\n */\n tryWait(): boolean {\n return this.internalRemainingCount === 0\n }\n\n /**\n * 读取距离打开闭锁还差多少次 `countDown()`。\n */\n getRemainingCount(): number {\n return this.internalRemainingCount\n }\n\n /**\n * 读取当前挂起的等待者数量。\n */\n getPendingCount(): number {\n return this.queue.getCount()\n }\n\n /**\n * 在闭锁打开时一次性唤醒全部等待者。\n */\n private resolveAll(): void {\n while (this.queue.isEmpty() === false) {\n const entry = this.queue.shift()\n if (entry === undefined) {\n return\n }\n\n if (entry.isSettled === true) {\n continue\n }\n\n entry.isSettled = true\n internalCleanupWaitConstraints(entry)\n entry.resolve()\n }\n }\n\n /**\n * 以失败状态结束指定等待者,并从队列中摘除。\n */\n private rejectEntry(entry: InternalCountDownLatchQueueEntry, reason: unknown): void {\n if (entry.isSettled === true) {\n return\n }\n\n entry.isSettled = true\n internalCleanupWaitConstraints(entry)\n this.queue.remove(entry)\n entry.reject(reason)\n }\n\n /**\n * 将闭锁剩余计数减少指定值。\n *\n * 当剩余计数降到 0 时,所有等待者会立即被放行。\n */\n countDown(count: number = 1): number {\n internalAssertDelta(count)\n\n if (this.internalRemainingCount === 0) {\n return 0\n }\n\n this.internalRemainingCount = Math.max(0, this.internalRemainingCount - count)\n\n if (this.internalRemainingCount === 0) {\n this.resolveAll()\n }\n\n return this.internalRemainingCount\n }\n\n /**\n * `countDown()` 的语义化别名,用于强调“到达一次事件”。\n */\n arrive(count: number = 1): number {\n return this.countDown(count)\n }\n\n /**\n * 等待直到闭锁打开。\n */\n async wait(options: CountDownLatchWaitOptions = {}): Promise<void> {\n internalAssertTimeoutOption(\"CountDownLatch wait\", options.timeout)\n\n internalThrowIfAborted(\"CountDownLatch wait\", options.abortSignal)\n\n if (this.internalRemainingCount === 0) {\n return\n }\n\n await new Promise<void>((resolve, reject) => {\n const entry: InternalCountDownLatchQueueEntry = {\n resolve,\n reject,\n isSettled: false,\n isQueued: false,\n previous: undefined,\n next: undefined,\n timeoutId: undefined,\n abortSignal: undefined,\n abortListener: undefined,\n }\n\n internalBindWaitConstraints(entry, options, {\n abortOperation: \"CountDownLatch wait\",\n timeoutOperation: \"CountDownLatch wait\",\n onAbort: error => {\n this.rejectEntry(entry, error)\n },\n onTimeout: error => {\n this.rejectEntry(entry, error)\n },\n })\n this.queue.enqueue(entry)\n\n if (this.internalRemainingCount === 0) {\n this.resolveAll()\n }\n })\n }\n}\n",
|
|
166
|
-
"const INTERNAL_DEFAULT_DUPLICATE_RELEASE_MESSAGE = \"Permit release was called more than once.\"\n\n/**\n * 表示 `Permit` 在检测到重复 `release()` 误用时使用的处理函数。\n */\nexport type PermitDuplicateReleaseHandler = (message: string) => void\n\n/**\n * 表示构造 `Permit` 时的可选元信息。\n */\nexport interface PermitOptions<Details> {\n /**\n * `Permit` 被正常释放时的回调。\n */\n onRelease: () => void\n\n /**\n * 释放句柄附带的只读细节。\n */\n details?: Details | undefined\n\n /**\n * 重复释放时的可选处理器。\n */\n onDuplicateRelease?: PermitDuplicateReleaseHandler | undefined\n\n /**\n * 重复释放时的提示信息。\n */\n duplicateReleaseMessage?: string | undefined\n}\n\n/**\n * 表示与某个协调原语关联的 permit 细节。\n */\nexport interface CoordinationPermitDetails<Coordination extends string = string> {\n coordination: Coordination\n}\n\n/**\n * 表示带有模式信息的 permit 细节。\n */\nexport interface ModePermitDetails<Coordination extends string, Mode extends string>\n extends CoordinationPermitDetails<Coordination> {\n mode: Mode\n}\n\n/**\n * 表示带有 key 信息的 permit 细节。\n */\nexport interface KeyedPermitDetails<Coordination extends string, Key>\n extends CoordinationPermitDetails<Coordination> {\n key: Key\n}\n\n/**\n * 表示一次已成功获取的协调资源占用句柄。\n *\n * `Permit` 本身不负责排队或调度,它只是对“当前持有一次资源”的显式表达,\n * 并把释放动作和调试元信息封装在一起。\n */\nexport class Permit<Details = undefined> implements Disposable {\n /**\n * 创建该 permit 时附带的只读元信息。\n */\n readonly details: Details | undefined\n\n private isReleasedValue: boolean\n\n private readonly onRelease: () => void\n\n private readonly onDuplicateRelease: PermitDuplicateReleaseHandler | undefined\n\n private readonly duplicateReleaseMessage: string\n\n /**\n * 创建一个 permit,并绑定释放时需要执行的回调。\n */\n constructor(options: PermitOptions<Details>) {\n this.details = options.details\n this.isReleasedValue = false\n this.onRelease = options.onRelease\n this.onDuplicateRelease = options.onDuplicateRelease\n this.duplicateReleaseMessage = options.duplicateReleaseMessage ?? INTERNAL_DEFAULT_DUPLICATE_RELEASE_MESSAGE\n }\n\n /**\n * 读取当前 `Permit` 是否已经释放。\n */\n isReleased(): boolean {\n return this.isReleasedValue\n }\n\n /**\n * 读取当前 `Permit` 是否仍然有效。\n */\n isActive(): boolean {\n return this.isReleasedValue === false\n }\n\n /**\n * 主动释放本次占用。\n */\n release(): void {\n if (this.isReleasedValue === true) {\n this.onDuplicateRelease?.(this.duplicateReleaseMessage)\n return\n }\n\n this.isReleasedValue = true\n this.onRelease()\n }\n\n /**\n * 与其他模块保持一致的显式释放别名。\n */\n dispose(): void {\n this.release()\n }\n\n /**\n * 支持 `using` 语法自动释放。\n */\n [Symbol.dispose](): void {\n this.release()\n }\n}\n",
|
|
167
|
-
"import type { CoordinationPermitDetails } from \"./permit.ts\"\nimport type { InternalWaitQueueEntry } from \"./internal/wait-queue.ts\"\nimport type { InternalWaitConstraintsEntry, InternalWaitConstraintsOptions } from \"./internal/wait-constraints.ts\"\n\nimport { InternalWaitQueue } from \"./internal/wait-queue.ts\"\nimport { Permit } from \"./permit.ts\"\nimport {\n internalAssertTimeoutOption,\n internalBindWaitConstraints,\n internalCleanupWaitConstraints,\n internalThrowIfAborted,\n} from \"./internal/wait-constraints.ts\"\n\n/**\n * 链表形式的等待节点。\n *\n * 之所以不使用数组,是因为等待中的任务可能会被 timeout 或 abort 主动取消。\n * 使用双向链表后,任意节点都可以在 O(1) 时间内从等待队列中移除,不需要做\n * `indexOf + splice` 这样的线性扫描。\n */\ninterface InternalMutexQueueEntry extends InternalWaitQueueEntry<InternalMutexQueueEntry>, InternalWaitConstraintsEntry {\n resolve: (permit: MutexPermit) => void\n reject: (reason: unknown) => void\n isSettled: boolean\n}\n\n/**\n * 表示获取互斥锁时可选的等待控制参数。\n */\nexport interface MutexAcquireOptions extends InternalWaitConstraintsOptions {\n /**\n * 等待锁的超时时间,单位为毫秒。\n */\n timeout?: number | undefined\n\n /**\n * 等待期间使用的中止信号;一旦中止,会将本次等待从队列中移除并拒绝。\n */\n abortSignal?: AbortSignal | undefined\n}\n\n/**\n * 表示 `Mutex` 成功获取后的占用句柄。\n */\nexport type MutexPermit = Permit<CoordinationPermitDetails<\"mutex\">>\n\nconst INTERNAL_MUTEX_DUPLICATE_RELEASE_MESSAGE = \"Mutex permit release was called more than once.\"\n/**\n * 表示 `Mutex` 在检测到重复 `release()` 误用时使用的处理函数。\n */\nexport type MutexDuplicateReleaseHandler = (message: string) => void\n/**\n * 表示构造 `Mutex` 时可选的运行时配置。\n */\nexport interface MutexOptions {\n /**\n * 重复调用同一个 `release()` 时的可选处理器。\n *\n * 未提供时,`Mutex` 会保持静默;提供后,每个 `Mutex` 实例最多调用一次。\n */\n onDuplicateRelease?: MutexDuplicateReleaseHandler | undefined\n}\n\n/**\n * 表示用于串行化异步临界区的互斥锁。\n *\n * @example\n * ```\n * const mutex = new Mutex()\n * let counter = 0\n *\n * await Promise.all([\n * mutex.runExclusive(async () => {\n * const current = counter\n * await Promise.resolve()\n * counter = current + 1\n * }),\n * mutex.runExclusive(async () => {\n * const current = counter\n * await Promise.resolve()\n * counter = current + 1\n * }),\n * ])\n *\n * // Expect: 2\n * const example1 = counter\n * ```\n */\nexport class Mutex {\n /**\n * 等待队列中的每个节点都代表一个尚未拿到锁的等待者。\n */\n private readonly queue: InternalWaitQueue<InternalMutexQueueEntry>\n\n /**\n * 当前是否已有持锁者进入临界区。\n */\n private internalIsLocked: boolean\n\n /**\n * 重复 release 误用的可选处理器。\n */\n private readonly onDuplicateRelease: MutexDuplicateReleaseHandler | undefined\n\n constructor(options: MutexOptions = {}) {\n this.queue = new InternalWaitQueue<InternalMutexQueueEntry>()\n this.internalIsLocked = false\n this.onDuplicateRelease = options.onDuplicateRelease\n }\n\n /**\n * 读取当前锁是否已经被持有。\n */\n isLocked(): boolean {\n return this.internalIsLocked\n }\n\n /**\n * 读取当前等待队列中的任务数量。\n */\n getPendingCount(): number {\n return this.queue.getCount()\n }\n\n /**\n * 尝试把锁交给下一个可运行的等待者。\n *\n * 这里始终从队头取任务,保持 FIFO;若遇到已失效节点,则跳过直到找到下一个有效等待者。\n */\n private dispatch(): void {\n if (this.internalIsLocked === true) {\n return\n }\n\n while (this.queue.isEmpty() === false) {\n const nextEntry = this.queue.shift()\n if (nextEntry === undefined) {\n return\n }\n\n if (nextEntry.isSettled === true) {\n continue\n }\n\n this.internalIsLocked = true\n nextEntry.isSettled = true\n internalCleanupWaitConstraints(nextEntry)\n nextEntry.resolve(this.buildPermit())\n return\n }\n }\n\n /**\n * 为当前持锁者构造一个 permit。\n */\n private buildPermit(): MutexPermit {\n return new Permit<CoordinationPermitDetails<\"mutex\">>({\n details: { coordination: \"mutex\" },\n duplicateReleaseMessage: INTERNAL_MUTEX_DUPLICATE_RELEASE_MESSAGE,\n onDuplicateRelease: this.onDuplicateRelease,\n onRelease: (): void => {\n this.internalIsLocked = false\n this.dispatch()\n },\n })\n }\n\n /**\n * 以失败状态结束一个等待节点。\n *\n * 该逻辑会统一处理:标记结束、清理约束、从队列摘除、拒绝 Promise,最后尝试继续调度后继等待者。\n */\n private rejectEntry(entry: InternalMutexQueueEntry, reason: unknown): void {\n if (entry.isSettled === true) {\n return\n }\n\n entry.isSettled = true\n internalCleanupWaitConstraints(entry)\n this.queue.remove(entry)\n entry.reject(reason)\n this.dispatch()\n }\n\n /**\n * 尝试立即获取锁;若当前不可用则返回 `undefined`。\n */\n tryAcquire(): MutexPermit | undefined {\n if (this.internalIsLocked === true || this.queue.isEmpty() === false) {\n return undefined\n }\n\n this.internalIsLocked = true\n return this.buildPermit()\n }\n\n /**\n * 等待直到成功获取锁。\n *\n * 当锁暂时不可用时,调用方会进入 FIFO 等待队列;一旦前面的持锁者释放,队头等待者会被唤醒。\n */\n async acquire(options: MutexAcquireOptions = {}): Promise<MutexPermit> {\n internalAssertTimeoutOption(\"Mutex acquire\", options.timeout)\n\n internalThrowIfAborted(\"Mutex acquire\", options.abortSignal)\n\n const immediatePermit = this.tryAcquire()\n if (immediatePermit !== undefined) {\n return immediatePermit\n }\n\n const permit = await new Promise<MutexPermit>((resolve, reject) => {\n const entry: InternalMutexQueueEntry = {\n resolve,\n reject,\n isSettled: false,\n isQueued: false,\n previous: undefined,\n next: undefined,\n timeoutId: undefined,\n abortSignal: undefined,\n abortListener: undefined,\n }\n\n internalBindWaitConstraints(entry, options, {\n abortOperation: \"Mutex acquire\",\n timeoutOperation: \"Mutex acquire\",\n onAbort: error => {\n this.rejectEntry(entry, error)\n },\n onTimeout: error => {\n this.rejectEntry(entry, error)\n },\n })\n this.queue.enqueue(entry)\n this.dispatch()\n })\n return permit\n }\n\n /**\n * 在独占锁保护下执行回调。\n *\n * 无论回调成功还是抛错,permit 都会在 `finally` 中释放,避免把锁永久占住。\n */\n async runExclusive<T>(callback: () => Promise<T>, options?: MutexAcquireOptions): Promise<T>\n async runExclusive<T>(callback: () => T, options?: MutexAcquireOptions): Promise<T>\n async runExclusive<T>(callback: () => Promise<T> | T, options: MutexAcquireOptions = {}): Promise<T> {\n const permit = await this.acquire(options)\n try {\n return await callback()\n }\n finally {\n permit.release()\n }\n }\n}\n",
|
|
168
|
-
"import type { CoordinationPermitDetails } from \"./permit.ts\"\nimport type { InternalWaitQueueEntry } from \"./internal/wait-queue.ts\"\nimport type { InternalWaitConstraintsEntry, InternalWaitConstraintsOptions } from \"./internal/wait-constraints.ts\"\n\nimport { InternalWaitQueue } from \"./internal/wait-queue.ts\"\nimport { Permit } from \"./permit.ts\"\nimport {\n internalAssertTimeoutOption,\n internalBindWaitConstraints,\n internalCleanupWaitConstraints,\n internalThrowIfAborted,\n} from \"./internal/wait-constraints.ts\"\n\nconst internalAssertMaxConcurrency = (maxConcurrency: number): void => {\n if (\n Number.isFinite(maxConcurrency) === false\n || Number.isInteger(maxConcurrency) === false\n || maxConcurrency <= 0\n ) {\n throw new RangeError(\"Semaphore maxConcurrency must be a finite integer greater than 0.\")\n }\n}\n\n/**\n * 表示 `Semaphore` 成功获取后的占用句柄。\n */\nexport type SemaphorePermit = Permit<CoordinationPermitDetails<\"semaphore\">>\n\n/**\n * 表示信号量等待队列中的单个节点。\n */\ninterface InternalSemaphoreQueueEntry extends InternalWaitQueueEntry<InternalSemaphoreQueueEntry>, InternalWaitConstraintsEntry {\n resolve: (permit: SemaphorePermit) => void\n reject: (reason: unknown) => void\n isSettled: boolean\n}\n\n/**\n * 表示调用 `Semaphore.acquire()` 时可选的等待约束。\n */\nexport interface SemaphoreAcquireOptions extends InternalWaitConstraintsOptions {\n /**\n * 单次等待允许持续的最长时间,单位为毫秒。\n */\n timeout?: number | undefined\n\n /**\n * 用于主动中止本次等待的信号。\n */\n abortSignal?: AbortSignal | undefined\n}\n\nconst INTERNAL_SEMAPHORE_DUPLICATE_RELEASE_MESSAGE = \"Semaphore permit release was called more than once.\"\n\n/**\n * 表示信号量在检测到重复释放时使用的处理函数。\n */\nexport type SemaphoreDuplicateReleaseHandler = (message: string) => void\n\n/**\n * 表示构造 `Semaphore` 时支持的配置。\n */\nexport interface SemaphoreOptions {\n /**\n * 重复调用同一个 permit 的 `release()` 时触发的可选处理器。\n */\n onDuplicateRelease?: SemaphoreDuplicateReleaseHandler | undefined\n}\n\n/**\n * 表示用于限制并发进入数量的信号量。\n *\n * @example\n * ```\n * const semaphore = new Semaphore(2)\n * let activeCount = 0\n * let peakCount = 0\n *\n * await Promise.all([\n * semaphore.runExclusive(async () => {\n * activeCount = activeCount + 1\n * peakCount = Math.max(peakCount, activeCount)\n * await Promise.resolve()\n * activeCount = activeCount - 1\n * }),\n * semaphore.runExclusive(async () => {\n * activeCount = activeCount + 1\n * peakCount = Math.max(peakCount, activeCount)\n * await Promise.resolve()\n * activeCount = activeCount - 1\n * }),\n * semaphore.runExclusive(async () => {\n * activeCount = activeCount + 1\n * peakCount = Math.max(peakCount, activeCount)\n * await Promise.resolve()\n * activeCount = activeCount - 1\n * }),\n * ])\n *\n * // Expect: 2\n * const example1 = peakCount\n * ```\n */\nexport class Semaphore {\n private readonly queue: InternalWaitQueue<InternalSemaphoreQueueEntry>\n\n private internalActiveCount: number\n\n private readonly maxConcurrency: number\n\n private readonly onDuplicateRelease: SemaphoreDuplicateReleaseHandler | undefined\n\n /**\n * 使用给定最大并发数创建信号量。\n */\n constructor(maxConcurrency: number, options: SemaphoreOptions = {}) {\n internalAssertMaxConcurrency(maxConcurrency)\n\n this.queue = new InternalWaitQueue<InternalSemaphoreQueueEntry>()\n this.internalActiveCount = 0\n this.maxConcurrency = maxConcurrency\n this.onDuplicateRelease = options.onDuplicateRelease\n }\n\n /**\n * 判断当前是否已经达到并发上限。\n */\n isSaturated(): boolean {\n return this.internalActiveCount >= this.maxConcurrency\n }\n\n /**\n * 读取当前正在占用中的数量。\n */\n getActiveCount(): number {\n return this.internalActiveCount\n }\n\n /**\n * 读取当前还剩多少可立即分配的许可。\n */\n getAvailableCount(): number {\n return this.maxConcurrency - this.internalActiveCount\n }\n\n /**\n * 读取当前等待中的任务数量。\n */\n getPendingCount(): number {\n return this.queue.getCount()\n }\n\n /**\n * 读取信号量的最大并发容量。\n */\n getMaxConcurrency(): number {\n return this.maxConcurrency\n }\n\n /**\n * 在仍有可用容量时,按 FIFO 顺序持续放行等待者。\n */\n private dispatch(): void {\n while (this.internalActiveCount < this.maxConcurrency && this.queue.isEmpty() === false) {\n const nextEntry = this.queue.shift()\n if (nextEntry === undefined) {\n return\n }\n\n if (nextEntry.isSettled === true) {\n continue\n }\n\n this.internalActiveCount = this.internalActiveCount + 1\n nextEntry.isSettled = true\n internalCleanupWaitConstraints(nextEntry)\n nextEntry.resolve(this.buildPermit())\n }\n }\n\n /**\n * 构造一个信号量 permit,并在释放时归还一个并发槽位。\n */\n private buildPermit(): SemaphorePermit {\n return new Permit<CoordinationPermitDetails<\"semaphore\">>({\n details: { coordination: \"semaphore\" },\n duplicateReleaseMessage: INTERNAL_SEMAPHORE_DUPLICATE_RELEASE_MESSAGE,\n onDuplicateRelease: this.onDuplicateRelease,\n onRelease: (): void => {\n this.internalActiveCount = this.internalActiveCount - 1\n this.dispatch()\n },\n })\n }\n\n /**\n * 以失败状态结束一个等待节点,并尝试继续调度后继等待者。\n */\n private rejectEntry(entry: InternalSemaphoreQueueEntry, reason: unknown): void {\n if (entry.isSettled === true) {\n return\n }\n\n entry.isSettled = true\n internalCleanupWaitConstraints(entry)\n this.queue.remove(entry)\n entry.reject(reason)\n this.dispatch()\n }\n\n /**\n * 尝试立即获取一个许可;若没有剩余容量或前面已有排队任务,则返回 `undefined`。\n */\n tryAcquire(): SemaphorePermit | undefined {\n if (this.internalActiveCount >= this.maxConcurrency || this.queue.isEmpty() === false) {\n return undefined\n }\n\n this.internalActiveCount = this.internalActiveCount + 1\n return this.buildPermit()\n }\n\n /**\n * 等待直到成功获取一个许可。\n */\n async acquire(options: SemaphoreAcquireOptions = {}): Promise<SemaphorePermit> {\n internalAssertTimeoutOption(\"Semaphore acquire\", options.timeout)\n\n internalThrowIfAborted(\"Semaphore acquire\", options.abortSignal)\n\n const immediatePermit = this.tryAcquire()\n if (immediatePermit !== undefined) {\n return immediatePermit\n }\n\n const permit = await new Promise<SemaphorePermit>((resolve, reject) => {\n const entry: InternalSemaphoreQueueEntry = {\n resolve,\n reject,\n isSettled: false,\n isQueued: false,\n previous: undefined,\n next: undefined,\n timeoutId: undefined,\n abortSignal: undefined,\n abortListener: undefined,\n }\n\n internalBindWaitConstraints(entry, options, {\n abortOperation: \"Semaphore acquire\",\n timeoutOperation: \"Semaphore acquire\",\n onAbort: error => {\n this.rejectEntry(entry, error)\n },\n onTimeout: error => {\n this.rejectEntry(entry, error)\n },\n })\n this.queue.enqueue(entry)\n this.dispatch()\n })\n\n return permit\n }\n\n /**\n * 在信号量许可保护下执行回调。\n */\n async runExclusive<T>(callback: () => Promise<T>, options?: SemaphoreAcquireOptions): Promise<T>\n async runExclusive<T>(callback: () => T, options?: SemaphoreAcquireOptions): Promise<T>\n async runExclusive<T>(callback: () => Promise<T> | T, options: SemaphoreAcquireOptions = {}): Promise<T> {\n const permit = await this.acquire(options)\n try {\n return await callback()\n }\n finally {\n permit.release()\n }\n }\n}\n",
|
|
169
|
-
"import type { MutexAcquireOptions, MutexOptions, MutexPermit } from \"./mutex.ts\"\nimport type { KeyedPermitDetails } from \"./permit.ts\"\n\nimport { Mutex } from \"./mutex.ts\"\nimport { Permit } from \"./permit.ts\"\n\n/**\n * 表示 `KeyedLock` 成功获取后的释放句柄。\n *\n * 句柄中会保留当前命中的 key,便于调试或上层记录持锁对象。\n */\nexport type KeyedLockPermit<Key> = Permit<KeyedPermitDetails<\"keyed-lock\", Key>>\n\n/**\n * 表示单个 key 对应的内部状态。\n *\n * 每个 key 都维护一个独立的 `Mutex`,并通过引用计数判断是否可以从状态表中清理。\n */\ninterface InternalKeyedLockState<Key> {\n key: Key\n mutex: Mutex\n referenceCount: number\n}\n\n/**\n * 表示构造 `KeyedLock` 时支持的配置。\n *\n * 当前直接复用 `Mutex` 的配置项,以保证每个 key 下的锁行为一致。\n */\nexport interface KeyedLockOptions extends MutexOptions {\n}\n\n/**\n * 表示按 key 维度拆分互斥域的锁。\n *\n * 相同 key 的任务会串行执行,不同 key 之间则互不影响,适合做资源 ID、租户 ID、文件路径等粒度的独占控制。\n */\nexport class KeyedLock<Key> {\n private readonly stateMap: Map<Key, InternalKeyedLockState<Key>>\n\n private readonly mutexOptions: MutexOptions\n\n /**\n * 创建一个按 key 分桶的互斥锁管理器。\n */\n constructor(options: KeyedLockOptions = {}) {\n this.stateMap = new Map<Key, InternalKeyedLockState<Key>>()\n this.mutexOptions = options\n }\n\n /**\n * 判断当前是否已经为指定 key 建立内部状态。\n */\n hasKey(key: Key): boolean {\n return this.stateMap.has(key)\n }\n\n /**\n * 读取当前仍被追踪的 key 数量。\n */\n getKeyCount(): number {\n return this.stateMap.size\n }\n\n /**\n * 取得指定 key 的状态;若不存在则惰性创建。\n */\n private getOrCreateState(key: Key): InternalKeyedLockState<Key> {\n const existingState = this.stateMap.get(key)\n if (existingState !== undefined) {\n return existingState\n }\n\n const state: InternalKeyedLockState<Key> = {\n key,\n mutex: new Mutex(this.mutexOptions),\n referenceCount: 0,\n }\n this.stateMap.set(key, state)\n return state\n }\n\n /**\n * 在某个 key 不再被持有且没有等待者时回收对应状态。\n */\n private cleanupState(state: InternalKeyedLockState<Key>): void {\n if (state.referenceCount !== 0) {\n return\n }\n\n if (state.mutex.isLocked() === true || state.mutex.getPendingCount() !== 0) {\n return\n }\n\n const currentState = this.stateMap.get(state.key)\n if (currentState === state) {\n this.stateMap.delete(state.key)\n }\n }\n\n /**\n * 基于底层 `Mutex` permit 构造带 key 元信息的释放句柄。\n */\n private buildPermit(state: InternalKeyedLockState<Key>, permit: MutexPermit): KeyedLockPermit<Key> {\n return new Permit<KeyedPermitDetails<\"keyed-lock\", Key>>({\n details: {\n coordination: \"keyed-lock\",\n key: state.key,\n },\n duplicateReleaseMessage: \"KeyedLock permit release was called more than once.\",\n onDuplicateRelease: this.mutexOptions.onDuplicateRelease,\n onRelease: (): void => {\n permit.release()\n state.referenceCount = state.referenceCount - 1\n this.cleanupState(state)\n },\n })\n }\n\n /**\n * 尝试立即获取指定 key 的独占锁。\n */\n tryAcquire(key: Key): KeyedLockPermit<Key> | undefined {\n const state = this.getOrCreateState(key)\n const permit = state.mutex.tryAcquire()\n\n if (permit === undefined) {\n this.cleanupState(state)\n return undefined\n }\n\n state.referenceCount = state.referenceCount + 1\n return this.buildPermit(state, permit)\n }\n\n /**\n * 等待直到成功获取指定 key 的独占锁。\n */\n async acquire(key: Key, options: MutexAcquireOptions = {}): Promise<KeyedLockPermit<Key>> {\n const state = this.getOrCreateState(key)\n state.referenceCount = state.referenceCount + 1\n\n try {\n const permit = await state.mutex.acquire(options)\n return this.buildPermit(state, permit)\n }\n catch (error) {\n state.referenceCount = state.referenceCount - 1\n this.cleanupState(state)\n throw error\n }\n }\n\n /**\n * 在指定 key 的独占锁保护下执行回调。\n */\n async runExclusive<T>(key: Key, callback: () => Promise<T>, options?: MutexAcquireOptions): Promise<T>\n async runExclusive<T>(key: Key, callback: () => T, options?: MutexAcquireOptions): Promise<T>\n async runExclusive<T>(key: Key, callback: () => Promise<T> | T, options: MutexAcquireOptions = {}): Promise<T> {\n const permit = await this.acquire(key, options)\n try {\n return await callback()\n }\n finally {\n permit.release()\n }\n }\n}\n",
|
|
170
|
-
"import type { InternalWaitQueueEntry } from \"./internal/wait-queue.ts\"\nimport type { ModePermitDetails } from \"./permit.ts\"\nimport type { InternalWaitConstraintsEntry, InternalWaitConstraintsOptions } from \"./internal/wait-constraints.ts\"\n\nimport { InternalWaitQueue } from \"./internal/wait-queue.ts\"\nimport { Permit } from \"./permit.ts\"\nimport {\n internalAssertTimeoutOption,\n internalBindWaitConstraints,\n internalCleanupWaitConstraints,\n internalThrowIfAborted,\n} from \"./internal/wait-constraints.ts\"\n\n/**\n * 表示读写锁内部使用的两种获取模式。\n */\ntype InternalReadWriteLockAcquireMode = \"read\" | \"write\"\n\n/**\n * 表示读写锁对外暴露的持锁模式。\n */\nexport type ReadWriteLockMode = InternalReadWriteLockAcquireMode\n\n/**\n * 表示 `ReadWriteLock` 成功获取后的占用句柄。\n */\nexport type ReadWriteLockPermit = Permit<ModePermitDetails<\"read-write-lock\", ReadWriteLockMode>>\n\n/**\n * 表示读写锁内部等待队列中的节点。\n */\ninterface InternalReadWriteLockQueueEntry extends InternalWaitQueueEntry<InternalReadWriteLockQueueEntry>, InternalWaitConstraintsEntry {\n mode: InternalReadWriteLockAcquireMode\n resolve: (permit: ReadWriteLockPermit) => void\n reject: (reason: unknown) => void\n isSettled: boolean\n}\n\n/**\n * 表示调用读锁或写锁获取方法时可选的等待约束。\n */\nexport interface ReadWriteLockAcquireOptions extends InternalWaitConstraintsOptions {\n /**\n * 单次等待允许持续的最长时间,单位为毫秒。\n */\n timeout?: number | undefined\n\n /**\n * 用于主动中止本次等待的信号。\n */\n abortSignal?: AbortSignal | undefined\n}\n\nconst INTERNAL_READ_WRITE_LOCK_DUPLICATE_RELEASE_MESSAGE = \"ReadWriteLock permit release was called more than once.\"\n\n/**\n * 表示读写锁在检测到重复释放时使用的处理函数。\n */\nexport type ReadWriteLockDuplicateReleaseHandler = (message: string) => void\n\n/**\n * 表示构造 `ReadWriteLock` 时支持的配置。\n */\nexport interface ReadWriteLockOptions {\n /**\n * 重复调用同一个 permit 的 `release()` 时触发的可选处理器。\n */\n onDuplicateRelease?: ReadWriteLockDuplicateReleaseHandler | undefined\n}\n\n/**\n * 表示一个读写锁。\n *\n * 读锁允许多个读取者并发进入,写锁则要求完全独占。\n * 当前实现采用 FIFO 等待队列,并保证一旦队头出现写者,后续读者不会越过该写者插队。\n */\nexport class ReadWriteLock {\n private readonly queue: InternalWaitQueue<InternalReadWriteLockQueueEntry>\n\n private internalPendingReaderCount: number\n\n private internalPendingWriterCount: number\n\n private internalActiveReaderCount: number\n\n private internalHasActiveWriter: boolean\n\n private readonly onDuplicateRelease: ReadWriteLockDuplicateReleaseHandler | undefined\n\n /**\n * 创建一个读写锁实例。\n */\n constructor(options: ReadWriteLockOptions = {}) {\n this.queue = new InternalWaitQueue<InternalReadWriteLockQueueEntry>()\n this.internalPendingReaderCount = 0\n this.internalPendingWriterCount = 0\n this.internalActiveReaderCount = 0\n this.internalHasActiveWriter = false\n this.onDuplicateRelease = options.onDuplicateRelease\n }\n\n /**\n * 判断当前是否至少存在一个活动中的读者。\n */\n isReadLocked(): boolean {\n return this.internalActiveReaderCount !== 0\n }\n\n /**\n * 判断当前是否存在活动中的写者。\n */\n isWriteLocked(): boolean {\n return this.internalHasActiveWriter\n }\n\n /**\n * 判断当前读写锁是否被任意模式占用。\n */\n isLocked(): boolean {\n return this.internalHasActiveWriter || this.internalActiveReaderCount !== 0\n }\n\n /**\n * 读取等待队列中的总任务数。\n */\n getPendingCount(): number {\n return this.queue.getCount()\n }\n\n /**\n * 读取等待中的读者数量。\n */\n getPendingReaderCount(): number {\n return this.internalPendingReaderCount\n }\n\n /**\n * 读取等待中的写者数量。\n */\n getPendingWriterCount(): number {\n return this.internalPendingWriterCount\n }\n\n /**\n * 读取当前已进入临界区的读者数量。\n */\n getActiveReaderCount(): number {\n return this.internalActiveReaderCount\n }\n\n /**\n * 把等待节点加入队列,并同步更新按模式拆分的统计计数。\n */\n private enqueueEntry(entry: InternalReadWriteLockQueueEntry): void {\n this.queue.enqueue(entry)\n\n if (entry.mode === \"read\") {\n this.internalPendingReaderCount = this.internalPendingReaderCount + 1\n }\n else {\n this.internalPendingWriterCount = this.internalPendingWriterCount + 1\n }\n }\n\n /**\n * 从等待队列中移除指定节点,并同步回收对应的统计计数。\n */\n private removeEntry(entry: InternalReadWriteLockQueueEntry): void {\n if (entry.isQueued === false) {\n return\n }\n\n this.queue.remove(entry)\n\n if (entry.mode === \"read\") {\n this.internalPendingReaderCount = this.internalPendingReaderCount - 1\n }\n else {\n this.internalPendingWriterCount = this.internalPendingWriterCount - 1\n }\n }\n\n /**\n * 构造一个读锁 permit。\n */\n private buildReadPermit(): ReadWriteLockPermit {\n return new Permit<ModePermitDetails<\"read-write-lock\", ReadWriteLockMode>>({\n details: { coordination: \"read-write-lock\", mode: \"read\" },\n duplicateReleaseMessage: INTERNAL_READ_WRITE_LOCK_DUPLICATE_RELEASE_MESSAGE,\n onDuplicateRelease: this.onDuplicateRelease,\n onRelease: (): void => {\n this.internalActiveReaderCount = this.internalActiveReaderCount - 1\n this.dispatch()\n },\n })\n }\n\n /**\n * 构造一个写锁 permit。\n */\n private buildWritePermit(): ReadWriteLockPermit {\n return new Permit<ModePermitDetails<\"read-write-lock\", ReadWriteLockMode>>({\n details: { coordination: \"read-write-lock\", mode: \"write\" },\n duplicateReleaseMessage: INTERNAL_READ_WRITE_LOCK_DUPLICATE_RELEASE_MESSAGE,\n onDuplicateRelease: this.onDuplicateRelease,\n onRelease: (): void => {\n this.internalHasActiveWriter = false\n this.dispatch()\n },\n })\n }\n\n /**\n * 尝试按 FIFO 规则调度队头等待者。\n *\n * 规则如下:\n * 1. 若已有活动写者,则任何人都不能继续进入。\n * 2. 若队头是写者,则必须等到所有活动读者结束后才可授予写锁。\n * 3. 若队头是读者,则会批量放行连续的读者,直到遇到写者或队列结束。\n */\n private dispatch(): void {\n if (this.internalHasActiveWriter === true) {\n return\n }\n\n while (true) {\n const head = this.queue.peek()\n if (head === undefined) {\n return\n }\n\n if (head.mode === \"write\") {\n if (this.internalActiveReaderCount !== 0) {\n return\n }\n\n const writerEntry = this.queue.shift()\n if (writerEntry === undefined) {\n return\n }\n\n this.internalPendingWriterCount = this.internalPendingWriterCount - 1\n\n if (writerEntry.isSettled === true) {\n continue\n }\n\n this.internalHasActiveWriter = true\n writerEntry.isSettled = true\n internalCleanupWaitConstraints(writerEntry)\n writerEntry.resolve(this.buildWritePermit())\n return\n }\n\n while (true) {\n const readerHead = this.queue.peek()\n if (readerHead === undefined || readerHead.mode !== \"read\") {\n break\n }\n\n const readerEntry = this.queue.shift()\n if (readerEntry === undefined) {\n return\n }\n\n this.internalPendingReaderCount = this.internalPendingReaderCount - 1\n\n if (readerEntry.isSettled === true) {\n continue\n }\n\n this.internalActiveReaderCount = this.internalActiveReaderCount + 1\n readerEntry.isSettled = true\n internalCleanupWaitConstraints(readerEntry)\n readerEntry.resolve(this.buildReadPermit())\n }\n\n if (this.internalActiveReaderCount !== 0) {\n return\n }\n }\n }\n\n /**\n * 以失败状态结束一个等待节点,并尝试继续调度后继等待者。\n */\n private rejectEntry(entry: InternalReadWriteLockQueueEntry, reason: unknown): void {\n if (entry.isSettled === true) {\n return\n }\n\n entry.isSettled = true\n internalCleanupWaitConstraints(entry)\n this.removeEntry(entry)\n entry.reject(reason)\n this.dispatch()\n }\n\n /**\n * 尝试立即获取读锁;若当前已有写者或队列中存在排队任务,则返回 `undefined`。\n */\n tryAcquireRead(): ReadWriteLockPermit | undefined {\n if (this.internalHasActiveWriter === true || this.queue.isEmpty() === false) {\n return undefined\n }\n\n this.internalActiveReaderCount = this.internalActiveReaderCount + 1\n return this.buildReadPermit()\n }\n\n /**\n * 尝试立即获取写锁;只有完全空闲时才会成功。\n */\n tryAcquireWrite(): ReadWriteLockPermit | undefined {\n if (\n this.internalHasActiveWriter === true\n || this.internalActiveReaderCount !== 0\n || this.queue.isEmpty() === false\n ) {\n return undefined\n }\n\n this.internalHasActiveWriter = true\n return this.buildWritePermit()\n }\n\n /**\n * 等待直到成功获取读锁。\n */\n async acquireRead(options: ReadWriteLockAcquireOptions = {}): Promise<ReadWriteLockPermit> {\n internalAssertTimeoutOption(\"ReadWriteLock read acquire\", options.timeout)\n\n internalThrowIfAborted(\"ReadWriteLock read acquire\", options.abortSignal)\n\n const immediatePermit = this.tryAcquireRead()\n if (immediatePermit !== undefined) {\n return immediatePermit\n }\n\n const permit = await new Promise<ReadWriteLockPermit>((resolve, reject) => {\n const entry: InternalReadWriteLockQueueEntry = {\n mode: \"read\",\n resolve,\n reject,\n isSettled: false,\n isQueued: false,\n previous: undefined,\n next: undefined,\n timeoutId: undefined,\n abortSignal: undefined,\n abortListener: undefined,\n }\n\n internalBindWaitConstraints(entry, options, {\n abortOperation: \"ReadWriteLock read acquire\",\n timeoutOperation: \"ReadWriteLock read acquire\",\n onAbort: error => {\n this.rejectEntry(entry, error)\n },\n onTimeout: error => {\n this.rejectEntry(entry, error)\n },\n })\n this.enqueueEntry(entry)\n this.dispatch()\n })\n\n return permit\n }\n\n /**\n * 等待直到成功获取写锁。\n */\n async acquireWrite(options: ReadWriteLockAcquireOptions = {}): Promise<ReadWriteLockPermit> {\n internalAssertTimeoutOption(\"ReadWriteLock write acquire\", options.timeout)\n\n internalThrowIfAborted(\"ReadWriteLock write acquire\", options.abortSignal)\n\n const immediatePermit = this.tryAcquireWrite()\n if (immediatePermit !== undefined) {\n return immediatePermit\n }\n\n const permit = await new Promise<ReadWriteLockPermit>((resolve, reject) => {\n const entry: InternalReadWriteLockQueueEntry = {\n mode: \"write\",\n resolve,\n reject,\n isSettled: false,\n isQueued: false,\n previous: undefined,\n next: undefined,\n timeoutId: undefined,\n abortSignal: undefined,\n abortListener: undefined,\n }\n\n internalBindWaitConstraints(entry, options, {\n abortOperation: \"ReadWriteLock write acquire\",\n timeoutOperation: \"ReadWriteLock write acquire\",\n onAbort: error => {\n this.rejectEntry(entry, error)\n },\n onTimeout: error => {\n this.rejectEntry(entry, error)\n },\n })\n this.enqueueEntry(entry)\n this.dispatch()\n })\n\n return permit\n }\n\n /**\n * 在读锁保护下执行回调。\n */\n async runExclusiveRead<T>(callback: () => Promise<T>, options?: ReadWriteLockAcquireOptions): Promise<T>\n async runExclusiveRead<T>(callback: () => T, options?: ReadWriteLockAcquireOptions): Promise<T>\n async runExclusiveRead<T>(callback: () => Promise<T> | T, options: ReadWriteLockAcquireOptions = {}): Promise<T> {\n const permit = await this.acquireRead(options)\n try {\n return await callback()\n }\n finally {\n permit.release()\n }\n }\n\n /**\n * 在写锁保护下执行回调。\n */\n async runExclusiveWrite<T>(callback: () => Promise<T>, options?: ReadWriteLockAcquireOptions): Promise<T>\n async runExclusiveWrite<T>(callback: () => T, options?: ReadWriteLockAcquireOptions): Promise<T>\n async runExclusiveWrite<T>(callback: () => Promise<T> | T, options: ReadWriteLockAcquireOptions = {}): Promise<T> {\n const permit = await this.acquireWrite(options)\n try {\n return await callback()\n }\n finally {\n permit.release()\n }\n }\n}\n",
|
|
171
|
-
"const internalBase64Pattern = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/\nconst internalNormalizeBase64 = (input: string): string => {\n return input.replaceAll(/\\s+/g, \"\")\n}\n/**\n * 判断输入是否为合法的 Base64 字符串。\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = isBase64(\"aGVsbG8=\")\n * // Expect: false\n * const example2 = isBase64(\"abc\")\n * ```\n */\nexport const isBase64 = (input: string): boolean => {\n const normalizedInput = internalNormalizeBase64(input)\n return internalBase64Pattern.test(normalizedInput)\n}\n\nconst internalAssertValidBase64 = (input: string): void => {\n if (internalBase64Pattern.test(input) === false) {\n throw new TypeError(\"Invalid Base64 input\")\n }\n}\n/**\n * 断言输入是合法的 Base64 字符串。\n *\n * @example\n * ```\n * const example1 = assertBase64(\"aGVsbG8=\")\n * // Expect: undefined\n *\n * // Expect: throws TypeError\n * const example2 = () => assertBase64(\"abc\")\n * ```\n *\n * @throws {TypeError} when input is not valid Base64\n */\nexport const assertBase64 = (input: string): void => {\n const normalizedInput = internalNormalizeBase64(input)\n internalAssertValidBase64(normalizedInput)\n}\n\nconst internalStringToBase64ByBrowserApi = (input: string): string => {\n const bytes = new TextEncoder().encode(input)\n let binaryString = \"\"\n\n bytes.forEach((byte) => {\n binaryString = binaryString + String.fromCodePoint(byte)\n })\n\n return btoa(binaryString)\n}\n/**\n * 将 UTF-8 字符串转换为 Base64 字符串。\n *\n * @example\n * ```\n * // Expect: \"aGVsbG8=\"\n * const example1 = stringToBase64(\"hello\")\n * // Expect: \"5L2g5aW9\"\n * const example2 = stringToBase64(\"你好\")\n * ```\n */\nexport const stringToBase64 = (input: string): string => {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(input, \"utf8\").toString(\"base64\")\n }\n\n if (typeof btoa !== \"undefined\") {\n return internalStringToBase64ByBrowserApi(input)\n }\n\n throw new Error(\"No Base64 runtime support found\")\n}\n\nconst internalBase64ToStringByBrowserApi = (input: string): string => {\n const binaryString = atob(input)\n const bytes = Uint8Array.from(binaryString, char => char.codePointAt(0) ?? 0)\n return new TextDecoder().decode(bytes)\n}\n/**\n * 将合法的 Base64 字符串转换为 UTF-8 字符串。\n *\n * @example\n * ```\n * // Expect: \"hello\"\n * const example1 = base64ToString(\"aGVsbG8=\")\n * // Expect: \"你好\"\n * const example2 = base64ToString(\"5L2g5aW9\")\n * ```\n */\nexport const base64ToString = (input: string): string => {\n const normalizedInput = internalNormalizeBase64(input)\n internalAssertValidBase64(normalizedInput)\n\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(normalizedInput, \"base64\").toString(\"utf8\")\n }\n\n if (typeof atob !== \"undefined\") {\n return internalBase64ToStringByBrowserApi(normalizedInput)\n }\n\n throw new Error(\"No Base64 runtime support found\")\n}\n",
|
|
172
|
-
"const internalRandomStringPacket: Record<number, string[]> = {}\n/**\n * 生成指定长度的随机字符串,并可选限制字符集。\n *\n * 该函数适合生成界面状态键、临时标识或其它非业务主键用途的随机文本。\n *\n * 当未传入字符集时,将使用数字、小写字母与大写字母组成的默认字符集。\n * 同一运行时内会按长度记录已生成结果,尽量避免返回同长度的重复值。\n *\n * @example\n * ```\n * // Expect: 8\n * const example1 = randomString(8).length\n * // Expect: true\n * const example2 = randomString(4, \"ab\").split(\"\").every(char => char === \"a\" || char === \"b\")\n * ```\n */\nexport const randomString = (length: number, chars?: string | undefined): string => {\n let result = \"\"\n const preparedChars = chars ?? \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n Array.from({ length }).forEach(() => {\n result = result + preparedChars[Math.floor(Math.random() * preparedChars.length)]!\n })\n\n internalRandomStringPacket[length] = internalRandomStringPacket[length] ?? []\n const packet = internalRandomStringPacket[length]\n if (packet.includes(result)) {\n return randomString(length, preparedChars)\n }\n else {\n packet.push(result)\n return result\n }\n}\n",
|
|
173
|
-
"/**\n * 断言一个数值是有限数字。\n */\nexport const internalAssertFinite = (value: number, name: string): void => {\n if (Number.isFinite(value) === false) {\n throw new RangeError(`${name} must be a finite number`)\n }\n}\n\n/**\n * 断言一个数值是非负有限数字。\n */\nexport const internalAssertNonNegativeFinite = (value: number, name: string): void => {\n internalAssertFinite(value, name)\n\n if (value < 0) {\n throw new RangeError(`${name} must be a non-negative finite number`)\n }\n}\n\n/**\n * 断言一个颜色单位值位于 `0` 到 `1` 之间。\n */\nexport const internalAssertColorUnit = (value: number, unitName: string): void => {\n if (Number.isFinite(value) === false || value < 0 || value > 1) {\n throw new RangeError(`Color ${unitName} must be a finite number between 0 and 1`)\n }\n}\n\n/**\n * 断言一个透明度值位于 `0` 到 `1` 之间。\n */\nexport const internalAssertAlpha = (value: number): void => {\n internalAssertColorUnit(value, \"alpha\")\n}\n\n/**\n * 将浮点数按颜色计算常用精度进行圆整。\n */\nexport const internalRoundColorFloat = (value: number): number => {\n return Number(value.toFixed(6))\n}\n",
|
|
174
|
-
"import {\n internalAssertAlpha,\n internalAssertNonNegativeFinite,\n} from \"../internal.ts\"\n\nimport type { XyzColorValue } from \"../types.ts\"\n\n/**\n * 规范化 XYZ 颜色值结构。\n */\nexport const internalNormalizeXyzColorValue = (color: XyzColorValue): XyzColorValue => {\n internalAssertNonNegativeFinite(color.x, \"Color channel x\")\n internalAssertNonNegativeFinite(color.y, \"Color channel y\")\n internalAssertNonNegativeFinite(color.z, \"Color channel z\")\n internalAssertAlpha(color.alpha)\n\n return {\n x: color.x,\n y: color.y,\n z: color.z,\n alpha: color.alpha,\n }\n}\n",
|
|
175
|
-
"import { internalNormalizeXyzColorValue } from \"./internal.ts\"\n\nimport type { XyzColorValue } from \"../types.ts\"\n\n/**\n * 构造一个 XYZ 颜色值对象。\n *\n * @example\n * ```\n * // Expect: { x: 0.25, y: 0.3, z: 0.4, alpha: 1 }\n * const example1 = createXyzColorValue({ x: 0.25, y: 0.3, z: 0.4, alpha: 1 })\n *\n * // Expect: { x: 0, y: 0, z: 0, alpha: 0.5 }\n * const example2 = createXyzColorValue({ x: 0, y: 0, z: 0, alpha: 0.5 })\n * ```\n */\nexport const createXyzColorValue = (color: XyzColorValue): XyzColorValue => {\n return internalNormalizeXyzColorValue(color)\n}\n",
|
|
176
|
-
"import { internalNormalizeXyzColorValue } from \"./internal.ts\"\nimport {\n internalAssertAlpha,\n internalAssertFinite,\n internalRoundColorFloat,\n} from \"../internal.ts\"\n\nimport type {\n LinearRgbColorValue,\n XyzColorValue,\n} from \"../types.ts\"\n\nconst internalNormalizeLinearRgbColorValueForXyzConversion = (color: LinearRgbColorValue): LinearRgbColorValue => {\n internalAssertFinite(color.red, \"Color channel red\")\n internalAssertFinite(color.green, \"Color channel green\")\n internalAssertFinite(color.blue, \"Color channel blue\")\n internalAssertAlpha(color.alpha)\n\n return {\n red: color.red,\n green: color.green,\n blue: color.blue,\n alpha: color.alpha,\n }\n}\n\n/**\n * 将 XYZ 颜色值转换为 Linear RGB 颜色值。\n *\n * @example\n * ```\n * // Expect: { red: 0.2, green: 0.4, blue: 0.6, alpha: 1 }\n * const example1 = xyzColorValueToLinearRgbColorValue({ x: 0.333784, y: 0.3719, z: 0.621726, alpha: 1 })\n *\n * // Expect: { red: 1, green: 0, blue: 0, alpha: 1 }\n * const example2 = xyzColorValueToLinearRgbColorValue({ x: 0.412456, y: 0.212673, z: 0.019334, alpha: 1 })\n * ```\n */\nexport const xyzColorValueToLinearRgbColorValue = (color: XyzColorValue): LinearRgbColorValue => {\n const normalizedColor = internalNormalizeXyzColorValue(color)\n\n return internalNormalizeLinearRgbColorValueForXyzConversion({\n red: internalRoundColorFloat((3.240_454_2 * normalizedColor.x) - (1.537_138_5 * normalizedColor.y) - (0.498_531_4 * normalizedColor.z)),\n green: internalRoundColorFloat((-0.969_266 * normalizedColor.x) + (1.876_010_8 * normalizedColor.y) + (0.041_556 * normalizedColor.z)),\n blue: internalRoundColorFloat((0.055_643_4 * normalizedColor.x) - (0.204_025_9 * normalizedColor.y) + (1.057_225_2 * normalizedColor.z)),\n alpha: normalizedColor.alpha,\n })\n}\n\n/**\n * 将 Linear RGB 颜色值转换为 XYZ 颜色值。\n *\n * @example\n * ```\n * // Expect: { x: 0.333784, y: 0.3719, z: 0.621726, alpha: 1 }\n * const example1 = linearRgbColorValueToXyzColorValue({ red: 0.2, green: 0.4, blue: 0.6, alpha: 1 })\n *\n * // Expect: { x: 0.412456, y: 0.212673, z: 0.019334, alpha: 1 }\n * const example2 = linearRgbColorValueToXyzColorValue({ red: 1, green: 0, blue: 0, alpha: 1 })\n * ```\n */\nexport const linearRgbColorValueToXyzColorValue = (color: LinearRgbColorValue): XyzColorValue => {\n const normalizedColor = internalNormalizeLinearRgbColorValueForXyzConversion(color)\n\n return internalNormalizeXyzColorValue({\n x: internalRoundColorFloat((0.412_456_4 * normalizedColor.red) + (0.357_576_1 * normalizedColor.green) + (0.180_437_5 * normalizedColor.blue)),\n y: internalRoundColorFloat((0.212_672_9 * normalizedColor.red) + (0.715_152_2 * normalizedColor.green) + (0.072_175 * normalizedColor.blue)),\n z: internalRoundColorFloat((0.019_333_9 * normalizedColor.red) + (0.119_192 * normalizedColor.green) + (0.950_304_1 * normalizedColor.blue)),\n alpha: normalizedColor.alpha,\n })\n}\n",
|
|
177
|
-
"import { createXyzColorValue } from \"./construct.ts\"\nimport { internalRoundColorFloat } from \"../internal.ts\"\n\nimport type {\n XyChromaticityValue,\n XyzColorValue,\n} from \"../types.ts\"\n\nconst internalGetNormalizedXyzColorData = (color: XyzColorValue): { color: XyzColorValue, tristimulusSum: number } => {\n const normalizedColor = createXyzColorValue(color)\n const tristimulusSum = internalRoundColorFloat(normalizedColor.x + normalizedColor.y + normalizedColor.z)\n\n return {\n color: normalizedColor,\n tristimulusSum,\n }\n}\n\n/**\n * 读取 XYZ 颜色值的相对亮度。\n *\n * 在当前模块约定下,`Y` 通道直接表示相对亮度。\n *\n * @example\n * ```\n * // Expect: 0.3\n * const example1 = xyzColorValueToRelativeLuminance({ x: 0.25, y: 0.3, z: 0.4, alpha: 1 })\n *\n * // Expect: 0\n * const example2 = xyzColorValueToRelativeLuminance({ x: 0, y: 0, z: 0, alpha: 1 })\n * ```\n */\nexport const xyzColorValueToRelativeLuminance = (color: XyzColorValue): number => {\n return createXyzColorValue(color).y\n}\n\n/**\n * 读取 XYZ 颜色值的三刺激总量。\n *\n * 在当前模块约定下,结果等于 `x + y + z`。\n *\n * @example\n * ```\n * // Expect: 0.95\n * const example1 = xyzColorValueToTristimulusSum({ x: 0.25, y: 0.3, z: 0.4, alpha: 1 })\n *\n * // Expect: 0\n * const example2 = xyzColorValueToTristimulusSum({ x: 0, y: 0, z: 0, alpha: 1 })\n * ```\n */\nexport const xyzColorValueToTristimulusSum = (color: XyzColorValue): number => {\n return internalGetNormalizedXyzColorData(color).tristimulusSum\n}\n\n/**\n * 读取 XYZ 颜色值对应的 `xy` 色度坐标。\n *\n * 当三刺激总量为 `0` 时,该结果没有定义,因此会抛出异常。\n *\n * @example\n * ```\n * // Expect: { x: 0.263158, y: 0.315789 }\n * const example1 = xyzColorValueToXyChromaticityValue({ x: 0.25, y: 0.3, z: 0.4, alpha: 1 })\n *\n * // Expect: { x: 0.64, y: 0.33 }\n * const example2 = xyzColorValueToXyChromaticityValue({ x: 0.412456, y: 0.212673, z: 0.019334, alpha: 1 })\n * ```\n */\nexport const xyzColorValueToXyChromaticityValue = (color: XyzColorValue): XyChromaticityValue => {\n const normalizedData = internalGetNormalizedXyzColorData(color)\n\n if (normalizedData.tristimulusSum === 0) {\n throw new RangeError(\"XYZ tristimulus sum must be greater than 0 to compute xy chromaticity\")\n }\n\n return {\n x: internalRoundColorFloat(normalizedData.color.x / normalizedData.tristimulusSum),\n y: internalRoundColorFloat(normalizedData.color.y / normalizedData.tristimulusSum),\n }\n}\n",
|
|
178
|
-
"import {\n internalAssertAlpha,\n internalAssertColorUnit,\n internalAssertFinite,\n internalRoundColorFloat,\n} from \"../internal.ts\"\n\nimport type {\n HslColorValue,\n HsvColorValue,\n LinearRgbColorValue,\n SrgbColorValue,\n} from \"../types.ts\"\n\n/**\n * 匹配模块支持的十六进制颜色字符串格式。\n */\nexport const internalHexPattern: RegExp = /^#?(?:[\\da-fA-F]{3}|[\\da-fA-F]{4}|[\\da-fA-F]{6}|[\\da-fA-F]{8})$/\n\n/**\n * 断言一个 sRGB 通道值是合法的 8 位整数。\n */\nexport const internalAssertByte = (value: number, channelName: string): void => {\n if (Number.isInteger(value) === false || value < 0 || value > 255) {\n throw new RangeError(`Color channel ${channelName} must be an integer between 0 and 255`)\n }\n}\n\n/**\n * 将色相角度规范化到 `0` 到 `360` 之间,`360` 会被折叠为 `0`。\n */\nexport const internalNormalizeHue = (value: number): number => {\n internalAssertFinite(value, \"Color hue\")\n\n const normalizedValue = value % 360\n if (normalizedValue < 0) {\n return normalizedValue + 360\n }\n\n return normalizedValue\n}\n\n/**\n * 规范化 Linear RGB 颜色值结构。\n */\nexport const internalNormalizeLinearRgbColorValue = (color: LinearRgbColorValue): LinearRgbColorValue => {\n internalAssertFinite(color.red, \"Color channel red\")\n internalAssertFinite(color.green, \"Color channel green\")\n internalAssertFinite(color.blue, \"Color channel blue\")\n internalAssertAlpha(color.alpha)\n\n return {\n red: color.red,\n green: color.green,\n blue: color.blue,\n alpha: color.alpha,\n }\n}\n\n/**\n * 规范化 sRGB 颜色值结构。\n */\nexport const internalNormalizeSrgbColorValue = (color: SrgbColorValue): SrgbColorValue => {\n internalAssertByte(color.red, \"red\")\n internalAssertByte(color.green, \"green\")\n internalAssertByte(color.blue, \"blue\")\n internalAssertAlpha(color.alpha)\n\n return {\n red: color.red,\n green: color.green,\n blue: color.blue,\n alpha: color.alpha,\n }\n}\n\n/**\n * 规范化 HSL 颜色值结构。\n */\nexport const internalNormalizeHslColorValue = (color: HslColorValue): HslColorValue => {\n internalAssertColorUnit(color.saturation, \"saturation\")\n internalAssertColorUnit(color.lightness, \"lightness\")\n internalAssertAlpha(color.alpha)\n\n return {\n hue: internalNormalizeHue(color.hue),\n saturation: internalRoundColorFloat(color.saturation),\n lightness: internalRoundColorFloat(color.lightness),\n alpha: color.alpha,\n }\n}\n\n/**\n * 规范化 HSV 颜色值结构。\n */\nexport const internalNormalizeHsvColorValue = (color: HsvColorValue): HsvColorValue => {\n internalAssertColorUnit(color.saturation, \"saturation\")\n internalAssertColorUnit(color.value, \"value\")\n internalAssertAlpha(color.alpha)\n\n return {\n hue: internalNormalizeHue(color.hue),\n saturation: internalRoundColorFloat(color.saturation),\n value: internalRoundColorFloat(color.value),\n alpha: color.alpha,\n }\n}\n\n/**\n * 将短格式十六进制颜色扩展为长格式。\n */\nexport const internalExpandShortHex = (input: string): string => {\n return input.split(\"\").map(char => `${char}${char}`).join(\"\")\n}\n\n/**\n * 将 8 位通道值格式化为两位十六进制字符串。\n */\nexport const internalFormatHexByte = (value: number): string => {\n return value.toString(16).padStart(2, \"0\").toUpperCase()\n}\n\n/**\n * 将浮点数格式化为适合颜色字符串的紧凑小数字符串。\n */\nexport const internalFormatAlpha = (value: number): string => {\n return Number(value.toFixed(4)).toString()\n}\n\n/**\n * 将 `0` 到 `1` 的单位值格式化为百分比数值字符串,不附带 `%` 符号。\n */\nexport const internalFormatPercentUnit = (value: number): string => {\n internalAssertColorUnit(value, \"unit\")\n return Number((value * 100).toFixed(2)).toString()\n}\n\n/**\n * 将 RGB 字符串通道解析为合法的 8 位通道值。\n */\nexport const internalParseRgbChannel = (input: string, channelName: string): number => {\n const value = Number(input)\n internalAssertByte(value, channelName)\n return value\n}\n\n/**\n * 将百分比字符串解析为 `0` 到 `1` 之间的单位值。\n */\nexport const internalParsePercentUnit = (input: string, channelName: string): number => {\n if (input.endsWith(\"%\") === false) {\n throw new TypeError(`Invalid ${channelName} percentage input`)\n }\n\n return internalRoundColorFloat(Number(input.slice(0, -1)) / 100)\n}\n\n/**\n * 将 8 位 sRGB 通道值转换为线性光通道值。\n */\nexport const internalGetLinearRgbChannelBySrgbChannel = (value: number): number => {\n internalAssertByte(value, \"sRGB\")\n const normalizedValue = value / 255\n\n if (normalizedValue <= 0.040_45) {\n return internalRoundColorFloat(normalizedValue / 12.92)\n }\n\n return internalRoundColorFloat(((normalizedValue + 0.055) / 1.055) ** 2.4)\n}\n\n/**\n * 将线性光通道值转换为 8 位 sRGB 通道值。\n */\nexport const internalGetSrgbChannelByLinearRgbChannel = (value: number, channelName: string): number => {\n internalAssertFinite(value, `Linear RGB channel ${channelName}`)\n\n if (value < 0 || value > 1) {\n throw new RangeError(`Linear RGB channel ${channelName} must be between 0 and 1 to convert to sRGB`)\n }\n\n if (value <= 0.003_130_8) {\n return Math.round(value * 12.92 * 255)\n }\n\n return Math.round(((1.055 * (value ** (1 / 2.4))) - 0.055) * 255)\n}\n\n/**\n * 根据输入字符串稳定生成一个 sRGB 颜色值。\n */\nexport const internalGetStableSrgbColorValueByString = (input: string): SrgbColorValue => {\n let codePointSum = 0\n\n for (const char of input) {\n const codePoint = char.codePointAt(0)\n if (codePoint !== undefined) {\n codePointSum = codePointSum + codePoint\n }\n }\n\n return {\n red: Math.round(Math.abs(Math.sin(codePointSum) * 255)),\n green: Math.round(Math.abs(Math.sin(codePointSum + 1) * 255)),\n blue: Math.round(Math.abs(Math.sin(codePointSum + 2) * 255)),\n alpha: 1,\n }\n}\n",
|
|
179
|
-
"import {\n internalRoundColorFloat,\n} from \"../internal.ts\"\nimport {\n internalGetLinearRgbChannelBySrgbChannel,\n internalGetSrgbChannelByLinearRgbChannel,\n internalNormalizeHslColorValue,\n internalNormalizeHsvColorValue,\n internalNormalizeLinearRgbColorValue,\n internalNormalizeSrgbColorValue,\n} from \"./internal.ts\"\n\nimport type {\n HslColorValue,\n HsvColorValue,\n LinearRgbColorValue,\n SrgbColorValue,\n} from \"../types.ts\"\n\nconst internalGetHueByNormalizedRgbChannels = (red: number, green: number, blue: number, delta: number, max: number): number => {\n if (delta === 0) {\n return 0\n }\n\n let hue = 0\n\n if (max === red) {\n hue = 60 * (((green - blue) / delta) % 6)\n } else if (max === green) {\n hue = 60 * (((blue - red) / delta) + 2)\n } else {\n hue = 60 * (((red - green) / delta) + 4)\n }\n\n if (hue < 0) {\n return hue + 360\n }\n\n return hue\n}\nconst internalGetNormalizedRgbChannelsByHue = (hue: number, chroma: number): { red: number, green: number, blue: number } => {\n const segment = hue / 60\n const secondary = chroma * (1 - Math.abs((segment % 2) - 1))\n\n if (segment >= 0 && segment < 1) {\n return { red: chroma, green: secondary, blue: 0 }\n }\n\n if (segment >= 1 && segment < 2) {\n return { red: secondary, green: chroma, blue: 0 }\n }\n\n if (segment >= 2 && segment < 3) {\n return { red: 0, green: chroma, blue: secondary }\n }\n\n if (segment >= 3 && segment < 4) {\n return { red: 0, green: secondary, blue: chroma }\n }\n\n if (segment >= 4 && segment < 5) {\n return { red: secondary, green: 0, blue: chroma }\n }\n\n return { red: chroma, green: 0, blue: secondary }\n}\n\n/**\n * 将 Linear RGB 颜色值转换为 sRGB 颜色值。\n *\n * @example\n * ```\n * // Expect: { red: 255, green: 0, blue: 0, alpha: 1 }\n * const example1 = linearRgbColorValueToSrgbColorValue({ red: 1, green: 0, blue: 0, alpha: 1 })\n *\n * // Expect: { red: 188, green: 188, blue: 188, alpha: 0.5 }\n * const example2 = linearRgbColorValueToSrgbColorValue({ red: 0.5, green: 0.5, blue: 0.5, alpha: 0.5 })\n * ```\n */\nexport const linearRgbColorValueToSrgbColorValue = (color: LinearRgbColorValue): SrgbColorValue => {\n const normalizedColor = internalNormalizeLinearRgbColorValue(color)\n\n return internalNormalizeSrgbColorValue({\n red: internalGetSrgbChannelByLinearRgbChannel(normalizedColor.red, \"red\"),\n green: internalGetSrgbChannelByLinearRgbChannel(normalizedColor.green, \"green\"),\n blue: internalGetSrgbChannelByLinearRgbChannel(normalizedColor.blue, \"blue\"),\n alpha: normalizedColor.alpha,\n })\n}\n\n/**\n * 将 sRGB 颜色值转换为 Linear RGB 颜色值。\n *\n * @example\n * ```\n * // Expect: { red: 1, green: 0, blue: 0, alpha: 1 }\n * const example1 = srgbColorValueToLinearRgbColorValue({ red: 255, green: 0, blue: 0, alpha: 1 })\n *\n * // Expect: { red: 0.215861, green: 0.215861, blue: 0.215861, alpha: 0.5 }\n * const example2 = srgbColorValueToLinearRgbColorValue({ red: 128, green: 128, blue: 128, alpha: 0.5 })\n * ```\n */\nexport const srgbColorValueToLinearRgbColorValue = (color: SrgbColorValue): LinearRgbColorValue => {\n const normalizedColor = internalNormalizeSrgbColorValue(color)\n\n return internalNormalizeLinearRgbColorValue({\n red: internalGetLinearRgbChannelBySrgbChannel(normalizedColor.red),\n green: internalGetLinearRgbChannelBySrgbChannel(normalizedColor.green),\n blue: internalGetLinearRgbChannelBySrgbChannel(normalizedColor.blue),\n alpha: normalizedColor.alpha,\n })\n}\n\n/**\n * 将 sRGB 颜色值转换为 HSL 颜色值。\n *\n * @example\n * ```\n * // Expect: { hue: 210, saturation: 0.5, lightness: 0.4, alpha: 1 }\n * const example1 = srgbColorValueToHslColorValue({ red: 51, green: 102, blue: 153, alpha: 1 })\n *\n * // Expect: { hue: 0, saturation: 0, lightness: 0.501961, alpha: 1 }\n * const example2 = srgbColorValueToHslColorValue({ red: 128, green: 128, blue: 128, alpha: 1 })\n * ```\n */\nexport const srgbColorValueToHslColorValue = (color: SrgbColorValue): HslColorValue => {\n const normalizedColor = internalNormalizeSrgbColorValue(color)\n const red = normalizedColor.red / 255\n const green = normalizedColor.green / 255\n const blue = normalizedColor.blue / 255\n const max = Math.max(red, green, blue)\n const min = Math.min(red, green, blue)\n const delta = max - min\n const lightness = (max + min) / 2\n const saturation = delta === 0 ? 0 : delta / (1 - Math.abs((2 * lightness) - 1))\n const hue = internalGetHueByNormalizedRgbChannels(red, green, blue, delta, max)\n\n return internalNormalizeHslColorValue({\n hue: internalRoundColorFloat(hue),\n saturation: internalRoundColorFloat(saturation),\n lightness: internalRoundColorFloat(lightness),\n alpha: normalizedColor.alpha,\n })\n}\n\n/**\n * 将 HSL 颜色值转换为 sRGB 颜色值。\n *\n * @example\n * ```\n * // Expect: { red: 51, green: 102, blue: 153, alpha: 1 }\n * const example1 = hslColorValueToSrgbColorValue({ hue: 210, saturation: 0.5, lightness: 0.4, alpha: 1 })\n *\n * // Expect: { red: 128, green: 128, blue: 128, alpha: 1 }\n * const example2 = hslColorValueToSrgbColorValue({ hue: 0, saturation: 0, lightness: 0.501961, alpha: 1 })\n * ```\n */\nexport const hslColorValueToSrgbColorValue = (color: HslColorValue): SrgbColorValue => {\n const normalizedColor = internalNormalizeHslColorValue(color)\n const chroma = (1 - Math.abs((2 * normalizedColor.lightness) - 1)) * normalizedColor.saturation\n const channels = internalGetNormalizedRgbChannelsByHue(normalizedColor.hue, chroma)\n const match = normalizedColor.lightness - (chroma / 2)\n\n return internalNormalizeSrgbColorValue({\n red: Math.round((channels.red + match) * 255),\n green: Math.round((channels.green + match) * 255),\n blue: Math.round((channels.blue + match) * 255),\n alpha: normalizedColor.alpha,\n })\n}\n\n/**\n * 将 sRGB 颜色值转换为 HSV 颜色值。\n *\n * @example\n * ```\n * // Expect: { hue: 210, saturation: 0.666667, value: 0.6, alpha: 1 }\n * const example1 = srgbColorValueToHsvColorValue({ red: 51, green: 102, blue: 153, alpha: 1 })\n *\n * // Expect: { hue: 0, saturation: 0, value: 0.501961, alpha: 1 }\n * const example2 = srgbColorValueToHsvColorValue({ red: 128, green: 128, blue: 128, alpha: 1 })\n * ```\n */\nexport const srgbColorValueToHsvColorValue = (color: SrgbColorValue): HsvColorValue => {\n const normalizedColor = internalNormalizeSrgbColorValue(color)\n const red = normalizedColor.red / 255\n const green = normalizedColor.green / 255\n const blue = normalizedColor.blue / 255\n const max = Math.max(red, green, blue)\n const min = Math.min(red, green, blue)\n const delta = max - min\n const saturation = max === 0 ? 0 : delta / max\n const hue = internalGetHueByNormalizedRgbChannels(red, green, blue, delta, max)\n\n return internalNormalizeHsvColorValue({\n hue: internalRoundColorFloat(hue),\n saturation: internalRoundColorFloat(saturation),\n value: internalRoundColorFloat(max),\n alpha: normalizedColor.alpha,\n })\n}\n\n/**\n * 将 HSV 颜色值转换为 sRGB 颜色值。\n *\n * @example\n * ```\n * // Expect: { red: 51, green: 102, blue: 153, alpha: 1 }\n * const example1 = hsvColorValueToSrgbColorValue({ hue: 210, saturation: 0.666667, value: 0.6, alpha: 1 })\n *\n * // Expect: { red: 128, green: 128, blue: 128, alpha: 1 }\n * const example2 = hsvColorValueToSrgbColorValue({ hue: 0, saturation: 0, value: 0.501961, alpha: 1 })\n * ```\n */\nexport const hsvColorValueToSrgbColorValue = (color: HsvColorValue): SrgbColorValue => {\n const normalizedColor = internalNormalizeHsvColorValue(color)\n const chroma = normalizedColor.value * normalizedColor.saturation\n const channels = internalGetNormalizedRgbChannelsByHue(normalizedColor.hue, chroma)\n const match = normalizedColor.value - chroma\n\n return internalNormalizeSrgbColorValue({\n red: Math.round((channels.red + match) * 255),\n green: Math.round((channels.green + match) * 255),\n blue: Math.round((channels.blue + match) * 255),\n alpha: normalizedColor.alpha,\n })\n}\n",
|
|
180
|
-
"import {\n internalGetStableSrgbColorValueByString,\n internalNormalizeHslColorValue,\n internalNormalizeHsvColorValue,\n internalNormalizeLinearRgbColorValue,\n internalNormalizeSrgbColorValue,\n} from \"./internal.ts\"\nimport {\n srgbColorValueToHslColorValue,\n srgbColorValueToHsvColorValue,\n} from \"./convert.ts\"\n\nimport type {\n HslColorValue,\n HsvColorValue,\n LinearRgbColorValue,\n SrgbColorValue,\n} from \"../types.ts\"\n\n/**\n * 构造一个 Linear RGB 颜色值对象。\n *\n * @example\n * ```\n * // Expect: { red: 0.2, green: 0.4, blue: 0.6, alpha: 1 }\n * const example1 = createLinearRgbColorValue({ red: 0.2, green: 0.4, blue: 0.6, alpha: 1 })\n *\n * // Expect: { red: -0.25, green: 0.4, blue: 1.2, alpha: 0.5 }\n * const example2 = createLinearRgbColorValue({ red: -0.25, green: 0.4, blue: 1.2, alpha: 0.5 })\n * ```\n */\nexport const createLinearRgbColorValue = (color: LinearRgbColorValue): LinearRgbColorValue => {\n return internalNormalizeLinearRgbColorValue(color)\n}\n\n/**\n * 构造一个 sRGB 颜色值对象。\n *\n * @example\n * ```\n * // Expect: { red: 51, green: 102, blue: 153, alpha: 1 }\n * const example1 = createSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 })\n *\n * // Expect: { red: 255, green: 255, blue: 255, alpha: 0.5 }\n * const example2 = createSrgbColorValue({ red: 255, green: 255, blue: 255, alpha: 0.5 })\n * ```\n */\nexport const createSrgbColorValue = (color: SrgbColorValue): SrgbColorValue => {\n return internalNormalizeSrgbColorValue(color)\n}\n\n/**\n * 构造一个 HSL 颜色值对象。\n *\n * @example\n * ```\n * // Expect: { hue: 330, saturation: 0.5, lightness: 0.4, alpha: 1 }\n * const example1 = createHslColorValue({ hue: -30, saturation: 0.5, lightness: 0.4, alpha: 1 })\n *\n * // Expect: { hue: 0, saturation: 0, lightness: 1, alpha: 0.5 }\n * const example2 = createHslColorValue({ hue: 360, saturation: 0, lightness: 1, alpha: 0.5 })\n * ```\n */\nexport const createHslColorValue = (color: HslColorValue): HslColorValue => {\n return internalNormalizeHslColorValue(color)\n}\n\n/**\n * 构造一个 HSV 颜色值对象。\n *\n * @example\n * ```\n * // Expect: { hue: 330, saturation: 0.5, value: 0.6, alpha: 1 }\n * const example1 = createHsvColorValue({ hue: -30, saturation: 0.5, value: 0.6, alpha: 1 })\n *\n * // Expect: { hue: 30, saturation: 0.5, value: 0.6, alpha: 1 }\n * const example2 = createHsvColorValue({ hue: 390, saturation: 0.5, value: 0.6, alpha: 1 })\n * ```\n */\nexport const createHsvColorValue = (color: HsvColorValue): HsvColorValue => {\n return internalNormalizeHsvColorValue(color)\n}\n\n/**\n * 根据稳定字符串构造 sRGB 颜色值。\n *\n * @example\n * ```\n * // Expect: { red: 254, green: 192, blue: 46, alpha: 1 }\n * const example1 = createSrgbColorValueByString(\"mobius\")\n *\n * // Expect: { red: 101, green: 227, blue: 144, alpha: 1 }\n * const example2 = createSrgbColorValueByString(\"planet\")\n * ```\n */\nexport const createSrgbColorValueByString = (input: string): SrgbColorValue => {\n return internalGetStableSrgbColorValueByString(input)\n}\n\n/**\n * 根据稳定字符串构造 HSL 颜色值。\n *\n * @example\n * ```\n * // Expect: { hue: 42.992126, saturation: 0.991597, lightness: 0.588235, alpha: 1 }\n * const example1 = createHslColorValueByString(\"mobius\")\n *\n * // Expect: { hue: 139.777778, saturation: 0.71831, lightness: 0.643137, alpha: 1 }\n * const example2 = createHslColorValueByString(\"planet\")\n * ```\n */\nexport const createHslColorValueByString = (input: string): HslColorValue => {\n return srgbColorValueToHslColorValue(createSrgbColorValueByString(input))\n}\n\n/**\n * 根据稳定字符串构造 HSV 颜色值。\n *\n * @example\n * ```\n * // Expect: { hue: 42.992126, saturation: 0.818898, value: 0.996078, alpha: 1 }\n * const example1 = createHsvColorValueByString(\"mobius\")\n *\n * // Expect: { hue: 139.777778, saturation: 0.555066, value: 0.890196, alpha: 1 }\n * const example2 = createHsvColorValueByString(\"planet\")\n * ```\n */\nexport const createHsvColorValueByString = (input: string): HsvColorValue => {\n return srgbColorValueToHsvColorValue(createSrgbColorValueByString(input))\n}\n",
|
|
181
|
-
"import { internalAssertAlpha } from \"../internal.ts\"\nimport {\n createHslColorValue,\n createHsvColorValue,\n createSrgbColorValue,\n} from \"./construct.ts\"\nimport {\n hslColorValueToSrgbColorValue,\n hsvColorValueToSrgbColorValue,\n} from \"./convert.ts\"\nimport {\n internalExpandShortHex,\n internalHexPattern,\n internalParsePercentUnit,\n internalParseRgbChannel,\n} from \"./internal.ts\"\n\nimport type {\n HslColorValue,\n HsvColorValue,\n SrgbColorValue,\n} from \"../types.ts\"\n\n/**\n * 判断输入是否为合法的十六进制颜色字符串。\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = isHexColorString(\"#F0A\")\n *\n * // Expect: false\n * const example2 = isHexColorString(\"#12\")\n * ```\n */\nexport const isHexColorString = (input: string): boolean => {\n return internalHexPattern.test(input.trim())\n}\n\n/**\n * 将十六进制颜色字符串解析为 sRGB 颜色值对象。\n *\n * @example\n * ```\n * // Expect: { red: 255, green: 0, blue: 170, alpha: 1 }\n * const example1 = hexColorStringToSrgbColorValue(\"#F0A\")\n *\n * // Expect: { red: 17, green: 34, blue: 51, alpha: 0.2667 }\n * const example2 = hexColorStringToSrgbColorValue(\"#11223344\")\n * ```\n */\nexport const hexColorStringToSrgbColorValue = (input: string): SrgbColorValue => {\n const normalizedInput = input.trim()\n if (isHexColorString(normalizedInput) === false) {\n throw new TypeError(\"Invalid hex color input\")\n }\n\n const hex = normalizedInput.startsWith(\"#\") ? normalizedInput.slice(1) : normalizedInput\n const expandedHex = hex.length === 3 || hex.length === 4 ? internalExpandShortHex(hex) : hex\n const red = Number.parseInt(expandedHex.slice(0, 2), 16)\n const green = Number.parseInt(expandedHex.slice(2, 4), 16)\n const blue = Number.parseInt(expandedHex.slice(4, 6), 16)\n const alpha = expandedHex.length === 8\n ? Number((Number.parseInt(expandedHex.slice(6, 8), 16) / 255).toFixed(4))\n : 1\n\n return createSrgbColorValue({ red, green, blue, alpha })\n}\n\nconst internalParseRgbParts = (input: string, allowAlpha: boolean): SrgbColorValue => {\n const rgbMatch = /^rgba?\\((.*)\\)$/i.exec(input)\n if (rgbMatch === null) {\n throw new TypeError(\"Invalid color string input\")\n }\n\n const partsSource = rgbMatch[1]\n if (partsSource === undefined) {\n throw new TypeError(\"Invalid color string input\")\n }\n\n const parts = partsSource.split(\",\").map(part => part.trim())\n if (allowAlpha === true && parts.length !== 4) {\n throw new TypeError(\"Invalid RGBA color string input\")\n }\n\n if (allowAlpha === false && parts.length !== 3) {\n throw new TypeError(\"Invalid RGB color string input\")\n }\n\n const [redPart = \"\", greenPart = \"\", bluePart = \"\", alphaPart] = parts\n const red = internalParseRgbChannel(redPart, \"red\")\n const green = internalParseRgbChannel(greenPart, \"green\")\n const blue = internalParseRgbChannel(bluePart, \"blue\")\n const alpha = allowAlpha === true ? Number(alphaPart) : 1\n\n return createSrgbColorValue({ red, green, blue, alpha })\n}\n\n/**\n * 将 `rgb(r, g, b)` 字符串解析为 sRGB 颜色值对象。\n *\n * @example\n * ```\n * // Expect: { red: 51, green: 102, blue: 153, alpha: 1 }\n * const example1 = rgbColorStringToSrgbColorValue(\"rgb(51, 102, 153)\")\n *\n * // Expect: { red: 0, green: 0, blue: 0, alpha: 1 }\n * const example2 = rgbColorStringToSrgbColorValue(\"rgb(0, 0, 0)\")\n * ```\n */\nexport const rgbColorStringToSrgbColorValue = (input: string): SrgbColorValue => {\n return internalParseRgbParts(input.trim(), false)\n}\n\n/**\n * 将 `rgba(r, g, b, a)` 字符串解析为 sRGB 颜色值对象。\n *\n * @example\n * ```\n * // Expect: { red: 51, green: 102, blue: 153, alpha: 0.5 }\n * const example1 = rgbaColorStringToSrgbColorValue(\"rgba(51, 102, 153, 0.5)\")\n *\n * // Expect: { red: 255, green: 255, blue: 255, alpha: 1 }\n * const example2 = rgbaColorStringToSrgbColorValue(\"rgba(255, 255, 255, 1)\")\n * ```\n */\nexport const rgbaColorStringToSrgbColorValue = (input: string): SrgbColorValue => {\n return internalParseRgbParts(input.trim(), true)\n}\n\nconst internalParseHslParts = (input: string, allowAlpha: boolean): HslColorValue => {\n const hslMatch = /^hsla?\\((.*)\\)$/i.exec(input)\n if (hslMatch === null) {\n throw new TypeError(\"Invalid color string input\")\n }\n\n const partsSource = hslMatch[1]\n if (partsSource === undefined) {\n throw new TypeError(\"Invalid color string input\")\n }\n\n const parts = partsSource.split(\",\").map(part => part.trim())\n if (allowAlpha === true && parts.length !== 4) {\n throw new TypeError(\"Invalid HSLA color string input\")\n }\n\n if (allowAlpha === false && parts.length !== 3) {\n throw new TypeError(\"Invalid HSL color string input\")\n }\n\n const [huePart = \"\", saturationPart = \"\", lightnessPart = \"\", alphaPart] = parts\n const hue = Number(huePart)\n const saturation = internalParsePercentUnit(saturationPart, \"saturation\")\n const lightness = internalParsePercentUnit(lightnessPart, \"lightness\")\n const alpha = allowAlpha === true ? Number(alphaPart) : 1\n internalAssertAlpha(alpha)\n\n return createHslColorValue({ hue, saturation, lightness, alpha })\n}\n\n/**\n * 将 `hsl(h, s%, l%)` 字符串解析为 HSL 颜色值对象。\n *\n * @example\n * ```\n * // Expect: { hue: 210, saturation: 0.5, lightness: 0.4, alpha: 1 }\n * const example1 = hslColorStringToHslColorValue(\"hsl(210, 50%, 40%)\")\n *\n * // Expect: { hue: 330, saturation: 0.5, lightness: 0.4, alpha: 1 }\n * const example2 = hslColorStringToHslColorValue(\"hsl(-30, 50%, 40%)\")\n * ```\n */\nexport const hslColorStringToHslColorValue = (input: string): HslColorValue => {\n return internalParseHslParts(input.trim(), false)\n}\n\n/**\n * 将 `hsla(h, s%, l%, a)` 字符串解析为 HSL 颜色值对象。\n *\n * @example\n * ```\n * // Expect: { hue: 210, saturation: 0.5, lightness: 0.4, alpha: 0.5 }\n * const example1 = hslaColorStringToHslColorValue(\"hsla(210, 50%, 40%, 0.5)\")\n *\n * // Expect: { hue: 0, saturation: 0, lightness: 1, alpha: 1 }\n * const example2 = hslaColorStringToHslColorValue(\"hsla(0, 0%, 100%, 1)\")\n * ```\n */\nexport const hslaColorStringToHslColorValue = (input: string): HslColorValue => {\n return internalParseHslParts(input.trim(), true)\n}\n\nconst internalParseHsvParts = (input: string, allowAlpha: boolean): HsvColorValue => {\n const hsvMatch = /^hsva?\\((.*)\\)$/i.exec(input)\n if (hsvMatch === null) {\n throw new TypeError(\"Invalid color string input\")\n }\n\n const partsSource = hsvMatch[1]\n if (partsSource === undefined) {\n throw new TypeError(\"Invalid color string input\")\n }\n\n const parts = partsSource.split(\",\").map(part => part.trim())\n if (allowAlpha === true && parts.length !== 4) {\n throw new TypeError(\"Invalid HSVA color string input\")\n }\n\n if (allowAlpha === false && parts.length !== 3) {\n throw new TypeError(\"Invalid HSV color string input\")\n }\n\n const [huePart = \"\", saturationPart = \"\", valuePart = \"\", alphaPart] = parts\n const hue = Number(huePart)\n const saturation = internalParsePercentUnit(saturationPart, \"saturation\")\n const value = internalParsePercentUnit(valuePart, \"value\")\n const alpha = allowAlpha === true ? Number(alphaPart) : 1\n internalAssertAlpha(alpha)\n\n return createHsvColorValue({ hue, saturation, value, alpha })\n}\n\n/**\n * 将 `hsv(h, s%, v%)` 字符串解析为 HSV 颜色值对象。\n *\n * @example\n * ```\n * // Expect: { hue: 210, saturation: 0.6667, value: 0.6, alpha: 1 }\n * const example1 = hsvColorStringToHsvColorValue(\"hsv(210, 66.67%, 60%)\")\n *\n * // Expect: { hue: 30, saturation: 0.5, value: 0.6, alpha: 1 }\n * const example2 = hsvColorStringToHsvColorValue(\"hsv(390, 50%, 60%)\")\n * ```\n */\nexport const hsvColorStringToHsvColorValue = (input: string): HsvColorValue => {\n return internalParseHsvParts(input.trim(), false)\n}\n\n/**\n * 将 `hsva(h, s%, v%, a)` 字符串解析为 HSV 颜色值对象。\n *\n * @example\n * ```\n * // Expect: { hue: 210, saturation: 0.6667, value: 0.6, alpha: 0.5 }\n * const example1 = hsvaColorStringToHsvColorValue(\"hsva(210, 66.67%, 60%, 0.5)\")\n *\n * // Expect: { hue: 0, saturation: 0, value: 1, alpha: 1 }\n * const example2 = hsvaColorStringToHsvColorValue(\"hsva(0, 0%, 100%, 1)\")\n * ```\n */\nexport const hsvaColorStringToHsvColorValue = (input: string): HsvColorValue => {\n return internalParseHsvParts(input.trim(), true)\n}\n\n/**\n * 将异构颜色字符串归一化为 sRGB 颜色值对象。\n *\n * 这是一个面向最终显示层的归一化入口。它会有意把十六进制、RGB、HSL 与 HSV\n * 等不同语义层的字符串统一折叠为 sRGB;如果调用方需要保留输入本身的颜色语义,\n * 应改用对应的专用解析函数。\n *\n * @example\n * ```\n * // Expect: { red: 51, green: 102, blue: 153, alpha: 1 }\n * const example1 = colorStringToSrgbColorValue(\"#336699\")\n *\n * // Expect: { red: 51, green: 102, blue: 153, alpha: 1 }\n * const example2 = colorStringToSrgbColorValue(\"hsl(210, 50%, 40%)\")\n * ```\n */\nexport const colorStringToSrgbColorValue = (input: string): SrgbColorValue => {\n const normalizedInput = input.trim()\n if (normalizedInput.startsWith(\"#\") || isHexColorString(normalizedInput) === true) {\n return hexColorStringToSrgbColorValue(normalizedInput)\n }\n\n if (normalizedInput.toLowerCase().startsWith(\"rgba(\")) {\n return rgbaColorStringToSrgbColorValue(normalizedInput)\n }\n\n if (normalizedInput.toLowerCase().startsWith(\"rgb(\")) {\n return rgbColorStringToSrgbColorValue(normalizedInput)\n }\n\n if (normalizedInput.toLowerCase().startsWith(\"hsla(\")) {\n return hslColorValueToSrgbColorValue(hslaColorStringToHslColorValue(normalizedInput))\n }\n\n if (normalizedInput.toLowerCase().startsWith(\"hsl(\")) {\n return hslColorValueToSrgbColorValue(hslColorStringToHslColorValue(normalizedInput))\n }\n\n if (normalizedInput.toLowerCase().startsWith(\"hsva(\")) {\n return hsvColorValueToSrgbColorValue(hsvaColorStringToHsvColorValue(normalizedInput))\n }\n\n if (normalizedInput.toLowerCase().startsWith(\"hsv(\")) {\n return hsvColorValueToSrgbColorValue(hsvColorStringToHsvColorValue(normalizedInput))\n }\n\n throw new TypeError(\"Invalid color string input\")\n}\n",
|
|
182
|
-
"import {\n createHslColorValue,\n createHsvColorValue,\n createSrgbColorValue,\n} from \"./construct.ts\"\nimport {\n internalFormatAlpha,\n internalFormatHexByte,\n internalFormatPercentUnit,\n} from \"./internal.ts\"\n\nimport type {\n HslColorValue,\n HsvColorValue,\n SrgbColorValue,\n} from \"../types.ts\"\n\n/**\n * 将 sRGB 颜色值序列化为十六进制颜色字符串。\n *\n * @example\n * ```\n * // Expect: #336699\n * const example1 = srgbColorValueToHexColorString({ red: 51, green: 102, blue: 153, alpha: 0.5 })\n *\n * // Expect: #33669980\n * const example2 = srgbColorValueToHexColorString({ red: 51, green: 102, blue: 153, alpha: 0.5 }, { includeAlpha: true })\n * ```\n */\nexport const srgbColorValueToHexColorString = (color: SrgbColorValue, options: { includeAlpha?: boolean } = {}): string => {\n const normalizedColor = createSrgbColorValue(color)\n const hex = [normalizedColor.red, normalizedColor.green, normalizedColor.blue]\n .map(value => internalFormatHexByte(value))\n .join(\"\")\n\n if (options.includeAlpha === true) {\n const alphaByte = Math.round(normalizedColor.alpha * 255)\n return `#${hex}${internalFormatHexByte(alphaByte)}`\n }\n\n return `#${hex}`\n}\n\n/**\n * 将 sRGB 颜色值序列化为 `rgb(...)` 字符串。\n *\n * @example\n * ```\n * // Expect: rgb(51, 102, 153)\n * const example1 = srgbColorValueToRgbColorString({ red: 51, green: 102, blue: 153, alpha: 0.5 })\n *\n * // Expect: rgb(0, 0, 0)\n * const example2 = srgbColorValueToRgbColorString({ red: 0, green: 0, blue: 0, alpha: 1 })\n * ```\n */\nexport const srgbColorValueToRgbColorString = (color: SrgbColorValue): string => {\n const normalizedColor = createSrgbColorValue(color)\n return `rgb(${normalizedColor.red}, ${normalizedColor.green}, ${normalizedColor.blue})`\n}\n\n/**\n * 将 sRGB 颜色值序列化为 `rgba(...)` 字符串。\n *\n * @example\n * ```\n * // Expect: rgba(51, 102, 153, 0.5)\n * const example1 = srgbColorValueToRgbaColorString({ red: 51, green: 102, blue: 153, alpha: 0.5 })\n *\n * // Expect: rgba(255, 255, 255, 1)\n * const example2 = srgbColorValueToRgbaColorString({ red: 255, green: 255, blue: 255, alpha: 1 })\n * ```\n */\nexport const srgbColorValueToRgbaColorString = (color: SrgbColorValue): string => {\n const normalizedColor = createSrgbColorValue(color)\n return `rgba(${normalizedColor.red}, ${normalizedColor.green}, ${normalizedColor.blue}, ${internalFormatAlpha(normalizedColor.alpha)})`\n}\n\n/**\n * 将 HSL 颜色值序列化为 `hsl(...)` 字符串。\n *\n * @example\n * ```\n * // Expect: hsl(210, 50%, 40%)\n * const example1 = hslColorValueToHslColorString({ hue: 210, saturation: 0.5, lightness: 0.4, alpha: 0.5 })\n *\n * // Expect: hsl(0, 0%, 100%)\n * const example2 = hslColorValueToHslColorString({ hue: 0, saturation: 0, lightness: 1, alpha: 1 })\n * ```\n */\nexport const hslColorValueToHslColorString = (color: HslColorValue): string => {\n const normalizedColor = createHslColorValue(color)\n return `hsl(${normalizedColor.hue}, ${internalFormatPercentUnit(normalizedColor.saturation)}%, ${internalFormatPercentUnit(normalizedColor.lightness)}%)`\n}\n\n/**\n * 将 HSL 颜色值序列化为 `hsla(...)` 字符串。\n *\n * @example\n * ```\n * // Expect: hsla(210, 50%, 40%, 0.5)\n * const example1 = hslColorValueToHslaColorString({ hue: 210, saturation: 0.5, lightness: 0.4, alpha: 0.5 })\n *\n * // Expect: hsla(0, 0%, 100%, 1)\n * const example2 = hslColorValueToHslaColorString({ hue: 0, saturation: 0, lightness: 1, alpha: 1 })\n * ```\n */\nexport const hslColorValueToHslaColorString = (color: HslColorValue): string => {\n const normalizedColor = createHslColorValue(color)\n return `hsla(${normalizedColor.hue}, ${internalFormatPercentUnit(normalizedColor.saturation)}%, ${internalFormatPercentUnit(normalizedColor.lightness)}%, ${internalFormatAlpha(normalizedColor.alpha)})`\n}\n\n/**\n * 将 HSV 颜色值序列化为 `hsv(...)` 字符串。\n *\n * @example\n * ```\n * // Expect: hsv(210, 66.67%, 60%)\n * const example1 = hsvColorValueToHsvColorString({ hue: 210, saturation: 0.6667, value: 0.6, alpha: 0.5 })\n *\n * // Expect: hsv(0, 0%, 100%)\n * const example2 = hsvColorValueToHsvColorString({ hue: 0, saturation: 0, value: 1, alpha: 1 })\n * ```\n */\nexport const hsvColorValueToHsvColorString = (color: HsvColorValue): string => {\n const normalizedColor = createHsvColorValue(color)\n return `hsv(${normalizedColor.hue}, ${internalFormatPercentUnit(normalizedColor.saturation)}%, ${internalFormatPercentUnit(normalizedColor.value)}%)`\n}\n\n/**\n * 将 HSV 颜色值序列化为 `hsva(...)` 字符串。\n *\n * @example\n * ```\n * // Expect: hsva(210, 66.67%, 60%, 0.5)\n * const example1 = hsvColorValueToHsvaColorString({ hue: 210, saturation: 0.6667, value: 0.6, alpha: 0.5 })\n *\n * // Expect: hsva(0, 0%, 100%, 1)\n * const example2 = hsvColorValueToHsvaColorString({ hue: 0, saturation: 0, value: 1, alpha: 1 })\n * ```\n */\nexport const hsvColorValueToHsvaColorString = (color: HsvColorValue): string => {\n const normalizedColor = createHsvColorValue(color)\n return `hsva(${normalizedColor.hue}, ${internalFormatPercentUnit(normalizedColor.saturation)}%, ${internalFormatPercentUnit(normalizedColor.value)}%, ${internalFormatAlpha(normalizedColor.alpha)})`\n}\n",
|
|
183
|
-
"import { createSrgbColorValue } from \"./construct.ts\"\nimport { internalAssertColorUnit } from \"../internal.ts\"\nimport { linearRgbColorValueToXyzColorValue } from \"../xyz/convert.ts\"\nimport { srgbColorValueToLinearRgbColorValue } from \"./convert.ts\"\nimport {\n xyzColorValueToRelativeLuminance,\n xyzColorValueToTristimulusSum,\n xyzColorValueToXyChromaticityValue,\n} from \"../xyz/analyze.ts\"\n\nimport type {\n LinearRgbColorValue,\n SrgbColorValue,\n XyChromaticityValue,\n} from \"../types.ts\"\n\nconst internalDefaultDarkSrgbColorValue: SrgbColorValue = { red: 0, green: 0, blue: 0, alpha: 1 }\nconst internalDefaultLightSrgbColorValue: SrgbColorValue = { red: 255, green: 255, blue: 255, alpha: 1 }\n\nconst internalNormalizeContrastRatio = (value: number): number => {\n if (Number.isFinite(value) === false || value < 1) {\n throw new RangeError(\"Contrast ratio must be a finite number greater than or equal to 1\")\n }\n\n return value\n}\n\n/**\n * 读取 Linear RGB 颜色值的相对亮度。\n *\n * 该函数会沿合法路径 `Linear RGB -> XYZ -> luminance` 计算。\n *\n * @example\n * ```\n * // Expect: 0.212673\n * const example1 = linearRgbColorValueToRelativeLuminance({ red: 1, green: 0, blue: 0, alpha: 1 })\n *\n * // Expect: 1\n * const example2 = linearRgbColorValueToRelativeLuminance({ red: 1, green: 1, blue: 1, alpha: 1 })\n * ```\n */\nexport const linearRgbColorValueToRelativeLuminance = (color: LinearRgbColorValue): number => {\n return xyzColorValueToRelativeLuminance(linearRgbColorValueToXyzColorValue(color))\n}\n\n/**\n * 读取 sRGB 颜色值的相对亮度。\n *\n * 该函数会沿合法路径 `sRGB -> Linear RGB -> XYZ -> luminance` 计算。\n *\n * @example\n * ```\n * // Expect: 0.125053\n * const example1 = srgbColorValueToRelativeLuminance({ red: 51, green: 102, blue: 153, alpha: 1 })\n *\n * // Expect: 1\n * const example2 = srgbColorValueToRelativeLuminance({ red: 255, green: 255, blue: 255, alpha: 1 })\n * ```\n */\nexport const srgbColorValueToRelativeLuminance = (color: SrgbColorValue): number => {\n return linearRgbColorValueToRelativeLuminance(srgbColorValueToLinearRgbColorValue(color))\n}\n\n/**\n * 读取两个 sRGB 颜色值之间的对比度。\n *\n * 该函数假定输入已经是最终显示颜色;若存在透明叠加,应先完成合成。\n *\n * @example\n * ```\n * // Expect: 21\n * const example1 = srgbColorValuesToContrastRatio(\n * { red: 0, green: 0, blue: 0, alpha: 1 },\n * { red: 255, green: 255, blue: 255, alpha: 1 },\n * )\n *\n * // Expect: 1\n * const example2 = srgbColorValuesToContrastRatio(\n * { red: 51, green: 102, blue: 153, alpha: 1 },\n * { red: 51, green: 102, blue: 153, alpha: 1 },\n * )\n * ```\n */\nexport const srgbColorValuesToContrastRatio = (first: SrgbColorValue, second: SrgbColorValue): number => {\n const firstLuminance = srgbColorValueToRelativeLuminance(first)\n const secondLuminance = srgbColorValueToRelativeLuminance(second)\n const lighterLuminance = Math.max(firstLuminance, secondLuminance)\n const darkerLuminance = Math.min(firstLuminance, secondLuminance)\n\n return lighterLuminance === darkerLuminance\n ? 1\n : Number((((lighterLuminance + 0.05) / (darkerLuminance + 0.05))).toFixed(6))\n}\n\n/**\n * 判断两个 sRGB 颜色值是否达到指定对比度阈值。\n *\n * 该函数假定输入已经是最终显示颜色;若存在透明叠加,应先完成合成。\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = doSrgbColorValuesMeetContrastRatio(\n * { red: 0, green: 0, blue: 0, alpha: 1 },\n * { red: 255, green: 255, blue: 255, alpha: 1 },\n * 4.5,\n * )\n *\n * // Expect: false\n * const example2 = doSrgbColorValuesMeetContrastRatio(\n * { red: 120, green: 120, blue: 120, alpha: 1 },\n * { red: 255, green: 255, blue: 255, alpha: 1 },\n * 4.5,\n * )\n * ```\n */\nexport const doSrgbColorValuesMeetContrastRatio = (first: SrgbColorValue, second: SrgbColorValue, minimumContrastRatio = 4.5): boolean => {\n return srgbColorValuesToContrastRatio(first, second) >= internalNormalizeContrastRatio(minimumContrastRatio)\n}\n\n/**\n * 为给定背景色选择更可读的黑色或白色文本颜色。\n *\n * 该函数假定背景色已经是最终显示颜色。\n *\n * @example\n * ```\n * // Expect: { red: 255, green: 255, blue: 255, alpha: 1 }\n * const example1 = pickReadableSrgbTextColorValue({ red: 0, green: 102, blue: 204, alpha: 1 })\n *\n * // Expect: { red: 0, green: 0, blue: 0, alpha: 1 }\n * const example2 = pickReadableSrgbTextColorValue({ red: 250, green: 240, blue: 210, alpha: 1 })\n * ```\n */\nexport const pickReadableSrgbTextColorValue = (\n backgroundColor: SrgbColorValue,\n options: { darkColor?: SrgbColorValue, lightColor?: SrgbColorValue } = {},\n): SrgbColorValue => {\n const normalizedDarkColor = createSrgbColorValue(options.darkColor ?? internalDefaultDarkSrgbColorValue)\n const normalizedLightColor = createSrgbColorValue(options.lightColor ?? internalDefaultLightSrgbColorValue)\n const darkContrastRatio = srgbColorValuesToContrastRatio(normalizedDarkColor, backgroundColor)\n const lightContrastRatio = srgbColorValuesToContrastRatio(normalizedLightColor, backgroundColor)\n\n return lightContrastRatio > darkContrastRatio ? normalizedLightColor : normalizedDarkColor\n}\n\n/**\n * 读取 Linear RGB 颜色值沿合法路径得到的三刺激总量。\n *\n * 该函数会沿合法路径 `Linear RGB -> XYZ -> tristimulus sum` 计算。\n *\n * @example\n * ```\n * // Expect: 0.644463\n * const example1 = linearRgbColorValueToTristimulusSum({ red: 1, green: 0, blue: 0, alpha: 1 })\n *\n * // Expect: 3.0393\n * const example2 = linearRgbColorValueToTristimulusSum({ red: 1, green: 1, blue: 1, alpha: 1 })\n * ```\n */\nexport const linearRgbColorValueToTristimulusSum = (color: LinearRgbColorValue): number => {\n return xyzColorValueToTristimulusSum(linearRgbColorValueToXyzColorValue(color))\n}\n\n/**\n * 读取 sRGB 颜色值沿合法路径得到的三刺激总量。\n *\n * 该函数会沿合法路径 `sRGB -> Linear RGB -> XYZ -> tristimulus sum` 计算。\n *\n * @example\n * ```\n * // Expect: 0.562889\n * const example1 = srgbColorValueToTristimulusSum({ red: 51, green: 102, blue: 153, alpha: 1 })\n *\n * // Expect: 3.0393\n * const example2 = srgbColorValueToTristimulusSum({ red: 255, green: 255, blue: 255, alpha: 1 })\n * ```\n */\nexport const srgbColorValueToTristimulusSum = (color: SrgbColorValue): number => {\n return linearRgbColorValueToTristimulusSum(srgbColorValueToLinearRgbColorValue(color))\n}\n\n/**\n * 读取 Linear RGB 颜色值沿合法路径得到的 `xy` 色度坐标。\n *\n * 该函数会沿合法路径 `Linear RGB -> XYZ -> xy chromaticity` 计算。\n *\n * @example\n * ```\n * // Expect: { x: 0.64, y: 0.33 }\n * const example1 = linearRgbColorValueToXyChromaticityValue({ red: 1, green: 0, blue: 0, alpha: 1 })\n *\n * // Expect: { x: 0.312727, y: 0.329023 }\n * const example2 = linearRgbColorValueToXyChromaticityValue({ red: 1, green: 1, blue: 1, alpha: 1 })\n * ```\n */\nexport const linearRgbColorValueToXyChromaticityValue = (color: LinearRgbColorValue): XyChromaticityValue => {\n return xyzColorValueToXyChromaticityValue(linearRgbColorValueToXyzColorValue(color))\n}\n\n/**\n * 读取 sRGB 颜色值沿合法路径得到的 `xy` 色度坐标。\n *\n * 该函数会沿合法路径 `sRGB -> Linear RGB -> XYZ -> xy chromaticity` 计算。\n *\n * @example\n * ```\n * // Expect: { x: 0.210775, y: 0.222163 }\n * const example1 = srgbColorValueToXyChromaticityValue({ red: 51, green: 102, blue: 153, alpha: 1 })\n *\n * // Expect: { x: 0.312727, y: 0.329023 }\n * const example2 = srgbColorValueToXyChromaticityValue({ red: 255, green: 255, blue: 255, alpha: 1 })\n * ```\n */\nexport const srgbColorValueToXyChromaticityValue = (color: SrgbColorValue): XyChromaticityValue => {\n return linearRgbColorValueToXyChromaticityValue(srgbColorValueToLinearRgbColorValue(color))\n}\n\n/**\n * 判断一个 sRGB 颜色值是否可视为亮色。\n *\n * 阈值位于 `0` 到 `1` 之间,判断依据是相对亮度。\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = isLightSrgbColorValue({ red: 255, green: 255, blue: 255, alpha: 1 })\n *\n * // Expect: false\n * const example2 = isLightSrgbColorValue({ red: 0, green: 0, blue: 0, alpha: 1 })\n * ```\n */\nexport const isLightSrgbColorValue = (color: SrgbColorValue, threshold = 0.5): boolean => {\n internalAssertColorUnit(threshold, \"threshold\")\n return srgbColorValueToRelativeLuminance(createSrgbColorValue(color)) >= threshold\n}\n",
|
|
184
|
-
"import {\n createLinearRgbColorValue,\n createSrgbColorValue,\n} from \"./construct.ts\"\nimport {\n internalAssertColorUnit,\n internalRoundColorFloat,\n} from \"../internal.ts\"\nimport {\n linearRgbColorValueToSrgbColorValue,\n srgbColorValueToLinearRgbColorValue,\n} from \"./convert.ts\"\n\nimport type {\n LinearRgbColorValue,\n SrgbColorValue,\n} from \"../types.ts\"\n\nconst internalOpaqueBlackLinearRgbColorValue: LinearRgbColorValue = { red: 0, green: 0, blue: 0, alpha: 1 }\nconst internalOpaqueWhiteLinearRgbColorValue: LinearRgbColorValue = { red: 1, green: 1, blue: 1, alpha: 1 }\nconst internalOpaqueGrayLinearRgbColorValue: LinearRgbColorValue = { red: 0.5, green: 0.5, blue: 0.5, alpha: 1 }\n\nconst internalMixNumber = (first: number, second: number, weight: number): number => {\n return internalRoundColorFloat((first * (1 - weight)) + (second * weight))\n}\nconst internalCompositeLinearRgbChannels = (foreground: number, background: number, foregroundAlpha: number, backgroundAlpha: number, outputAlpha: number): number => {\n if (outputAlpha === 0) {\n return 0\n }\n\n return internalRoundColorFloat(((foreground * foregroundAlpha) + (background * backgroundAlpha * (1 - foregroundAlpha))) / outputAlpha)\n}\nconst internalMixSrgbColorValueWithLinearReference = (color: SrgbColorValue, referenceColor: LinearRgbColorValue, amount: number): SrgbColorValue => {\n internalAssertColorUnit(amount, \"amount\")\n const normalizedColor = createSrgbColorValue(color)\n\n return linearRgbColorValueToSrgbColorValue(mixLinearRgbColorValues(\n srgbColorValueToLinearRgbColorValue(normalizedColor),\n referenceColor,\n amount,\n ))\n}\n\n/**\n * 在 Linear RGB 层混合两个颜色值。\n *\n * `weight` 表示第二个颜色值的占比。\n *\n * @example\n * ```\n * // Expect: { red: 0.5, green: 0, blue: 0.5, alpha: 1 }\n * const example1 = mixLinearRgbColorValues(\n * { red: 1, green: 0, blue: 0, alpha: 1 },\n * { red: 0, green: 0, blue: 1, alpha: 1 },\n * 0.5,\n * )\n *\n * // Expect: { red: 0.75, green: 0.75, blue: 0.75, alpha: 1 }\n * const example2 = mixLinearRgbColorValues(\n * { red: 1, green: 1, blue: 1, alpha: 1 },\n * { red: 0, green: 0, blue: 0, alpha: 1 },\n * 0.25,\n * )\n * ```\n */\nexport const mixLinearRgbColorValues = (first: LinearRgbColorValue, second: LinearRgbColorValue, weight = 0.5): LinearRgbColorValue => {\n internalAssertColorUnit(weight, \"weight\")\n const normalizedFirst = createLinearRgbColorValue(first)\n const normalizedSecond = createLinearRgbColorValue(second)\n\n return createLinearRgbColorValue({\n red: internalMixNumber(normalizedFirst.red, normalizedSecond.red, weight),\n green: internalMixNumber(normalizedFirst.green, normalizedSecond.green, weight),\n blue: internalMixNumber(normalizedFirst.blue, normalizedSecond.blue, weight),\n alpha: internalMixNumber(normalizedFirst.alpha, normalizedSecond.alpha, weight),\n })\n}\n\n/**\n * 在 sRGB 层混合两个颜色值。\n *\n * 该函数会沿合法路径 `sRGB -> Linear RGB -> mix -> sRGB` 计算。\n *\n * @example\n * ```\n * // Expect: { red: 188, green: 0, blue: 188, alpha: 1 }\n * const example1 = mixSrgbColorValues(\n * { red: 255, green: 0, blue: 0, alpha: 1 },\n * { red: 0, green: 0, blue: 255, alpha: 1 },\n * 0.5,\n * )\n *\n * // Expect: { red: 255, green: 188, blue: 188, alpha: 1 }\n * const example2 = mixSrgbColorValues(\n * { red: 255, green: 0, blue: 0, alpha: 1 },\n * { red: 255, green: 255, blue: 255, alpha: 1 },\n * 0.5,\n * )\n * ```\n */\nexport const mixSrgbColorValues = (first: SrgbColorValue, second: SrgbColorValue, weight = 0.5): SrgbColorValue => {\n internalAssertColorUnit(weight, \"weight\")\n const normalizedFirst = createSrgbColorValue(first)\n const normalizedSecond = createSrgbColorValue(second)\n const mixedLinearRgbColorValue = mixLinearRgbColorValues(\n srgbColorValueToLinearRgbColorValue(normalizedFirst),\n srgbColorValueToLinearRgbColorValue(normalizedSecond),\n weight,\n )\n\n return linearRgbColorValueToSrgbColorValue(mixedLinearRgbColorValue)\n}\n\n/**\n * 将一个 Linear RGB 前景色合成到另一个 Linear RGB 背景色之上。\n *\n * 该函数在支线核心计算层直接执行 alpha 合成。\n *\n * @example\n * ```\n * // Expect: { red: 0.5, green: 0.5, blue: 1, alpha: 1 }\n * const example1 = compositeLinearRgbColorValueOverBackground(\n * { red: 1, green: 1, blue: 1, alpha: 0.5 },\n * { red: 0, green: 0, blue: 1, alpha: 1 },\n * )\n *\n * // Expect: { red: 1, green: 0, blue: 0, alpha: 1 }\n * const example2 = compositeLinearRgbColorValueOverBackground(\n * { red: 1, green: 0, blue: 0, alpha: 1 },\n * { red: 0, green: 0, blue: 1, alpha: 1 },\n * )\n * ```\n */\nexport const compositeLinearRgbColorValueOverBackground = (foreground: LinearRgbColorValue, background: LinearRgbColorValue): LinearRgbColorValue => {\n const normalizedForeground = createLinearRgbColorValue(foreground)\n const normalizedBackground = createLinearRgbColorValue(background)\n const outputAlpha = internalRoundColorFloat(\n normalizedForeground.alpha + (normalizedBackground.alpha * (1 - normalizedForeground.alpha)),\n )\n\n return createLinearRgbColorValue({\n red: internalCompositeLinearRgbChannels(\n normalizedForeground.red,\n normalizedBackground.red,\n normalizedForeground.alpha,\n normalizedBackground.alpha,\n outputAlpha,\n ),\n green: internalCompositeLinearRgbChannels(\n normalizedForeground.green,\n normalizedBackground.green,\n normalizedForeground.alpha,\n normalizedBackground.alpha,\n outputAlpha,\n ),\n blue: internalCompositeLinearRgbChannels(\n normalizedForeground.blue,\n normalizedBackground.blue,\n normalizedForeground.alpha,\n normalizedBackground.alpha,\n outputAlpha,\n ),\n alpha: outputAlpha,\n })\n}\n\n/**\n * 将一个 sRGB 前景色沿合法路径合成到另一个 sRGB 背景色之上。\n *\n * 该函数会沿合法路径 `sRGB -> Linear RGB -> composite -> sRGB` 计算。\n *\n * @example\n * ```\n * // Expect: { red: 188, green: 188, blue: 255, alpha: 1 }\n * const example1 = compositeSrgbColorValueOverBackground(\n * { red: 255, green: 255, blue: 255, alpha: 0.5 },\n * { red: 0, green: 0, blue: 255, alpha: 1 },\n * )\n *\n * // Expect: { red: 255, green: 0, blue: 0, alpha: 1 }\n * const example2 = compositeSrgbColorValueOverBackground(\n * { red: 255, green: 0, blue: 0, alpha: 1 },\n * { red: 0, green: 0, blue: 255, alpha: 1 },\n * )\n * ```\n */\nexport const compositeSrgbColorValueOverBackground = (foreground: SrgbColorValue, background: SrgbColorValue): SrgbColorValue => {\n const normalizedForeground = createSrgbColorValue(foreground)\n const normalizedBackground = createSrgbColorValue(background)\n\n return linearRgbColorValueToSrgbColorValue(compositeLinearRgbColorValueOverBackground(\n srgbColorValueToLinearRgbColorValue(normalizedForeground),\n srgbColorValueToLinearRgbColorValue(normalizedBackground),\n ))\n}\n\n/**\n * 调整一个 sRGB 颜色值的透明度。\n *\n * @example\n * ```\n * // Expect: { red: 51, green: 102, blue: 153, alpha: 0.4 }\n * const example1 = fadeSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0.4)\n *\n * // Expect: { red: 51, green: 102, blue: 153, alpha: 0 }\n * const example2 = fadeSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0)\n * ```\n */\nexport const fadeSrgbColorValue = (color: SrgbColorValue, alpha: number): SrgbColorValue => {\n internalAssertColorUnit(alpha, \"alpha\")\n const normalizedColor = createSrgbColorValue(color)\n\n return createSrgbColorValue({\n red: normalizedColor.red,\n green: normalizedColor.green,\n blue: normalizedColor.blue,\n alpha,\n })\n}\n\n/**\n * 沿合法路径将一个 sRGB 颜色值向白色方向推进。\n *\n * @example\n * ```\n * // Expect: { red: 190, green: 198, blue: 212, alpha: 1 }\n * const example1 = tintSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0.5)\n *\n * // Expect: { red: 51, green: 102, blue: 153, alpha: 1 }\n * const example2 = tintSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0)\n * ```\n */\nexport const tintSrgbColorValue = (color: SrgbColorValue, amount: number): SrgbColorValue => {\n return internalMixSrgbColorValueWithLinearReference(color, internalOpaqueWhiteLinearRgbColorValue, amount)\n}\n\n/**\n * 沿合法路径将一个 sRGB 颜色值向黑色方向推进。\n *\n * @example\n * ```\n * // Expect: { red: 35, green: 73, blue: 111, alpha: 1 }\n * const example1 = shadeSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0.5)\n *\n * // Expect: { red: 51, green: 102, blue: 153, alpha: 1 }\n * const example2 = shadeSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0)\n * ```\n */\nexport const shadeSrgbColorValue = (color: SrgbColorValue, amount: number): SrgbColorValue => {\n return internalMixSrgbColorValueWithLinearReference(color, internalOpaqueBlackLinearRgbColorValue, amount)\n}\n\n/**\n * 沿合法路径将一个 sRGB 颜色值向中性灰方向推进。\n *\n * @example\n * ```\n * // Expect: { red: 141, green: 153, blue: 171, alpha: 1 }\n * const example1 = toneSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0.5)\n *\n * // Expect: { red: 51, green: 102, blue: 153, alpha: 1 }\n * const example2 = toneSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0)\n * ```\n */\nexport const toneSrgbColorValue = (color: SrgbColorValue, amount: number): SrgbColorValue => {\n return internalMixSrgbColorValueWithLinearReference(color, internalOpaqueGrayLinearRgbColorValue, amount)\n}\n\n/**\n * 沿合法路径提高一个 sRGB 颜色值的亮度倾向。\n *\n * 该能力当前等价于向白色混合。\n *\n * @example\n * ```\n * // Expect: { red: 143, green: 160, blue: 186, alpha: 1 }\n * const example1 = lightenSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0.25)\n *\n * // Expect: { red: 51, green: 102, blue: 153, alpha: 1 }\n * const example2 = lightenSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0)\n * ```\n */\nexport const lightenSrgbColorValue = (color: SrgbColorValue, amount: number): SrgbColorValue => {\n return tintSrgbColorValue(color, amount)\n}\n\n/**\n * 沿合法路径降低一个 sRGB 颜色值的亮度倾向。\n *\n * 该能力当前等价于向黑色混合。\n *\n * @example\n * ```\n * // Expect: { red: 44, green: 89, blue: 134, alpha: 1 }\n * const example1 = darkenSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0.25)\n *\n * // Expect: { red: 51, green: 102, blue: 153, alpha: 1 }\n * const example2 = darkenSrgbColorValue({ red: 51, green: 102, blue: 153, alpha: 1 }, 0)\n * ```\n */\nexport const darkenSrgbColorValue = (color: SrgbColorValue, amount: number): SrgbColorValue => {\n return shadeSrgbColorValue(color, amount)\n}\n",
|
|
185
|
-
"\n/**\n * 获取当前页面的来源(origin)。\n */\nexport const getOrigin = (): string => {\n return window.location.origin\n}\n\n/**\n * 获取当前页面的完整地址。\n */\nexport const getHref = (): string => {\n return window.location.href\n}\n\n/**\n * 跳转到指定地址,并向历史记录中新增一条记录。\n */\nexport const navigateTo = (url: string): void => {\n window.location.assign(url)\n}\n\n/**\n * 跳转到指定地址,并替换当前历史记录。\n */\nexport const redirectTo = (url: string): void => {\n window.location.replace(url)\n}\n",
|
|
186
|
-
"/**\n * Listen for page hide events, and execute a callback when\n * such events occur.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Window/pagehide_event}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event}\n */\nexport const onPageHide = (callback: (event: PageTransitionEvent) => void): void => {\n window.addEventListener(\"pagehide\", (event: PageTransitionEvent): void => {\n callback(event)\n })\n}\n\n/**\n * Listen for visibility change events, and execute a callback when\n * such events occur.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/visibilitychange_event}\n */\nexport const onVisibilityChange = (callback: (visibilityState: DocumentVisibilityState) => void): void => {\n window.addEventListener(\"visibilitychange\", (): void => {\n callback(document.visibilityState)\n })\n}\n/**\n * Listen for visibility change events, and execute a callback when\n * the page becomes hidden.\n */\nexport const onVisibilityChangeToHidden = (callback: () => void): void => {\n onVisibilityChange((visibilityState) => {\n if (visibilityState === \"hidden\") {\n callback()\n }\n })\n}\n/**\n * Listen for visibility change events, and execute a callback when\n * the page becomes visible.\n */\nexport const onVisibilityChangeToVisible = (callback: () => void): void => {\n onVisibilityChange((visibilityState) => {\n if (visibilityState === \"visible\") {\n callback()\n }\n })\n}\n",
|
|
187
|
-
"\n/**\n * Get the number of key-value pairs currently stored in local storage.\n */\nexport const getLengthOfLocalStorage = (): number => {\n return localStorage.length\n}\n\n/**\n * Get an array of all keys currently stored in local storage.\n */\nexport const getAllKeysFromLocalStorage = (): string[] => {\n const keys: string[] = []\n for (let i = 0; i < localStorage.length; i = i + 1) {\n const key = localStorage.key(i)\n if (key !== null) {\n keys.push(key)\n }\n }\n return keys\n}\n\n/**\n * Check if a specific key exists in local storage.\n */\nexport const hasKeyInLocalStorage = (key: string): boolean => {\n return localStorage.getItem(key) !== null\n}\n\n/**\n * Retrieve a value from local storage by its key.\n */\nexport const getFromLocalStorage = (key: string): string | null => {\n return localStorage.getItem(key)\n}\n\n/**\n * Set a value in local storage by its key.\n * If the value is null, the key will be removed from local storage.\n */\nexport const setToLocalStorage = (key: string, value: string | null): string | null => {\n if (value !== null) {\n localStorage.setItem(key, value)\n }\n else {\n localStorage.removeItem(key)\n }\n return value\n}\n\n/**\n * Remove a value from local storage by its key.\n * Returns the removed value, or null if the key did not exist.\n */\nexport const removeFromLocalStorage = (key: string): string | null => {\n const value = localStorage.getItem(key)\n localStorage.removeItem(key)\n return value\n}\n\n/**\n * Clear all key-value pairs from local storage.\n */\nexport const clearLocalStorage = (): void => {\n localStorage.clear()\n}\n\n/**\n * Subscribe to changes in local storage. The callback will be\n * invoked whenever any key-value pair in local storage changes.\n * Returns a function to unsubscribe from the changes.\n */\nexport const subscribeAllChangesOfLocalStorage = (\n subscriber: (event: StorageEvent) => void\n): (() => void) => {\n const internalSubscriber = (event: StorageEvent): void => {\n subscriber(event)\n }\n const subscribe = (): void => {\n window.addEventListener(\"storage\", internalSubscriber)\n }\n const unsubscribe = (): void => {\n window.removeEventListener(\"storage\", internalSubscriber)\n }\n\n subscribe()\n return unsubscribe\n}\n\n/**\n * Subscribe to changes in a specific key in local storage.\n * The callback will be invoked whenever the value of the key changes.\n * Returns a function to unsubscribe from the changes.\n */\nexport const subscribeKeyChangesOfLocalStorage = (\n key: string,\n subscriber: (event: StorageEvent) => void\n): (() => void) => {\n const internalSubscriber = (event: StorageEvent): void => {\n if (event.key === key) {\n subscriber(event)\n }\n }\n const subscribe = (): void => {\n window.addEventListener(\"storage\", internalSubscriber)\n }\n const unsubscribe = (): void => {\n window.removeEventListener(\"storage\", internalSubscriber)\n }\n\n subscribe()\n return unsubscribe\n}\n",
|
|
188
|
-
"\n/**\n * 获取当前文档标题。\n */\nexport const getDocumentTitle = (): string => {\n return document.title\n}\n\n/**\n * 设置当前文档标题。\n */\nexport const setDocumentTitle = (title: string): void => {\n document.title = title\n}\n\n/**\n * 重置输入元素的值,常用于清空文件输入框。\n */\nexport const resetInput = (input: HTMLInputElement | null | undefined): void => {\n if (input === null || input === undefined) {\n return\n }\n input.value = \"\"\n}\n\n/**\n * Prevent double click selection, but allow drag selection.\n *\n * @see {@link https://www.cnblogs.com/walkermag/p/16700244.html}\n */\nexport const disableDoubleClickSelection = (event: MouseEvent): void => {\n if (event.detail > 1) {\n event.preventDefault()\n }\n}\n\n/**\n * Listen for clicks outside of the specified node, and execute\n * a callback when such clicks occur.\n */\nexport const onClickOutside = (\n node: HTMLElement | null,\n callback: () => void\n): (() => void) => {\n const handleClick = (event: MouseEvent): void => {\n if (event.target === null) {\n return\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n if (node !== null && node.contains(event.target as Node) === false) {\n callback()\n }\n }\n document.addEventListener(\"click\", handleClick)\n return () => {\n document.removeEventListener(\"click\", handleClick)\n }\n}\n\n/**\n * 表示注入脚本节点时可配置的选项。\n */\nexport interface InjectScriptOptions {\n src: string\n onload?: NonNullable<GlobalEventHandlers['onload']> | undefined\n removeAfterLoaded?: boolean | undefined\n}\n/**\n * Inject a script into the document head.\n */\nexport const injectScript = (options: InjectScriptOptions): HTMLScriptElement => {\n const { src, onload, removeAfterLoaded } = options\n\n const script = document.createElement('script')\n script.setAttribute('type', 'text/javascript')\n script.src = src\n script.addEventListener('load', (...args): void => {\n if (onload !== undefined) {\n onload.bind(script)(...args)\n }\n if (removeAfterLoaded === true) {\n script.remove()\n }\n })\n document.head.append(script)\n\n return script\n}\n\n/**\n * 表示轮询查找 DOM 元素时可配置的选项。\n */\nexport interface PollingToGetElementOptions {\n selector: string\n interval: number\n callback: (node: Element) => void\n}\n/**\n * Poll the DOM to get an element by selector, and execute a callback\n * when the element is found.\n */\nexport const pollingToGetElement = (options: PollingToGetElementOptions): void => {\n const { selector, interval, callback } = options\n\n let node: Element | null = null\n const fixedSelector = (selector.includes('#') || selector.includes('.'))\n ? selector\n : `#${selector}`\n node = document.querySelector(fixedSelector)\n const timer = setInterval(() => {\n node = node ?? document.querySelector(fixedSelector)\n if (node !== null) {\n clearInterval(timer)\n callback(node)\n }\n }, interval)\n}\n",
|
|
189
|
-
"/**\n * 表示可用于 Web 权限查询与订阅的权限名称。\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Permissions}\n */\nexport type WebPermissionName =\n | PermissionName\n | \"accelerometer\"\n | \"accessibility-events\"\n | \"ambient-light-sensor\"\n | \"background-sync\"\n | \"camera\"\n | \"capture-surface-control\"\n | \"clipboard-read\"\n | \"clipboard-write\"\n | \"geolocation\"\n | \"gyroscope\"\n | \"local-fonts\"\n | \"magnetometer\"\n | \"microphone\"\n | \"midi\"\n | \"notifications\"\n | \"payment-handler\"\n | \"persistent-storage\"\n | \"push\"\n | \"screen-wake-lock\"\n | \"top-level-storage-access\"\n | \"window-management\"\n\n/**\n * 表示查询单个 Web 权限时的输入选项。\n */\nexport interface QueryPermissionOptions {\n name: WebPermissionName\n}\n\n/**\n * 表示单个 Web 权限查询后的标准化结果。\n */\nexport interface QueryPermissionResult {\n name: WebPermissionName\n state: PermissionState | \"unsupported\" | \"exception\"\n detail?: string | undefined\n}\n/**\n * 查询指定 Web 权限的当前状态。\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Permissions/query}\n */\nexport const queryPermission = async (options: QueryPermissionOptions): Promise<QueryPermissionResult> => {\n const { name } = options\n try {\n const permissionStatus = await navigator.permissions.query({\n // oxlint-disable-next-line no-unsafe-type-assertion\n name: name as PermissionName\n })\n\n return {\n name: name,\n state: permissionStatus.state\n }\n } catch (exception) {\n if (exception instanceof TypeError) {\n return {\n name: name,\n state: \"unsupported\",\n detail: exception.message\n }\n } else if (exception instanceof DOMException) {\n return {\n name: name,\n state: \"exception\",\n detail: exception.message\n }\n } else {\n return {\n name: name,\n state: \"exception\",\n detail: String(exception)\n }\n }\n }\n}\n\n/**\n * 确保指定权限已被授予;如果权限状态不为 \"granted\",则抛出错误。\n */\nexport const ensurePermissionGranted = async (options: QueryPermissionOptions): Promise<void> => {\n try {\n const queryResult = await queryPermission(options)\n if (queryResult.state !== \"granted\") {\n throw new Error(`Permission \"${options.name}\" is not granted. Current state: ${queryResult.state}`)\n }\n } catch (exception) {\n throw new Error(`Failed to ensure permission \"${options.name}\"`, { cause: exception })\n }\n}\n\n/**\n * 表示订阅单个 Web 权限变化时的输入选项。\n */\nexport interface SubscribePermissionOptions {\n name: WebPermissionName\n subscribe: (queryPermissionResult: QueryPermissionResult) => void\n}\n/**\n * 订阅指定权限状态的变化。当权限状态发生变化时,回调函数会被调用并传入最新的权限状态。\n */\nexport const subscribePermission = (options: SubscribePermissionOptions): (() => void) => {\n const { name, subscribe } = options\n\n let unsubscribed = false\n let internalUnsubscribe: (() => void) | undefined = undefined\n const unsubscribe = (): void => {\n unsubscribed = true\n internalUnsubscribe?.()\n }\n\n try {\n void navigator.permissions.query({\n // oxlint-disable-next-line no-unsafe-type-assertion\n name: name as PermissionName\n }).then((permissionStatus) => {\n if (unsubscribed === true) {\n return\n }\n\n const internalSubscribe = (): void => {\n subscribe({\n name: name,\n state: permissionStatus.state\n })\n }\n permissionStatus.addEventListener(\"change\", internalSubscribe)\n internalUnsubscribe = (): void => {\n permissionStatus.removeEventListener(\"change\", internalSubscribe)\n }\n }).catch((exception: unknown) => {\n if (unsubscribed === true) {\n return\n }\n\n if (exception instanceof TypeError) {\n subscribe({\n name: name,\n state: \"unsupported\",\n detail: exception.message\n })\n } else if (exception instanceof DOMException) {\n subscribe({\n name: name,\n state: \"exception\",\n detail: exception.message\n })\n } else {\n subscribe({\n name: name,\n state: \"exception\",\n detail: String(exception)\n })\n }\n })\n } catch (exception: unknown) {\n subscribe({\n name: name,\n state: \"unsupported\",\n detail: String(exception)\n })\n }\n\n return unsubscribe\n}\n",
|
|
190
|
-
"import { ensureClipboard } from \"#Source/environment/index.ts\"\nimport { ensurePermissionGranted } from \"./permission.ts\"\n\n/**\n * Writes the given text to the clipboard. This function ensures\n * that the Clipboard API is available and that the necessary\n * permissions are granted before attempting to write to the clipboard.\n */\nexport const writeTextToClipboard = async <T extends string>(text: T): Promise<T> => {\n ensureClipboard()\n await ensurePermissionGranted({ name: \"clipboard-write\" })\n\n // write text to clipboard\n await navigator.clipboard.writeText(text)\n\n return text\n}\n\n/**\n * Reads text from the clipboard. This function ensures that\n * the Clipboard API is available and that the necessary\n * permissions are granted before attempting to read from the clipboard.\n *\n * It returns the text read from the clipboard as a string.\n */\nexport const readTextFromClipboard = async (): Promise<string> => {\n ensureClipboard()\n await ensurePermissionGranted({ name: \"clipboard-read\" })\n\n // read text from clipboard\n const text = await navigator.clipboard.readText()\n\n return text\n}\n\n/**\n * Writes the given image blob to the clipboard. This function ensures\n * that the Clipboard API is available and that the necessary\n * permissions are granted before attempting to write to the clipboard.\n *\n * It returns the blob that was written to the clipboard.\n */\nexport const writeBlobImageToClipboard = async <T extends Blob>(\n blob: T\n): Promise<T> => {\n ensureClipboard()\n await ensurePermissionGranted({ name: \"clipboard-write\" })\n\n // write image to clipboard\n await navigator.clipboard.write([\n new ClipboardItem({ [blob.type]: blob }),\n ])\n\n return blob\n}\n\nconst base64ToBlob = (base64: string): Blob | null => {\n try {\n const byteString = atob(base64.split(\",\")[1] ?? \"\")\n const mimeString = base64.split(\",\")[0]?.split(\":\")[1]?.split(\";\")[0]\n if (mimeString === undefined) {\n throw new Error(\"Invalid MIME type\")\n }\n\n const arrayBuffer = new ArrayBuffer(byteString.length)\n const uintArray = new Uint8Array(arrayBuffer)\n for (let i = 0; i < byteString.length; i = i + 1) {\n const codePoint = byteString.codePointAt(i)\n if (codePoint === undefined) {\n throw new Error(\"Invalid character in base64 string\")\n }\n uintArray[i] = codePoint\n }\n\n return new Blob([arrayBuffer], { type: mimeString })\n } catch (exception) {\n console.error(\"Failed to convert base64 to Blob:\", exception)\n return null\n }\n}\n/**\n * Writes a base64-encoded image to the clipboard. This function first converts\n * the base64 string to a Blob object and then uses the `writeBlobImageToClipboard`\n * function to write the image to the clipboard.\n *\n * It returns the original base64 string if the operation is successful.\n */\nexport const writeBase64ImageToClipboard = async <T extends string>(\n base64: T\n): Promise<T> => {\n const blob = base64ToBlob(base64)\n if (blob === null) {\n throw new Error(\"Failed to convert base64 to Blob\")\n }\n await writeBlobImageToClipboard(blob)\n return base64\n}\n",
|
|
191
|
-
"export function resolveUrl(url, baseUrl) {\n // url is absolute already\n if (url.match(/^[a-z]+:\\/\\//i)) {\n return url;\n }\n // url is absolute already, without protocol\n if (url.match(/^\\/\\//)) {\n return window.location.protocol + url;\n }\n // dataURI, mailto:, tel:, etc.\n if (url.match(/^[a-z]+:/i)) {\n return url;\n }\n const doc = document.implementation.createHTMLDocument();\n const base = doc.createElement('base');\n const a = doc.createElement('a');\n doc.head.appendChild(base);\n doc.body.appendChild(a);\n if (baseUrl) {\n base.href = baseUrl;\n }\n a.href = url;\n return a.href;\n}\nexport const uuid = (() => {\n // generate uuid for className of pseudo elements.\n // We should not use GUIDs, otherwise pseudo elements sometimes cannot be captured.\n let counter = 0;\n // ref: http://stackoverflow.com/a/6248722/2519373\n const random = () => \n // eslint-disable-next-line no-bitwise\n `0000${((Math.random() * 36 ** 4) << 0).toString(36)}`.slice(-4);\n return () => {\n counter += 1;\n return `u${random()}${counter}`;\n };\n})();\nexport function delay(ms) {\n return (args) => new Promise((resolve) => {\n setTimeout(() => resolve(args), ms);\n });\n}\nexport function toArray(arrayLike) {\n const arr = [];\n for (let i = 0, l = arrayLike.length; i < l; i++) {\n arr.push(arrayLike[i]);\n }\n return arr;\n}\nlet styleProps = null;\nexport function getStyleProperties(options = {}) {\n if (styleProps) {\n return styleProps;\n }\n if (options.includeStyleProperties) {\n styleProps = options.includeStyleProperties;\n return styleProps;\n }\n styleProps = toArray(window.getComputedStyle(document.documentElement));\n return styleProps;\n}\nfunction px(node, styleProperty) {\n const win = node.ownerDocument.defaultView || window;\n const val = win.getComputedStyle(node).getPropertyValue(styleProperty);\n return val ? parseFloat(val.replace('px', '')) : 0;\n}\nfunction getNodeWidth(node) {\n const leftBorder = px(node, 'border-left-width');\n const rightBorder = px(node, 'border-right-width');\n return node.clientWidth + leftBorder + rightBorder;\n}\nfunction getNodeHeight(node) {\n const topBorder = px(node, 'border-top-width');\n const bottomBorder = px(node, 'border-bottom-width');\n return node.clientHeight + topBorder + bottomBorder;\n}\nexport function getImageSize(targetNode, options = {}) {\n const width = options.width || getNodeWidth(targetNode);\n const height = options.height || getNodeHeight(targetNode);\n return { width, height };\n}\nexport function getPixelRatio() {\n let ratio;\n let FINAL_PROCESS;\n try {\n FINAL_PROCESS = process;\n }\n catch (e) {\n // pass\n }\n const val = FINAL_PROCESS && FINAL_PROCESS.env\n ? FINAL_PROCESS.env.devicePixelRatio\n : null;\n if (val) {\n ratio = parseInt(val, 10);\n if (Number.isNaN(ratio)) {\n ratio = 1;\n }\n }\n return ratio || window.devicePixelRatio || 1;\n}\n// @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas#maximum_canvas_size\nconst canvasDimensionLimit = 16384;\nexport function checkCanvasDimensions(canvas) {\n if (canvas.width > canvasDimensionLimit ||\n canvas.height > canvasDimensionLimit) {\n if (canvas.width > canvasDimensionLimit &&\n canvas.height > canvasDimensionLimit) {\n if (canvas.width > canvas.height) {\n canvas.height *= canvasDimensionLimit / canvas.width;\n canvas.width = canvasDimensionLimit;\n }\n else {\n canvas.width *= canvasDimensionLimit / canvas.height;\n canvas.height = canvasDimensionLimit;\n }\n }\n else if (canvas.width > canvasDimensionLimit) {\n canvas.height *= canvasDimensionLimit / canvas.width;\n canvas.width = canvasDimensionLimit;\n }\n else {\n canvas.width *= canvasDimensionLimit / canvas.height;\n canvas.height = canvasDimensionLimit;\n }\n }\n}\nexport function canvasToBlob(canvas, options = {}) {\n if (canvas.toBlob) {\n return new Promise((resolve) => {\n canvas.toBlob(resolve, options.type ? options.type : 'image/png', options.quality ? options.quality : 1);\n });\n }\n return new Promise((resolve) => {\n const binaryString = window.atob(canvas\n .toDataURL(options.type ? options.type : undefined, options.quality ? options.quality : undefined)\n .split(',')[1]);\n const len = binaryString.length;\n const binaryArray = new Uint8Array(len);\n for (let i = 0; i < len; i += 1) {\n binaryArray[i] = binaryString.charCodeAt(i);\n }\n resolve(new Blob([binaryArray], {\n type: options.type ? options.type : 'image/png',\n }));\n });\n}\nexport function createImage(url) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n img.decode().then(() => {\n requestAnimationFrame(() => resolve(img));\n });\n };\n img.onerror = reject;\n img.crossOrigin = 'anonymous';\n img.decoding = 'async';\n img.src = url;\n });\n}\nexport async function svgToDataURL(svg) {\n return Promise.resolve()\n .then(() => new XMLSerializer().serializeToString(svg))\n .then(encodeURIComponent)\n .then((html) => `data:image/svg+xml;charset=utf-8,${html}`);\n}\nexport async function nodeToDataURL(node, width, height) {\n const xmlns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(xmlns, 'svg');\n const foreignObject = document.createElementNS(xmlns, 'foreignObject');\n svg.setAttribute('width', `${width}`);\n svg.setAttribute('height', `${height}`);\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`);\n foreignObject.setAttribute('width', '100%');\n foreignObject.setAttribute('height', '100%');\n foreignObject.setAttribute('x', '0');\n foreignObject.setAttribute('y', '0');\n foreignObject.setAttribute('externalResourcesRequired', 'true');\n svg.appendChild(foreignObject);\n foreignObject.appendChild(node);\n return svgToDataURL(svg);\n}\nexport const isInstanceOfElement = (node, instance) => {\n if (node instanceof instance)\n return true;\n const nodePrototype = Object.getPrototypeOf(node);\n if (nodePrototype === null)\n return false;\n return (nodePrototype.constructor.name === instance.name ||\n isInstanceOfElement(nodePrototype, instance));\n};\n//# sourceMappingURL=util.js.map",
|
|
192
|
-
"import { uuid, getStyleProperties } from './util';\nfunction formatCSSText(style) {\n const content = style.getPropertyValue('content');\n return `${style.cssText} content: '${content.replace(/'|\"/g, '')}';`;\n}\nfunction formatCSSProperties(style, options) {\n return getStyleProperties(options)\n .map((name) => {\n const value = style.getPropertyValue(name);\n const priority = style.getPropertyPriority(name);\n return `${name}: ${value}${priority ? ' !important' : ''};`;\n })\n .join(' ');\n}\nfunction getPseudoElementStyle(className, pseudo, style, options) {\n const selector = `.${className}:${pseudo}`;\n const cssText = style.cssText\n ? formatCSSText(style)\n : formatCSSProperties(style, options);\n return document.createTextNode(`${selector}{${cssText}}`);\n}\nfunction clonePseudoElement(nativeNode, clonedNode, pseudo, options) {\n const style = window.getComputedStyle(nativeNode, pseudo);\n const content = style.getPropertyValue('content');\n if (content === '' || content === 'none') {\n return;\n }\n const className = uuid();\n try {\n clonedNode.className = `${clonedNode.className} ${className}`;\n }\n catch (err) {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.appendChild(getPseudoElementStyle(className, pseudo, style, options));\n clonedNode.appendChild(styleElement);\n}\nexport function clonePseudoElements(nativeNode, clonedNode, options) {\n clonePseudoElement(nativeNode, clonedNode, ':before', options);\n clonePseudoElement(nativeNode, clonedNode, ':after', options);\n}\n//# sourceMappingURL=clone-pseudos.js.map",
|
|
193
|
-
"const WOFF = 'application/font-woff';\nconst JPEG = 'image/jpeg';\nconst mimes = {\n woff: WOFF,\n woff2: WOFF,\n ttf: 'application/font-truetype',\n eot: 'application/vnd.ms-fontobject',\n png: 'image/png',\n jpg: JPEG,\n jpeg: JPEG,\n gif: 'image/gif',\n tiff: 'image/tiff',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n};\nfunction getExtension(url) {\n const match = /\\.([^./]*?)$/g.exec(url);\n return match ? match[1] : '';\n}\nexport function getMimeType(url) {\n const extension = getExtension(url).toLowerCase();\n return mimes[extension] || '';\n}\n//# sourceMappingURL=mimes.js.map",
|
|
194
|
-
"function getContentFromDataUrl(dataURL) {\n return dataURL.split(/,/)[1];\n}\nexport function isDataUrl(url) {\n return url.search(/^(data:)/) !== -1;\n}\nexport function makeDataUrl(content, mimeType) {\n return `data:${mimeType};base64,${content}`;\n}\nexport async function fetchAsDataURL(url, init, process) {\n const res = await fetch(url, init);\n if (res.status === 404) {\n throw new Error(`Resource \"${res.url}\" not found`);\n }\n const blob = await res.blob();\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = reject;\n reader.onloadend = () => {\n try {\n resolve(process({ res, result: reader.result }));\n }\n catch (error) {\n reject(error);\n }\n };\n reader.readAsDataURL(blob);\n });\n}\nconst cache = {};\nfunction getCacheKey(url, contentType, includeQueryParams) {\n let key = url.replace(/\\?.*/, '');\n if (includeQueryParams) {\n key = url;\n }\n // font resource\n if (/ttf|otf|eot|woff2?/i.test(key)) {\n key = key.replace(/.*\\//, '');\n }\n return contentType ? `[${contentType}]${key}` : key;\n}\nexport async function resourceToDataURL(resourceUrl, contentType, options) {\n const cacheKey = getCacheKey(resourceUrl, contentType, options.includeQueryParams);\n if (cache[cacheKey] != null) {\n return cache[cacheKey];\n }\n // ref: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache\n if (options.cacheBust) {\n // eslint-disable-next-line no-param-reassign\n resourceUrl += (/\\?/.test(resourceUrl) ? '&' : '?') + new Date().getTime();\n }\n let dataURL;\n try {\n const content = await fetchAsDataURL(resourceUrl, options.fetchRequestInit, ({ res, result }) => {\n if (!contentType) {\n // eslint-disable-next-line no-param-reassign\n contentType = res.headers.get('Content-Type') || '';\n }\n return getContentFromDataUrl(result);\n });\n dataURL = makeDataUrl(content, contentType);\n }\n catch (error) {\n dataURL = options.imagePlaceholder || '';\n let msg = `Failed to fetch resource: ${resourceUrl}`;\n if (error) {\n msg = typeof error === 'string' ? error : error.message;\n }\n if (msg) {\n console.warn(msg);\n }\n }\n cache[cacheKey] = dataURL;\n return dataURL;\n}\n//# sourceMappingURL=dataurl.js.map",
|
|
195
|
-
"import { clonePseudoElements } from './clone-pseudos';\nimport { createImage, toArray, isInstanceOfElement, getStyleProperties, } from './util';\nimport { getMimeType } from './mimes';\nimport { resourceToDataURL } from './dataurl';\nasync function cloneCanvasElement(canvas) {\n const dataURL = canvas.toDataURL();\n if (dataURL === 'data:,') {\n return canvas.cloneNode(false);\n }\n return createImage(dataURL);\n}\nasync function cloneVideoElement(video, options) {\n if (video.currentSrc) {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n canvas.width = video.clientWidth;\n canvas.height = video.clientHeight;\n ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n const dataURL = canvas.toDataURL();\n return createImage(dataURL);\n }\n const poster = video.poster;\n const contentType = getMimeType(poster);\n const dataURL = await resourceToDataURL(poster, contentType, options);\n return createImage(dataURL);\n}\nasync function cloneIFrameElement(iframe, options) {\n var _a;\n try {\n if ((_a = iframe === null || iframe === void 0 ? void 0 : iframe.contentDocument) === null || _a === void 0 ? void 0 : _a.body) {\n return (await cloneNode(iframe.contentDocument.body, options, true));\n }\n }\n catch (_b) {\n // Failed to clone iframe\n }\n return iframe.cloneNode(false);\n}\nasync function cloneSingleNode(node, options) {\n if (isInstanceOfElement(node, HTMLCanvasElement)) {\n return cloneCanvasElement(node);\n }\n if (isInstanceOfElement(node, HTMLVideoElement)) {\n return cloneVideoElement(node, options);\n }\n if (isInstanceOfElement(node, HTMLIFrameElement)) {\n return cloneIFrameElement(node, options);\n }\n return node.cloneNode(isSVGElement(node));\n}\nconst isSlotElement = (node) => node.tagName != null && node.tagName.toUpperCase() === 'SLOT';\nconst isSVGElement = (node) => node.tagName != null && node.tagName.toUpperCase() === 'SVG';\nasync function cloneChildren(nativeNode, clonedNode, options) {\n var _a, _b;\n if (isSVGElement(clonedNode)) {\n return clonedNode;\n }\n let children = [];\n if (isSlotElement(nativeNode) && nativeNode.assignedNodes) {\n children = toArray(nativeNode.assignedNodes());\n }\n else if (isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n ((_a = nativeNode.contentDocument) === null || _a === void 0 ? void 0 : _a.body)) {\n children = toArray(nativeNode.contentDocument.body.childNodes);\n }\n else {\n children = toArray(((_b = nativeNode.shadowRoot) !== null && _b !== void 0 ? _b : nativeNode).childNodes);\n }\n if (children.length === 0 ||\n isInstanceOfElement(nativeNode, HTMLVideoElement)) {\n return clonedNode;\n }\n await children.reduce((deferred, child) => deferred\n .then(() => cloneNode(child, options))\n .then((clonedChild) => {\n if (clonedChild) {\n clonedNode.appendChild(clonedChild);\n }\n }), Promise.resolve());\n return clonedNode;\n}\nfunction cloneCSSStyle(nativeNode, clonedNode, options) {\n const targetStyle = clonedNode.style;\n if (!targetStyle) {\n return;\n }\n const sourceStyle = window.getComputedStyle(nativeNode);\n if (sourceStyle.cssText) {\n targetStyle.cssText = sourceStyle.cssText;\n targetStyle.transformOrigin = sourceStyle.transformOrigin;\n }\n else {\n getStyleProperties(options).forEach((name) => {\n let value = sourceStyle.getPropertyValue(name);\n if (name === 'font-size' && value.endsWith('px')) {\n const reducedFont = Math.floor(parseFloat(value.substring(0, value.length - 2))) - 0.1;\n value = `${reducedFont}px`;\n }\n if (isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n name === 'display' &&\n value === 'inline') {\n value = 'block';\n }\n if (name === 'd' && clonedNode.getAttribute('d')) {\n value = `path(${clonedNode.getAttribute('d')})`;\n }\n targetStyle.setProperty(name, value, sourceStyle.getPropertyPriority(name));\n });\n }\n}\nfunction cloneInputValue(nativeNode, clonedNode) {\n if (isInstanceOfElement(nativeNode, HTMLTextAreaElement)) {\n clonedNode.innerHTML = nativeNode.value;\n }\n if (isInstanceOfElement(nativeNode, HTMLInputElement)) {\n clonedNode.setAttribute('value', nativeNode.value);\n }\n}\nfunction cloneSelectValue(nativeNode, clonedNode) {\n if (isInstanceOfElement(nativeNode, HTMLSelectElement)) {\n const clonedSelect = clonedNode;\n const selectedOption = Array.from(clonedSelect.children).find((child) => nativeNode.value === child.getAttribute('value'));\n if (selectedOption) {\n selectedOption.setAttribute('selected', '');\n }\n }\n}\nfunction decorate(nativeNode, clonedNode, options) {\n if (isInstanceOfElement(clonedNode, Element)) {\n cloneCSSStyle(nativeNode, clonedNode, options);\n clonePseudoElements(nativeNode, clonedNode, options);\n cloneInputValue(nativeNode, clonedNode);\n cloneSelectValue(nativeNode, clonedNode);\n }\n return clonedNode;\n}\nasync function ensureSVGSymbols(clone, options) {\n const uses = clone.querySelectorAll ? clone.querySelectorAll('use') : [];\n if (uses.length === 0) {\n return clone;\n }\n const processedDefs = {};\n for (let i = 0; i < uses.length; i++) {\n const use = uses[i];\n const id = use.getAttribute('xlink:href');\n if (id) {\n const exist = clone.querySelector(id);\n const definition = document.querySelector(id);\n if (!exist && definition && !processedDefs[id]) {\n // eslint-disable-next-line no-await-in-loop\n processedDefs[id] = (await cloneNode(definition, options, true));\n }\n }\n }\n const nodes = Object.values(processedDefs);\n if (nodes.length) {\n const ns = 'http://www.w3.org/1999/xhtml';\n const svg = document.createElementNS(ns, 'svg');\n svg.setAttribute('xmlns', ns);\n svg.style.position = 'absolute';\n svg.style.width = '0';\n svg.style.height = '0';\n svg.style.overflow = 'hidden';\n svg.style.display = 'none';\n const defs = document.createElementNS(ns, 'defs');\n svg.appendChild(defs);\n for (let i = 0; i < nodes.length; i++) {\n defs.appendChild(nodes[i]);\n }\n clone.appendChild(svg);\n }\n return clone;\n}\nexport async function cloneNode(node, options, isRoot) {\n if (!isRoot && options.filter && !options.filter(node)) {\n return null;\n }\n return Promise.resolve(node)\n .then((clonedNode) => cloneSingleNode(clonedNode, options))\n .then((clonedNode) => cloneChildren(node, clonedNode, options))\n .then((clonedNode) => decorate(node, clonedNode, options))\n .then((clonedNode) => ensureSVGSymbols(clonedNode, options));\n}\n//# sourceMappingURL=clone-node.js.map",
|
|
196
|
-
"import { resolveUrl } from './util';\nimport { getMimeType } from './mimes';\nimport { isDataUrl, makeDataUrl, resourceToDataURL } from './dataurl';\nconst URL_REGEX = /url\\((['\"]?)([^'\"]+?)\\1\\)/g;\nconst URL_WITH_FORMAT_REGEX = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g;\nconst FONT_SRC_REGEX = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g;\nfunction toRegex(url) {\n // eslint-disable-next-line no-useless-escape\n const escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, '\\\\$1');\n return new RegExp(`(url\\\\(['\"]?)(${escaped})(['\"]?\\\\))`, 'g');\n}\nexport function parseURLs(cssText) {\n const urls = [];\n cssText.replace(URL_REGEX, (raw, quotation, url) => {\n urls.push(url);\n return raw;\n });\n return urls.filter((url) => !isDataUrl(url));\n}\nexport async function embed(cssText, resourceURL, baseURL, options, getContentFromUrl) {\n try {\n const resolvedURL = baseURL ? resolveUrl(resourceURL, baseURL) : resourceURL;\n const contentType = getMimeType(resourceURL);\n let dataURL;\n if (getContentFromUrl) {\n const content = await getContentFromUrl(resolvedURL);\n dataURL = makeDataUrl(content, contentType);\n }\n else {\n dataURL = await resourceToDataURL(resolvedURL, contentType, options);\n }\n return cssText.replace(toRegex(resourceURL), `$1${dataURL}$3`);\n }\n catch (error) {\n // pass\n }\n return cssText;\n}\nfunction filterPreferredFontFormat(str, { preferredFontFormat }) {\n return !preferredFontFormat\n ? str\n : str.replace(FONT_SRC_REGEX, (match) => {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const [src, , format] = URL_WITH_FORMAT_REGEX.exec(match) || [];\n if (!format) {\n return '';\n }\n if (format === preferredFontFormat) {\n return `src: ${src};`;\n }\n }\n });\n}\nexport function shouldEmbed(url) {\n return url.search(URL_REGEX) !== -1;\n}\nexport async function embedResources(cssText, baseUrl, options) {\n if (!shouldEmbed(cssText)) {\n return cssText;\n }\n const filteredCSSText = filterPreferredFontFormat(cssText, options);\n const urls = parseURLs(filteredCSSText);\n return urls.reduce((deferred, url) => deferred.then((css) => embed(css, url, baseUrl, options)), Promise.resolve(filteredCSSText));\n}\n//# sourceMappingURL=embed-resources.js.map",
|
|
197
|
-
"import { embedResources } from './embed-resources';\nimport { toArray, isInstanceOfElement } from './util';\nimport { isDataUrl, resourceToDataURL } from './dataurl';\nimport { getMimeType } from './mimes';\nasync function embedProp(propName, node, options) {\n var _a;\n const propValue = (_a = node.style) === null || _a === void 0 ? void 0 : _a.getPropertyValue(propName);\n if (propValue) {\n const cssString = await embedResources(propValue, null, options);\n node.style.setProperty(propName, cssString, node.style.getPropertyPriority(propName));\n return true;\n }\n return false;\n}\nasync function embedBackground(clonedNode, options) {\n ;\n (await embedProp('background', clonedNode, options)) ||\n (await embedProp('background-image', clonedNode, options));\n (await embedProp('mask', clonedNode, options)) ||\n (await embedProp('-webkit-mask', clonedNode, options)) ||\n (await embedProp('mask-image', clonedNode, options)) ||\n (await embedProp('-webkit-mask-image', clonedNode, options));\n}\nasync function embedImageNode(clonedNode, options) {\n const isImageElement = isInstanceOfElement(clonedNode, HTMLImageElement);\n if (!(isImageElement && !isDataUrl(clonedNode.src)) &&\n !(isInstanceOfElement(clonedNode, SVGImageElement) &&\n !isDataUrl(clonedNode.href.baseVal))) {\n return;\n }\n const url = isImageElement ? clonedNode.src : clonedNode.href.baseVal;\n const dataURL = await resourceToDataURL(url, getMimeType(url), options);\n await new Promise((resolve, reject) => {\n clonedNode.onload = resolve;\n clonedNode.onerror = options.onImageErrorHandler\n ? (...attributes) => {\n try {\n resolve(options.onImageErrorHandler(...attributes));\n }\n catch (error) {\n reject(error);\n }\n }\n : reject;\n const image = clonedNode;\n if (image.decode) {\n image.decode = resolve;\n }\n if (image.loading === 'lazy') {\n image.loading = 'eager';\n }\n if (isImageElement) {\n clonedNode.srcset = '';\n clonedNode.src = dataURL;\n }\n else {\n clonedNode.href.baseVal = dataURL;\n }\n });\n}\nasync function embedChildren(clonedNode, options) {\n const children = toArray(clonedNode.childNodes);\n const deferreds = children.map((child) => embedImages(child, options));\n await Promise.all(deferreds).then(() => clonedNode);\n}\nexport async function embedImages(clonedNode, options) {\n if (isInstanceOfElement(clonedNode, Element)) {\n await embedBackground(clonedNode, options);\n await embedImageNode(clonedNode, options);\n await embedChildren(clonedNode, options);\n }\n}\n//# sourceMappingURL=embed-images.js.map",
|
|
198
|
-
"export function applyStyle(node, options) {\n const { style } = node;\n if (options.backgroundColor) {\n style.backgroundColor = options.backgroundColor;\n }\n if (options.width) {\n style.width = `${options.width}px`;\n }\n if (options.height) {\n style.height = `${options.height}px`;\n }\n const manual = options.style;\n if (manual != null) {\n Object.keys(manual).forEach((key) => {\n style[key] = manual[key];\n });\n }\n return node;\n}\n//# sourceMappingURL=apply-style.js.map",
|
|
199
|
-
"import { toArray } from './util';\nimport { fetchAsDataURL } from './dataurl';\nimport { shouldEmbed, embedResources } from './embed-resources';\nconst cssFetchCache = {};\nasync function fetchCSS(url) {\n let cache = cssFetchCache[url];\n if (cache != null) {\n return cache;\n }\n const res = await fetch(url);\n const cssText = await res.text();\n cache = { url, cssText };\n cssFetchCache[url] = cache;\n return cache;\n}\nasync function embedFonts(data, options) {\n let cssText = data.cssText;\n const regexUrl = /url\\([\"']?([^\"')]+)[\"']?\\)/g;\n const fontLocs = cssText.match(/url\\([^)]+\\)/g) || [];\n const loadFonts = fontLocs.map(async (loc) => {\n let url = loc.replace(regexUrl, '$1');\n if (!url.startsWith('https://')) {\n url = new URL(url, data.url).href;\n }\n return fetchAsDataURL(url, options.fetchRequestInit, ({ result }) => {\n cssText = cssText.replace(loc, `url(${result})`);\n return [loc, result];\n });\n });\n return Promise.all(loadFonts).then(() => cssText);\n}\nfunction parseCSS(source) {\n if (source == null) {\n return [];\n }\n const result = [];\n const commentsRegex = /(\\/\\*[\\s\\S]*?\\*\\/)/gi;\n // strip out comments\n let cssText = source.replace(commentsRegex, '');\n // eslint-disable-next-line prefer-regex-literals\n const keyframesRegex = new RegExp('((@.*?keyframes [\\\\s\\\\S]*?){([\\\\s\\\\S]*?}\\\\s*?)})', 'gi');\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const matches = keyframesRegex.exec(cssText);\n if (matches === null) {\n break;\n }\n result.push(matches[0]);\n }\n cssText = cssText.replace(keyframesRegex, '');\n const importRegex = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi;\n // to match css & media queries together\n const combinedCSSRegex = '((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]' +\n '*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})';\n // unified regex\n const unifiedRegex = new RegExp(combinedCSSRegex, 'gi');\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let matches = importRegex.exec(cssText);\n if (matches === null) {\n matches = unifiedRegex.exec(cssText);\n if (matches === null) {\n break;\n }\n else {\n importRegex.lastIndex = unifiedRegex.lastIndex;\n }\n }\n else {\n unifiedRegex.lastIndex = importRegex.lastIndex;\n }\n result.push(matches[0]);\n }\n return result;\n}\nasync function getCSSRules(styleSheets, options) {\n const ret = [];\n const deferreds = [];\n // First loop inlines imports\n styleSheets.forEach((sheet) => {\n if ('cssRules' in sheet) {\n try {\n toArray(sheet.cssRules || []).forEach((item, index) => {\n if (item.type === CSSRule.IMPORT_RULE) {\n let importIndex = index + 1;\n const url = item.href;\n const deferred = fetchCSS(url)\n .then((metadata) => embedFonts(metadata, options))\n .then((cssText) => parseCSS(cssText).forEach((rule) => {\n try {\n sheet.insertRule(rule, rule.startsWith('@import')\n ? (importIndex += 1)\n : sheet.cssRules.length);\n }\n catch (error) {\n console.error('Error inserting rule from remote css', {\n rule,\n error,\n });\n }\n }))\n .catch((e) => {\n console.error('Error loading remote css', e.toString());\n });\n deferreds.push(deferred);\n }\n });\n }\n catch (e) {\n const inline = styleSheets.find((a) => a.href == null) || document.styleSheets[0];\n if (sheet.href != null) {\n deferreds.push(fetchCSS(sheet.href)\n .then((metadata) => embedFonts(metadata, options))\n .then((cssText) => parseCSS(cssText).forEach((rule) => {\n inline.insertRule(rule, inline.cssRules.length);\n }))\n .catch((err) => {\n console.error('Error loading remote stylesheet', err);\n }));\n }\n console.error('Error inlining remote css file', e);\n }\n }\n });\n return Promise.all(deferreds).then(() => {\n // Second loop parses rules\n styleSheets.forEach((sheet) => {\n if ('cssRules' in sheet) {\n try {\n toArray(sheet.cssRules || []).forEach((item) => {\n ret.push(item);\n });\n }\n catch (e) {\n console.error(`Error while reading CSS rules from ${sheet.href}`, e);\n }\n }\n });\n return ret;\n });\n}\nfunction getWebFontRules(cssRules) {\n return cssRules\n .filter((rule) => rule.type === CSSRule.FONT_FACE_RULE)\n .filter((rule) => shouldEmbed(rule.style.getPropertyValue('src')));\n}\nasync function parseWebFontRules(node, options) {\n if (node.ownerDocument == null) {\n throw new Error('Provided element is not within a Document');\n }\n const styleSheets = toArray(node.ownerDocument.styleSheets);\n const cssRules = await getCSSRules(styleSheets, options);\n return getWebFontRules(cssRules);\n}\nfunction normalizeFontFamily(font) {\n return font.trim().replace(/[\"']/g, '');\n}\nfunction getUsedFonts(node) {\n const fonts = new Set();\n function traverse(node) {\n const fontFamily = node.style.fontFamily || getComputedStyle(node).fontFamily;\n fontFamily.split(',').forEach((font) => {\n fonts.add(normalizeFontFamily(font));\n });\n Array.from(node.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n traverse(child);\n }\n });\n }\n traverse(node);\n return fonts;\n}\nexport async function getWebFontCSS(node, options) {\n const rules = await parseWebFontRules(node, options);\n const usedFonts = getUsedFonts(node);\n const cssTexts = await Promise.all(rules\n .filter((rule) => usedFonts.has(normalizeFontFamily(rule.style.fontFamily)))\n .map((rule) => {\n const baseUrl = rule.parentStyleSheet\n ? rule.parentStyleSheet.href\n : null;\n return embedResources(rule.cssText, baseUrl, options);\n }));\n return cssTexts.join('\\n');\n}\nexport async function embedWebFonts(clonedNode, options) {\n const cssText = options.fontEmbedCSS != null\n ? options.fontEmbedCSS\n : options.skipFonts\n ? null\n : await getWebFontCSS(clonedNode, options);\n if (cssText) {\n const styleNode = document.createElement('style');\n const sytleContent = document.createTextNode(cssText);\n styleNode.appendChild(sytleContent);\n if (clonedNode.firstChild) {\n clonedNode.insertBefore(styleNode, clonedNode.firstChild);\n }\n else {\n clonedNode.appendChild(styleNode);\n }\n }\n}\n//# sourceMappingURL=embed-webfonts.js.map",
|
|
200
|
-
"import { cloneNode } from './clone-node';\nimport { embedImages } from './embed-images';\nimport { applyStyle } from './apply-style';\nimport { embedWebFonts, getWebFontCSS } from './embed-webfonts';\nimport { getImageSize, getPixelRatio, createImage, canvasToBlob, nodeToDataURL, checkCanvasDimensions, } from './util';\nexport async function toSvg(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const clonedNode = (await cloneNode(node, options, true));\n await embedWebFonts(clonedNode, options);\n await embedImages(clonedNode, options);\n applyStyle(clonedNode, options);\n const datauri = await nodeToDataURL(clonedNode, width, height);\n return datauri;\n}\nexport async function toCanvas(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const svg = await toSvg(node, options);\n const img = await createImage(svg);\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n const ratio = options.pixelRatio || getPixelRatio();\n const canvasWidth = options.canvasWidth || width;\n const canvasHeight = options.canvasHeight || height;\n canvas.width = canvasWidth * ratio;\n canvas.height = canvasHeight * ratio;\n if (!options.skipAutoScale) {\n checkCanvasDimensions(canvas);\n }\n canvas.style.width = `${canvasWidth}`;\n canvas.style.height = `${canvasHeight}`;\n if (options.backgroundColor) {\n context.fillStyle = options.backgroundColor;\n context.fillRect(0, 0, canvas.width, canvas.height);\n }\n context.drawImage(img, 0, 0, canvas.width, canvas.height);\n return canvas;\n}\nexport async function toPixelData(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const canvas = await toCanvas(node, options);\n const ctx = canvas.getContext('2d');\n return ctx.getImageData(0, 0, width, height).data;\n}\nexport async function toPng(node, options = {}) {\n const canvas = await toCanvas(node, options);\n return canvas.toDataURL();\n}\nexport async function toJpeg(node, options = {}) {\n const canvas = await toCanvas(node, options);\n return canvas.toDataURL('image/jpeg', options.quality || 1);\n}\nexport async function toBlob(node, options = {}) {\n const canvas = await toCanvas(node, options);\n const blob = await canvasToBlob(canvas);\n return blob;\n}\nexport async function getFontEmbedCSS(node, options = {}) {\n return getWebFontCSS(node, options);\n}\n//# sourceMappingURL=index.js.map",
|
|
201
|
-
"import { toJpeg, toPng } from \"html-to-image\"\n\n/**\n * 表示将 DOM 节点导出为图像时可配置的选项。\n */\nexport interface DomToImageOptions {\n node: HTMLElement\n imageType?: \"jpeg\" | \"png\" | undefined\n extraOptions?: Exclude<Parameters<typeof toJpeg>[1], undefined>\n}\n/**\n * Convert a DOM node to an image (JPEG or PNG) and return the image as a data URL.\n * The image type can be specified in the options, and additional options for the\n * conversion can also be provided.\n */\nexport const domToImage = async (options: DomToImageOptions): Promise<string | undefined> => {\n const { node, imageType, extraOptions } = options\n const preparedOptions = { cacheBust: true, ...extraOptions }\n const toImage = imageType === \"jpeg\" ? toJpeg : toPng\n const image = await toImage(node, preparedOptions)\n return image\n}\n\n/**\n * Convert a canvas element to a Blob object.\n */\nexport const canvasToBlob = async (canvas: HTMLCanvasElement): Promise<Blob | null> => {\n const blob = await new Promise<Blob | null>((resolve) => {\n canvas.toBlob((blob) => {\n resolve(blob)\n })\n })\n\n return blob\n}\n",
|
|
202
|
-
"\n/**\n * Download a base64 image as a file with the specified filename.\n */\nexport const downloadImage = (base64: string, filename: string): void => {\n const element = document.createElement(\"a\")\n element.setAttribute(\"href\", base64)\n element.setAttribute(\"download\", filename)\n\n element.style.display = \"none\"\n document.body.append(element)\n\n element.click()\n\n element.remove()\n}\n",
|
|
203
|
-
"\n/**\n * 将脚本地址转换为基于当前文档的绝对地址,避免相对路径、完整地址和等价地址之间比较不一致。\n */\nexport const normalizeScriptSrc = (src: string): string => {\n return new URL(src, document.baseURI).href\n}\n\n/**\n * 在当前页面中查找与目标地址匹配的 `<script>` 元素。\n *\n * 查找时会先将输入地址与现有脚本地址都标准化为绝对地址,\n * 因此可以识别相同脚本的不同写法。\n */\nexport const findScript = (src: string): HTMLScriptElement | null => {\n const normalizedSrc = normalizeScriptSrc(src)\n return Array.from(document.scripts).find((item) => {\n if (item.hasAttribute(\"src\") === false || item.src === \"\") {\n return false\n }\n return normalizeScriptSrc(item.src) === normalizedSrc\n }) ?? null\n}\n\n/**\n * 表示页面中的内联 JavaScript 脚本项。\n */\nexport interface JavaScriptCollectionInternalItem {\n element: HTMLScriptElement\n}\n\n/**\n * 表示页面中的外部 JavaScript 脚本项。\n */\nexport interface JavaScriptCollectionExternalItem {\n element: HTMLScriptElement\n src: string\n}\n\n/**\n * 表示页面中脚本采集结果的集合。\n */\nexport interface JavaScriptCollection {\n internal: JavaScriptCollectionInternalItem[]\n external: JavaScriptCollectionExternalItem[]\n}\n\n/**\n * 采集页面中已经存在的 JavaScript 脚本,包括内部脚本和外部脚本两种。\n *\n * - 内部脚本:(InternalScript)指 JavaScript 代码直接写在 `<script></script>` 标签内部。\n *\n * - 外部脚本:(ExternalScript)指通过设置 `<script></script>` 标签的 `src` 属性进行引入的 JavaScript 脚本文件。\n *\n * {@link https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/script#attr-type | \\<script\\> 脚本元素}\n */\nexport const collectJavaScript = (): JavaScriptCollection => {\n const scripts = Array.from(document.scripts)\n const collection = scripts.reduce<JavaScriptCollection>((value, item) => {\n if (item.hasAttribute(\"src\")) {\n const normalizedSrc = normalizeScriptSrc(item.src)\n value.external.push({ src: normalizedSrc, element: item })\n }\n else {\n value.internal.push({ element: item })\n }\n return value\n }, { internal: [], external: [] })\n return collection\n}\n\n/**\n * 表示单个脚本的加载选项。\n */\nexport interface ScriptLoadOptions {\n /**\n * 待加载脚本的地址。\n */\n src: string\n /**\n * 调用方自定义的脚本标识,仅用于透传到结果与回调中。\n */\n name?: string | undefined\n /**\n * 指定脚本类型。\n */\n type?: \"module\" | undefined\n /**\n * 是否为插入的脚本节点设置 `async=true`。\n */\n async?: boolean | undefined\n /**\n * 加载超时时间,单位为毫秒。\n */\n timeout?: number | undefined\n /**\n * 脚本可用后执行的采集函数,返回值会保存在加载结果中。\n */\n collect?: ((element: HTMLScriptElement) => unknown) | undefined\n /**\n * 在后续脚本开始加载前执行,用于隔离当前脚本对全局环境的影响。\n */\n isolate?: (() => void) | undefined\n /**\n * 在后续脚本加载完成后执行,用于恢复当前脚本的全局环境。\n */\n deisolate?: (() => void) | undefined\n beforeLoad?: ((context: { options: ScriptLoadOptions }) => void) | undefined\n onLoad?: ((context: { options: ScriptLoadOptions, element: HTMLScriptElement }) => void) | undefined\n afterLoad?: ((context: { options: ScriptLoadOptions, element: HTMLScriptElement }) => void) | undefined\n onError?: ((context: { options: ScriptLoadOptions, error: unknown }) => void) | undefined\n}\n\n/**\n * 表示单个脚本的加载结果。\n */\nexport interface SingleScriptLoadResult extends ScriptLoadOptions {\n element: HTMLScriptElement\n /**\n * Save result of `collect` function.\n */\n collected?: unknown | undefined\n}\n\n/**\n * 表示批量脚本加载的输入选项。\n */\nexport interface MultipleScriptLoadOptions {\n /**\n * 待加载脚本列表。字符串会被视为仅包含 `src` 的加载项。\n */\n items: Array<string | ScriptLoadOptions>\n /**\n * 为未单独指定 `onLoad` 的加载项提供统一的成功回调。\n */\n onLoad?: ScriptLoadOptions[\"onLoad\"] | undefined\n /**\n * 为未单独指定 `onError` 的加载项提供统一的失败回调。\n */\n onError?: ScriptLoadOptions[\"onError\"] | undefined\n}\n\n/**\n * 表示批量脚本加载的汇总结果。\n */\nexport interface MultipleScriptLoadResult {\n success: SingleScriptLoadResult[]\n failure: Array<{ src: string, reason: unknown }>\n}\n\n/**\n * 按串行队列将指定脚本加载到当前页面中。\n *\n * 加载之前进行检测:\n * - 如果指定地址(src)的脚本已经存在于页面中,直接返回该脚本作为加载结果。\n * - 如果指定地址(src)的脚本不存在于页面中,则通过插入 `script` 标签的方式将脚本加载到页面中,然后返回加载结果。\n *\n * 以 `script` 标签加载到页面中的脚本全部拥有 JavaScript 环境的完全访问权限,当脚本加载涉及到全局变量的变更时,\n * 并行加载会出现难以预料的错误,所以这里统一采用串行加载。\n * - 加载器会维护一个加载队列,只有先申请的脚本加载完成之后才会加载后申请的脚本,\n * - 脚本加载的选项中可以定义辅助隔离全局变量的函数(isolate、deisolate),\n * 在加载某个脚本之前,加载器会遍历执行其它已加载的脚本的 isolate 函数,加载完成之后,再遍历执行已加载脚本的 deisolate 函数。\n */\nexport class ScriptLoader {\n private queue: Promise<void>\n private readonly registry: Map<string, Promise<SingleScriptLoadResult>>\n\n private readonly loaded: Map<string, SingleScriptLoadResult>\n\n constructor() {\n this.queue = Promise.resolve()\n this.registry = new Map()\n\n this.loaded = new Map()\n }\n\n protected hasLoaded(src: string): boolean {\n return this.loaded.has(normalizeScriptSrc(src))\n }\n\n protected getLoaded(src: string): SingleScriptLoadResult | undefined {\n return this.loaded.get(normalizeScriptSrc(src))\n }\n\n private setLoaded(src: string, result: SingleScriptLoadResult): void {\n this.loaded.set(normalizeScriptSrc(src), result)\n }\n\n protected removeLoaded(src: string): void {\n this.loaded.delete(normalizeScriptSrc(src))\n }\n\n protected isolateAll(): void {\n this.loaded.forEach((item) => {\n if (item.isolate !== undefined) {\n item.isolate()\n }\n })\n }\n\n protected deisolateAll(): void {\n this.loaded.forEach((item) => {\n if (item.deisolate !== undefined) {\n item.deisolate()\n }\n })\n }\n\n /**\n * 统一组装加载结果,并在需要时执行 `collect`。\n */\n private createResult(options: ScriptLoadOptions, element: HTMLScriptElement): SingleScriptLoadResult {\n const result: SingleScriptLoadResult = { ...options, element }\n if (options.collect !== undefined) {\n result.collected = options.collect(element)\n }\n return result\n }\n\n /**\n * 将各种失败原因统一转换为 `Error` 实例,便于上层消费。\n */\n private toError(error: unknown): Error {\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n const { message } = error as { message?: unknown }\n if (typeof message === \"string\") {\n return new Error(message)\n }\n }\n return new Error(typeof error === \"string\" ? error : \"Unknown script load error.\")\n }\n\n /**\n * 实际创建并注入 `<script>` 节点,负责处理生命周期回调、超时与错误清理。\n */\n private async injectScript(options: ScriptLoadOptions): Promise<SingleScriptLoadResult> {\n const { src, type, async, timeout, beforeLoad, onLoad, afterLoad, onError } = options\n\n return await new Promise<SingleScriptLoadResult>((resolve, reject) => {\n const head = document.head ?? document.querySelector(\"head\")\n if (head === null) {\n throw new Error(\"Unable to find document head.\")\n }\n\n const script = document.createElement(\"script\")\n script.src = src\n script.type = type === \"module\" ? \"module\" : \"text/javascript\"\n if (async === true) {\n script.async = true\n }\n\n let settled = false\n let timeoutId: ReturnType<typeof setTimeout> | undefined\n\n const start = (): void => {\n script.addEventListener(\"load\", handleLoad)\n script.addEventListener(\"error\", handleError)\n head.append(script)\n }\n\n const cleanup = (): void => {\n script.removeEventListener(\"load\", handleLoad)\n script.removeEventListener(\"error\", handleError)\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId)\n }\n }\n\n const fail = (exception: unknown, shouldRemove: boolean): void => {\n if (settled === true) {\n return\n }\n settled = true\n cleanup()\n if (shouldRemove === true) {\n script.remove()\n }\n const actualError = this.toError(exception)\n onError?.({ options, error: actualError })\n reject(actualError)\n }\n\n const handleError = (event: Event): void => {\n fail(event, true)\n }\n\n const handleLoad = (): void => {\n try {\n onLoad?.({ options, element: script })\n } catch (exception) {\n fail(exception, false)\n return\n }\n\n try {\n afterLoad?.({ options, element: script })\n } catch (exception) {\n fail(exception, false)\n return\n }\n\n try {\n const result = this.createResult(options, script)\n cleanup()\n resolve(result)\n } catch (exception) {\n fail(exception, false)\n }\n }\n\n if (timeout !== undefined && timeout > 0) {\n timeoutId = setTimeout(() => {\n const exception = new Error(`Script load timeout: ${src}`)\n fail(exception, true)\n }, timeout)\n }\n\n try {\n beforeLoad?.({ options })\n } catch (exception) {\n fail(exception, false)\n return\n }\n\n start()\n })\n }\n\n /**\n * 执行一次脚本加载。\n *\n * 如果页面中已经存在目标脚本,则直接返回现有节点;\n * 否则在隔离已加载脚本的前提下插入新脚本。\n */\n private async executeLoad(options: ScriptLoadOptions): Promise<SingleScriptLoadResult> {\n const { src } = options\n\n const existingScript = findScript(src)\n if (existingScript !== null) {\n const result = this.createResult(options, existingScript)\n this.setLoaded(src, result)\n return result\n }\n\n this.isolateAll()\n try {\n const result = await this.injectScript(options)\n this.setLoaded(src, result)\n return result\n }\n finally {\n this.deisolateAll()\n }\n }\n\n /**\n * 加载单个脚本。\n *\n * - 同一标准化地址只会注册一个进行中的加载任务;重复请求会复用同一个 Promise。\n * - 已完成加载的脚本会缓存在实例内部,后续请求会直接返回缓存结果。\n */\n async load(options: ScriptLoadOptions): Promise<SingleScriptLoadResult> {\n options.src = normalizeScriptSrc(options.src)\n const { src } = options\n\n const loaded = this.getLoaded(src)\n if (loaded !== undefined) {\n return loaded\n }\n\n const registeredTask = this.registry.get(src)\n if (registeredTask !== undefined) {\n return await registeredTask\n }\n\n const task = this.queue.then(async () => {\n return await this.executeLoad(options)\n })\n this.registry.set(src, task)\n this.queue = task.then(() => undefined, () => undefined)\n\n void task.finally(() => {\n if (this.registry.get(src) === task) {\n this.registry.delete(src)\n }\n })\n\n return await task\n }\n\n /**\n * 批量加载多个脚本,并汇总成功与失败结果。\n *\n * 每一项最终仍通过 `load` 进入同一串行队列,因此不会破坏加载顺序约束。\n */\n async loadMultiple(options: MultipleScriptLoadOptions): Promise<MultipleScriptLoadResult> {\n const { items, onLoad, onError } = options\n\n const preparedItems = items.map<ScriptLoadOptions>((item) => {\n if (typeof item === \"string\") {\n return { src: item }\n }\n return {\n src: item.src,\n name: item.name,\n type: item.type,\n async: item.async,\n timeout: item.timeout,\n collect: item.collect,\n isolate: item.isolate,\n deisolate: item.deisolate,\n beforeLoad: item.beforeLoad,\n onLoad: item.onLoad ?? onLoad,\n afterLoad: item.afterLoad,\n onError: item.onError ?? onError,\n }\n })\n\n const settledResults = await Promise.allSettled(preparedItems.map(async item => await this.load(item)))\n const result = settledResults.reduce<MultipleScriptLoadResult>((value, item, index) => {\n if (item.status === \"fulfilled\") {\n value.success.push(item.value)\n }\n else {\n value.failure.push({ src: preparedItems[index]!.src, reason: item.reason })\n }\n return value\n }, { success: [], failure: [] })\n\n return result\n }\n}\n",
|
|
204
|
-
"/**\n * 表示以空格分隔的 CSS 类名字串。\n */\nexport type ClassString = string\n\n/**\n * 表示按顺序保存的 CSS 类名数组。\n */\nexport type ClassArray = string[]\n\n/**\n * 表示以类名为键、以启用状态为值的 CSS 类名对象。\n *\n * 该表示允许保留值为 `false` 的键,以表达已知但当前未启用的类名状态。\n */\nexport type ClassObject = Record<string, boolean>\n\n/**\n * 表示 CSS 类名的三种公共表达形式:字符串、数组或对象。\n */\nexport type ClassUnion = ClassString | ClassArray | ClassObject\n\n/**\n * 规范化类名字串,使其适合作为统一的字符串表示。\n *\n * 该函数会将 `.` 视为分隔符,将连续空白折叠为一个空格,并移除首尾空白。\n *\n * @example\n * ```\n * // Expect: 'mobius-base mobius-theme--light'\n * const example1 = neatenClassString('mobius-base mobius-theme--light')\n *\n * // Expect: 'mobius-base mobius-theme--light'\n * const example2 = neatenClassString('.mobius-base.mobius-theme--light')\n *\n * // Expect: 'mobius-base mobius-theme--light'\n * const example3 = neatenClassString(' .mobius-base mobius-theme--light ')\n * ```\n */\nexport const neatenClassString = (str: string): ClassString => {\n const classString = str.replaceAll('.', ' ').replaceAll(/\\s+/g, ' ').trim()\n return classString\n}\n\n/**\n * 将类名字串转换为类名数组。\n *\n * 输入会先经过 `neatenClassString` 规范化,再按空格拆分,并移除空项。\n *\n * @example\n * ```\n * // Expect: ['mobius-base', 'mobius-theme--light']\n * const example1 = classStringToClassArray('mobius-base mobius-theme--light')\n *\n * // Expect: ['mobius-base', 'mobius-theme--light']\n * const example2 = classStringToClassArray('.mobius-base.mobius-theme--light')\n *\n * // Expect: ['mobius-base', 'mobius-theme--light']\n * const example3 = classStringToClassArray(' .mobius-base mobius-theme--light ')\n * ```\n */\nexport const classStringToClassArray = (str: ClassString): ClassArray => {\n const classArray = neatenClassString(str).split(' ').filter(s => s.length !== 0)\n return classArray\n}\n\n/**\n * 将类名数组转换为布尔对象表示。\n *\n * 数组中的每个非空类名都会映射为值为 `true` 的对象键。\n *\n * @example\n * ```\n * // Expect: { 'mobius-base': true, 'mobius-theme--light': true }\n * const example1 = classArrayToClassObject(['mobius-base', 'mobius-theme--light'])\n *\n * // Expect: { 'mobius-base': true }\n * const example2 = classArrayToClassObject(['mobius-base', ''])\n *\n * // Expect: {}\n * const example3 = classArrayToClassObject([])\n * ```\n */\nexport const classArrayToClassObject = (arr: ClassArray): ClassObject => {\n const classObject: ClassObject = {}\n arr.filter(s => s.length !== 0).forEach(s => {\n classObject[s] = true\n })\n return classObject\n}\n\n/**\n * 将类名字串直接转换为布尔对象表示。\n *\n * 该函数会先把字符串拆分为类名数组,再将每个类名映射为值为 `true` 的对象键。\n *\n * @example\n * ```\n * // Expect: { 'mobius-base': true, 'mobius-theme--light': true }\n * const example1 = classStringToClassObject('mobius-base mobius-theme--light')\n *\n * // Expect: { 'mobius-base': true, 'mobius-theme--light': true }\n * const example2 = classStringToClassObject('.mobius-base.mobius-theme--light')\n * ```\n */\nexport const classStringToClassObject = (str: ClassString): ClassObject => {\n const classArray = classStringToClassArray(str)\n const classObject = classArrayToClassObject(classArray)\n return classObject\n}\n\n/**\n * 将布尔对象表示转换为类名数组。\n *\n * 值为 `false` 的类名和空类名会被忽略。\n *\n * @example\n * ```\n * // Expect: ['active', 'primary']\n * const example1 = classObjectToClassArray({ active: true, disabled: false, primary: true })\n *\n * // Expect: ['active']\n * const example2 = classObjectToClassArray({ '': true, active: true, disabled: false })\n * ```\n */\nexport const classObjectToClassArray = (obj: ClassObject): ClassArray => {\n const classArray: string[] = []\n Object.entries(obj)\n .filter(([key, value]) => key.length !== 0 && value)\n .forEach(([key, _]) => {\n classArray.push(key)\n })\n return classArray\n}\n\n/**\n * 将类名数组按空格连接为类名字串。\n *\n * 空字符串项会被过滤,以避免产生多余空格。\n *\n * @example\n * ```\n * // Expect: 'mobius-base mobius-theme--light'\n * const example1 = classArrayToClassString(['mobius-base', 'mobius-theme--light'])\n *\n * // Expect: 'mobius-base mobius-theme--light'\n * const example2 = classArrayToClassString(['mobius-base', '', 'mobius-theme--light'])\n * ```\n */\nexport const classArrayToClassString = (arr: ClassArray): ClassString => {\n const classString = arr.filter(s => s.length !== 0).join(' ')\n return classString\n}\n\n/**\n * 将布尔对象表示转换为类名字串。\n *\n * 该函数会忽略值为 `false` 的类名和空类名,并保留其余类名的迭代顺序。\n *\n * @example\n * ```\n * // Expect: 'active primary'\n * const example1 = classObjectToClassString({ active: true, disabled: false, primary: true })\n *\n * // Expect: 'active'\n * const example2 = classObjectToClassString({ '': true, active: true, disabled: false })\n * ```\n */\nexport const classObjectToClassString = (obj: ClassObject): ClassString => {\n const classArray = classObjectToClassArray(obj)\n const classString = classArrayToClassString(classArray)\n return classString\n}\n\n/**\n * 将任意公共类名表示转换为字符串表示。\n *\n * 如果输入本身已经是字符串,则原样返回;数组和对象会分别经过对应的序列化流程。\n *\n * @example\n * ```\n * // Expect: ' .button active '\n * const example1 = toClassString(' .button active ')\n *\n * // Expect: 'button active'\n * const example2 = toClassString(['button', 'active'])\n *\n * // Expect: 'button active'\n * const example3 = toClassString({ button: true, active: true, disabled: false })\n * ```\n */\nexport const toClassString = (tar: ClassUnion): ClassString => {\n if (typeof tar === 'string') {\n return tar\n } else if (Array.isArray(tar)) {\n return classArrayToClassString(tar)\n } else {\n return classObjectToClassString(tar)\n }\n}\n\n/**\n * 将任意公共类名表示转换为数组表示。\n *\n * 如果输入本身已经是数组,则会在过滤空类名后返回一个浅拷贝,以避免调用方共享同一数组实例。\n *\n * @example\n * ```\n * // Expect: ['button', 'active']\n * const example1 = toClassArray('button active')\n *\n * // Expect: ['button', 'active']\n * const example2 = toClassArray(['button', 'active'])\n *\n * // Expect: ['button', 'active']\n * const example3 = toClassArray({ button: true, disabled: false, active: true })\n * ```\n */\nexport const toClassArray = (tar: ClassUnion): ClassArray => {\n if (typeof tar === 'string') {\n return classStringToClassArray(tar)\n } else if (Array.isArray(tar)) {\n return tar.filter(s => s.length !== 0)\n } else {\n return classObjectToClassArray(tar)\n }\n}\n\n/**\n * 将任意公共类名表示转换为对象表示。\n *\n * 如果输入本身已经是对象,则会在过滤空类名后返回一个浅拷贝,以避免外部直接共享内部结果。\n *\n * @example\n * ```\n * // Expect: { button: true, active: true }\n * const example1 = toClassObject('button active')\n *\n * // Expect: { button: true, active: true }\n * const example2 = toClassObject(['button', 'active'])\n *\n * // Expect: { button: true, active: false }\n * const example3 = toClassObject({ button: true, active: false, '': true })\n * ```\n */\nexport const toClassObject = (tar: ClassUnion): ClassObject => {\n if (typeof tar === 'string') {\n return classStringToClassObject(tar)\n } else if (Array.isArray(tar)) {\n return classArrayToClassObject(tar)\n } else {\n const classObject: ClassObject = {}\n Object.entries(tar).forEach(([key, value]) => {\n if (key.length !== 0) {\n classObject[key] = value\n }\n })\n return classObject\n }\n}\n\n/**\n * 按目标值的外部表示,将类名集合格式化为相同形态。\n *\n * 该函数适合在内部统一按对象进行计算后,再把结果还原为调用方原本使用的表示。\n *\n * @example\n * ```\n * // Expect: 'button active'\n * const example1 = formatClassToTarget('', ['button', 'active'])\n *\n * // Expect: ['button', 'active']\n * const example2 = formatClassToTarget([], 'button active')\n *\n * // Expect: { button: true, active: true }\n * const example3 = formatClassToTarget({}, ['button', 'active'])\n * ```\n */\nexport const formatClassToTarget = <T extends ClassUnion>(target: T, cls: ClassUnion): T => {\n if (typeof target === 'string') {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return toClassString(cls) as T\n } else if (Array.isArray(target)) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return toClassArray(cls) as T\n } else {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return toClassObject(cls) as T\n }\n}\n\n/**\n * 为类名集合中的每一项补上指定前缀。\n *\n * 已经带有该前缀的类名会保持不变。\n *\n * @example\n * ```\n * // Expect: 'pm-button pm-active'\n * const example1 = prefixClassWith('pm-', 'button active')\n *\n * // Expect: ['pm-button', 'pm-active']\n * const example2 = prefixClassWith('pm-', ['button', 'pm-active'])\n *\n * // Expect: { 'pm-button': true, 'pm-active': true }\n * const example3 = prefixClassWith('pm-', { button: true, 'pm-active': true })\n * ```\n */\nexport const prefixClassWith = <T extends ClassUnion>(prefix: string, cls: T): T => {\n if (typeof cls === 'string') {\n const classArray = classStringToClassArray(cls).map(item =>\n item.startsWith(prefix) ? item : `${prefix}${item}`\n )\n const classString = classArrayToClassString(classArray)\n // oxlint-disable-next-line no-unsafe-type-assertion\n return classString as T\n } else if (Array.isArray(cls)) {\n const classArray = cls.filter(item => item.length !== 0).map(item =>\n item.startsWith(prefix) ? item : `${prefix}${item}`\n )\n // oxlint-disable-next-line no-unsafe-type-assertion\n return classArray as T\n } else {\n const classObject: ClassObject = {}\n Object.entries(cls).forEach(([key, value]) => {\n if (key.length === 0) {\n return\n }\n const _key = key.startsWith(prefix) ? key : `${prefix}${key}`\n classObject[_key] = value === true\n })\n // oxlint-disable-next-line no-unsafe-type-assertion\n return classObject as T\n }\n}\n\n/**\n * 从类名集合中的每一项移除指定前缀。\n *\n * 不带该前缀的类名会保持原样。\n *\n * @example\n * ```\n * // Expect: 'button active plain'\n * const example1 = removePrefixOfClass('pm-', 'pm-button pm-active plain')\n *\n * // Expect: ['button', 'plain']\n * const example2 = removePrefixOfClass('pm-', ['pm-button', 'plain'])\n *\n * // Expect: { button: true, plain: false }\n * const example3 = removePrefixOfClass('pm-', { 'pm-button': true, plain: false, 'pm-': true })\n * ```\n */\nexport const removePrefixOfClass = <T extends ClassUnion>(prefix: string, cls: T): T => {\n if (typeof cls === 'string') {\n const classArray = classStringToClassArray(cls).map(item => {\n if (item.startsWith(prefix)) {\n return item.slice(prefix.length)\n }\n return item\n })\n const classString = classArrayToClassString(classArray)\n // oxlint-disable-next-line no-unsafe-type-assertion\n return classString as T\n } else if (Array.isArray(cls)) {\n const classArray = cls.filter(item => item.length !== 0).map(item => {\n if (item.startsWith(prefix)) {\n return item.slice(prefix.length)\n }\n return item\n })\n const filteredClassArray = classArray.filter(item => item.length !== 0)\n // oxlint-disable-next-line no-unsafe-type-assertion\n return filteredClassArray as T\n } else {\n const classObject: ClassObject = {}\n Object.entries(cls).forEach(([key, value]) => {\n if (key.length === 0) {\n return\n }\n const _key = key.startsWith(prefix) ? key.slice(prefix.length) : key\n if (_key.length !== 0) {\n classObject[_key] = value === true\n }\n })\n // oxlint-disable-next-line no-unsafe-type-assertion\n return classObject as T\n }\n}\n\n/**\n * 向目标类名集合中加入新的类名。\n *\n * 当目标与新增项都包含同名类时,以新增项转换后的对象表示为准。\n *\n * @example\n * ```\n * // Expect: 'button active primary'\n * const example1 = addClass('button', 'active primary')\n *\n * // Expect: ['button', 'active', 'primary']\n * const example2 = addClass(['button'], { active: true, primary: true })\n * ```\n */\nexport const addClass = <T extends ClassUnion>(target: T, added: ClassUnion): T => {\n const targetClassObj = toClassObject(target)\n const addedClassObj = toClassObject(added)\n const resClassObj = { ...targetClassObj, ...addedClassObj }\n const result = formatClassToTarget(target, resClassObj)\n return result\n}\n\n/**\n * 从目标类名集合中移除指定类名。\n *\n * 该函数会把待移除项标记为 `false`,再按目标形态输出结果。\n *\n * @example\n * ```\n * // Expect: 'button primary'\n * const example1 = removeClass('button active primary', 'active')\n *\n * // Expect: { button: true, active: false }\n * const example2 = removeClass({ button: true, active: true }, ['active'])\n * ```\n */\nexport const removeClass = <T extends ClassUnion>(target: T, removed: ClassUnion): T => {\n const targetClassObj = toClassObject(target)\n const removedClassObj = toClassObject(removed)\n Object.keys(removedClassObj).forEach(key => {\n removedClassObj[key] = false\n })\n const resClassObj = { ...targetClassObj, ...removedClassObj }\n const result = formatClassToTarget(target, resClassObj)\n return result\n}\n\n/**\n * 切换目标类名集合中指定类名的启用状态。\n *\n * 已存在的类名会被关闭,不存在的类名会被开启。\n *\n * @example\n * ```\n * // Expect: 'button primary'\n * const example1 = toggleClass('button active', 'active primary')\n *\n * // Expect: { button: true, primary: true }\n * const example2 = toggleClass({ button: true, active: true }, ['active', 'primary'])\n * ```\n */\nexport const toggleClass = <T extends ClassUnion>(target: T, toggled: ClassUnion): T => {\n const targetClassObj = toClassObject(target)\n const toggledClassArr = toClassArray(toggled)\n toggledClassArr.forEach((cls) => {\n // oxlint-disable-next-line strict-boolean-expressions\n targetClassObj[cls] = !targetClassObj[cls]\n })\n const result = formatClassToTarget(target, targetClassObj)\n return result\n}\n\n/**\n * 替换目标类名集合中的类名。\n *\n * `replaced` 支持三种形式:\n * - 字符串:仅移除对应类名。\n * - 字符串数组:逐项移除对应类名。\n * - 元组数组:按 `[from, to]` 的形式逐项替换类名。\n * - 对象:按键值对执行替换,值为空字符串时表示删除。\n *\n * @example\n * ```\n * // Expect: 'button selected'\n * const example1 = replaceClass('button active', [['active', 'selected']])\n *\n * // Expect: ['button', 'selected']\n * const example2 = replaceClass(['button', 'active'], { active: 'selected' })\n *\n * // Expect: { button: true, active: false }\n * const example3 = replaceClass({ button: true, active: true }, 'active')\n * ```\n */\nexport const replaceClass = <T extends ClassUnion>(\n target: T,\n replaced: Record<string, string> | string | string[] | Array<[string, string]>,\n): T => {\n if (typeof replaced === 'string') {\n return removeClass(target, replaced)\n }\n\n const targetClassObj = toClassObject(target)\n\n if (Array.isArray(replaced)) {\n for (const item of replaced) {\n if (typeof item === 'string') {\n const fromValue = targetClassObj[item]\n\n if (fromValue !== undefined) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete targetClassObj[item]\n }\n\n continue\n }\n\n const [from, to] = item\n const fromValue = targetClassObj[from]\n\n if (fromValue !== undefined) {\n if (to !== '') {\n targetClassObj[to] = fromValue\n }\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete targetClassObj[from]\n }\n }\n\n return formatClassToTarget(target, targetClassObj)\n }\n\n for (const [from, rawTo] of Object.entries(replaced)) {\n if (typeof rawTo !== 'string') {\n continue\n }\n\n const fromValue = targetClassObj[from]\n\n if (fromValue !== undefined) {\n if (rawTo !== '') {\n targetClassObj[rawTo] = fromValue\n }\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete targetClassObj[from]\n }\n }\n\n return formatClassToTarget(target, targetClassObj)\n}\n\n/**\n * 判断目标类名集合是否完整包含另一组类名。\n *\n * 只有当 `contained` 中的每个类名都存在于 `target` 中时,才会返回 `true`。\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = containClass('button active', 'button active primary')\n *\n * // Expect: false\n * const example2 = containClass(['button', 'missing'], { button: true, active: true })\n * ```\n */\nexport const containClass = (contained: ClassUnion, target: ClassUnion): boolean => {\n const containedClassArr = toClassArray(contained)\n const targetClassArr = toClassArray(target)\n return containedClassArr.every(item => targetClassArr.includes(item))\n}\n"
|
|
205
|
-
],
|
|
206
|
-
"mappings": "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",
|
|
207
|
-
"debugId": "4F0C17BF1C3EE75064756E2164756E21",
|
|
208
|
-
"names": []
|
|
209
|
-
}
|