@blamejs/blamejs-shop 0.0.44
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 +87 -0
- package/LICENSE +17 -0
- package/README.md +117 -0
- package/SECURITY.md +139 -0
- package/lib/admin.js +952 -0
- package/lib/analytics.js +267 -0
- package/lib/cart.js +279 -0
- package/lib/catalog-import.js +344 -0
- package/lib/catalog.js +769 -0
- package/lib/checkout.js +320 -0
- package/lib/config.js +151 -0
- package/lib/customers.js +322 -0
- package/lib/email.js +242 -0
- package/lib/externaldb-d1.js +283 -0
- package/lib/index.js +57 -0
- package/lib/inventory-alerts.js +198 -0
- package/lib/newsletter.js +142 -0
- package/lib/order.js +380 -0
- package/lib/payment.js +318 -0
- package/lib/pricing.js +185 -0
- package/lib/r2-bridge.js +169 -0
- package/lib/shipping.js +185 -0
- package/lib/storefront.js +2160 -0
- package/lib/subscriptions.js +410 -0
- package/lib/tax.js +161 -0
- package/lib/theme.js +194 -0
- package/lib/vendor/MANIFEST.json +19 -0
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +23 -0
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +34 -0
- package/lib/vendor/blamejs/.clusterfuzzlite/project.yaml +16 -0
- package/lib/vendor/blamejs/.dockerignore +45 -0
- package/lib/vendor/blamejs/.gitattributes +42 -0
- package/lib/vendor/blamejs/.github/CODEOWNERS +4 -0
- package/lib/vendor/blamejs/.github/FUNDING.yml +2 -0
- package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/bug_report.md +58 -0
- package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/feature_request.md +99 -0
- package/lib/vendor/blamejs/.github/PULL_REQUEST_TEMPLATE.md +77 -0
- package/lib/vendor/blamejs/.github/dependabot.yml +37 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +148 -0
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +107 -0
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +122 -0
- package/lib/vendor/blamejs/.github/workflows/ci.yml +511 -0
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +50 -0
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +655 -0
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +406 -0
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +101 -0
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +134 -0
- package/lib/vendor/blamejs/.gitignore +102 -0
- package/lib/vendor/blamejs/.gitleaks.toml +166 -0
- package/lib/vendor/blamejs/.hadolint.yaml +18 -0
- package/lib/vendor/blamejs/.npmrc +5 -0
- package/lib/vendor/blamejs/.pinact.yaml +17 -0
- package/lib/vendor/blamejs/ARCHITECTURE.md +158 -0
- package/lib/vendor/blamejs/CHANGELOG.md +1351 -0
- package/lib/vendor/blamejs/CODE_OF_CONDUCT.md +86 -0
- package/lib/vendor/blamejs/CONTRIBUTING.md +156 -0
- package/lib/vendor/blamejs/GOVERNANCE.md +201 -0
- package/lib/vendor/blamejs/LICENSE +201 -0
- package/lib/vendor/blamejs/LTS-CALENDAR.md +29 -0
- package/lib/vendor/blamejs/MIGRATING.md +29 -0
- package/lib/vendor/blamejs/NOTICE +81 -0
- package/lib/vendor/blamejs/README.md +304 -0
- package/lib/vendor/blamejs/SECURITY.md +432 -0
- package/lib/vendor/blamejs/api-snapshot.json +48709 -0
- package/lib/vendor/blamejs/assets/BlameJS_Logo.png +0 -0
- package/lib/vendor/blamejs/assets/BlameJS_Logo.svg +129 -0
- package/lib/vendor/blamejs/bench/README.md +77 -0
- package/lib/vendor/blamejs/bench/_helpers.js +70 -0
- package/lib/vendor/blamejs/bench/baseline.json +183 -0
- package/lib/vendor/blamejs/bench/crypto-hash.bench.js +19 -0
- package/lib/vendor/blamejs/bench/crypto-symmetric.bench.js +28 -0
- package/lib/vendor/blamejs/bench/run.js +140 -0
- package/lib/vendor/blamejs/bench/safe-json.bench.js +31 -0
- package/lib/vendor/blamejs/bin/blamejs.js +13 -0
- package/lib/vendor/blamejs/docker/caddy/Caddyfile +46 -0
- package/lib/vendor/blamejs/docker/coredns/Corefile +37 -0
- package/lib/vendor/blamejs/docker/haproxy/haproxy.cfg +52 -0
- package/lib/vendor/blamejs/docker/init/generate-certs.sh +118 -0
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +87 -0
- package/lib/vendor/blamejs/docker/mitmproxy/config.yaml +16 -0
- package/lib/vendor/blamejs/docker/mongo/init-tls.sh +17 -0
- package/lib/vendor/blamejs/docker/mysql/my.cnf +12 -0
- package/lib/vendor/blamejs/docker/nats/nats.conf +33 -0
- package/lib/vendor/blamejs/docker/postgres/init-tls.sh +17 -0
- package/lib/vendor/blamejs/docker/postgres/postgresql.conf +18 -0
- package/lib/vendor/blamejs/docker/rabbitmq/rabbitmq.conf +18 -0
- package/lib/vendor/blamejs/docker/redis/redis.conf +15 -0
- package/lib/vendor/blamejs/docker/squid/squid.conf +24 -0
- package/lib/vendor/blamejs/docker/syslog/syslog-ng.conf +34 -0
- package/lib/vendor/blamejs/docker-compose.test.yml +545 -0
- package/lib/vendor/blamejs/docs/cis-postgres-crosswalk.md +102 -0
- package/lib/vendor/blamejs/docs/cis-sqlite-equivalent.md +92 -0
- package/lib/vendor/blamejs/eslint.config.mjs +204 -0
- package/lib/vendor/blamejs/examples/wiki/Caddyfile +40 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +218 -0
- package/lib/vendor/blamejs/examples/wiki/Dockerfile +120 -0
- package/lib/vendor/blamejs/examples/wiki/README.md +157 -0
- package/lib/vendor/blamejs/examples/wiki/cli-snapshot.json +250 -0
- package/lib/vendor/blamejs/examples/wiki/docker-compose.prod.yml +231 -0
- package/lib/vendor/blamejs/examples/wiki/docker-compose.yml +166 -0
- package/lib/vendor/blamejs/examples/wiki/env-snapshot.json +217 -0
- package/lib/vendor/blamejs/examples/wiki/lib/auto-site-entries.js +139 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +555 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-cli.js +507 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-env-vars.js +435 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-errors.js +282 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-vendored-deps.js +321 -0
- package/lib/vendor/blamejs/examples/wiki/lib/nav.js +15 -0
- package/lib/vendor/blamejs/examples/wiki/lib/opts-resolver.js +75 -0
- package/lib/vendor/blamejs/examples/wiki/lib/page-generator.js +508 -0
- package/lib/vendor/blamejs/examples/wiki/lib/section.js +276 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +587 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-doc-parser.js +318 -0
- package/lib/vendor/blamejs/examples/wiki/lib/symbol-index.js +122 -0
- package/lib/vendor/blamejs/examples/wiki/migrations/0001-pages-schema.js +74 -0
- package/lib/vendor/blamejs/examples/wiki/package.json +18 -0
- package/lib/vendor/blamejs/examples/wiki/public/img/blamejs-logo.png +0 -0
- package/lib/vendor/blamejs/examples/wiki/public/img/blamejs-logo.svg +129 -0
- package/lib/vendor/blamejs/examples/wiki/public/robots.txt +5 -0
- package/lib/vendor/blamejs/examples/wiki/public/vendor/MANIFEST.json +30 -0
- package/lib/vendor/blamejs/examples/wiki/public/vendor/prism.css +1 -0
- package/lib/vendor/blamejs/examples/wiki/public/vendor/prism.js +15 -0
- package/lib/vendor/blamejs/examples/wiki/public/wiki.css +1250 -0
- package/lib/vendor/blamejs/examples/wiki/routes/admin.js +366 -0
- package/lib/vendor/blamejs/examples/wiki/routes/integration.js +230 -0
- package/lib/vendor/blamejs/examples/wiki/routes/pages.js +266 -0
- package/lib/vendor/blamejs/examples/wiki/scripts/backfill-module-metadata.js +214 -0
- package/lib/vendor/blamejs/examples/wiki/seeders/prod/0001-default-pages.js +35 -0
- package/lib/vendor/blamejs/examples/wiki/seeders/prod/pages/_index.js +34 -0
- package/lib/vendor/blamejs/examples/wiki/seeders/prod/pages/api.js +76 -0
- package/lib/vendor/blamejs/examples/wiki/server.js +129 -0
- package/lib/vendor/blamejs/examples/wiki/site.config.js +197 -0
- package/lib/vendor/blamejs/examples/wiki/snippets/README.md +38 -0
- package/lib/vendor/blamejs/examples/wiki/snippets/auth/password-hash.example.js +15 -0
- package/lib/vendor/blamejs/examples/wiki/src/editor.js +103 -0
- package/lib/vendor/blamejs/examples/wiki/src/wiki.js +349 -0
- package/lib/vendor/blamejs/examples/wiki/test/AUDIT.md +155 -0
- package/lib/vendor/blamejs/examples/wiki/test/codebase-patterns.test.js +594 -0
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +741 -0
- package/lib/vendor/blamejs/examples/wiki/test/find-missing-pages.js +254 -0
- package/lib/vendor/blamejs/examples/wiki/test/integration.js +391 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-cli-snapshot.js +379 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-env-snapshot.js +346 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-nav-coverage.js +212 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-site-coverage.js +252 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-source-comment-blocks.js +107 -0
- package/lib/vendor/blamejs/examples/wiki/views/_layout.html +115 -0
- package/lib/vendor/blamejs/examples/wiki/views/admin/api-keys.html +51 -0
- package/lib/vendor/blamejs/examples/wiki/views/admin/dashboard.html +22 -0
- package/lib/vendor/blamejs/examples/wiki/views/admin/edit.html +17 -0
- package/lib/vendor/blamejs/examples/wiki/views/home.html +85 -0
- package/lib/vendor/blamejs/examples/wiki/views/login.html +18 -0
- package/lib/vendor/blamejs/examples/wiki/views/page.html +5 -0
- package/lib/vendor/blamejs/examples/wiki/views/partials/nav.html +13 -0
- package/lib/vendor/blamejs/examples/wiki/views/search.html +19 -0
- package/lib/vendor/blamejs/examples/wiki/wiki.config.js +15 -0
- package/lib/vendor/blamejs/fuzz/README.md +137 -0
- package/lib/vendor/blamejs/fuzz/_expected.js +35 -0
- package/lib/vendor/blamejs/fuzz/guard-agent-registry.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-csv.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/01-basic.csv +3 -0
- package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/02-formula.csv +1 -0
- package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/03-hyperlink.csv +1 -0
- package/lib/vendor/blamejs/fuzz/guard-dsn.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-email.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-email_seed_corpus/01-basic.eml +5 -0
- package/lib/vendor/blamejs/fuzz/guard-envelope.fuzz.js +24 -0
- package/lib/vendor/blamejs/fuzz/guard-event-bus-payload.fuzz.js +24 -0
- package/lib/vendor/blamejs/fuzz/guard-event-bus-topic.fuzz.js +20 -0
- package/lib/vendor/blamejs/fuzz/guard-html.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/01-basic.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/02-script.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/03-event.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/04-jsurl.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-idempotency-key.fuzz.js +20 -0
- package/lib/vendor/blamejs/fuzz/guard-imap-command.fuzz.js +35 -0
- package/lib/vendor/blamejs/fuzz/guard-jmap.fuzz.js +41 -0
- package/lib/vendor/blamejs/fuzz/guard-json.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/01-basic.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/02-proto.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/03-dupkey.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/04-nan.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/05-bom.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-list-id.fuzz.js +21 -0
- package/lib/vendor/blamejs/fuzz/guard-list-unsubscribe.fuzz.js +25 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-compose.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-move.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-query.fuzz.js +27 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-reply.fuzz.js +23 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-sieve.fuzz.js +36 -0
- package/lib/vendor/blamejs/fuzz/guard-managesieve-command.fuzz.js +26 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/01-basic.md +2 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/02-jsurl.md +1 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/03-jsimg.md +1 -0
- package/lib/vendor/blamejs/fuzz/guard-message-id.fuzz.js +26 -0
- package/lib/vendor/blamejs/fuzz/guard-pop3-command.fuzz.js +23 -0
- package/lib/vendor/blamejs/fuzz/guard-posture-chain.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-saga-config.fuzz.js +32 -0
- package/lib/vendor/blamejs/fuzz/guard-smtp-command.fuzz.js +27 -0
- package/lib/vendor/blamejs/fuzz/guard-snapshot-envelope.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-stream-args.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-svg.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-svg_seed_corpus/01-basic.svg +1 -0
- package/lib/vendor/blamejs/fuzz/guard-svg_seed_corpus/02-script.svg +1 -0
- package/lib/vendor/blamejs/fuzz/guard-tenant-id.fuzz.js +20 -0
- package/lib/vendor/blamejs/fuzz/guard-trace-context.fuzz.js +30 -0
- package/lib/vendor/blamejs/fuzz/guard-xml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-xml_seed_corpus/01-basic.xml +1 -0
- package/lib/vendor/blamejs/fuzz/guard-xml_seed_corpus/02-xxe.xml +1 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/01-basic.yaml +2 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/02-anchor.yaml +2 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/03-norway.yaml +1 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/04-multidoc.yaml +4 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-ini.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-ini_seed_corpus/01-basic.ini +2 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-toml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-toml_seed_corpus/01-basic.toml +4 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-xml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-xml_seed_corpus/01-basic.xml +1 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-yaml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-yaml_seed_corpus/01-basic.yaml +4 -0
- package/lib/vendor/blamejs/fuzz/safe-decompress.fuzz.js +49 -0
- package/lib/vendor/blamejs/fuzz/safe-dns.fuzz.js +29 -0
- package/lib/vendor/blamejs/fuzz/safe-ical.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/safe-icap.fuzz.js +42 -0
- package/lib/vendor/blamejs/fuzz/safe-json.fuzz.js +25 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/01-object.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/02-array.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/03-string.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/04-proto.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/05-deep.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/01-basic.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/02-filter.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/03-deepscan.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/04-slice.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-mime.fuzz.js +27 -0
- package/lib/vendor/blamejs/fuzz/safe-mount-info.fuzz.js +33 -0
- package/lib/vendor/blamejs/fuzz/safe-sieve.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/safe-smtp.fuzz.js +64 -0
- package/lib/vendor/blamejs/fuzz/safe-url.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/01-basic.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/02-userinfo.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/03-dangerous.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/04-data.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/05-ipv6.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/06-idn.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-vcard.fuzz.js +16 -0
- package/lib/vendor/blamejs/index.js +678 -0
- package/lib/vendor/blamejs/keys/release-pqc-pub.json +7 -0
- package/lib/vendor/blamejs/lib/_test/crypto-fixtures.js +67 -0
- package/lib/vendor/blamejs/lib/a2a-tasks.js +598 -0
- package/lib/vendor/blamejs/lib/a2a.js +407 -0
- package/lib/vendor/blamejs/lib/acme.js +1448 -0
- package/lib/vendor/blamejs/lib/agent-audit.js +45 -0
- package/lib/vendor/blamejs/lib/agent-event-bus.js +382 -0
- package/lib/vendor/blamejs/lib/agent-idempotency.js +497 -0
- package/lib/vendor/blamejs/lib/agent-orchestrator.js +717 -0
- package/lib/vendor/blamejs/lib/agent-posture-chain.js +366 -0
- package/lib/vendor/blamejs/lib/agent-saga.js +321 -0
- package/lib/vendor/blamejs/lib/agent-snapshot.js +676 -0
- package/lib/vendor/blamejs/lib/agent-stream.js +269 -0
- package/lib/vendor/blamejs/lib/agent-tenant.js +632 -0
- package/lib/vendor/blamejs/lib/agent-trace.js +281 -0
- package/lib/vendor/blamejs/lib/ai-adverse-decision.js +184 -0
- package/lib/vendor/blamejs/lib/ai-content-detect.js +268 -0
- package/lib/vendor/blamejs/lib/ai-input.js +201 -0
- package/lib/vendor/blamejs/lib/ai-model-manifest.js +363 -0
- package/lib/vendor/blamejs/lib/ai-pref.js +340 -0
- package/lib/vendor/blamejs/lib/api-key.js +721 -0
- package/lib/vendor/blamejs/lib/api-snapshot.js +458 -0
- package/lib/vendor/blamejs/lib/app-shutdown.js +557 -0
- package/lib/vendor/blamejs/lib/app.js +365 -0
- package/lib/vendor/blamejs/lib/archive.js +547 -0
- package/lib/vendor/blamejs/lib/arg-parser.js +697 -0
- package/lib/vendor/blamejs/lib/argon2-builtin.js +173 -0
- package/lib/vendor/blamejs/lib/asn1-der.js +424 -0
- package/lib/vendor/blamejs/lib/asyncapi-bindings.js +160 -0
- package/lib/vendor/blamejs/lib/asyncapi-traits.js +143 -0
- package/lib/vendor/blamejs/lib/asyncapi.js +575 -0
- package/lib/vendor/blamejs/lib/atomic-file.js +1023 -0
- package/lib/vendor/blamejs/lib/audit-chain.js +266 -0
- package/lib/vendor/blamejs/lib/audit-daily-review.js +389 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +751 -0
- package/lib/vendor/blamejs/lib/audit-tools.js +1113 -0
- package/lib/vendor/blamejs/lib/audit.js +1671 -0
- package/lib/vendor/blamejs/lib/auth/aal.js +169 -0
- package/lib/vendor/blamejs/lib/auth/access-lock.js +220 -0
- package/lib/vendor/blamejs/lib/auth/acr-vocabulary.js +265 -0
- package/lib/vendor/blamejs/lib/auth/ato-kill-switch.js +112 -0
- package/lib/vendor/blamejs/lib/auth/auth-time-tracker.js +111 -0
- package/lib/vendor/blamejs/lib/auth/bot-challenge.js +573 -0
- package/lib/vendor/blamejs/lib/auth/ciba.js +637 -0
- package/lib/vendor/blamejs/lib/auth/dpop.js +516 -0
- package/lib/vendor/blamejs/lib/auth/elevation-grant.js +306 -0
- package/lib/vendor/blamejs/lib/auth/fal.js +229 -0
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +681 -0
- package/lib/vendor/blamejs/lib/auth/jwt-external.js +519 -0
- package/lib/vendor/blamejs/lib/auth/jwt.js +430 -0
- package/lib/vendor/blamejs/lib/auth/lockout.js +449 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +2141 -0
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +657 -0
- package/lib/vendor/blamejs/lib/auth/oid4vp.js +531 -0
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +600 -0
- package/lib/vendor/blamejs/lib/auth/passkey.js +676 -0
- package/lib/vendor/blamejs/lib/auth/password.js +693 -0
- package/lib/vendor/blamejs/lib/auth/saml.js +2109 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-disclosure.js +95 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-holder.js +225 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-issuer.js +197 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +728 -0
- package/lib/vendor/blamejs/lib/auth/status-list.js +272 -0
- package/lib/vendor/blamejs/lib/auth/step-up-policy.js +335 -0
- package/lib/vendor/blamejs/lib/auth/step-up.js +454 -0
- package/lib/vendor/blamejs/lib/auth-bot-challenge.js +505 -0
- package/lib/vendor/blamejs/lib/auth-header.js +148 -0
- package/lib/vendor/blamejs/lib/backup/bundle.js +265 -0
- package/lib/vendor/blamejs/lib/backup/crypto.js +176 -0
- package/lib/vendor/blamejs/lib/backup/index.js +1001 -0
- package/lib/vendor/blamejs/lib/backup/manifest.js +443 -0
- package/lib/vendor/blamejs/lib/boot-gates.js +174 -0
- package/lib/vendor/blamejs/lib/breach-deadline.js +272 -0
- package/lib/vendor/blamejs/lib/break-glass.js +1753 -0
- package/lib/vendor/blamejs/lib/budr.js +205 -0
- package/lib/vendor/blamejs/lib/bundler.js +461 -0
- package/lib/vendor/blamejs/lib/cache-redis.js +256 -0
- package/lib/vendor/blamejs/lib/cache-status.js +288 -0
- package/lib/vendor/blamejs/lib/cache.js +1331 -0
- package/lib/vendor/blamejs/lib/calendar.js +1240 -0
- package/lib/vendor/blamejs/lib/canonical-json.js +143 -0
- package/lib/vendor/blamejs/lib/cdn-cache-control.js +473 -0
- package/lib/vendor/blamejs/lib/cert.js +763 -0
- package/lib/vendor/blamejs/lib/chain-writer.js +259 -0
- package/lib/vendor/blamejs/lib/circuit-breaker.js +101 -0
- package/lib/vendor/blamejs/lib/cli-helpers.js +237 -0
- package/lib/vendor/blamejs/lib/cli.js +2328 -0
- package/lib/vendor/blamejs/lib/client-hints.js +318 -0
- package/lib/vendor/blamejs/lib/cloud-events.js +277 -0
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +317 -0
- package/lib/vendor/blamejs/lib/cluster-storage.js +351 -0
- package/lib/vendor/blamejs/lib/cluster.js +1017 -0
- package/lib/vendor/blamejs/lib/cms-codec.js +826 -0
- package/lib/vendor/blamejs/lib/codepoint-class.js +262 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-logging.js +190 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +205 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-risk.js +189 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +200 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +821 -0
- package/lib/vendor/blamejs/lib/compliance-eaa.js +204 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions-aliases.js +167 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions-fetcher.js +206 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions-fuzzy.js +297 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions.js +569 -0
- package/lib/vendor/blamejs/lib/compliance.js +1558 -0
- package/lib/vendor/blamejs/lib/config-drift.js +426 -0
- package/lib/vendor/blamejs/lib/config.js +446 -0
- package/lib/vendor/blamejs/lib/consent.js +369 -0
- package/lib/vendor/blamejs/lib/constants.js +209 -0
- package/lib/vendor/blamejs/lib/content-credentials.js +704 -0
- package/lib/vendor/blamejs/lib/cookies.js +560 -0
- package/lib/vendor/blamejs/lib/cra-report.js +299 -0
- package/lib/vendor/blamejs/lib/credential-hash.js +394 -0
- package/lib/vendor/blamejs/lib/crypto-field.js +1017 -0
- package/lib/vendor/blamejs/lib/crypto-hpke-pq.js +187 -0
- package/lib/vendor/blamejs/lib/crypto-hpke.js +256 -0
- package/lib/vendor/blamejs/lib/crypto.js +1908 -0
- package/lib/vendor/blamejs/lib/csp.js +271 -0
- package/lib/vendor/blamejs/lib/csv.js +418 -0
- package/lib/vendor/blamejs/lib/daemon.js +481 -0
- package/lib/vendor/blamejs/lib/dark-patterns.js +488 -0
- package/lib/vendor/blamejs/lib/data-act.js +328 -0
- package/lib/vendor/blamejs/lib/db-collection.js +587 -0
- package/lib/vendor/blamejs/lib/db-declare-row-policy.js +267 -0
- package/lib/vendor/blamejs/lib/db-declare-view.js +420 -0
- package/lib/vendor/blamejs/lib/db-file-lifecycle.js +333 -0
- package/lib/vendor/blamejs/lib/db-query.js +802 -0
- package/lib/vendor/blamejs/lib/db-role-context.js +50 -0
- package/lib/vendor/blamejs/lib/db-schema.js +322 -0
- package/lib/vendor/blamejs/lib/db.js +3111 -0
- package/lib/vendor/blamejs/lib/dbsc.js +299 -0
- package/lib/vendor/blamejs/lib/ddl-change-control.js +523 -0
- package/lib/vendor/blamejs/lib/deprecate.js +377 -0
- package/lib/vendor/blamejs/lib/dev.js +405 -0
- package/lib/vendor/blamejs/lib/dora.js +402 -0
- package/lib/vendor/blamejs/lib/dr-runbook.js +368 -0
- package/lib/vendor/blamejs/lib/dsr.js +1188 -0
- package/lib/vendor/blamejs/lib/dual-control.js +526 -0
- package/lib/vendor/blamejs/lib/early-hints.js +212 -0
- package/lib/vendor/blamejs/lib/error-page.js +420 -0
- package/lib/vendor/blamejs/lib/events.js +214 -0
- package/lib/vendor/blamejs/lib/external-db-migrate.js +659 -0
- package/lib/vendor/blamejs/lib/external-db.js +1877 -0
- package/lib/vendor/blamejs/lib/fapi2.js +394 -0
- package/lib/vendor/blamejs/lib/fda-21cfr11.js +395 -0
- package/lib/vendor/blamejs/lib/fdx.js +370 -0
- package/lib/vendor/blamejs/lib/fedcm.js +264 -0
- package/lib/vendor/blamejs/lib/file-type.js +360 -0
- package/lib/vendor/blamejs/lib/file-upload.js +1256 -0
- package/lib/vendor/blamejs/lib/flag-cache.js +136 -0
- package/lib/vendor/blamejs/lib/flag-evaluation-context.js +135 -0
- package/lib/vendor/blamejs/lib/flag-providers.js +279 -0
- package/lib/vendor/blamejs/lib/flag-targeting.js +210 -0
- package/lib/vendor/blamejs/lib/flag.js +346 -0
- package/lib/vendor/blamejs/lib/forms.js +525 -0
- package/lib/vendor/blamejs/lib/framework-error.js +724 -0
- package/lib/vendor/blamejs/lib/framework-schema.js +845 -0
- package/lib/vendor/blamejs/lib/framework-sha1-hibp.js +34 -0
- package/lib/vendor/blamejs/lib/fsm.js +469 -0
- package/lib/vendor/blamejs/lib/gate-contract.js +1661 -0
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +261 -0
- package/lib/vendor/blamejs/lib/graphql-federation.js +234 -0
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +179 -0
- package/lib/vendor/blamejs/lib/guard-all.js +555 -0
- package/lib/vendor/blamejs/lib/guard-archive.js +901 -0
- package/lib/vendor/blamejs/lib/guard-auth.js +451 -0
- package/lib/vendor/blamejs/lib/guard-cidr.js +676 -0
- package/lib/vendor/blamejs/lib/guard-csv.js +1176 -0
- package/lib/vendor/blamejs/lib/guard-domain.js +814 -0
- package/lib/vendor/blamejs/lib/guard-dsn.js +382 -0
- package/lib/vendor/blamejs/lib/guard-email.js +951 -0
- package/lib/vendor/blamejs/lib/guard-envelope.js +294 -0
- package/lib/vendor/blamejs/lib/guard-event-bus-payload.js +217 -0
- package/lib/vendor/blamejs/lib/guard-event-bus-topic.js +150 -0
- package/lib/vendor/blamejs/lib/guard-filename.js +956 -0
- package/lib/vendor/blamejs/lib/guard-graphql.js +731 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-aria.js +164 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-forms.js +144 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-tables.js +154 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-tagwalk.js +44 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag.js +470 -0
- package/lib/vendor/blamejs/lib/guard-html.js +1209 -0
- package/lib/vendor/blamejs/lib/guard-idempotency-key.js +151 -0
- package/lib/vendor/blamejs/lib/guard-image.js +584 -0
- package/lib/vendor/blamejs/lib/guard-imap-command.js +337 -0
- package/lib/vendor/blamejs/lib/guard-jmap.js +321 -0
- package/lib/vendor/blamejs/lib/guard-json.js +935 -0
- package/lib/vendor/blamejs/lib/guard-jsonpath.js +512 -0
- package/lib/vendor/blamejs/lib/guard-jwt.js +772 -0
- package/lib/vendor/blamejs/lib/guard-list-id.js +318 -0
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +412 -0
- package/lib/vendor/blamejs/lib/guard-mail-compose.js +282 -0
- package/lib/vendor/blamejs/lib/guard-mail-move.js +202 -0
- package/lib/vendor/blamejs/lib/guard-mail-query.js +310 -0
- package/lib/vendor/blamejs/lib/guard-mail-reply.js +172 -0
- package/lib/vendor/blamejs/lib/guard-mail-sieve.js +207 -0
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +566 -0
- package/lib/vendor/blamejs/lib/guard-markdown.js +768 -0
- package/lib/vendor/blamejs/lib/guard-message-id.js +267 -0
- package/lib/vendor/blamejs/lib/guard-mime.js +609 -0
- package/lib/vendor/blamejs/lib/guard-oauth.js +650 -0
- package/lib/vendor/blamejs/lib/guard-pdf.js +569 -0
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +317 -0
- package/lib/vendor/blamejs/lib/guard-posture-chain.js +201 -0
- package/lib/vendor/blamejs/lib/guard-regex.js +632 -0
- package/lib/vendor/blamejs/lib/guard-saga-config.js +157 -0
- package/lib/vendor/blamejs/lib/guard-shell.js +522 -0
- package/lib/vendor/blamejs/lib/guard-smtp-command.js +594 -0
- package/lib/vendor/blamejs/lib/guard-snapshot-envelope.js +168 -0
- package/lib/vendor/blamejs/lib/guard-stream-args.js +166 -0
- package/lib/vendor/blamejs/lib/guard-svg.js +1163 -0
- package/lib/vendor/blamejs/lib/guard-template.js +490 -0
- package/lib/vendor/blamejs/lib/guard-tenant-id.js +138 -0
- package/lib/vendor/blamejs/lib/guard-time.js +586 -0
- package/lib/vendor/blamejs/lib/guard-trace-context.js +172 -0
- package/lib/vendor/blamejs/lib/guard-uuid.js +548 -0
- package/lib/vendor/blamejs/lib/guard-xml.js +666 -0
- package/lib/vendor/blamejs/lib/guard-yaml.js +726 -0
- package/lib/vendor/blamejs/lib/hal.js +125 -0
- package/lib/vendor/blamejs/lib/handlers.js +350 -0
- package/lib/vendor/blamejs/lib/honeytoken.js +168 -0
- package/lib/vendor/blamejs/lib/html-balance.js +347 -0
- package/lib/vendor/blamejs/lib/http-client-cache.js +923 -0
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +519 -0
- package/lib/vendor/blamejs/lib/http-client.js +2152 -0
- package/lib/vendor/blamejs/lib/http-message-signature.js +589 -0
- package/lib/vendor/blamejs/lib/http2-teardown.js +34 -0
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +398 -0
- package/lib/vendor/blamejs/lib/i18n.js +931 -0
- package/lib/vendor/blamejs/lib/iab-mspa.js +257 -0
- package/lib/vendor/blamejs/lib/iab-tcf.js +461 -0
- package/lib/vendor/blamejs/lib/importmap-integrity.js +90 -0
- package/lib/vendor/blamejs/lib/inbox.js +435 -0
- package/lib/vendor/blamejs/lib/incident-report.js +314 -0
- package/lib/vendor/blamejs/lib/ip-utils.js +102 -0
- package/lib/vendor/blamejs/lib/jobs.js +185 -0
- package/lib/vendor/blamejs/lib/jose-jwe-experimental.js +228 -0
- package/lib/vendor/blamejs/lib/jsonapi.js +230 -0
- package/lib/vendor/blamejs/lib/keychain.js +865 -0
- package/lib/vendor/blamejs/lib/lazy-require.js +48 -0
- package/lib/vendor/blamejs/lib/legal-hold.js +374 -0
- package/lib/vendor/blamejs/lib/local-db-thin.js +321 -0
- package/lib/vendor/blamejs/lib/log-stream-cloudwatch.js +369 -0
- package/lib/vendor/blamejs/lib/log-stream-local.js +146 -0
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +410 -0
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +286 -0
- package/lib/vendor/blamejs/lib/log-stream-syslog.js +310 -0
- package/lib/vendor/blamejs/lib/log-stream-webhook.js +199 -0
- package/lib/vendor/blamejs/lib/log-stream.js +584 -0
- package/lib/vendor/blamejs/lib/log.js +625 -0
- package/lib/vendor/blamejs/lib/lro.js +200 -0
- package/lib/vendor/blamejs/lib/mail-agent.js +786 -0
- package/lib/vendor/blamejs/lib/mail-arc-sign.js +417 -0
- package/lib/vendor/blamejs/lib/mail-arf.js +343 -0
- package/lib/vendor/blamejs/lib/mail-auth.js +2144 -0
- package/lib/vendor/blamejs/lib/mail-bimi.js +1047 -0
- package/lib/vendor/blamejs/lib/mail-bounce.js +955 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +1286 -0
- package/lib/vendor/blamejs/lib/mail-crypto-smime.js +789 -0
- package/lib/vendor/blamejs/lib/mail-crypto.js +108 -0
- package/lib/vendor/blamejs/lib/mail-dav.js +1224 -0
- package/lib/vendor/blamejs/lib/mail-deploy.js +1119 -0
- package/lib/vendor/blamejs/lib/mail-dkim.js +1250 -0
- package/lib/vendor/blamejs/lib/mail-greylist.js +448 -0
- package/lib/vendor/blamejs/lib/mail-helo.js +473 -0
- package/lib/vendor/blamejs/lib/mail-journal.js +435 -0
- package/lib/vendor/blamejs/lib/mail-mdn.js +424 -0
- package/lib/vendor/blamejs/lib/mail-rbl.js +392 -0
- package/lib/vendor/blamejs/lib/mail-require-tls.js +198 -0
- package/lib/vendor/blamejs/lib/mail-scan.js +502 -0
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +629 -0
- package/lib/vendor/blamejs/lib/mail-server-imap.js +1858 -0
- package/lib/vendor/blamejs/lib/mail-server-jmap.js +1565 -0
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +908 -0
- package/lib/vendor/blamejs/lib/mail-server-mx.js +969 -0
- package/lib/vendor/blamejs/lib/mail-server-pop3.js +915 -0
- package/lib/vendor/blamejs/lib/mail-server-rate-limit.js +315 -0
- package/lib/vendor/blamejs/lib/mail-server-registry.js +378 -0
- package/lib/vendor/blamejs/lib/mail-server-submission.js +1396 -0
- package/lib/vendor/blamejs/lib/mail-server-tls.js +445 -0
- package/lib/vendor/blamejs/lib/mail-sieve.js +557 -0
- package/lib/vendor/blamejs/lib/mail-spam-score.js +284 -0
- package/lib/vendor/blamejs/lib/mail-srs.js +248 -0
- package/lib/vendor/blamejs/lib/mail-store-fts.js +394 -0
- package/lib/vendor/blamejs/lib/mail-store.js +929 -0
- package/lib/vendor/blamejs/lib/mail-unsubscribe.js +400 -0
- package/lib/vendor/blamejs/lib/mail.js +1971 -0
- package/lib/vendor/blamejs/lib/mcp-tool-registry.js +473 -0
- package/lib/vendor/blamejs/lib/mcp.js +950 -0
- package/lib/vendor/blamejs/lib/metrics.js +1503 -0
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +177 -0
- package/lib/vendor/blamejs/lib/middleware/ai-act-disclosure.js +203 -0
- package/lib/vendor/blamejs/lib/middleware/api-encrypt.js +981 -0
- package/lib/vendor/blamejs/lib/middleware/assetlinks.js +137 -0
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +171 -0
- package/lib/vendor/blamejs/lib/middleware/attach-user.js +220 -0
- package/lib/vendor/blamejs/lib/middleware/bearer-auth.js +293 -0
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +1519 -0
- package/lib/vendor/blamejs/lib/middleware/bot-disclose.js +183 -0
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +217 -0
- package/lib/vendor/blamejs/lib/middleware/clear-site-data.js +122 -0
- package/lib/vendor/blamejs/lib/middleware/compose-pipeline.js +355 -0
- package/lib/vendor/blamejs/lib/middleware/compression.js +489 -0
- package/lib/vendor/blamejs/lib/middleware/cookies.js +130 -0
- package/lib/vendor/blamejs/lib/middleware/cors.js +386 -0
- package/lib/vendor/blamejs/lib/middleware/csp-nonce.js +388 -0
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +167 -0
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +499 -0
- package/lib/vendor/blamejs/lib/middleware/daily-byte-quota.js +243 -0
- package/lib/vendor/blamejs/lib/middleware/db-role-for.js +304 -0
- package/lib/vendor/blamejs/lib/middleware/dpop.js +402 -0
- package/lib/vendor/blamejs/lib/middleware/error-handler.js +69 -0
- package/lib/vendor/blamejs/lib/middleware/fetch-metadata.js +168 -0
- package/lib/vendor/blamejs/lib/middleware/flag-context.js +110 -0
- package/lib/vendor/blamejs/lib/middleware/gpc.js +153 -0
- package/lib/vendor/blamejs/lib/middleware/headers.js +242 -0
- package/lib/vendor/blamejs/lib/middleware/health.js +438 -0
- package/lib/vendor/blamejs/lib/middleware/host-allowlist.js +189 -0
- package/lib/vendor/blamejs/lib/middleware/idempotency-key.js +964 -0
- package/lib/vendor/blamejs/lib/middleware/index.js +183 -0
- package/lib/vendor/blamejs/lib/middleware/nel.js +214 -0
- package/lib/vendor/blamejs/lib/middleware/network-allowlist.js +237 -0
- package/lib/vendor/blamejs/lib/middleware/no-cache.js +106 -0
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +177 -0
- package/lib/vendor/blamejs/lib/middleware/protected-resource-metadata.js +277 -0
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +556 -0
- package/lib/vendor/blamejs/lib/middleware/request-id.js +79 -0
- package/lib/vendor/blamejs/lib/middleware/request-log.js +205 -0
- package/lib/vendor/blamejs/lib/middleware/require-aal.js +138 -0
- package/lib/vendor/blamejs/lib/middleware/require-auth.js +144 -0
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +290 -0
- package/lib/vendor/blamejs/lib/middleware/require-content-type.js +113 -0
- package/lib/vendor/blamejs/lib/middleware/require-methods.js +97 -0
- package/lib/vendor/blamejs/lib/middleware/require-mtls.js +212 -0
- package/lib/vendor/blamejs/lib/middleware/require-step-up.js +226 -0
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +375 -0
- package/lib/vendor/blamejs/lib/middleware/security-headers.js +285 -0
- package/lib/vendor/blamejs/lib/middleware/security-txt.js +170 -0
- package/lib/vendor/blamejs/lib/middleware/span-http-server.js +280 -0
- package/lib/vendor/blamejs/lib/middleware/speculation-rules.js +323 -0
- package/lib/vendor/blamejs/lib/middleware/sse.js +200 -0
- package/lib/vendor/blamejs/lib/middleware/trace-log-correlation.js +167 -0
- package/lib/vendor/blamejs/lib/middleware/trace-propagate.js +148 -0
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +749 -0
- package/lib/vendor/blamejs/lib/middleware/web-app-manifest.js +164 -0
- package/lib/vendor/blamejs/lib/migration-files.js +37 -0
- package/lib/vendor/blamejs/lib/migrations.js +385 -0
- package/lib/vendor/blamejs/lib/mime-parse.js +198 -0
- package/lib/vendor/blamejs/lib/money.js +699 -0
- package/lib/vendor/blamejs/lib/mtls-ca.js +572 -0
- package/lib/vendor/blamejs/lib/mtls-engine-default.js +501 -0
- package/lib/vendor/blamejs/lib/network-byte-quota.js +308 -0
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +533 -0
- package/lib/vendor/blamejs/lib/network-dns.js +1930 -0
- package/lib/vendor/blamejs/lib/network-heartbeat.js +425 -0
- package/lib/vendor/blamejs/lib/network-nts.js +574 -0
- package/lib/vendor/blamejs/lib/network-proxy.js +265 -0
- package/lib/vendor/blamejs/lib/network-smtp-policy.js +836 -0
- package/lib/vendor/blamejs/lib/network-tls.js +3126 -0
- package/lib/vendor/blamejs/lib/network.js +346 -0
- package/lib/vendor/blamejs/lib/nis2-report.js +181 -0
- package/lib/vendor/blamejs/lib/nist-crosswalk.js +293 -0
- package/lib/vendor/blamejs/lib/nonce-store.js +177 -0
- package/lib/vendor/blamejs/lib/notify.js +683 -0
- package/lib/vendor/blamejs/lib/ntp-check.js +458 -0
- package/lib/vendor/blamejs/lib/numeric-bounds.js +111 -0
- package/lib/vendor/blamejs/lib/numeric-checks.js +40 -0
- package/lib/vendor/blamejs/lib/object-store/azure-blob-bucket-ops.js +349 -0
- package/lib/vendor/blamejs/lib/object-store/azure-blob.js +488 -0
- package/lib/vendor/blamejs/lib/object-store/gcs-bucket-ops.js +351 -0
- package/lib/vendor/blamejs/lib/object-store/gcs.js +515 -0
- package/lib/vendor/blamejs/lib/object-store/http-put.js +153 -0
- package/lib/vendor/blamejs/lib/object-store/http-request.js +38 -0
- package/lib/vendor/blamejs/lib/object-store/index.js +197 -0
- package/lib/vendor/blamejs/lib/object-store/local.js +163 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4-bucket-ops.js +1133 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +957 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +420 -0
- package/lib/vendor/blamejs/lib/observability-tracer.js +395 -0
- package/lib/vendor/blamejs/lib/observability.js +720 -0
- package/lib/vendor/blamejs/lib/openapi-paths-builder.js +248 -0
- package/lib/vendor/blamejs/lib/openapi-schema-walk.js +192 -0
- package/lib/vendor/blamejs/lib/openapi-security.js +169 -0
- package/lib/vendor/blamejs/lib/openapi-yaml.js +154 -0
- package/lib/vendor/blamejs/lib/openapi.js +489 -0
- package/lib/vendor/blamejs/lib/otel-export.js +278 -0
- package/lib/vendor/blamejs/lib/outbox.js +547 -0
- package/lib/vendor/blamejs/lib/pagination.js +542 -0
- package/lib/vendor/blamejs/lib/parsers/index.js +91 -0
- package/lib/vendor/blamejs/lib/parsers/safe-env.js +642 -0
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +293 -0
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +784 -0
- package/lib/vendor/blamejs/lib/parsers/safe-xml.js +390 -0
- package/lib/vendor/blamejs/lib/parsers/safe-yaml.js +1015 -0
- package/lib/vendor/blamejs/lib/permissions.js +793 -0
- package/lib/vendor/blamejs/lib/pick.js +105 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +351 -0
- package/lib/vendor/blamejs/lib/pqc-gate.js +279 -0
- package/lib/vendor/blamejs/lib/pqc-software.js +271 -0
- package/lib/vendor/blamejs/lib/problem-details.js +482 -0
- package/lib/vendor/blamejs/lib/process-spawn.js +196 -0
- package/lib/vendor/blamejs/lib/promise-pool.js +162 -0
- package/lib/vendor/blamejs/lib/protobuf-encoder.js +190 -0
- package/lib/vendor/blamejs/lib/protocol-dispatcher.js +161 -0
- package/lib/vendor/blamejs/lib/public-suffix.js +403 -0
- package/lib/vendor/blamejs/lib/pubsub-cluster.js +154 -0
- package/lib/vendor/blamejs/lib/pubsub-redis.js +167 -0
- package/lib/vendor/blamejs/lib/pubsub.js +463 -0
- package/lib/vendor/blamejs/lib/queue-local.js +476 -0
- package/lib/vendor/blamejs/lib/queue-redis.js +745 -0
- package/lib/vendor/blamejs/lib/queue-sqs.js +319 -0
- package/lib/vendor/blamejs/lib/queue.js +1016 -0
- package/lib/vendor/blamejs/lib/redact.js +1007 -0
- package/lib/vendor/blamejs/lib/redis-client.js +520 -0
- package/lib/vendor/blamejs/lib/render.js +285 -0
- package/lib/vendor/blamejs/lib/request-helpers.js +767 -0
- package/lib/vendor/blamejs/lib/resource-access-lock.js +116 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +340 -0
- package/lib/vendor/blamejs/lib/restore-rollback.js +365 -0
- package/lib/vendor/blamejs/lib/restore.js +409 -0
- package/lib/vendor/blamejs/lib/retention.js +640 -0
- package/lib/vendor/blamejs/lib/retry.js +523 -0
- package/lib/vendor/blamejs/lib/router.js +1289 -0
- package/lib/vendor/blamejs/lib/safe-async.js +1184 -0
- package/lib/vendor/blamejs/lib/safe-buffer.js +562 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +297 -0
- package/lib/vendor/blamejs/lib/safe-dns.js +665 -0
- package/lib/vendor/blamejs/lib/safe-ical.js +634 -0
- package/lib/vendor/blamejs/lib/safe-icap.js +502 -0
- package/lib/vendor/blamejs/lib/safe-json.js +946 -0
- package/lib/vendor/blamejs/lib/safe-jsonpath.js +285 -0
- package/lib/vendor/blamejs/lib/safe-mime.js +831 -0
- package/lib/vendor/blamejs/lib/safe-mount-info.js +306 -0
- package/lib/vendor/blamejs/lib/safe-path.js +254 -0
- package/lib/vendor/blamejs/lib/safe-redirect.js +106 -0
- package/lib/vendor/blamejs/lib/safe-schema.js +1810 -0
- package/lib/vendor/blamejs/lib/safe-sieve.js +684 -0
- package/lib/vendor/blamejs/lib/safe-smtp.js +185 -0
- package/lib/vendor/blamejs/lib/safe-sql.js +363 -0
- package/lib/vendor/blamejs/lib/safe-url.js +428 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +473 -0
- package/lib/vendor/blamejs/lib/sandbox-worker.js +135 -0
- package/lib/vendor/blamejs/lib/sandbox.js +358 -0
- package/lib/vendor/blamejs/lib/scheduler.js +827 -0
- package/lib/vendor/blamejs/lib/sd-notify.js +269 -0
- package/lib/vendor/blamejs/lib/sec-cyber.js +214 -0
- package/lib/vendor/blamejs/lib/security-assert.js +395 -0
- package/lib/vendor/blamejs/lib/seeders.js +620 -0
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +309 -0
- package/lib/vendor/blamejs/lib/self-update.js +804 -0
- package/lib/vendor/blamejs/lib/server-timing.js +174 -0
- package/lib/vendor/blamejs/lib/session-device-binding.js +431 -0
- package/lib/vendor/blamejs/lib/session-stores.js +138 -0
- package/lib/vendor/blamejs/lib/session.js +1162 -0
- package/lib/vendor/blamejs/lib/slug.js +381 -0
- package/lib/vendor/blamejs/lib/sse.js +349 -0
- package/lib/vendor/blamejs/lib/ssrf-guard.js +792 -0
- package/lib/vendor/blamejs/lib/standard-webhooks.js +183 -0
- package/lib/vendor/blamejs/lib/static.js +1249 -0
- package/lib/vendor/blamejs/lib/storage.js +1272 -0
- package/lib/vendor/blamejs/lib/stream-throttle.js +235 -0
- package/lib/vendor/blamejs/lib/structured-fields.js +244 -0
- package/lib/vendor/blamejs/lib/subject.js +667 -0
- package/lib/vendor/blamejs/lib/tcpa-10dlc.js +175 -0
- package/lib/vendor/blamejs/lib/template.js +931 -0
- package/lib/vendor/blamejs/lib/tenant-quota.js +545 -0
- package/lib/vendor/blamejs/lib/test-harness.js +275 -0
- package/lib/vendor/blamejs/lib/testing.js +1185 -0
- package/lib/vendor/blamejs/lib/time.js +578 -0
- package/lib/vendor/blamejs/lib/tls-exporter.js +239 -0
- package/lib/vendor/blamejs/lib/totp.js +318 -0
- package/lib/vendor/blamejs/lib/tracing.js +546 -0
- package/lib/vendor/blamejs/lib/uuid.js +207 -0
- package/lib/vendor/blamejs/lib/validate-opts.js +381 -0
- package/lib/vendor/blamejs/lib/vault/index.js +638 -0
- package/lib/vendor/blamejs/lib/vault/passphrase-ops.js +311 -0
- package/lib/vendor/blamejs/lib/vault/passphrase-source.js +198 -0
- package/lib/vendor/blamejs/lib/vault/rotate.js +803 -0
- package/lib/vendor/blamejs/lib/vault/seal-pem-file.js +471 -0
- package/lib/vendor/blamejs/lib/vault/wrap.js +296 -0
- package/lib/vendor/blamejs/lib/vault-aad.js +259 -0
- package/lib/vendor/blamejs/lib/vendor/.vendor-data-pubkey +4 -0
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +161 -0
- package/lib/vendor/blamejs/lib/vendor/bimi-trust-anchors.data.js +68 -0
- package/lib/vendor/blamejs/lib/vendor/bimi-trust-anchors.pem +33 -0
- package/lib/vendor/blamejs/lib/vendor/common-passwords-top-10000.data.js +1325 -0
- package/lib/vendor/blamejs/lib/vendor/common-passwords-top-10000.txt +10002 -0
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +9 -0
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +18 -0
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +181 -0
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +16382 -0
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5881 -0
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +328 -0
- package/lib/vendor/blamejs/lib/vendor/vendor-data-pubkey.js +16 -0
- package/lib/vendor/blamejs/lib/vendor-data.js +520 -0
- package/lib/vendor/blamejs/lib/vex.js +630 -0
- package/lib/vendor/blamejs/lib/watcher.js +608 -0
- package/lib/vendor/blamejs/lib/web-push-vapid.js +322 -0
- package/lib/vendor/blamejs/lib/webhook.js +977 -0
- package/lib/vendor/blamejs/lib/websocket-channels.js +327 -0
- package/lib/vendor/blamejs/lib/websocket.js +1561 -0
- package/lib/vendor/blamejs/lib/wiki-concepts.js +338 -0
- package/lib/vendor/blamejs/lib/worker-pool.js +464 -0
- package/lib/vendor/blamejs/lib/ws-client.js +978 -0
- package/lib/vendor/blamejs/lib/xml-c14n.js +506 -0
- package/lib/vendor/blamejs/memory/specs/node-26-map-getorinsert-migration.md +164 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +19 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/README.md +88 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/build.sh +26 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/project.yaml +28 -0
- package/lib/vendor/blamejs/package.json +81 -0
- package/lib/vendor/blamejs/release-notes/v0.0.x.json +310 -0
- package/lib/vendor/blamejs/release-notes/v0.1.x.json +1798 -0
- package/lib/vendor/blamejs/release-notes/v0.10.x.json +1288 -0
- package/lib/vendor/blamejs/release-notes/v0.11.x.json +2551 -0
- package/lib/vendor/blamejs/release-notes/v0.12.0.json +64 -0
- package/lib/vendor/blamejs/release-notes/v0.12.1.json +32 -0
- package/lib/vendor/blamejs/release-notes/v0.12.2.json +45 -0
- package/lib/vendor/blamejs/release-notes/v0.2.x.json +706 -0
- package/lib/vendor/blamejs/release-notes/v0.3.x.json +786 -0
- package/lib/vendor/blamejs/release-notes/v0.4.x.json +588 -0
- package/lib/vendor/blamejs/release-notes/v0.5.x.json +390 -0
- package/lib/vendor/blamejs/release-notes/v0.6.x.json +1947 -0
- package/lib/vendor/blamejs/release-notes/v0.7.x.json +3811 -0
- package/lib/vendor/blamejs/release-notes/v0.8.x.json +3318 -0
- package/lib/vendor/blamejs/release-notes/v0.9.x.json +2257 -0
- package/lib/vendor/blamejs/scripts/build-vendored-sbom.js +325 -0
- package/lib/vendor/blamejs/scripts/check-api-snapshot.js +62 -0
- package/lib/vendor/blamejs/scripts/check-changelog-extract.js +108 -0
- package/lib/vendor/blamejs/scripts/check-pack-against-gitignore.js +83 -0
- package/lib/vendor/blamejs/scripts/check-services.js +483 -0
- package/lib/vendor/blamejs/scripts/check-vendor-currency.js +349 -0
- package/lib/vendor/blamejs/scripts/consolidate-release-notes.js +216 -0
- package/lib/vendor/blamejs/scripts/gen-migrating.js +275 -0
- package/lib/vendor/blamejs/scripts/generate-changelog-entry.js +577 -0
- package/lib/vendor/blamejs/scripts/generate-release-signing-key.js +79 -0
- package/lib/vendor/blamejs/scripts/publish-dep-confusion-placeholder.sh +101 -0
- package/lib/vendor/blamejs/scripts/refresh-api-snapshot.js +31 -0
- package/lib/vendor/blamejs/scripts/refresh-vendor-manifest.js +132 -0
- package/lib/vendor/blamejs/scripts/release.js +652 -0
- package/lib/vendor/blamejs/scripts/sha3-digest.js +62 -0
- package/lib/vendor/blamejs/scripts/sign-release-artifact.js +92 -0
- package/lib/vendor/blamejs/scripts/test-integration.js +181 -0
- package/lib/vendor/blamejs/scripts/test-wiki-integration.js +126 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +77 -0
- package/lib/vendor/blamejs/scripts/vendor-data-gen.js +186 -0
- package/lib/vendor/blamejs/scripts/vendor-data-keygen.js +101 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +278 -0
- package/lib/vendor/blamejs/test/00-primitives.js +19075 -0
- package/lib/vendor/blamejs/test/10-state.js +622 -0
- package/lib/vendor/blamejs/test/20-db.js +561 -0
- package/lib/vendor/blamejs/test/30-chain.js +2110 -0
- package/lib/vendor/blamejs/test/40-consumers.js +2453 -0
- package/lib/vendor/blamejs/test/50-integration.js +486 -0
- package/lib/vendor/blamejs/test/_helpers.js +10 -0
- package/lib/vendor/blamejs/test/_smoke-worker.js +69 -0
- package/lib/vendor/blamejs/test/fixtures/exploit-corpus/corpus.json +368 -0
- package/lib/vendor/blamejs/test/fixtures/http-client-stream-payload.txt +2 -0
- package/lib/vendor/blamejs/test/fixtures/worker-pool/echo.js +52 -0
- package/lib/vendor/blamejs/test/helpers/_codebase-shingle-worker.js +24 -0
- package/lib/vendor/blamejs/test/helpers/_codebase-shingle.js +203 -0
- package/lib/vendor/blamejs/test/helpers/_shape-match.js +513 -0
- package/lib/vendor/blamejs/test/helpers/check.js +36 -0
- package/lib/vendor/blamejs/test/helpers/cluster.js +70 -0
- package/lib/vendor/blamejs/test/helpers/db.js +143 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +207 -0
- package/lib/vendor/blamejs/test/helpers/fs-watch.js +101 -0
- package/lib/vendor/blamejs/test/helpers/http.js +14 -0
- package/lib/vendor/blamejs/test/helpers/index.js +93 -0
- package/lib/vendor/blamejs/test/helpers/json-round-trip.js +120 -0
- package/lib/vendor/blamejs/test/helpers/mocks.js +20 -0
- package/lib/vendor/blamejs/test/helpers/otel.js +13 -0
- package/lib/vendor/blamejs/test/helpers/services.js +380 -0
- package/lib/vendor/blamejs/test/helpers/wait.js +206 -0
- package/lib/vendor/blamejs/test/integration/cache.test.js +235 -0
- package/lib/vendor/blamejs/test/integration/cluster-provider-mysql.test.js +174 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +611 -0
- package/lib/vendor/blamejs/test/integration/http-client.test.js +129 -0
- package/lib/vendor/blamejs/test/integration/log-stream.test.js +219 -0
- package/lib/vendor/blamejs/test/integration/mail-crypto-smime.test.js +181 -0
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +152 -0
- package/lib/vendor/blamejs/test/integration/mail-smtp.test.js +161 -0
- package/lib/vendor/blamejs/test/integration/mtls-ca.test.js +289 -0
- package/lib/vendor/blamejs/test/integration/network-dns.test.js +123 -0
- package/lib/vendor/blamejs/test/integration/network-heartbeat.test.js +101 -0
- package/lib/vendor/blamejs/test/integration/ntp-check.test.js +89 -0
- package/lib/vendor/blamejs/test/integration/object-store-sigv4.test.js +403 -0
- package/lib/vendor/blamejs/test/integration/pqc-pkcs8-forward-compat.test.js +271 -0
- package/lib/vendor/blamejs/test/integration/pubsub.test.js +137 -0
- package/lib/vendor/blamejs/test/integration/queue-redis.test.js +352 -0
- package/lib/vendor/blamejs/test/integration/redis-client-tls.test.js +96 -0
- package/lib/vendor/blamejs/test/integration/ssrf-guard.test.js +98 -0
- package/lib/vendor/blamejs/test/integration/websocket-permessage-deflate.test.js +261 -0
- package/lib/vendor/blamejs/test/integration/ws-client-roundtrip.test.js +230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +211 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a.test.js +59 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/access-lock.test.js +136 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +219 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +69 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-event-bus.test.js +266 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-orchestrator.test.js +390 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-posture-chain.test.js +174 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +279 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +322 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-stream.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-tenant.test.js +302 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-trace.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-adverse-decision.test.js +44 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-content-detect.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-input.test.js +50 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-model-manifest.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-pref.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +1080 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +311 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-zip-stream.test.js +291 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +267 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asyncapi.test.js +929 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file-conflict-path.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-cve-defensive.test.js +176 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-daily-review.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-export-cadf.test.js +97 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-framework-namespaces.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-segregation.test.js +115 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-ml-dsa-65.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-use-store.test.js +246 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-bot-challenge-verifier.test.js +485 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-bot-challenge.test.js +331 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-lockout.test.js +572 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password-audit.test.js +61 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/azure-blob-bucket-ops.test.js +258 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-worker.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/bearer-auth.test.js +107 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/body-parser-chunked-malformed.test.js +131 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/body-parser-smuggling.test.js +118 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/boot-gates.test.js +85 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/breach-deadline.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +861 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/budr.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/bundler-engine.test.js +209 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache-status.test.js +129 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +871 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/canonical-json-jcs.test.js +43 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cdn-cache-control.test.js +243 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +107 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-api-key.test.js +147 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-audit-verify-chain.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-backup.test.js +135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-config-drift.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +75 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-file-type.test.js +98 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-helpers.test.js +145 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-mtls.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-password.test.js +97 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-restore.test.js +160 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-retention.test.js +84 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-security.test.js +69 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-vault.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/client-hints.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +237 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +9600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-cascade.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-eaa.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +712 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance.test.js +278 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/config-drift.test.js +97 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/config.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cors.test.js +357 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cra-report.test.js +31 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/credential-hash.test.js +226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-base64url.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-envelope.test.js +85 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +193 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +98 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hpke-pq.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hpke.test.js +155 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-mlkem768-x25519.test.js +129 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-namespace-hash.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-random-int.test.js +72 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-builder.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-nonce.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +180 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +210 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daily-byte-quota.test.js +153 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/data-act.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-collection-extensions.test.js +226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-collection.test.js +136 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-init-extensions.test.js +165 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query-cross-schema.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query-extensions.test.js +191 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-role-for.test.js +228 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-vacuum.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-worm.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +184 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/declare-row-policy.test.js +203 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/declare-view.test.js +303 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dns-dnssec-algorithm.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dns-null-mx.test.js +39 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dora.test.js +165 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dr-runbook.test.js +59 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr-state-rules.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +786 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/early-hints.test.js +147 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/events.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/exploit-replay.test.js +243 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-hardening.test.js +181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-routing.test.js +531 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +118 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fapi2.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fda-21cfr11.test.js +156 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fdx.test.js +79 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +216 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +434 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +432 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-type.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +887 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forensic-snapshot.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fsm.test.js +375 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gcs-bucket-ops.test.js +321 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/graphql-federation.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-agent-registry.test.js +87 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-all.test.js +328 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +339 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-csv.test.js +694 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-dsn.test.js +296 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-email.test.js +234 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-envelope.test.js +192 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-event-bus-payload.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-event-bus-topic.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +386 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html-wcag.test.js +859 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +357 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +174 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-json.test.js +317 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-list-id.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-list-unsubscribe.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-compose.test.js +111 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-move.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-query.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-reply.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-sieve.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +301 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +265 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-message-id.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +161 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-posture-chain.test.js +100 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-saga-config.test.js +79 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-smtp-command.test.js +269 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-snapshot-envelope.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-stream-args.test.js +78 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +288 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-tenant-id.test.js +69 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-trace-context.test.js +102 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-xml.test.js +202 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-yaml.test.js +203 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/hal.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/honeytoken.test.js +50 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +37 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +692 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-stream.test.js +280 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +225 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +203 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +991 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/iab-mspa.test.js +63 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/iab-tcf.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +612 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/importmap-integrity.test.js +56 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/inbox.test.js +166 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/incident-report.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jose-jwe-experimental.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-api.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-round-trip-helper.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +159 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/legal-hold.test.js +118 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/local-db-thin.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-cloudwatch.test.js +489 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-otlp-grpc.test.js +207 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-otlp.test.js +283 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/lro.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +417 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-arf.test.js +208 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +910 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +502 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +680 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-canspam.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +149 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +297 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +514 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy-tlsrpt.test.js +369 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +627 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-feedback-id.test.js +56 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-greylist.test.js +217 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +283 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-journal.test.js +217 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-mdn.test.js +334 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-rbl.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-require-tls.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +336 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +732 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +840 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +130 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +285 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +229 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +394 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-tls.test.js +147 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-spam-score.test.js +204 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-srs.test.js +152 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +279 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-unsubscribe.test.js +165 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +439 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-tool-registry.test.js +202 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +155 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-shadow-registry.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +224 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-compose-pipeline.test.js +278 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/money.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-paths.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nel.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-allowlist.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-byte-quota.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +372 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +635 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-heartbeat-passive.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls-build-options.test.js +130 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls-ct-inclusion.test.js +179 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +447 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +369 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nis2-report.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nist-crosswalk.test.js +42 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/no-cache.test.js +98 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/notify.test.js +707 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/numeric-bounds.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oauth-callback.test.js +72 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +597 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openapi.test.js +877 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/otel-export.test.js +257 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pagination.test.js +522 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +216 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +324 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +546 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +153 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-software.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/problem-details.test.js +195 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/process-spawn.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/promise-pool.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/protected-resource-metadata.test.js +68 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/protobuf-encoder.test.js +138 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/protocol-dispatcher.test.js +174 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/public-suffix.test.js +197 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +232 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-dlq-extend-lease.test.js +178 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +322 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-priority-rate-progress.test.js +266 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-sqs.test.js +300 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-cluster.test.js +338 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-registry.test.js +75 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact-dlp.test.js +246 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redis-client.test.js +130 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +335 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-log.test.js +170 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-auth-cache-control.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-mtls.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/resource-access-lock.test.js +52 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention-floor.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retry.test.js +535 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-cross-origin-redirect.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-loops.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-parallel.test.js +170 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +248 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +451 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +289 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-icap.test.js +206 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-jsonpath.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +339 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mount-info.test.js +180 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +78 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sieve.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-smtp.test.js +95 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url-idn-homograph.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +257 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/saml-slo.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sandbox.test.js +228 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler-exactly-once.test.js +238 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +700 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-notify.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sec-cyber.test.js +85 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +107 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-headers.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/seeders.test.js +816 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update-standalone-verifier.test.js +168 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +302 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/server-timing.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +247 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-extensions.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/shape-match.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +952 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-multipart-sse.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/slug.test.js +330 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/smtp-policy.test.js +233 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/source-comment-blocks.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/speculation-rules.test.js +319 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sse.test.js +148 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +283 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/standard-webhooks.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +266 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/step-up.test.js +487 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-chunk-scratch.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +773 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/stream-throttle.test.js +173 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/structured-fields.test.js +180 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tcpa-10dlc.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +571 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/test-harness.test.js +190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/testing-request.test.js +119 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/testing.test.js +522 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-exporter.test.js +168 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-ocsp-ct.test.js +275 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-ocsp-verify.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-pinset-drift.test.js +35 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-preferred-groups.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tracing.test.js +280 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/uuid.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-aad.test.js +277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-seal-pem-file.test.js +252 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vendor-data.test.js +149 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vendor-manifest.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vex.test.js +661 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +308 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/web-push-vapid.test.js +144 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +674 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket-channels.test.js +360 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/worker-pool.test.js +302 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +349 -0
- package/lib/vendor/blamejs/test/layer-1-state/api-key.test.js +717 -0
- package/lib/vendor/blamejs/test/layer-5-integration/bundler-output.test.js +444 -0
- package/lib/vendor/blamejs/test/layer-5-integration/guard-host-integration.test.js +597 -0
- package/lib/vendor/blamejs/test/layer-5-integration/security-chaos.test.js +308 -0
- package/lib/vendor/blamejs/test/smoke.js +431 -0
- package/lib/webhooks.js +305 -0
- package/package.json +43 -0
|
@@ -0,0 +1,1240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @module b.calendar
|
|
4
|
+
* @nav Mail
|
|
5
|
+
* @title Calendar (JSCalendar)
|
|
6
|
+
* @order 400
|
|
7
|
+
* @slug calendar
|
|
8
|
+
*
|
|
9
|
+
* @intro
|
|
10
|
+
* JSCalendar (RFC 8984) primitive. Wraps the framework's existing
|
|
11
|
+
* `b.safeIcal.parse` (RFC 5545 grammar + bounded parser) with the
|
|
12
|
+
* JSON-native JSCalendar surface JMAP Calendars (RFC 8984 / draft-
|
|
13
|
+
* ietf-jmap-calendars) requires for cross-protocol interop.
|
|
14
|
+
*
|
|
15
|
+
* Scope:
|
|
16
|
+
* - `validate(jsCal)` — assert JSCalendar Event / Task / Note /
|
|
17
|
+
* Group shape (RFC 8984 §5 / §6 / §1.4.4).
|
|
18
|
+
* - `fromIcal(text, opts?)` — VCALENDAR.VEVENT → Event,
|
|
19
|
+
* VTODO → Task, VJOURNAL → Note. Mixed-component VCALENDARs
|
|
20
|
+
* return an array.
|
|
21
|
+
* - `toIcal(jsCal, opts?)` — Event → VEVENT, Task → VTODO, Note →
|
|
22
|
+
* VJOURNAL. Group emits a single VCALENDAR wrapping every
|
|
23
|
+
* entry's component.
|
|
24
|
+
* - `expandRecurrence(event, { from, to, max })` — RRULE expansion
|
|
25
|
+
* for FREQ=DAILY/WEEKLY/MONTHLY/YEARLY with UNTIL/COUNT/INTERVAL
|
|
26
|
+
* and BYDAY/BYMONTH/BYMONTHDAY/BYWEEKNO/BYYEARDAY/BYHOUR/
|
|
27
|
+
* BYMINUTE/BYSECOND/BYSETPOS. Multiple `recurrenceRules`
|
|
28
|
+
* expand independently and UNION per RFC 8984 §4.3.2.
|
|
29
|
+
*
|
|
30
|
+
* Deferred-with-condition (no operator demand yet):
|
|
31
|
+
* - RFC 7529 non-Gregorian calendars.
|
|
32
|
+
* - Floating-timezone resolution against IANA TZDB.
|
|
33
|
+
*
|
|
34
|
+
* @card
|
|
35
|
+
* JSCalendar (RFC 8984) ↔ iCalendar (RFC 5545) bridge — validate,
|
|
36
|
+
* convert both directions, expand recurrences. Substrate for JMAP
|
|
37
|
+
* Calendars (RFC 8984 + draft-ietf-jmap-calendars).
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
var safeIcal = require("./safe-ical");
|
|
41
|
+
var time = require("./time");
|
|
42
|
+
var { defineClass } = require("./framework-error");
|
|
43
|
+
|
|
44
|
+
var CalendarError = defineClass("CalendarError", { alwaysPermanent: true });
|
|
45
|
+
|
|
46
|
+
// JSCalendar shape vocabulary — RFC 8984 §1.2 (`@type`) catalogues
|
|
47
|
+
// the discriminator strings every nested object MUST carry.
|
|
48
|
+
var JSCAL_TYPES = Object.freeze({
|
|
49
|
+
Event: "Event",
|
|
50
|
+
Task: "Task",
|
|
51
|
+
// Note maps RFC 5545 §3.6.3 VJOURNAL — a dated, free-form journal
|
|
52
|
+
// entry with no duration / progress / due semantics. Not formally
|
|
53
|
+
// defined as an @type in RFC 8984 §1.2 (which only enumerates
|
|
54
|
+
// Event + Task + Group); blamejs adopts `Note` as a recognised
|
|
55
|
+
// extension shape for VJOURNAL round-trip interop with iCalendar
|
|
56
|
+
// sources. Operators interoperating with strict RFC 8984 consumers
|
|
57
|
+
// should map Note → Group or Note → custom-@type before exchange.
|
|
58
|
+
Note: "Note",
|
|
59
|
+
Group: "Group",
|
|
60
|
+
Participant: "Participant",
|
|
61
|
+
Location: "Location",
|
|
62
|
+
Link: "Link",
|
|
63
|
+
Alert: "Alert",
|
|
64
|
+
Recurrence: "RecurrenceRule",
|
|
65
|
+
TimeZone: "TimeZone",
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// RFC 8984 §4.3.2 — frequencies recognised in `RecurrenceRule.frequency`.
|
|
69
|
+
var JSCAL_FREQUENCIES = Object.freeze({
|
|
70
|
+
yearly: 1, monthly: 1, weekly: 1, daily: 1, hourly: 1, minutely: 1, secondly: 1,
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// RFC 8984 §4.6.2 — alert action types.
|
|
74
|
+
var JSCAL_ALERT_ACTIONS = Object.freeze({
|
|
75
|
+
display: 1, email: 1,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// RFC 8984 §6.4.3 — Task progress vocabulary. Mirrors RFC 5545 STATUS
|
|
79
|
+
// values for VTODO (`NEEDS-ACTION` / `IN-PROCESS` / `COMPLETED` /
|
|
80
|
+
// `CANCELLED`); JSCalendar lower-cases them. `failed` is NOT included
|
|
81
|
+
// — RFC 5545 STATUS does not define a `FAILED` value, so the iCal
|
|
82
|
+
// round-trip path could not safely emit it (strict consumers refuse
|
|
83
|
+
// the unknown STATUS token). Operators with a "failed" semantic
|
|
84
|
+
// model it via `progress: "cancelled"` + a vendor-namespaced
|
|
85
|
+
// extension property instead.
|
|
86
|
+
var JSCAL_TASK_PROGRESS = Object.freeze({
|
|
87
|
+
"needs-action": 1, "in-process": 1, "completed": 1, "cancelled": 1,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// RFC 5545 §3.8.1.11 STATUS for VJOURNAL — Note carries DRAFT / FINAL
|
|
91
|
+
// / CANCELLED. JSCalendar lower-cases them on import/export. Note's
|
|
92
|
+
// `status` is OPTIONAL; absence on the wire maps to `status`
|
|
93
|
+
// unset (rather than defaulting to "draft" — operator intent is
|
|
94
|
+
// ambiguous when STATUS is omitted, per RFC 5545 grammar).
|
|
95
|
+
var JSCAL_NOTE_STATUS = Object.freeze({
|
|
96
|
+
"draft": 1, "final": 1, "cancelled": 1,
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Recurrence-expansion caps. Mirror b.safeIcal's RRULE limits so the
|
|
100
|
+
// expand path can't outpace what the parser already permitted.
|
|
101
|
+
var MAX_EXPAND_INSTANCES = 4096; // allow:raw-byte-literal — instance count cap, not bytes
|
|
102
|
+
var MAX_EXPAND_SPAN_MS = 10 * 365 * 24 * 60 * 60 * 1000; // allow:raw-byte-literal + allow:raw-time-literal — 10 year max expansion span
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @primitive b.calendar.validate
|
|
106
|
+
* @signature b.calendar.validate(jsCal)
|
|
107
|
+
* @since 0.11.31
|
|
108
|
+
* @status stable
|
|
109
|
+
*
|
|
110
|
+
* Validate a JSCalendar Event / Task object's required-field shape per
|
|
111
|
+
* RFC 8984 §5 (Event) + §6 (Task). Returns the input on success; throws
|
|
112
|
+
* `CalendarError` on refusal with a `.code` naming the specific shape
|
|
113
|
+
* rule that failed.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* b.calendar.validate({
|
|
117
|
+
* "@type": "Event",
|
|
118
|
+
* uid: "0e612e8b-1c4f-4e30-8e6a-4adc4e8b1c4f",
|
|
119
|
+
* updated: "2026-05-21T10:00:00Z",
|
|
120
|
+
* title: "Sprint planning",
|
|
121
|
+
* start: "2026-05-22T09:00:00",
|
|
122
|
+
* duration: "PT1H",
|
|
123
|
+
* timeZone: "America/Los_Angeles",
|
|
124
|
+
* });
|
|
125
|
+
*/
|
|
126
|
+
function validate(jsCal) {
|
|
127
|
+
if (!jsCal || typeof jsCal !== "object" || Array.isArray(jsCal)) {
|
|
128
|
+
throw new CalendarError("calendar/bad-input",
|
|
129
|
+
"b.calendar.validate: input must be a JSCalendar object");
|
|
130
|
+
}
|
|
131
|
+
var t = jsCal["@type"];
|
|
132
|
+
if (t !== JSCAL_TYPES.Event && t !== JSCAL_TYPES.Task && t !== JSCAL_TYPES.Note && t !== JSCAL_TYPES.Group) {
|
|
133
|
+
throw new CalendarError("calendar/bad-type",
|
|
134
|
+
"b.calendar.validate: @type must be 'Event', 'Task', 'Note' or 'Group' (got " + JSON.stringify(t) + ")");
|
|
135
|
+
}
|
|
136
|
+
if (typeof jsCal.uid !== "string" || jsCal.uid.length === 0) {
|
|
137
|
+
throw new CalendarError("calendar/no-uid",
|
|
138
|
+
"b.calendar.validate: uid is required (RFC 8984 §5.1.4)");
|
|
139
|
+
}
|
|
140
|
+
if (jsCal.uid.length > 1024) { // allow:raw-byte-literal — anti-DoS uid length cap
|
|
141
|
+
throw new CalendarError("calendar/oversize-uid",
|
|
142
|
+
"b.calendar.validate: uid exceeds 1024 bytes");
|
|
143
|
+
}
|
|
144
|
+
if (typeof jsCal.updated !== "string" || !_isUtcDateTime(jsCal.updated)) {
|
|
145
|
+
throw new CalendarError("calendar/bad-updated",
|
|
146
|
+
"b.calendar.validate: updated MUST be a UTCDateTime per RFC 8984 §1.4.3 (got " + JSON.stringify(jsCal.updated) + ")");
|
|
147
|
+
}
|
|
148
|
+
if (t === JSCAL_TYPES.Event) {
|
|
149
|
+
if (jsCal.start !== undefined && (typeof jsCal.start !== "string" || !_isLocalDateTime(jsCal.start))) {
|
|
150
|
+
throw new CalendarError("calendar/bad-start",
|
|
151
|
+
"b.calendar.validate: Event.start MUST be a LocalDateTime");
|
|
152
|
+
}
|
|
153
|
+
if (jsCal.duration !== undefined && (typeof jsCal.duration !== "string" || !_isDuration(jsCal.duration))) {
|
|
154
|
+
throw new CalendarError("calendar/bad-duration",
|
|
155
|
+
"b.calendar.validate: Event.duration MUST be an RFC 8601 PnYnMnDTnHnMnS Duration");
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (t === JSCAL_TYPES.Task) {
|
|
159
|
+
if (jsCal.start !== undefined && (typeof jsCal.start !== "string" || !_isLocalDateTime(jsCal.start))) {
|
|
160
|
+
throw new CalendarError("calendar/bad-start",
|
|
161
|
+
"b.calendar.validate: Task.start MUST be a LocalDateTime (RFC 8984 §6.4)");
|
|
162
|
+
}
|
|
163
|
+
if (jsCal.due !== undefined && (typeof jsCal.due !== "string" || !_isLocalDateTime(jsCal.due))) {
|
|
164
|
+
throw new CalendarError("calendar/bad-due",
|
|
165
|
+
"b.calendar.validate: Task.due MUST be a LocalDateTime (RFC 8984 §6.4.4)");
|
|
166
|
+
}
|
|
167
|
+
if (jsCal.estimatedDuration !== undefined &&
|
|
168
|
+
(typeof jsCal.estimatedDuration !== "string" || !_isDuration(jsCal.estimatedDuration))) {
|
|
169
|
+
throw new CalendarError("calendar/bad-duration",
|
|
170
|
+
"b.calendar.validate: Task.estimatedDuration MUST be an RFC 8601 PnYnMnDTnHnMnS Duration");
|
|
171
|
+
}
|
|
172
|
+
if (jsCal.progress !== undefined &&
|
|
173
|
+
!Object.prototype.hasOwnProperty.call(JSCAL_TASK_PROGRESS, jsCal.progress)) {
|
|
174
|
+
throw new CalendarError("calendar/bad-progress",
|
|
175
|
+
"b.calendar.validate: Task.progress MUST be one of " +
|
|
176
|
+
Object.keys(JSCAL_TASK_PROGRESS).join(" | ") + " (RFC 8984 §6.4.3)");
|
|
177
|
+
}
|
|
178
|
+
if (jsCal.percentComplete !== undefined) {
|
|
179
|
+
// RFC 8984 §6.4.4 specifies `UnsignedInt` (integer). RFC 5545
|
|
180
|
+
// §3.8.1.16 PERCENT-COMPLETE is also integer-typed. A float
|
|
181
|
+
// would emit as `PERCENT-COMPLETE:12.5` which strict parsers
|
|
182
|
+
// refuse.
|
|
183
|
+
if (typeof jsCal.percentComplete !== "number" || !isFinite(jsCal.percentComplete) ||
|
|
184
|
+
!Number.isInteger(jsCal.percentComplete) ||
|
|
185
|
+
jsCal.percentComplete < 0 || jsCal.percentComplete > 100) { // allow:raw-byte-literal — RFC 8984 §6 percent range
|
|
186
|
+
throw new CalendarError("calendar/bad-percent",
|
|
187
|
+
"b.calendar.validate: Task.percentComplete MUST be an integer in 0..100 (RFC 8984 §6.4.4 UnsignedInt)");
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (jsCal.progressUpdated !== undefined &&
|
|
191
|
+
(typeof jsCal.progressUpdated !== "string" || !_isUtcDateTime(jsCal.progressUpdated))) {
|
|
192
|
+
throw new CalendarError("calendar/bad-progress-updated",
|
|
193
|
+
"b.calendar.validate: Task.progressUpdated MUST be a UTCDateTime");
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (t === JSCAL_TYPES.Note) {
|
|
197
|
+
// Note (VJOURNAL) — dated free-form journal entry. RFC 5545
|
|
198
|
+
// §3.6.3 permits an optional DTSTART (date or date-time) and
|
|
199
|
+
// SUMMARY / DESCRIPTION; STATUS values are limited to DRAFT /
|
|
200
|
+
// FINAL / CANCELLED. There is no DUE / DURATION / COMPLETED /
|
|
201
|
+
// PERCENT-COMPLETE on VJOURNAL.
|
|
202
|
+
if (jsCal.start !== undefined && (typeof jsCal.start !== "string" || !_isLocalDateTime(jsCal.start))) {
|
|
203
|
+
throw new CalendarError("calendar/bad-start",
|
|
204
|
+
"b.calendar.validate: Note.start MUST be a LocalDateTime (RFC 5545 §3.6.3)");
|
|
205
|
+
}
|
|
206
|
+
if (jsCal.duration !== undefined) {
|
|
207
|
+
throw new CalendarError("calendar/bad-duration",
|
|
208
|
+
"b.calendar.validate: Note.duration MUST NOT be set (RFC 5545 §3.6.3 VJOURNAL has no DURATION)");
|
|
209
|
+
}
|
|
210
|
+
if (jsCal.due !== undefined) {
|
|
211
|
+
throw new CalendarError("calendar/bad-due",
|
|
212
|
+
"b.calendar.validate: Note.due MUST NOT be set (DUE is a VTODO-only property)");
|
|
213
|
+
}
|
|
214
|
+
if (jsCal.progress !== undefined) {
|
|
215
|
+
throw new CalendarError("calendar/bad-progress",
|
|
216
|
+
"b.calendar.validate: Note.progress MUST NOT be set (progress is a Task-only property)");
|
|
217
|
+
}
|
|
218
|
+
if (jsCal.percentComplete !== undefined) {
|
|
219
|
+
throw new CalendarError("calendar/bad-percent",
|
|
220
|
+
"b.calendar.validate: Note.percentComplete MUST NOT be set (percentComplete is a Task-only property)");
|
|
221
|
+
}
|
|
222
|
+
if (jsCal.progressUpdated !== undefined) {
|
|
223
|
+
throw new CalendarError("calendar/bad-progress-updated",
|
|
224
|
+
"b.calendar.validate: Note.progressUpdated MUST NOT be set (progressUpdated is a Task-only property)");
|
|
225
|
+
}
|
|
226
|
+
if (jsCal.status !== undefined &&
|
|
227
|
+
!Object.prototype.hasOwnProperty.call(JSCAL_NOTE_STATUS, jsCal.status)) {
|
|
228
|
+
throw new CalendarError("calendar/bad-note-status",
|
|
229
|
+
"b.calendar.validate: Note.status MUST be one of " +
|
|
230
|
+
Object.keys(JSCAL_NOTE_STATUS).join(" | ") + " (RFC 5545 §3.8.1.11 VJOURNAL STATUS)");
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (t === JSCAL_TYPES.Group) {
|
|
234
|
+
// RFC 8984 §1.4.4 — a Group is a container envelope for multiple
|
|
235
|
+
// Event / Task / Note entries that share a logical name +
|
|
236
|
+
// categories. Group itself does not carry start / duration / due
|
|
237
|
+
// / progress — those live on the entries. `entries` MUST be a
|
|
238
|
+
// non-empty array; every entry MUST be a valid Event / Task /
|
|
239
|
+
// Note (Groups nesting Groups is refused — the spec does not
|
|
240
|
+
// define a nesting recursion semantic).
|
|
241
|
+
if (!Array.isArray(jsCal.entries) || jsCal.entries.length === 0) {
|
|
242
|
+
throw new CalendarError("calendar/bad-entries",
|
|
243
|
+
"b.calendar.validate: Group.entries MUST be a non-empty array (RFC 8984 §1.4.4)");
|
|
244
|
+
}
|
|
245
|
+
for (var gei = 0; gei < jsCal.entries.length; gei += 1) {
|
|
246
|
+
var entry = jsCal.entries[gei];
|
|
247
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
248
|
+
throw new CalendarError("calendar/bad-entries",
|
|
249
|
+
"b.calendar.validate: Group.entries[" + gei + "] MUST be an object");
|
|
250
|
+
}
|
|
251
|
+
var et = entry["@type"];
|
|
252
|
+
if (et !== JSCAL_TYPES.Event && et !== JSCAL_TYPES.Task && et !== JSCAL_TYPES.Note) {
|
|
253
|
+
throw new CalendarError("calendar/bad-entries",
|
|
254
|
+
"b.calendar.validate: Group.entries[" + gei + "].@type MUST be 'Event', 'Task' or 'Note' " +
|
|
255
|
+
"(got " + JSON.stringify(et) + ") — Groups do not nest");
|
|
256
|
+
}
|
|
257
|
+
// Recurse into each entry so per-type shape rules apply.
|
|
258
|
+
validate(entry);
|
|
259
|
+
}
|
|
260
|
+
if (jsCal.source !== undefined && typeof jsCal.source !== "string") {
|
|
261
|
+
throw new CalendarError("calendar/bad-source",
|
|
262
|
+
"b.calendar.validate: Group.source MUST be a string URI when present (RFC 8984 §1.4.4)");
|
|
263
|
+
}
|
|
264
|
+
if (jsCal.categories !== undefined) {
|
|
265
|
+
// Codex P1 — `typeof null === "object"` would let `categories:
|
|
266
|
+
// null` through this check, and the subsequent Object.keys
|
|
267
|
+
// throws a raw TypeError instead of a structured CalendarError.
|
|
268
|
+
// Refuse null explicitly so callers depending on the
|
|
269
|
+
// `calendar/bad-categories` refusal code stay stable.
|
|
270
|
+
if (jsCal.categories === null || typeof jsCal.categories !== "object" ||
|
|
271
|
+
Array.isArray(jsCal.categories)) {
|
|
272
|
+
throw new CalendarError("calendar/bad-categories",
|
|
273
|
+
"b.calendar.validate: Group.categories MUST be a String-keyed Boolean object (RFC 8984 §1.4.4)");
|
|
274
|
+
}
|
|
275
|
+
var catKeys = Object.keys(jsCal.categories);
|
|
276
|
+
for (var ci = 0; ci < catKeys.length; ci += 1) {
|
|
277
|
+
if (jsCal.categories[catKeys[ci]] !== true) {
|
|
278
|
+
throw new CalendarError("calendar/bad-categories",
|
|
279
|
+
"b.calendar.validate: Group.categories['" + catKeys[ci] + "'] MUST be `true` (boolean set per RFC 8984 §1.4.4)");
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// Group itself MUST NOT carry the entry-specific fields. Refuse
|
|
284
|
+
// explicit setting so operators don't accidentally model entry
|
|
285
|
+
// state on the envelope.
|
|
286
|
+
if (jsCal.start !== undefined || jsCal.duration !== undefined || jsCal.due !== undefined ||
|
|
287
|
+
jsCal.progress !== undefined || jsCal.percentComplete !== undefined ||
|
|
288
|
+
jsCal.progressUpdated !== undefined || jsCal.recurrenceRules !== undefined) {
|
|
289
|
+
throw new CalendarError("calendar/bad-group",
|
|
290
|
+
"b.calendar.validate: Group MUST NOT carry start / duration / due / progress / " +
|
|
291
|
+
"percentComplete / progressUpdated / recurrenceRules — those live on the entries");
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (t !== JSCAL_TYPES.Group && jsCal.recurrenceRules !== undefined) {
|
|
295
|
+
if (!Array.isArray(jsCal.recurrenceRules)) {
|
|
296
|
+
throw new CalendarError("calendar/bad-recurrence",
|
|
297
|
+
"b.calendar.validate: recurrenceRules MUST be an array of RecurrenceRule");
|
|
298
|
+
}
|
|
299
|
+
for (var ri = 0; ri < jsCal.recurrenceRules.length; ri += 1) {
|
|
300
|
+
var rr = jsCal.recurrenceRules[ri];
|
|
301
|
+
if (!rr || typeof rr !== "object" || rr["@type"] !== "RecurrenceRule") {
|
|
302
|
+
throw new CalendarError("calendar/bad-recurrence",
|
|
303
|
+
"b.calendar.validate: recurrenceRules[" + ri + "].@type MUST be 'RecurrenceRule'");
|
|
304
|
+
}
|
|
305
|
+
if (!Object.prototype.hasOwnProperty.call(JSCAL_FREQUENCIES, rr.frequency)) {
|
|
306
|
+
throw new CalendarError("calendar/bad-recurrence",
|
|
307
|
+
"b.calendar.validate: recurrenceRules[" + ri + "].frequency MUST be one of " +
|
|
308
|
+
Object.keys(JSCAL_FREQUENCIES).join(" | "));
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
if (jsCal.alerts !== undefined) {
|
|
313
|
+
if (jsCal.alerts === null || typeof jsCal.alerts !== "object" || Array.isArray(jsCal.alerts)) {
|
|
314
|
+
throw new CalendarError("calendar/bad-alerts",
|
|
315
|
+
"b.calendar.validate: alerts MUST be an object map keyed by alert-id");
|
|
316
|
+
}
|
|
317
|
+
var alertKeys = Object.keys(jsCal.alerts);
|
|
318
|
+
for (var ai = 0; ai < alertKeys.length; ai += 1) {
|
|
319
|
+
var alert = jsCal.alerts[alertKeys[ai]];
|
|
320
|
+
if (!alert || alert["@type"] !== "Alert") {
|
|
321
|
+
throw new CalendarError("calendar/bad-alerts",
|
|
322
|
+
"b.calendar.validate: alerts[" + alertKeys[ai] + "].@type MUST be 'Alert'");
|
|
323
|
+
}
|
|
324
|
+
if (alert.action && !Object.prototype.hasOwnProperty.call(JSCAL_ALERT_ACTIONS, alert.action)) {
|
|
325
|
+
throw new CalendarError("calendar/bad-alerts",
|
|
326
|
+
"b.calendar.validate: alerts[" + alertKeys[ai] + "].action MUST be one of " +
|
|
327
|
+
Object.keys(JSCAL_ALERT_ACTIONS).join(" | "));
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return jsCal;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* @primitive b.calendar.fromIcal
|
|
336
|
+
* @signature b.calendar.fromIcal(text, opts?)
|
|
337
|
+
* @since 0.11.31
|
|
338
|
+
* @status stable
|
|
339
|
+
*
|
|
340
|
+
* Parse iCalendar text (RFC 5545) via `b.safeIcal.parse` and map the
|
|
341
|
+
* first VEVENT into a JSCalendar Event object (RFC 8984 §5). Returns
|
|
342
|
+
* a single Event when the VCALENDAR contains exactly one VEVENT, or
|
|
343
|
+
* an array when multiple VEVENTs are present.
|
|
344
|
+
*
|
|
345
|
+
* @opts
|
|
346
|
+
* safeIcalOpts: object, // forwarded to b.safeIcal.parse (caps, allowExperimental, etc.)
|
|
347
|
+
*
|
|
348
|
+
* @example
|
|
349
|
+
* b.calendar.fromIcal(
|
|
350
|
+
* "BEGIN:VCALENDAR\\r\\nVERSION:2.0\\r\\n" +
|
|
351
|
+
* "BEGIN:VEVENT\\r\\nUID:a@b\\r\\nDTSTAMP:20260521T100000Z\\r\\n" +
|
|
352
|
+
* "DTSTART:20260522T090000Z\\r\\nDURATION:PT1H\\r\\n" +
|
|
353
|
+
* "SUMMARY:Sprint\\r\\nEND:VEVENT\\r\\nEND:VCALENDAR\\r\\n");
|
|
354
|
+
* // → { "@type":"Event", uid:"a@b", updated:"2026-05-21T10:00:00Z", ... }
|
|
355
|
+
*/
|
|
356
|
+
function fromIcal(text, opts) {
|
|
357
|
+
var ast = safeIcal.parse(text, opts || {});
|
|
358
|
+
var events = (ast && ast.vcalendar && ast.vcalendar.vevent) || [];
|
|
359
|
+
var todos = (ast && ast.vcalendar && ast.vcalendar.vtodo) || [];
|
|
360
|
+
var journals = (ast && ast.vcalendar && ast.vcalendar.vjournal) || [];
|
|
361
|
+
if (events.length === 0 && todos.length === 0 && journals.length === 0) {
|
|
362
|
+
throw new CalendarError("calendar/no-component",
|
|
363
|
+
"b.calendar.fromIcal: VCALENDAR has no VEVENT, VTODO or VJOURNAL components");
|
|
364
|
+
}
|
|
365
|
+
var converted = events.map(_veventToJsCalEvent)
|
|
366
|
+
.concat(todos.map(_vtodoToJsCalTask))
|
|
367
|
+
.concat(journals.map(_vjournalToJsCalNote));
|
|
368
|
+
return converted.length === 1 ? converted[0] : converted;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* @primitive b.calendar.toIcal
|
|
373
|
+
* @signature b.calendar.toIcal(jsCal, opts?)
|
|
374
|
+
* @since 0.11.31
|
|
375
|
+
* @status stable
|
|
376
|
+
*
|
|
377
|
+
* Render a JSCalendar Event back to RFC 5545 iCalendar text. Returns a
|
|
378
|
+
* CRLF-terminated string wrapped in a `BEGIN:VCALENDAR / VERSION:2.0 /
|
|
379
|
+
* PRODID:-//blamejs//Calendar//EN / BEGIN:VEVENT ... END:VEVENT /
|
|
380
|
+
* END:VCALENDAR` envelope per RFC 5545 §3.4.
|
|
381
|
+
*
|
|
382
|
+
* @opts
|
|
383
|
+
* prodid: string, // PRODID value to emit; default "-//blamejs//Calendar//EN"
|
|
384
|
+
*
|
|
385
|
+
* @example
|
|
386
|
+
* b.calendar.toIcal({
|
|
387
|
+
* "@type": "Event",
|
|
388
|
+
* uid: "a@b",
|
|
389
|
+
* updated: "2026-05-21T10:00:00Z",
|
|
390
|
+
* title: "Sprint",
|
|
391
|
+
* start: "2026-05-22T09:00:00",
|
|
392
|
+
* duration: "PT1H",
|
|
393
|
+
* });
|
|
394
|
+
*/
|
|
395
|
+
function toIcal(jsCal, opts) {
|
|
396
|
+
validate(jsCal);
|
|
397
|
+
var prodid = (opts && opts.prodid) || "-//blamejs//Calendar//EN";
|
|
398
|
+
// RFC 8984 §1.4.4 — a Group emits a single VCALENDAR envelope
|
|
399
|
+
// containing every entry's component in declared order. The Group's
|
|
400
|
+
// own uid + updated + name + description are NOT round-tripped to
|
|
401
|
+
// iCalendar (RFC 5545 has no envelope-level metadata for these);
|
|
402
|
+
// operators preserving Group metadata across a round-trip use the
|
|
403
|
+
// JSON-native JSCalendar surface.
|
|
404
|
+
if (jsCal["@type"] === "Group") {
|
|
405
|
+
var groupLines = [
|
|
406
|
+
"BEGIN:VCALENDAR",
|
|
407
|
+
"VERSION:2.0",
|
|
408
|
+
"PRODID:" + prodid,
|
|
409
|
+
];
|
|
410
|
+
for (var gei2 = 0; gei2 < jsCal.entries.length; gei2 += 1) {
|
|
411
|
+
var entryIcal = toIcal(jsCal.entries[gei2], { prodid: prodid });
|
|
412
|
+
// Strip outer VCALENDAR envelope; keep inner component lines.
|
|
413
|
+
var entryLines = entryIcal.split("\r\n");
|
|
414
|
+
for (var eli = 0; eli < entryLines.length; eli += 1) {
|
|
415
|
+
var line = entryLines[eli];
|
|
416
|
+
if (line && line !== "BEGIN:VCALENDAR" && line !== "VERSION:2.0" &&
|
|
417
|
+
line.indexOf("PRODID:") !== 0 && line !== "END:VCALENDAR") {
|
|
418
|
+
groupLines.push(line);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
groupLines.push("END:VCALENDAR");
|
|
423
|
+
return groupLines.join("\r\n") + "\r\n";
|
|
424
|
+
}
|
|
425
|
+
// RFC 8984 §6 — JSCalendar Task maps to RFC 5545 §3.6.2 VTODO; Event
|
|
426
|
+
// maps to VEVENT. The wrapper + most properties are identical; the
|
|
427
|
+
// wrapping component tag + Task-specific fields (DUE / STATUS /
|
|
428
|
+
// PERCENT-COMPLETE / COMPLETED) diverge.
|
|
429
|
+
var component = jsCal["@type"] === "Task"
|
|
430
|
+
? "VTODO"
|
|
431
|
+
: jsCal["@type"] === "Note" ? "VJOURNAL" : "VEVENT";
|
|
432
|
+
var lines = [
|
|
433
|
+
"BEGIN:VCALENDAR",
|
|
434
|
+
"VERSION:2.0",
|
|
435
|
+
"PRODID:" + prodid,
|
|
436
|
+
"BEGIN:" + component,
|
|
437
|
+
"UID:" + _foldLine(jsCal.uid),
|
|
438
|
+
"DTSTAMP:" + _utcDateTimeToIcal(jsCal.updated),
|
|
439
|
+
];
|
|
440
|
+
if (jsCal.title) lines.push("SUMMARY:" + _foldLine(_escapeText(jsCal.title)));
|
|
441
|
+
if (jsCal.description) lines.push("DESCRIPTION:" + _foldLine(_escapeText(jsCal.description)));
|
|
442
|
+
if (jsCal.start) {
|
|
443
|
+
// RFC 8984 §1.4.4 maps `timeZone: "Etc/UTC"` to a `Z`-suffix
|
|
444
|
+
// DTSTART (RFC 5545 §3.3.5 form 2); any other named timezone
|
|
445
|
+
// maps to a TZID parameter (form 3); no timeZone leaves DTSTART
|
|
446
|
+
// as floating local time (form 1).
|
|
447
|
+
var dtStartIcal = _localDateTimeToIcal(jsCal.start);
|
|
448
|
+
if (jsCal.timeZone === "Etc/UTC" || jsCal.timeZone === "UTC") {
|
|
449
|
+
lines.push("DTSTART:" + dtStartIcal + "Z");
|
|
450
|
+
} else if (jsCal.timeZone) {
|
|
451
|
+
lines.push("DTSTART;TZID=" + jsCal.timeZone + ":" + dtStartIcal);
|
|
452
|
+
} else {
|
|
453
|
+
lines.push("DTSTART:" + dtStartIcal);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
// RFC 5545 §3.8.2.3 — DUE is Task-only; same TZID/UTC handling as DTSTART.
|
|
457
|
+
if (component === "VTODO" && jsCal.due) {
|
|
458
|
+
var dueIcal = _localDateTimeToIcal(jsCal.due);
|
|
459
|
+
if (jsCal.timeZone === "Etc/UTC" || jsCal.timeZone === "UTC") {
|
|
460
|
+
lines.push("DUE:" + dueIcal + "Z");
|
|
461
|
+
} else if (jsCal.timeZone) {
|
|
462
|
+
lines.push("DUE;TZID=" + jsCal.timeZone + ":" + dueIcal);
|
|
463
|
+
} else {
|
|
464
|
+
lines.push("DUE:" + dueIcal);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
// RFC 8984 §6 — Task carries `estimatedDuration` (RFC 5545 DURATION).
|
|
468
|
+
// Event uses `duration`. Both map to the same iCalendar property.
|
|
469
|
+
var icalDuration = component === "VTODO"
|
|
470
|
+
? (jsCal.estimatedDuration || jsCal.duration)
|
|
471
|
+
: jsCal.duration;
|
|
472
|
+
if (icalDuration) lines.push("DURATION:" + icalDuration);
|
|
473
|
+
// RFC 5545 §3.8.1.11 STATUS — Task progress maps directly; the four
|
|
474
|
+
// RFC 8984 §6.4.3 progress values (`needs-action` / `in-process` /
|
|
475
|
+
// `completed` / `cancelled`) are the same wire strings.
|
|
476
|
+
if (component === "VTODO" && jsCal.progress) {
|
|
477
|
+
lines.push("STATUS:" + String(jsCal.progress).toUpperCase());
|
|
478
|
+
}
|
|
479
|
+
// RFC 5545 §3.8.1.11 — VJOURNAL STATUS values are DRAFT / FINAL /
|
|
480
|
+
// CANCELLED. JSCalendar Note carries them lower-cased; emit upper.
|
|
481
|
+
if (component === "VJOURNAL" && jsCal.status) {
|
|
482
|
+
lines.push("STATUS:" + String(jsCal.status).toUpperCase());
|
|
483
|
+
}
|
|
484
|
+
if (component === "VTODO" && typeof jsCal.percentComplete === "number") {
|
|
485
|
+
lines.push("PERCENT-COMPLETE:" + jsCal.percentComplete);
|
|
486
|
+
}
|
|
487
|
+
if (component === "VTODO" && jsCal.progressUpdated) {
|
|
488
|
+
lines.push("COMPLETED:" + _utcDateTimeToIcal(jsCal.progressUpdated));
|
|
489
|
+
}
|
|
490
|
+
if (Array.isArray(jsCal.locations) || (jsCal.locations && typeof jsCal.locations === "object")) {
|
|
491
|
+
var locValues = Array.isArray(jsCal.locations) ? jsCal.locations : Object.values(jsCal.locations);
|
|
492
|
+
for (var li = 0; li < locValues.length; li += 1) {
|
|
493
|
+
var loc = locValues[li];
|
|
494
|
+
if (loc && typeof loc.name === "string") {
|
|
495
|
+
lines.push("LOCATION:" + _foldLine(_escapeText(loc.name)));
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
if (Array.isArray(jsCal.recurrenceRules)) {
|
|
500
|
+
for (var rri = 0; rri < jsCal.recurrenceRules.length; rri += 1) {
|
|
501
|
+
lines.push("RRULE:" + _recurrenceRuleToIcal(jsCal.recurrenceRules[rri]));
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
lines.push("END:" + component, "END:VCALENDAR");
|
|
505
|
+
return lines.join("\r\n") + "\r\n";
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* @primitive b.calendar.expandRecurrence
|
|
510
|
+
* @signature b.calendar.expandRecurrence(event, opts)
|
|
511
|
+
* @since 0.11.31
|
|
512
|
+
* @status stable
|
|
513
|
+
*
|
|
514
|
+
* Expand a JSCalendar Event's `recurrenceRules` into concrete start
|
|
515
|
+
* timestamps in the operator's `[from, to]` window. Returns an array
|
|
516
|
+
* of ISO 8601 UTC strings (`yyyy-mm-ddTHH:MM:SSZ`). Bounded by
|
|
517
|
+
* `MAX_EXPAND_INSTANCES` (4096) + `MAX_EXPAND_SPAN_MS` (10 years) to
|
|
518
|
+
* defend against CVE-2024-39687-class recurrence-bomb expansion.
|
|
519
|
+
*
|
|
520
|
+
* v1 supports FREQ=DAILY/WEEKLY/MONTHLY/YEARLY with INTERVAL, COUNT,
|
|
521
|
+
* UNTIL. BYDAY / BYMONTH / BYMONTHDAY / BYWEEKNO / BYYEARDAY /
|
|
522
|
+
* BYHOUR / BYMINUTE / BYSECOND refine the base frequency. BYSETPOS
|
|
523
|
+
* picks the Nth candidate from the BY*-filtered set within a FREQ
|
|
524
|
+
* interval (positive = 1-indexed from start, negative = from end);
|
|
525
|
+
* supported for FREQ=MONTHLY / YEARLY / WEEKLY with day-granularity
|
|
526
|
+
* candidates (time-of-day inherited from start). Multiple
|
|
527
|
+
* `recurrenceRules` are expanded independently and UNIONed; per
|
|
528
|
+
* RFC 8984 §4.3.2 each rule's `count` cap applies per-rule, not to
|
|
529
|
+
* the combined set. (RFC 7529 non-Gregorian calendars not in scope.)
|
|
530
|
+
*
|
|
531
|
+
* @opts
|
|
532
|
+
* from: string, // ISO 8601 UTC timestamp — lower bound of expansion window
|
|
533
|
+
* to: string, // ISO 8601 UTC timestamp — upper bound (window <= 10 years)
|
|
534
|
+
* max: number, // instance-count cap (default 4096; never exceeds MAX_EXPAND_INSTANCES)
|
|
535
|
+
*
|
|
536
|
+
* @example
|
|
537
|
+
* b.calendar.expandRecurrence(
|
|
538
|
+
* { "@type": "Event", uid: "x", updated: "2026-05-21T10:00:00Z",
|
|
539
|
+
* start: "2026-05-22T09:00:00",
|
|
540
|
+
* recurrenceRules: [{ "@type": "RecurrenceRule", frequency: "daily", count: 5 }] },
|
|
541
|
+
* { from: "2026-05-22T00:00:00Z", to: "2026-06-01T00:00:00Z" });
|
|
542
|
+
* // → ["2026-05-22T09:00:00Z", "2026-05-23T09:00:00Z", ..., "2026-05-26T09:00:00Z"]
|
|
543
|
+
*/
|
|
544
|
+
function expandRecurrence(event, opts) {
|
|
545
|
+
validate(event);
|
|
546
|
+
opts = opts || {};
|
|
547
|
+
if (!Array.isArray(event.recurrenceRules) || event.recurrenceRules.length === 0) {
|
|
548
|
+
return event.start ? [_localToUtc(event.start)] : [];
|
|
549
|
+
}
|
|
550
|
+
var fromMs = opts.from ? Date.parse(opts.from) : null;
|
|
551
|
+
var toMs = opts.to ? Date.parse(opts.to) : null;
|
|
552
|
+
if (fromMs !== null && toMs !== null) {
|
|
553
|
+
if (toMs - fromMs > MAX_EXPAND_SPAN_MS) {
|
|
554
|
+
throw new CalendarError("calendar/oversize-expansion-span",
|
|
555
|
+
"b.calendar.expandRecurrence: window [" + opts.from + ", " + opts.to + "] exceeds 10 years");
|
|
556
|
+
}
|
|
557
|
+
if (toMs < fromMs) {
|
|
558
|
+
throw new CalendarError("calendar/bad-expansion-window",
|
|
559
|
+
"b.calendar.expandRecurrence: opts.to must be after opts.from");
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
var maxCount = Math.min(opts.max || MAX_EXPAND_INSTANCES, MAX_EXPAND_INSTANCES);
|
|
563
|
+
// JSCalendar's LocalDateTime is FLOATING when no timeZone is set;
|
|
564
|
+
// for expansion we treat it as already-UTC so the returned ISO
|
|
565
|
+
// strings carry the same wall-clock the operator stored. Appending
|
|
566
|
+
// `Z` to the LocalDateTime sidesteps Date.parse's host-locale
|
|
567
|
+
// interpretation (which would otherwise mangle the wall-clock).
|
|
568
|
+
var startInput = _isLocalDateTime(event.start) ? event.start + "Z" : event.start;
|
|
569
|
+
var startMs = Date.parse(startInput);
|
|
570
|
+
if (!isFinite(startMs)) {
|
|
571
|
+
throw new CalendarError("calendar/bad-start",
|
|
572
|
+
"b.calendar.expandRecurrence: event.start is not a parseable date");
|
|
573
|
+
}
|
|
574
|
+
// RFC 8984 §4.3.2 — when multiple RecurrenceRule objects are
|
|
575
|
+
// specified, they are expanded independently and the resulting
|
|
576
|
+
// instances are UNIONed (deduped + sorted ascending). Per-rule
|
|
577
|
+
// count caps apply per-rule per the same section.
|
|
578
|
+
var globalStepBudget = MAX_EXPAND_INSTANCES * 366; // allow:raw-byte-literal — total days/year step budget shared across all rules
|
|
579
|
+
var seen = Object.create(null);
|
|
580
|
+
var unioned = [];
|
|
581
|
+
for (var rrIndex = 0; rrIndex < event.recurrenceRules.length; rrIndex += 1) {
|
|
582
|
+
var perRule = _expandSingleRule(event.recurrenceRules[rrIndex], startMs, {
|
|
583
|
+
fromMs: fromMs,
|
|
584
|
+
toMs: toMs,
|
|
585
|
+
maxCount: maxCount,
|
|
586
|
+
stepBudgetRef: { remaining: globalStepBudget },
|
|
587
|
+
});
|
|
588
|
+
globalStepBudget = perRule.stepBudgetRemaining;
|
|
589
|
+
for (var pi = 0; pi < perRule.instances.length; pi += 1) {
|
|
590
|
+
var iso = perRule.instances[pi];
|
|
591
|
+
if (!seen[iso]) {
|
|
592
|
+
seen[iso] = true;
|
|
593
|
+
unioned.push(iso);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
unioned.sort();
|
|
598
|
+
return unioned.length > maxCount ? unioned.slice(0, maxCount) : unioned;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// Expand ONE RecurrenceRule per the v0.11.31..v0.11.36 logic. Returns
|
|
602
|
+
// `{ instances: [isoZ...], stepBudgetRemaining: <int> }`. Caller is
|
|
603
|
+
// responsible for merging across rules (deduplication + sort + global
|
|
604
|
+
// cap).
|
|
605
|
+
function _expandSingleRule(rule, startMs, ctx) {
|
|
606
|
+
var fromMs = ctx.fromMs;
|
|
607
|
+
var toMs = ctx.toMs;
|
|
608
|
+
var maxCount = ctx.maxCount;
|
|
609
|
+
var out = [];
|
|
610
|
+
var interval = Math.max(1, parseInt(rule.interval || 1, 10));
|
|
611
|
+
var freq = rule.frequency;
|
|
612
|
+
var count = isFinite(rule.count) ? rule.count : Infinity;
|
|
613
|
+
var untilMs = rule.until ? Date.parse(rule.until) : Infinity;
|
|
614
|
+
// RFC 5545 §3.3.10 BY* filters narrow which stepped occurrences
|
|
615
|
+
// emit. We support the BYDAY/BYMONTH/BYMONTHDAY subset; rule
|
|
616
|
+
// instances that fail the filter are stepped past WITHOUT counting
|
|
617
|
+
// against `count` (per RFC 5545 BY* expansion semantics — only
|
|
618
|
+
// surviving instances count).
|
|
619
|
+
var byDaySet = null;
|
|
620
|
+
if (Array.isArray(rule.byDay) && rule.byDay.length > 0) {
|
|
621
|
+
byDaySet = Object.create(null);
|
|
622
|
+
var dayCodes = { su: 0, mo: 1, tu: 2, we: 3, th: 4, fr: 5, sa: 6 };
|
|
623
|
+
for (var bi = 0; bi < rule.byDay.length; bi += 1) {
|
|
624
|
+
var entry = rule.byDay[bi];
|
|
625
|
+
var dayKey = (entry && entry.day ? entry.day : entry || "").toLowerCase();
|
|
626
|
+
if (Object.prototype.hasOwnProperty.call(dayCodes, dayKey)) {
|
|
627
|
+
byDaySet[dayCodes[dayKey]] = true;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
var byMonthSet = null;
|
|
632
|
+
if (Array.isArray(rule.byMonth) && rule.byMonth.length > 0) {
|
|
633
|
+
byMonthSet = Object.create(null);
|
|
634
|
+
for (var mi = 0; mi < rule.byMonth.length; mi += 1) {
|
|
635
|
+
var mn = parseInt(rule.byMonth[mi], 10);
|
|
636
|
+
if (isFinite(mn) && mn >= 1 && mn <= 12) byMonthSet[mn] = true; // allow:raw-byte-literal — 12 calendar months
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
var byMonthDaySet = null;
|
|
640
|
+
if (Array.isArray(rule.byMonthDay) && rule.byMonthDay.length > 0) {
|
|
641
|
+
byMonthDaySet = Object.create(null);
|
|
642
|
+
for (var mdi = 0; mdi < rule.byMonthDay.length; mdi += 1) {
|
|
643
|
+
var mdn = parseInt(rule.byMonthDay[mdi], 10);
|
|
644
|
+
if (isFinite(mdn) && mdn !== 0 && mdn >= -31 && mdn <= 31) byMonthDaySet[mdn] = true; // allow:raw-byte-literal — calendar day-of-month bounds
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
// RFC 5545 §3.3.10 — BYWEEKNO refines yearly recurrences to specific
|
|
648
|
+
// ISO 8601 week numbers (1..53 or -1..-53). Implementation
|
|
649
|
+
// computes the ISO week of each candidate instance + compares.
|
|
650
|
+
var byWeekNoSet = null;
|
|
651
|
+
if (Array.isArray(rule.byWeekNo) && rule.byWeekNo.length > 0) {
|
|
652
|
+
byWeekNoSet = Object.create(null);
|
|
653
|
+
for (var wni = 0; wni < rule.byWeekNo.length; wni += 1) {
|
|
654
|
+
var wn = parseInt(rule.byWeekNo[wni], 10);
|
|
655
|
+
if (isFinite(wn) && wn !== 0 && wn >= -53 && wn <= 53) byWeekNoSet[wn] = true; // allow:raw-byte-literal — ISO 8601 week-number bounds
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
// BYYEARDAY — day-of-year (1..366 or -1..-366; negative counts from
|
|
659
|
+
// the end of the year per RFC 5545 §3.3.10).
|
|
660
|
+
var byYearDaySet = null;
|
|
661
|
+
if (Array.isArray(rule.byYearDay) && rule.byYearDay.length > 0) {
|
|
662
|
+
byYearDaySet = Object.create(null);
|
|
663
|
+
for (var ydi = 0; ydi < rule.byYearDay.length; ydi += 1) {
|
|
664
|
+
var yd = parseInt(rule.byYearDay[ydi], 10);
|
|
665
|
+
if (isFinite(yd) && yd !== 0 && yd >= -366 && yd <= 366) byYearDaySet[yd] = true; // allow:raw-byte-literal — day-of-year bounds
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
// BYHOUR / BYMINUTE / BYSECOND — time-of-day filters. RFC 5545 §3.3.10
|
|
669
|
+
// bounds: hours 0..23, minutes 0..59, seconds 0..60 (60 covers
|
|
670
|
+
// POSIX leap-second representation).
|
|
671
|
+
function _bySet(arr, lo, hi) {
|
|
672
|
+
if (!Array.isArray(arr) || arr.length === 0) return null;
|
|
673
|
+
var s = Object.create(null);
|
|
674
|
+
var hasAny = false;
|
|
675
|
+
for (var i = 0; i < arr.length; i += 1) {
|
|
676
|
+
var n = parseInt(arr[i], 10);
|
|
677
|
+
if (isFinite(n) && n >= lo && n <= hi) { s[n] = true; hasAny = true; }
|
|
678
|
+
}
|
|
679
|
+
// Codex P2 — when every value in the BY* list is out of range,
|
|
680
|
+
// return null instead of an empty set. An empty truthy set would
|
|
681
|
+
// cause `_matchesBy` to reject every candidate (`!set[n]` is
|
|
682
|
+
// true) and silently turn malformed input into a "match nothing"
|
|
683
|
+
// rule. Returning null lets the rule fall through to the next
|
|
684
|
+
// unfiltered candidate per RFC 5545's tolerant grammar.
|
|
685
|
+
return hasAny ? s : null;
|
|
686
|
+
}
|
|
687
|
+
var byHourSet = _bySet(rule.byHour, 0, 23); // allow:raw-byte-literal — RFC 5545 hour range
|
|
688
|
+
var byMinuteSet = _bySet(rule.byMinute, 0, 59); // allow:raw-byte-literal — RFC 5545 minute range
|
|
689
|
+
var bySecondSet = _bySet(rule.bySecond, 0, 60); // allow:raw-byte-literal — RFC 5545 second range incl. leap second // allow:raw-time-literal — second-of-minute bound, not a duration
|
|
690
|
+
|
|
691
|
+
function _isoWeekParts(d) {
|
|
692
|
+
// ISO 8601 week-of-year + week-year. The week-YEAR can differ
|
|
693
|
+
// from the Gregorian year for early-Jan / late-Dec boundary
|
|
694
|
+
// dates (e.g. 2021-01-01 is ISO week 53 of WEEK-YEAR 2020).
|
|
695
|
+
// Returns { week, year }.
|
|
696
|
+
var tmp = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()));
|
|
697
|
+
var dayOfWeek = tmp.getUTCDay() || 7;
|
|
698
|
+
tmp.setUTCDate(tmp.getUTCDate() + 4 - dayOfWeek); // allow:raw-byte-literal — ISO week-year anchor (Thursday)
|
|
699
|
+
var weekYear = tmp.getUTCFullYear();
|
|
700
|
+
var yearStart = new Date(Date.UTC(weekYear, 0, 1));
|
|
701
|
+
var week = Math.ceil((((tmp - yearStart) / 86400000) + 1) / 7); // allow:raw-time-literal — 86400000 ms/day, 7 days/week // allow:raw-byte-literal
|
|
702
|
+
return { week: week, year: weekYear };
|
|
703
|
+
}
|
|
704
|
+
function _isoWeekOf(d) {
|
|
705
|
+
return _isoWeekParts(d).week;
|
|
706
|
+
}
|
|
707
|
+
function _yearDayOf(d) {
|
|
708
|
+
var startOfYear = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
|
|
709
|
+
return Math.floor((d - startOfYear) / 86400000) + 1; // allow:raw-time-literal — 86400000 ms/day // allow:raw-byte-literal
|
|
710
|
+
}
|
|
711
|
+
function _daysInYear(year) {
|
|
712
|
+
return ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) ? 366 : 365; // allow:raw-byte-literal — Gregorian leap-year rule
|
|
713
|
+
}
|
|
714
|
+
function _matchesBy(t) {
|
|
715
|
+
var d = new Date(t);
|
|
716
|
+
if (byDaySet && !byDaySet[d.getUTCDay()]) return false;
|
|
717
|
+
if (byMonthSet && !byMonthSet[d.getUTCMonth() + 1]) return false;
|
|
718
|
+
if (byMonthDaySet && !byMonthDaySet[d.getUTCDate()]) return false;
|
|
719
|
+
if (byWeekNoSet) {
|
|
720
|
+
// Codex P1 — ISO week-year vs Gregorian year. 2021-01-01 is ISO
|
|
721
|
+
// week 53 of WEEK-YEAR 2020 (since 2021 only has 52 ISO weeks).
|
|
722
|
+
// Comparing only the numeric week would let a Jan 1 2021 date
|
|
723
|
+
// match a BYWEEKNO=53 rule whose implicit year is 2021. Refuse
|
|
724
|
+
// when the candidate's ISO week-year doesn't match the
|
|
725
|
+
// candidate's Gregorian year (the most common operator-intent
|
|
726
|
+
// alignment); operators with boundary-crossing rules opt in via
|
|
727
|
+
// a future explicit knob if demand surfaces.
|
|
728
|
+
var iso = _isoWeekParts(d);
|
|
729
|
+
if (iso.year !== d.getUTCFullYear()) return false;
|
|
730
|
+
var lastWeek = _isoWeekOf(new Date(Date.UTC(d.getUTCFullYear(), 11, 28))); // allow:raw-byte-literal — Dec 28 always in last ISO week
|
|
731
|
+
if (!byWeekNoSet[iso.week] && !byWeekNoSet[-(lastWeek - iso.week + 1)]) return false;
|
|
732
|
+
}
|
|
733
|
+
if (byYearDaySet) {
|
|
734
|
+
var yd = _yearDayOf(d);
|
|
735
|
+
var dayCount = _daysInYear(d.getUTCFullYear());
|
|
736
|
+
if (!byYearDaySet[yd] && !byYearDaySet[-(dayCount - yd + 1)]) return false;
|
|
737
|
+
}
|
|
738
|
+
if (byHourSet && !byHourSet[d.getUTCHours()]) return false;
|
|
739
|
+
if (byMinuteSet && !byMinuteSet[d.getUTCMinutes()]) return false;
|
|
740
|
+
if (bySecondSet && !bySecondSet[d.getUTCSeconds()]) return false;
|
|
741
|
+
return true;
|
|
742
|
+
}
|
|
743
|
+
// RFC 5545 §3.3.10 BYSETPOS — picks the Nth candidate from the
|
|
744
|
+
// BY*-filtered set within a FREQ interval. Positive = 1-indexed
|
|
745
|
+
// from start; negative = from end. Operators reach for this most
|
|
746
|
+
// often with "last Friday of month" (FREQ=MONTHLY;BYDAY=FR;
|
|
747
|
+
// BYSETPOS=-1) or "second Tuesday of month" (BYSETPOS=2).
|
|
748
|
+
//
|
|
749
|
+
// v1 supports BYSETPOS for FREQ=MONTHLY / YEARLY / WEEKLY at
|
|
750
|
+
// day-granularity — candidates are days within the period at the
|
|
751
|
+
// start's time-of-day. Sub-day BY* filters (byHour/byMinute/
|
|
752
|
+
// bySecond) are ignored under BYSETPOS for v1; the rare combo
|
|
753
|
+
// (BYSETPOS + byHour) reverts to the standard non-bysetpos step
|
|
754
|
+
// path when applicable.
|
|
755
|
+
var bySetPosArr = _bySetPosArray(rule.bySetPos);
|
|
756
|
+
if (bySetPosArr) {
|
|
757
|
+
return _expandWithBysetpos({
|
|
758
|
+
rule: rule,
|
|
759
|
+
startMs: startMs,
|
|
760
|
+
freq: freq,
|
|
761
|
+
interval: interval,
|
|
762
|
+
count: count,
|
|
763
|
+
untilMs: untilMs,
|
|
764
|
+
fromMs: fromMs,
|
|
765
|
+
toMs: toMs,
|
|
766
|
+
maxCount: maxCount,
|
|
767
|
+
matchesBy: _matchesBy,
|
|
768
|
+
bySetPos: bySetPosArr,
|
|
769
|
+
stepBudgetRef: ctx.stepBudgetRef,
|
|
770
|
+
});
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
var t = startMs;
|
|
774
|
+
// Safety cap on the step loop: at most MAX_EXPAND_INSTANCES * 366
|
|
775
|
+
// iterations so BY* filters that match sparsely (e.g. FREQ=DAILY;
|
|
776
|
+
// BYMONTH=1 — only Jan days survive) cannot loop forever inside
|
|
777
|
+
// the 10-year span cap. The budget is SHARED across all rules in
|
|
778
|
+
// the same expand call so an N-rule union can't amplify the
|
|
779
|
+
// worst-case work past the single-rule bound.
|
|
780
|
+
while (out.length < count && out.length < maxCount && ctx.stepBudgetRef.remaining > 0) {
|
|
781
|
+
ctx.stepBudgetRef.remaining -= 1;
|
|
782
|
+
if (t > untilMs) break;
|
|
783
|
+
if (toMs !== null && t > toMs) break;
|
|
784
|
+
if (_matchesBy(t)) {
|
|
785
|
+
if (fromMs === null || t >= fromMs) {
|
|
786
|
+
out.push(_msToIsoZ(t));
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
t = _advance(t, freq, interval);
|
|
790
|
+
if (t === null) {
|
|
791
|
+
throw new CalendarError("calendar/bad-recurrence",
|
|
792
|
+
"b.calendar.expandRecurrence: unsupported frequency '" + freq + "'");
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
return { instances: out, stepBudgetRemaining: ctx.stepBudgetRef.remaining };
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
// Parse + validate rule.bySetPos. Returns null when absent / empty;
|
|
799
|
+
// otherwise an array of integers in [-366, -1] U [1, 366] (RFC 5545
|
|
800
|
+
// grammar). Zero values + out-of-range values are silently dropped.
|
|
801
|
+
function _bySetPosArray(raw) {
|
|
802
|
+
if (!Array.isArray(raw) || raw.length === 0) return null;
|
|
803
|
+
var out = [];
|
|
804
|
+
for (var i = 0; i < raw.length; i += 1) {
|
|
805
|
+
var n = parseInt(raw[i], 10);
|
|
806
|
+
if (isFinite(n) && n !== 0 && n >= -366 && n <= 366) out.push(n); // allow:raw-byte-literal — RFC 5545 §3.3.10 bysetpos range
|
|
807
|
+
}
|
|
808
|
+
return out.length > 0 ? out : null;
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
// BYSETPOS expander. Iterates by FREQ interval; for each period,
|
|
812
|
+
// enumerates day-level candidates within the period; applies the
|
|
813
|
+
// caller's matchesBy filter; sorts ascending; picks the position(s)
|
|
814
|
+
// per bySetPos. Time-of-day per candidate matches the rule's start.
|
|
815
|
+
function _expandWithBysetpos(ctx) {
|
|
816
|
+
var startMs = ctx.startMs;
|
|
817
|
+
var freq = ctx.freq;
|
|
818
|
+
var interval = ctx.interval;
|
|
819
|
+
var count = ctx.count;
|
|
820
|
+
var untilMs = ctx.untilMs;
|
|
821
|
+
var fromMs = ctx.fromMs;
|
|
822
|
+
var toMs = ctx.toMs;
|
|
823
|
+
var maxCount = ctx.maxCount;
|
|
824
|
+
var matchesBy = ctx.matchesBy;
|
|
825
|
+
var bySetPos = ctx.bySetPos;
|
|
826
|
+
var stepBudgetRef = ctx.stepBudgetRef;
|
|
827
|
+
|
|
828
|
+
if (freq !== "monthly" && freq !== "yearly" && freq !== "weekly") {
|
|
829
|
+
throw new CalendarError("calendar/bad-recurrence",
|
|
830
|
+
"b.calendar.expandRecurrence: BYSETPOS supported only with FREQ=MONTHLY / YEARLY / WEEKLY (got '" + freq + "')");
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
var startDate = new Date(startMs);
|
|
834
|
+
var hh = startDate.getUTCHours();
|
|
835
|
+
var mm = startDate.getUTCMinutes();
|
|
836
|
+
var ss = startDate.getUTCSeconds();
|
|
837
|
+
var ms = startDate.getUTCMilliseconds();
|
|
838
|
+
|
|
839
|
+
var out = [];
|
|
840
|
+
// Period anchor (period 0 = start's period).
|
|
841
|
+
var periodIndex = 0;
|
|
842
|
+
|
|
843
|
+
while (out.length < count && out.length < maxCount && stepBudgetRef.remaining > 0) {
|
|
844
|
+
var period = _periodForIndex(freq, startDate, periodIndex * interval);
|
|
845
|
+
periodIndex += 1;
|
|
846
|
+
// Out-of-window early exit. Window-uppper applies once the period
|
|
847
|
+
// start crosses toMs; until applies once period-start crosses untilMs.
|
|
848
|
+
if (period.startMs > untilMs) break;
|
|
849
|
+
if (toMs !== null && period.startMs > toMs) break;
|
|
850
|
+
|
|
851
|
+
// Enumerate day-level candidates within the period at start's
|
|
852
|
+
// time-of-day. The budget decrements per candidate so adversarial
|
|
853
|
+
// periods (e.g. YEARLY = 366 days) can't loop forever.
|
|
854
|
+
var candidates = [];
|
|
855
|
+
var dayMs = period.startMs;
|
|
856
|
+
var safety = 400; // allow:raw-byte-literal — period day cap (covers leap year 366 + slack)
|
|
857
|
+
while (dayMs <= period.endMs && safety-- > 0 && stepBudgetRef.remaining > 0) {
|
|
858
|
+
stepBudgetRef.remaining -= 1;
|
|
859
|
+
var candidate = _withTimeOfDay(dayMs, hh, mm, ss, ms);
|
|
860
|
+
if (matchesBy(candidate)) candidates.push(candidate);
|
|
861
|
+
dayMs += 86400000; // allow:raw-time-literal — 86400000 ms/day step // allow:raw-byte-literal — same constant in ms/day form
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
// Sort + apply BYSETPOS. Positive index 1-based from start;
|
|
865
|
+
// negative from end. Out-of-range positions silently drop.
|
|
866
|
+
candidates.sort(function (a, b) { return a - b; });
|
|
867
|
+
var picked = Object.create(null);
|
|
868
|
+
for (var pi = 0; pi < bySetPos.length; pi += 1) {
|
|
869
|
+
var pos = bySetPos[pi];
|
|
870
|
+
var idx = pos > 0 ? pos - 1 : candidates.length + pos;
|
|
871
|
+
if (idx >= 0 && idx < candidates.length) picked[candidates[idx]] = true;
|
|
872
|
+
}
|
|
873
|
+
// Emit picked candidates in ascending order, gated by window +
|
|
874
|
+
// untilMs + per-rule count cap.
|
|
875
|
+
//
|
|
876
|
+
// Codex P1 — recurrence instances MUST NOT precede DTSTART (per
|
|
877
|
+
// RFC 5545 §3.8.5.3). The period-boundary enumeration above
|
|
878
|
+
// includes candidates BEFORE startMs when the period containing
|
|
879
|
+
// startMs has earlier BY*-matching days (e.g. start = May 20
|
|
880
|
+
// Friday, BYDAY=FR;BYSETPOS=1 → enumeration would pick May 1).
|
|
881
|
+
// Refusing pre-start candidates here both fixes the semantics
|
|
882
|
+
// AND avoids consuming the per-rule COUNT cap on instances the
|
|
883
|
+
// operator never asked for.
|
|
884
|
+
var pickedKeys = Object.keys(picked).map(Number).sort(function (a, b) { return a - b; });
|
|
885
|
+
for (var ki = 0; ki < pickedKeys.length; ki += 1) {
|
|
886
|
+
var pickedMs = pickedKeys[ki];
|
|
887
|
+
if (pickedMs < startMs) continue;
|
|
888
|
+
if (pickedMs > untilMs) { count = out.length; break; }
|
|
889
|
+
if (toMs !== null && pickedMs > toMs) { count = out.length; break; }
|
|
890
|
+
if (fromMs !== null && pickedMs < fromMs) continue;
|
|
891
|
+
if (out.length >= count || out.length >= maxCount) break;
|
|
892
|
+
out.push(_msToIsoZ(pickedMs));
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
return { instances: out, stepBudgetRemaining: stepBudgetRef.remaining };
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
// Compute period [startMs, endMs] given a base start date + interval
|
|
899
|
+
// offset. Period START is anchored at the first second of the period
|
|
900
|
+
// (Jan 1 for YEARLY, day 1 for MONTHLY, WKST-Monday for WEEKLY) so
|
|
901
|
+
// the day-enumeration loop strides whole-day from there.
|
|
902
|
+
function _periodForIndex(freq, startDate, offset) {
|
|
903
|
+
if (freq === "yearly") {
|
|
904
|
+
var year = startDate.getUTCFullYear() + offset;
|
|
905
|
+
var ys = Date.UTC(year, 0, 1, 0, 0, 0, 0);
|
|
906
|
+
var ye = Date.UTC(year + 1, 0, 1, 0, 0, 0, 0) - 1;
|
|
907
|
+
return { startMs: ys, endMs: ye };
|
|
908
|
+
}
|
|
909
|
+
if (freq === "monthly") {
|
|
910
|
+
var bm = startDate.getUTCMonth() + offset;
|
|
911
|
+
var by = startDate.getUTCFullYear() + Math.floor(bm / 12); // allow:raw-byte-literal — months/year
|
|
912
|
+
var mm = ((bm % 12) + 12) % 12; // allow:raw-byte-literal — months/year
|
|
913
|
+
var ms = Date.UTC(by, mm, 1, 0, 0, 0, 0);
|
|
914
|
+
var me = Date.UTC(by, mm + 1, 1, 0, 0, 0, 0) - 1;
|
|
915
|
+
return { startMs: ms, endMs: me };
|
|
916
|
+
}
|
|
917
|
+
// weekly — align to WKST=Monday (RFC 5545 default WKST).
|
|
918
|
+
var anchor = new Date(Date.UTC(startDate.getUTCFullYear(), startDate.getUTCMonth(), startDate.getUTCDate(), 0, 0, 0, 0));
|
|
919
|
+
var dow = anchor.getUTCDay() || 7;
|
|
920
|
+
anchor.setUTCDate(anchor.getUTCDate() - (dow - 1) + offset * 7); // allow:raw-byte-literal — days/week
|
|
921
|
+
var ws = anchor.getTime();
|
|
922
|
+
var we = ws + 7 * 86400000 - 1; // allow:raw-byte-literal + allow:raw-time-literal — 7-day window
|
|
923
|
+
return { startMs: ws, endMs: we };
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
function _withTimeOfDay(dayMs, hh, mm, ss, ms) {
|
|
927
|
+
var d = new Date(dayMs);
|
|
928
|
+
return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), hh, mm, ss, ms);
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
// ---- Internal helpers ----------------------------------------------------
|
|
932
|
+
|
|
933
|
+
function _veventToJsCalEvent(ve) {
|
|
934
|
+
var props = (ve && ve.properties) || {};
|
|
935
|
+
var jsCal = {
|
|
936
|
+
"@type": "Event",
|
|
937
|
+
uid: _firstValue(props.UID) || "",
|
|
938
|
+
updated: _icalDateTimeToUtc(_firstValue(props.DTSTAMP) || ""),
|
|
939
|
+
};
|
|
940
|
+
var summary = _firstValue(props.SUMMARY);
|
|
941
|
+
if (summary) jsCal.title = _unescapeText(summary);
|
|
942
|
+
var description = _firstValue(props.DESCRIPTION);
|
|
943
|
+
if (description) jsCal.description = _unescapeText(description);
|
|
944
|
+
var dtstart = _firstValue(props.DTSTART);
|
|
945
|
+
if (dtstart) jsCal.start = _icalDateTimeToLocal(dtstart);
|
|
946
|
+
var duration = _firstValue(props.DURATION);
|
|
947
|
+
if (duration) jsCal.duration = duration;
|
|
948
|
+
var tzid = _firstParamValue(props.DTSTART, "TZID");
|
|
949
|
+
if (tzid) {
|
|
950
|
+
jsCal.timeZone = tzid;
|
|
951
|
+
} else if (typeof dtstart === "string" && /Z$/.test(dtstart)) {
|
|
952
|
+
// Codex P1 — RFC 8984 §1.4.4: a UTC-suffix DTSTART (`...Z`) in
|
|
953
|
+
// iCalendar maps to a JSCalendar Event with `timeZone: "Etc/UTC"`.
|
|
954
|
+
// Without this, round-tripping `fromIcal` → `toIcal` would drop
|
|
955
|
+
// the UTC anchor + emit floating time, shifting the absolute
|
|
956
|
+
// instant for viewers in different timezones.
|
|
957
|
+
jsCal.timeZone = "Etc/UTC";
|
|
958
|
+
}
|
|
959
|
+
var location = _firstValue(props.LOCATION);
|
|
960
|
+
if (location) {
|
|
961
|
+
jsCal.locations = { L1: { "@type": "Location", name: _unescapeText(location) } };
|
|
962
|
+
}
|
|
963
|
+
var rrule = _firstValue(props.RRULE);
|
|
964
|
+
if (rrule) jsCal.recurrenceRules = [_icalRruleToJscal(rrule)];
|
|
965
|
+
return jsCal;
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
// RFC 8984 §6 — JSCalendar Task. The VTODO mapping is structurally
|
|
969
|
+
// similar to VEVENT but adds Task-specific properties:
|
|
970
|
+
// DUE → due (LocalDateTime)
|
|
971
|
+
// STATUS → progress ("needs-action"|"in-process"|"completed"|"cancelled")
|
|
972
|
+
// PERCENT-COMPLETE → percentComplete (0..100)
|
|
973
|
+
// COMPLETED → progressUpdated (UTCDateTime)
|
|
974
|
+
function _vtodoToJsCalTask(vt) {
|
|
975
|
+
var props = (vt && vt.properties) || {};
|
|
976
|
+
var jsCal = {
|
|
977
|
+
"@type": "Task",
|
|
978
|
+
uid: _firstValue(props.UID) || "",
|
|
979
|
+
updated: _icalDateTimeToUtc(_firstValue(props.DTSTAMP) || ""),
|
|
980
|
+
};
|
|
981
|
+
var summary = _firstValue(props.SUMMARY);
|
|
982
|
+
if (summary) jsCal.title = _unescapeText(summary);
|
|
983
|
+
var description = _firstValue(props.DESCRIPTION);
|
|
984
|
+
if (description) jsCal.description = _unescapeText(description);
|
|
985
|
+
var dtstart = _firstValue(props.DTSTART);
|
|
986
|
+
if (dtstart) jsCal.start = _icalDateTimeToLocal(dtstart);
|
|
987
|
+
var due = _firstValue(props.DUE);
|
|
988
|
+
if (due) jsCal.due = _icalDateTimeToLocal(due);
|
|
989
|
+
var duration = _firstValue(props.DURATION);
|
|
990
|
+
if (duration) jsCal.estimatedDuration = duration;
|
|
991
|
+
var tzid = _firstParamValue(props.DTSTART, "TZID") ||
|
|
992
|
+
_firstParamValue(props.DUE, "TZID");
|
|
993
|
+
if (tzid) {
|
|
994
|
+
jsCal.timeZone = tzid;
|
|
995
|
+
} else if ((typeof dtstart === "string" && /Z$/.test(dtstart)) ||
|
|
996
|
+
(typeof due === "string" && /Z$/.test(due))) {
|
|
997
|
+
jsCal.timeZone = "Etc/UTC";
|
|
998
|
+
}
|
|
999
|
+
var status = _firstValue(props.STATUS);
|
|
1000
|
+
if (status) {
|
|
1001
|
+
var statusLower = String(status).toLowerCase();
|
|
1002
|
+
var statusMap = {
|
|
1003
|
+
"needs-action": "needs-action",
|
|
1004
|
+
"in-process": "in-process",
|
|
1005
|
+
"completed": "completed",
|
|
1006
|
+
"cancelled": "cancelled",
|
|
1007
|
+
};
|
|
1008
|
+
if (statusMap[statusLower]) jsCal.progress = statusMap[statusLower];
|
|
1009
|
+
}
|
|
1010
|
+
var percent = _firstValue(props["PERCENT-COMPLETE"]);
|
|
1011
|
+
if (percent !== null && percent !== undefined) {
|
|
1012
|
+
var pn = parseInt(percent, 10);
|
|
1013
|
+
if (isFinite(pn) && pn >= 0 && pn <= 100) jsCal.percentComplete = pn; // allow:raw-byte-literal — RFC 8984 §6 percent range
|
|
1014
|
+
}
|
|
1015
|
+
var completed = _firstValue(props.COMPLETED);
|
|
1016
|
+
if (completed) jsCal.progressUpdated = _icalDateTimeToUtc(completed);
|
|
1017
|
+
var location = _firstValue(props.LOCATION);
|
|
1018
|
+
if (location) {
|
|
1019
|
+
jsCal.locations = { L1: { "@type": "Location", name: _unescapeText(location) } };
|
|
1020
|
+
}
|
|
1021
|
+
var rrule2 = _firstValue(props.RRULE);
|
|
1022
|
+
if (rrule2) jsCal.recurrenceRules = [_icalRruleToJscal(rrule2)];
|
|
1023
|
+
return jsCal;
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
// RFC 5545 §3.6.3 — VJOURNAL maps to a JSCalendar-shaped Note. The
|
|
1027
|
+
// VJOURNAL grammar permits MULTIPLE DESCRIPTION properties (the only
|
|
1028
|
+
// iCalendar component that does); blamejs joins them with a single
|
|
1029
|
+
// blank line to preserve operator-visible separators. STATUS is
|
|
1030
|
+
// limited to DRAFT / FINAL / CANCELLED (different from VTODO's
|
|
1031
|
+
// vocabulary), with no DUE / DURATION / PERCENT-COMPLETE / COMPLETED.
|
|
1032
|
+
function _vjournalToJsCalNote(vj) {
|
|
1033
|
+
var props = (vj && vj.properties) || {};
|
|
1034
|
+
var jsCal = {
|
|
1035
|
+
"@type": "Note",
|
|
1036
|
+
uid: _firstValue(props.UID) || "",
|
|
1037
|
+
updated: _icalDateTimeToUtc(_firstValue(props.DTSTAMP) || ""),
|
|
1038
|
+
};
|
|
1039
|
+
var summary = _firstValue(props.SUMMARY);
|
|
1040
|
+
if (summary) jsCal.title = _unescapeText(summary);
|
|
1041
|
+
// RFC 5545 §3.6.3 — VJOURNAL is the only component that may carry
|
|
1042
|
+
// multiple DESCRIPTION properties (one per discrete journal entry).
|
|
1043
|
+
// Concatenate them with a blank-line separator so downstream
|
|
1044
|
+
// consumers see the operator-visible boundaries.
|
|
1045
|
+
var descriptions = _allValues(props.DESCRIPTION);
|
|
1046
|
+
if (descriptions.length === 1) {
|
|
1047
|
+
jsCal.description = _unescapeText(descriptions[0]);
|
|
1048
|
+
} else if (descriptions.length > 1) {
|
|
1049
|
+
var parts = [];
|
|
1050
|
+
for (var di = 0; di < descriptions.length; di += 1) {
|
|
1051
|
+
parts.push(_unescapeText(descriptions[di]));
|
|
1052
|
+
}
|
|
1053
|
+
jsCal.description = parts.join("\n\n");
|
|
1054
|
+
}
|
|
1055
|
+
var dtstart = _firstValue(props.DTSTART);
|
|
1056
|
+
if (dtstart) jsCal.start = _icalDateTimeToLocal(dtstart);
|
|
1057
|
+
var tzid = _firstParamValue(props.DTSTART, "TZID");
|
|
1058
|
+
if (tzid) {
|
|
1059
|
+
jsCal.timeZone = tzid;
|
|
1060
|
+
} else if (typeof dtstart === "string" && /Z$/.test(dtstart)) {
|
|
1061
|
+
jsCal.timeZone = "Etc/UTC";
|
|
1062
|
+
}
|
|
1063
|
+
var status = _firstValue(props.STATUS);
|
|
1064
|
+
if (status) {
|
|
1065
|
+
var statusLower = String(status).toLowerCase();
|
|
1066
|
+
if (Object.prototype.hasOwnProperty.call(JSCAL_NOTE_STATUS, statusLower)) {
|
|
1067
|
+
jsCal.status = statusLower;
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
var location = _firstValue(props.LOCATION);
|
|
1071
|
+
if (location) {
|
|
1072
|
+
jsCal.locations = { L1: { "@type": "Location", name: _unescapeText(location) } };
|
|
1073
|
+
}
|
|
1074
|
+
var rrule3 = _firstValue(props.RRULE);
|
|
1075
|
+
if (rrule3) jsCal.recurrenceRules = [_icalRruleToJscal(rrule3)];
|
|
1076
|
+
return jsCal;
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
function _allValues(prop) {
|
|
1080
|
+
if (!prop) return [];
|
|
1081
|
+
if (Array.isArray(prop)) {
|
|
1082
|
+
var out = [];
|
|
1083
|
+
for (var i = 0; i < prop.length; i += 1) {
|
|
1084
|
+
var item = prop[i];
|
|
1085
|
+
if (item && item.value !== undefined) out.push(item.value);
|
|
1086
|
+
}
|
|
1087
|
+
return out;
|
|
1088
|
+
}
|
|
1089
|
+
return prop.value !== undefined ? [prop.value] : [];
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
function _firstValue(prop) {
|
|
1093
|
+
if (!prop) return null;
|
|
1094
|
+
if (Array.isArray(prop)) {
|
|
1095
|
+
var first = prop[0];
|
|
1096
|
+
return first && first.value !== undefined ? first.value : null;
|
|
1097
|
+
}
|
|
1098
|
+
if (prop.value !== undefined) return prop.value;
|
|
1099
|
+
return null;
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
function _firstParamValue(prop, paramName) {
|
|
1103
|
+
if (!prop) return null;
|
|
1104
|
+
var first = Array.isArray(prop) ? prop[0] : prop;
|
|
1105
|
+
if (!first || !first.params) return null;
|
|
1106
|
+
return first.params[paramName] || null;
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
function _icalRruleToJscal(rrule) {
|
|
1110
|
+
var out = { "@type": "RecurrenceRule", frequency: "daily" };
|
|
1111
|
+
var parts = String(rrule).split(";"); // allow:bare-split-on-quoted-header — RFC 5545 RRULE grammar has no quoted-string members; values are token-only
|
|
1112
|
+
for (var i = 0; i < parts.length; i += 1) {
|
|
1113
|
+
var kv = parts[i].split("=");
|
|
1114
|
+
if (kv.length !== 2) continue;
|
|
1115
|
+
var key = kv[0].toUpperCase();
|
|
1116
|
+
var val = kv[1];
|
|
1117
|
+
if (key === "FREQ") out.frequency = val.toLowerCase();
|
|
1118
|
+
else if (key === "INTERVAL") out.interval = parseInt(val, 10);
|
|
1119
|
+
else if (key === "COUNT") out.count = parseInt(val, 10);
|
|
1120
|
+
else if (key === "UNTIL") out.until = _icalDateTimeToUtc(val);
|
|
1121
|
+
else if (key === "BYDAY") out.byDay = val.split(",").map(function (d) { // allow:bare-split-on-quoted-header — RFC 5545 BYDAY values are token-only
|
|
1122
|
+
return { "@type": "NDay", day: d.slice(-2).toLowerCase() };
|
|
1123
|
+
});
|
|
1124
|
+
else if (key === "BYMONTH") out.byMonth = val.split(","); // allow:bare-split-on-quoted-header — RFC 5545 BYMONTH values are integer-only
|
|
1125
|
+
else if (key === "BYMONTHDAY") out.byMonthDay = val.split(",").map(function (n) { return parseInt(n, 10); }); // allow:bare-split-on-quoted-header — RFC 5545 BYMONTHDAY values are integer-only
|
|
1126
|
+
}
|
|
1127
|
+
return out;
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
function _recurrenceRuleToIcal(rr) {
|
|
1131
|
+
var parts = ["FREQ=" + (rr.frequency || "daily").toUpperCase()];
|
|
1132
|
+
if (rr.interval && rr.interval !== 1) parts.push("INTERVAL=" + rr.interval);
|
|
1133
|
+
if (rr.count) parts.push("COUNT=" + rr.count);
|
|
1134
|
+
if (rr.until) parts.push("UNTIL=" + _utcDateTimeToIcal(rr.until));
|
|
1135
|
+
if (Array.isArray(rr.byDay) && rr.byDay.length > 0) {
|
|
1136
|
+
parts.push("BYDAY=" + rr.byDay.map(function (d) { return (d.day || "").toUpperCase(); }).join(","));
|
|
1137
|
+
}
|
|
1138
|
+
if (Array.isArray(rr.byMonth)) parts.push("BYMONTH=" + rr.byMonth.join(","));
|
|
1139
|
+
if (Array.isArray(rr.byMonthDay)) parts.push("BYMONTHDAY=" + rr.byMonthDay.join(","));
|
|
1140
|
+
return parts.join(";");
|
|
1141
|
+
}
|
|
1142
|
+
|
|
1143
|
+
function _icalDateTimeToUtc(s) {
|
|
1144
|
+
// VALUE=DATE-TIME UTC form: 20260522T100000Z → 2026-05-22T10:00:00Z
|
|
1145
|
+
var m = String(s).match(/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z$/);
|
|
1146
|
+
if (!m) return "";
|
|
1147
|
+
return m[1] + "-" + m[2] + "-" + m[3] + "T" + m[4] + ":" + m[5] + ":" + m[6] + "Z";
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
function _icalDateTimeToLocal(s) {
|
|
1151
|
+
var m = String(s).match(/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z?$/);
|
|
1152
|
+
if (!m) return "";
|
|
1153
|
+
return m[1] + "-" + m[2] + "-" + m[3] + "T" + m[4] + ":" + m[5] + ":" + m[6];
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
function _utcDateTimeToIcal(s) {
|
|
1157
|
+
// JSCalendar UTCDateTime "2026-05-22T10:00:00.123Z" →
|
|
1158
|
+
// "20260522T100000Z" (RFC 5545 §3.3.5 form 2 has NO fractional
|
|
1159
|
+
// seconds; strict ICS consumers reject `T100000.123Z`).
|
|
1160
|
+
return String(s).replace(/\.\d+/, "").replace(/[-:]/g, ""); // allow:bare-split-on-quoted-header — not a header split
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
function _localDateTimeToIcal(s) {
|
|
1164
|
+
// JSCalendar LocalDateTime "2026-05-22T09:00:00.123" →
|
|
1165
|
+
// "20260522T090000" (same fractional-second strip as the UTC form).
|
|
1166
|
+
return String(s).replace(/\.\d+/, "").replace(/[-:]/g, ""); // allow:bare-split-on-quoted-header — not a header split
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
function _isUtcDateTime(s) {
|
|
1170
|
+
return /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$/.test(s);
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
function _isLocalDateTime(s) {
|
|
1174
|
+
return /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?$/.test(s);
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1177
|
+
function _isDuration(s) {
|
|
1178
|
+
return /^-?P(\d+Y)?(\d+M)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$/.test(s);
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
function _localToUtc(localStr) {
|
|
1182
|
+
// Naive — treats LocalDateTime as already-UTC for the no-tz case.
|
|
1183
|
+
return localStr.endsWith("Z") ? localStr : localStr + "Z";
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1186
|
+
function _msToIsoZ(ms) {
|
|
1187
|
+
return time.toIso8601NoMs(new Date(ms));
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
function _advance(ms, freq, interval) {
|
|
1191
|
+
var d = new Date(ms);
|
|
1192
|
+
switch (freq) {
|
|
1193
|
+
case "daily": d.setUTCDate(d.getUTCDate() + interval); break;
|
|
1194
|
+
case "weekly": d.setUTCDate(d.getUTCDate() + 7 * interval); break; // allow:raw-byte-literal — 7 days/week
|
|
1195
|
+
case "monthly": d.setUTCMonth(d.getUTCMonth() + interval); break;
|
|
1196
|
+
case "yearly": d.setUTCFullYear(d.getUTCFullYear() + interval); break;
|
|
1197
|
+
case "hourly": d.setUTCHours(d.getUTCHours() + interval); break;
|
|
1198
|
+
case "minutely": d.setUTCMinutes(d.getUTCMinutes() + interval); break;
|
|
1199
|
+
case "secondly": d.setUTCSeconds(d.getUTCSeconds() + interval); break;
|
|
1200
|
+
default: return null;
|
|
1201
|
+
}
|
|
1202
|
+
return d.getTime();
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1205
|
+
function _escapeText(s) {
|
|
1206
|
+
return String(s).replace(/\\/g, "\\\\").replace(/;/g, "\\;").replace(/,/g, "\\,").replace(/\n/g, "\\n");
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1209
|
+
function _unescapeText(s) {
|
|
1210
|
+
return String(s)
|
|
1211
|
+
.replace(/\\n/g, "\n").replace(/\\,/g, ",")
|
|
1212
|
+
.replace(/\\;/g, ";").replace(/\\\\/g, "\\");
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
function _foldLine(s) {
|
|
1216
|
+
// RFC 5545 §3.1 — content lines SHOULD NOT exceed 75 octets; fold
|
|
1217
|
+
// with CRLF + leading space. We let the joining code add the
|
|
1218
|
+
// trailing CRLF; this helper only inserts the intra-line fold.
|
|
1219
|
+
if (s.length <= 75) return s; // allow:raw-byte-literal — RFC 5545 §3.1 line-length cap
|
|
1220
|
+
var out = "";
|
|
1221
|
+
for (var i = 0; i < s.length; i += 73) { // allow:raw-byte-literal — 73 = 75 minus the CR/LF wrap
|
|
1222
|
+
out += (i === 0 ? "" : "\r\n ") + s.slice(i, i + 73); // allow:raw-byte-literal — same cap
|
|
1223
|
+
}
|
|
1224
|
+
return out;
|
|
1225
|
+
}
|
|
1226
|
+
|
|
1227
|
+
module.exports = {
|
|
1228
|
+
validate: validate,
|
|
1229
|
+
fromIcal: fromIcal,
|
|
1230
|
+
toIcal: toIcal,
|
|
1231
|
+
expandRecurrence: expandRecurrence,
|
|
1232
|
+
CalendarError: CalendarError,
|
|
1233
|
+
JSCAL_TYPES: JSCAL_TYPES,
|
|
1234
|
+
JSCAL_FREQUENCIES: JSCAL_FREQUENCIES,
|
|
1235
|
+
JSCAL_ALERT_ACTIONS: JSCAL_ALERT_ACTIONS,
|
|
1236
|
+
JSCAL_TASK_PROGRESS: JSCAL_TASK_PROGRESS,
|
|
1237
|
+
JSCAL_NOTE_STATUS: JSCAL_NOTE_STATUS,
|
|
1238
|
+
MAX_EXPAND_INSTANCES: MAX_EXPAND_INSTANCES,
|
|
1239
|
+
MAX_EXPAND_SPAN_MS: MAX_EXPAND_SPAN_MS,
|
|
1240
|
+
};
|