@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.
Files changed (1220) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/LICENSE +17 -0
  3. package/README.md +117 -0
  4. package/SECURITY.md +139 -0
  5. package/lib/admin.js +952 -0
  6. package/lib/analytics.js +267 -0
  7. package/lib/cart.js +279 -0
  8. package/lib/catalog-import.js +344 -0
  9. package/lib/catalog.js +769 -0
  10. package/lib/checkout.js +320 -0
  11. package/lib/config.js +151 -0
  12. package/lib/customers.js +322 -0
  13. package/lib/email.js +242 -0
  14. package/lib/externaldb-d1.js +283 -0
  15. package/lib/index.js +57 -0
  16. package/lib/inventory-alerts.js +198 -0
  17. package/lib/newsletter.js +142 -0
  18. package/lib/order.js +380 -0
  19. package/lib/payment.js +318 -0
  20. package/lib/pricing.js +185 -0
  21. package/lib/r2-bridge.js +169 -0
  22. package/lib/shipping.js +185 -0
  23. package/lib/storefront.js +2160 -0
  24. package/lib/subscriptions.js +410 -0
  25. package/lib/tax.js +161 -0
  26. package/lib/theme.js +194 -0
  27. package/lib/vendor/MANIFEST.json +19 -0
  28. package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +23 -0
  29. package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +34 -0
  30. package/lib/vendor/blamejs/.clusterfuzzlite/project.yaml +16 -0
  31. package/lib/vendor/blamejs/.dockerignore +45 -0
  32. package/lib/vendor/blamejs/.gitattributes +42 -0
  33. package/lib/vendor/blamejs/.github/CODEOWNERS +4 -0
  34. package/lib/vendor/blamejs/.github/FUNDING.yml +2 -0
  35. package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/bug_report.md +58 -0
  36. package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/config.yml +8 -0
  37. package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/feature_request.md +99 -0
  38. package/lib/vendor/blamejs/.github/PULL_REQUEST_TEMPLATE.md +77 -0
  39. package/lib/vendor/blamejs/.github/dependabot.yml +37 -0
  40. package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +148 -0
  41. package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +107 -0
  42. package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +122 -0
  43. package/lib/vendor/blamejs/.github/workflows/ci.yml +511 -0
  44. package/lib/vendor/blamejs/.github/workflows/codeql.yml +50 -0
  45. package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +655 -0
  46. package/lib/vendor/blamejs/.github/workflows/release-container.yml +406 -0
  47. package/lib/vendor/blamejs/.github/workflows/scorecard.yml +101 -0
  48. package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +134 -0
  49. package/lib/vendor/blamejs/.gitignore +102 -0
  50. package/lib/vendor/blamejs/.gitleaks.toml +166 -0
  51. package/lib/vendor/blamejs/.hadolint.yaml +18 -0
  52. package/lib/vendor/blamejs/.npmrc +5 -0
  53. package/lib/vendor/blamejs/.pinact.yaml +17 -0
  54. package/lib/vendor/blamejs/ARCHITECTURE.md +158 -0
  55. package/lib/vendor/blamejs/CHANGELOG.md +1351 -0
  56. package/lib/vendor/blamejs/CODE_OF_CONDUCT.md +86 -0
  57. package/lib/vendor/blamejs/CONTRIBUTING.md +156 -0
  58. package/lib/vendor/blamejs/GOVERNANCE.md +201 -0
  59. package/lib/vendor/blamejs/LICENSE +201 -0
  60. package/lib/vendor/blamejs/LTS-CALENDAR.md +29 -0
  61. package/lib/vendor/blamejs/MIGRATING.md +29 -0
  62. package/lib/vendor/blamejs/NOTICE +81 -0
  63. package/lib/vendor/blamejs/README.md +304 -0
  64. package/lib/vendor/blamejs/SECURITY.md +432 -0
  65. package/lib/vendor/blamejs/api-snapshot.json +48709 -0
  66. package/lib/vendor/blamejs/assets/BlameJS_Logo.png +0 -0
  67. package/lib/vendor/blamejs/assets/BlameJS_Logo.svg +129 -0
  68. package/lib/vendor/blamejs/bench/README.md +77 -0
  69. package/lib/vendor/blamejs/bench/_helpers.js +70 -0
  70. package/lib/vendor/blamejs/bench/baseline.json +183 -0
  71. package/lib/vendor/blamejs/bench/crypto-hash.bench.js +19 -0
  72. package/lib/vendor/blamejs/bench/crypto-symmetric.bench.js +28 -0
  73. package/lib/vendor/blamejs/bench/run.js +140 -0
  74. package/lib/vendor/blamejs/bench/safe-json.bench.js +31 -0
  75. package/lib/vendor/blamejs/bin/blamejs.js +13 -0
  76. package/lib/vendor/blamejs/docker/caddy/Caddyfile +46 -0
  77. package/lib/vendor/blamejs/docker/coredns/Corefile +37 -0
  78. package/lib/vendor/blamejs/docker/haproxy/haproxy.cfg +52 -0
  79. package/lib/vendor/blamejs/docker/init/generate-certs.sh +118 -0
  80. package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +87 -0
  81. package/lib/vendor/blamejs/docker/mitmproxy/config.yaml +16 -0
  82. package/lib/vendor/blamejs/docker/mongo/init-tls.sh +17 -0
  83. package/lib/vendor/blamejs/docker/mysql/my.cnf +12 -0
  84. package/lib/vendor/blamejs/docker/nats/nats.conf +33 -0
  85. package/lib/vendor/blamejs/docker/postgres/init-tls.sh +17 -0
  86. package/lib/vendor/blamejs/docker/postgres/postgresql.conf +18 -0
  87. package/lib/vendor/blamejs/docker/rabbitmq/rabbitmq.conf +18 -0
  88. package/lib/vendor/blamejs/docker/redis/redis.conf +15 -0
  89. package/lib/vendor/blamejs/docker/squid/squid.conf +24 -0
  90. package/lib/vendor/blamejs/docker/syslog/syslog-ng.conf +34 -0
  91. package/lib/vendor/blamejs/docker-compose.test.yml +545 -0
  92. package/lib/vendor/blamejs/docs/cis-postgres-crosswalk.md +102 -0
  93. package/lib/vendor/blamejs/docs/cis-sqlite-equivalent.md +92 -0
  94. package/lib/vendor/blamejs/eslint.config.mjs +204 -0
  95. package/lib/vendor/blamejs/examples/wiki/Caddyfile +40 -0
  96. package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +218 -0
  97. package/lib/vendor/blamejs/examples/wiki/Dockerfile +120 -0
  98. package/lib/vendor/blamejs/examples/wiki/README.md +157 -0
  99. package/lib/vendor/blamejs/examples/wiki/cli-snapshot.json +250 -0
  100. package/lib/vendor/blamejs/examples/wiki/docker-compose.prod.yml +231 -0
  101. package/lib/vendor/blamejs/examples/wiki/docker-compose.yml +166 -0
  102. package/lib/vendor/blamejs/examples/wiki/env-snapshot.json +217 -0
  103. package/lib/vendor/blamejs/examples/wiki/lib/auto-site-entries.js +139 -0
  104. package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +555 -0
  105. package/lib/vendor/blamejs/examples/wiki/lib/harvest-cli.js +507 -0
  106. package/lib/vendor/blamejs/examples/wiki/lib/harvest-env-vars.js +435 -0
  107. package/lib/vendor/blamejs/examples/wiki/lib/harvest-errors.js +282 -0
  108. package/lib/vendor/blamejs/examples/wiki/lib/harvest-vendored-deps.js +321 -0
  109. package/lib/vendor/blamejs/examples/wiki/lib/nav.js +15 -0
  110. package/lib/vendor/blamejs/examples/wiki/lib/opts-resolver.js +75 -0
  111. package/lib/vendor/blamejs/examples/wiki/lib/page-generator.js +508 -0
  112. package/lib/vendor/blamejs/examples/wiki/lib/section.js +276 -0
  113. package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +587 -0
  114. package/lib/vendor/blamejs/examples/wiki/lib/source-doc-parser.js +318 -0
  115. package/lib/vendor/blamejs/examples/wiki/lib/symbol-index.js +122 -0
  116. package/lib/vendor/blamejs/examples/wiki/migrations/0001-pages-schema.js +74 -0
  117. package/lib/vendor/blamejs/examples/wiki/package.json +18 -0
  118. package/lib/vendor/blamejs/examples/wiki/public/img/blamejs-logo.png +0 -0
  119. package/lib/vendor/blamejs/examples/wiki/public/img/blamejs-logo.svg +129 -0
  120. package/lib/vendor/blamejs/examples/wiki/public/robots.txt +5 -0
  121. package/lib/vendor/blamejs/examples/wiki/public/vendor/MANIFEST.json +30 -0
  122. package/lib/vendor/blamejs/examples/wiki/public/vendor/prism.css +1 -0
  123. package/lib/vendor/blamejs/examples/wiki/public/vendor/prism.js +15 -0
  124. package/lib/vendor/blamejs/examples/wiki/public/wiki.css +1250 -0
  125. package/lib/vendor/blamejs/examples/wiki/routes/admin.js +366 -0
  126. package/lib/vendor/blamejs/examples/wiki/routes/integration.js +230 -0
  127. package/lib/vendor/blamejs/examples/wiki/routes/pages.js +266 -0
  128. package/lib/vendor/blamejs/examples/wiki/scripts/backfill-module-metadata.js +214 -0
  129. package/lib/vendor/blamejs/examples/wiki/seeders/prod/0001-default-pages.js +35 -0
  130. package/lib/vendor/blamejs/examples/wiki/seeders/prod/pages/_index.js +34 -0
  131. package/lib/vendor/blamejs/examples/wiki/seeders/prod/pages/api.js +76 -0
  132. package/lib/vendor/blamejs/examples/wiki/server.js +129 -0
  133. package/lib/vendor/blamejs/examples/wiki/site.config.js +197 -0
  134. package/lib/vendor/blamejs/examples/wiki/snippets/README.md +38 -0
  135. package/lib/vendor/blamejs/examples/wiki/snippets/auth/password-hash.example.js +15 -0
  136. package/lib/vendor/blamejs/examples/wiki/src/editor.js +103 -0
  137. package/lib/vendor/blamejs/examples/wiki/src/wiki.js +349 -0
  138. package/lib/vendor/blamejs/examples/wiki/test/AUDIT.md +155 -0
  139. package/lib/vendor/blamejs/examples/wiki/test/codebase-patterns.test.js +594 -0
  140. package/lib/vendor/blamejs/examples/wiki/test/e2e.js +741 -0
  141. package/lib/vendor/blamejs/examples/wiki/test/find-missing-pages.js +254 -0
  142. package/lib/vendor/blamejs/examples/wiki/test/integration.js +391 -0
  143. package/lib/vendor/blamejs/examples/wiki/test/validate-cli-snapshot.js +379 -0
  144. package/lib/vendor/blamejs/examples/wiki/test/validate-env-snapshot.js +346 -0
  145. package/lib/vendor/blamejs/examples/wiki/test/validate-nav-coverage.js +212 -0
  146. package/lib/vendor/blamejs/examples/wiki/test/validate-site-coverage.js +252 -0
  147. package/lib/vendor/blamejs/examples/wiki/test/validate-source-comment-blocks.js +107 -0
  148. package/lib/vendor/blamejs/examples/wiki/views/_layout.html +115 -0
  149. package/lib/vendor/blamejs/examples/wiki/views/admin/api-keys.html +51 -0
  150. package/lib/vendor/blamejs/examples/wiki/views/admin/dashboard.html +22 -0
  151. package/lib/vendor/blamejs/examples/wiki/views/admin/edit.html +17 -0
  152. package/lib/vendor/blamejs/examples/wiki/views/home.html +85 -0
  153. package/lib/vendor/blamejs/examples/wiki/views/login.html +18 -0
  154. package/lib/vendor/blamejs/examples/wiki/views/page.html +5 -0
  155. package/lib/vendor/blamejs/examples/wiki/views/partials/nav.html +13 -0
  156. package/lib/vendor/blamejs/examples/wiki/views/search.html +19 -0
  157. package/lib/vendor/blamejs/examples/wiki/wiki.config.js +15 -0
  158. package/lib/vendor/blamejs/fuzz/README.md +137 -0
  159. package/lib/vendor/blamejs/fuzz/_expected.js +35 -0
  160. package/lib/vendor/blamejs/fuzz/guard-agent-registry.fuzz.js +22 -0
  161. package/lib/vendor/blamejs/fuzz/guard-csv.fuzz.js +16 -0
  162. package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/01-basic.csv +3 -0
  163. package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/02-formula.csv +1 -0
  164. package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/03-hyperlink.csv +1 -0
  165. package/lib/vendor/blamejs/fuzz/guard-dsn.fuzz.js +22 -0
  166. package/lib/vendor/blamejs/fuzz/guard-email.fuzz.js +16 -0
  167. package/lib/vendor/blamejs/fuzz/guard-email_seed_corpus/01-basic.eml +5 -0
  168. package/lib/vendor/blamejs/fuzz/guard-envelope.fuzz.js +24 -0
  169. package/lib/vendor/blamejs/fuzz/guard-event-bus-payload.fuzz.js +24 -0
  170. package/lib/vendor/blamejs/fuzz/guard-event-bus-topic.fuzz.js +20 -0
  171. package/lib/vendor/blamejs/fuzz/guard-html.fuzz.js +16 -0
  172. package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/01-basic.html +1 -0
  173. package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/02-script.html +1 -0
  174. package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/03-event.html +1 -0
  175. package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/04-jsurl.html +1 -0
  176. package/lib/vendor/blamejs/fuzz/guard-idempotency-key.fuzz.js +20 -0
  177. package/lib/vendor/blamejs/fuzz/guard-imap-command.fuzz.js +35 -0
  178. package/lib/vendor/blamejs/fuzz/guard-jmap.fuzz.js +41 -0
  179. package/lib/vendor/blamejs/fuzz/guard-json.fuzz.js +16 -0
  180. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/01-basic.json +1 -0
  181. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/02-proto.json +1 -0
  182. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/03-dupkey.json +1 -0
  183. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/04-nan.json +1 -0
  184. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/05-bom.json +1 -0
  185. package/lib/vendor/blamejs/fuzz/guard-list-id.fuzz.js +21 -0
  186. package/lib/vendor/blamejs/fuzz/guard-list-unsubscribe.fuzz.js +25 -0
  187. package/lib/vendor/blamejs/fuzz/guard-mail-compose.fuzz.js +22 -0
  188. package/lib/vendor/blamejs/fuzz/guard-mail-move.fuzz.js +22 -0
  189. package/lib/vendor/blamejs/fuzz/guard-mail-query.fuzz.js +27 -0
  190. package/lib/vendor/blamejs/fuzz/guard-mail-reply.fuzz.js +23 -0
  191. package/lib/vendor/blamejs/fuzz/guard-mail-sieve.fuzz.js +36 -0
  192. package/lib/vendor/blamejs/fuzz/guard-managesieve-command.fuzz.js +26 -0
  193. package/lib/vendor/blamejs/fuzz/guard-markdown.fuzz.js +16 -0
  194. package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/01-basic.md +2 -0
  195. package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/02-jsurl.md +1 -0
  196. package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/03-jsimg.md +1 -0
  197. package/lib/vendor/blamejs/fuzz/guard-message-id.fuzz.js +26 -0
  198. package/lib/vendor/blamejs/fuzz/guard-pop3-command.fuzz.js +23 -0
  199. package/lib/vendor/blamejs/fuzz/guard-posture-chain.fuzz.js +22 -0
  200. package/lib/vendor/blamejs/fuzz/guard-saga-config.fuzz.js +32 -0
  201. package/lib/vendor/blamejs/fuzz/guard-smtp-command.fuzz.js +27 -0
  202. package/lib/vendor/blamejs/fuzz/guard-snapshot-envelope.fuzz.js +22 -0
  203. package/lib/vendor/blamejs/fuzz/guard-stream-args.fuzz.js +22 -0
  204. package/lib/vendor/blamejs/fuzz/guard-svg.fuzz.js +16 -0
  205. package/lib/vendor/blamejs/fuzz/guard-svg_seed_corpus/01-basic.svg +1 -0
  206. package/lib/vendor/blamejs/fuzz/guard-svg_seed_corpus/02-script.svg +1 -0
  207. package/lib/vendor/blamejs/fuzz/guard-tenant-id.fuzz.js +20 -0
  208. package/lib/vendor/blamejs/fuzz/guard-trace-context.fuzz.js +30 -0
  209. package/lib/vendor/blamejs/fuzz/guard-xml.fuzz.js +16 -0
  210. package/lib/vendor/blamejs/fuzz/guard-xml_seed_corpus/01-basic.xml +1 -0
  211. package/lib/vendor/blamejs/fuzz/guard-xml_seed_corpus/02-xxe.xml +1 -0
  212. package/lib/vendor/blamejs/fuzz/guard-yaml.fuzz.js +16 -0
  213. package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/01-basic.yaml +2 -0
  214. package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/02-anchor.yaml +2 -0
  215. package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/03-norway.yaml +1 -0
  216. package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/04-multidoc.yaml +4 -0
  217. package/lib/vendor/blamejs/fuzz/parsers__safe-ini.fuzz.js +16 -0
  218. package/lib/vendor/blamejs/fuzz/parsers__safe-ini_seed_corpus/01-basic.ini +2 -0
  219. package/lib/vendor/blamejs/fuzz/parsers__safe-toml.fuzz.js +16 -0
  220. package/lib/vendor/blamejs/fuzz/parsers__safe-toml_seed_corpus/01-basic.toml +4 -0
  221. package/lib/vendor/blamejs/fuzz/parsers__safe-xml.fuzz.js +16 -0
  222. package/lib/vendor/blamejs/fuzz/parsers__safe-xml_seed_corpus/01-basic.xml +1 -0
  223. package/lib/vendor/blamejs/fuzz/parsers__safe-yaml.fuzz.js +16 -0
  224. package/lib/vendor/blamejs/fuzz/parsers__safe-yaml_seed_corpus/01-basic.yaml +4 -0
  225. package/lib/vendor/blamejs/fuzz/safe-decompress.fuzz.js +49 -0
  226. package/lib/vendor/blamejs/fuzz/safe-dns.fuzz.js +29 -0
  227. package/lib/vendor/blamejs/fuzz/safe-ical.fuzz.js +16 -0
  228. package/lib/vendor/blamejs/fuzz/safe-icap.fuzz.js +42 -0
  229. package/lib/vendor/blamejs/fuzz/safe-json.fuzz.js +25 -0
  230. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/01-object.txt +1 -0
  231. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/02-array.txt +1 -0
  232. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/03-string.txt +1 -0
  233. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/04-proto.txt +1 -0
  234. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/05-deep.txt +1 -0
  235. package/lib/vendor/blamejs/fuzz/safe-jsonpath.fuzz.js +16 -0
  236. package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/01-basic.txt +1 -0
  237. package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/02-filter.txt +1 -0
  238. package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/03-deepscan.txt +1 -0
  239. package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/04-slice.txt +1 -0
  240. package/lib/vendor/blamejs/fuzz/safe-mime.fuzz.js +27 -0
  241. package/lib/vendor/blamejs/fuzz/safe-mount-info.fuzz.js +33 -0
  242. package/lib/vendor/blamejs/fuzz/safe-sieve.fuzz.js +28 -0
  243. package/lib/vendor/blamejs/fuzz/safe-smtp.fuzz.js +64 -0
  244. package/lib/vendor/blamejs/fuzz/safe-url.fuzz.js +16 -0
  245. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/01-basic.txt +1 -0
  246. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/02-userinfo.txt +1 -0
  247. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/03-dangerous.txt +1 -0
  248. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/04-data.txt +1 -0
  249. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/05-ipv6.txt +1 -0
  250. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/06-idn.txt +1 -0
  251. package/lib/vendor/blamejs/fuzz/safe-vcard.fuzz.js +16 -0
  252. package/lib/vendor/blamejs/index.js +678 -0
  253. package/lib/vendor/blamejs/keys/release-pqc-pub.json +7 -0
  254. package/lib/vendor/blamejs/lib/_test/crypto-fixtures.js +67 -0
  255. package/lib/vendor/blamejs/lib/a2a-tasks.js +598 -0
  256. package/lib/vendor/blamejs/lib/a2a.js +407 -0
  257. package/lib/vendor/blamejs/lib/acme.js +1448 -0
  258. package/lib/vendor/blamejs/lib/agent-audit.js +45 -0
  259. package/lib/vendor/blamejs/lib/agent-event-bus.js +382 -0
  260. package/lib/vendor/blamejs/lib/agent-idempotency.js +497 -0
  261. package/lib/vendor/blamejs/lib/agent-orchestrator.js +717 -0
  262. package/lib/vendor/blamejs/lib/agent-posture-chain.js +366 -0
  263. package/lib/vendor/blamejs/lib/agent-saga.js +321 -0
  264. package/lib/vendor/blamejs/lib/agent-snapshot.js +676 -0
  265. package/lib/vendor/blamejs/lib/agent-stream.js +269 -0
  266. package/lib/vendor/blamejs/lib/agent-tenant.js +632 -0
  267. package/lib/vendor/blamejs/lib/agent-trace.js +281 -0
  268. package/lib/vendor/blamejs/lib/ai-adverse-decision.js +184 -0
  269. package/lib/vendor/blamejs/lib/ai-content-detect.js +268 -0
  270. package/lib/vendor/blamejs/lib/ai-input.js +201 -0
  271. package/lib/vendor/blamejs/lib/ai-model-manifest.js +363 -0
  272. package/lib/vendor/blamejs/lib/ai-pref.js +340 -0
  273. package/lib/vendor/blamejs/lib/api-key.js +721 -0
  274. package/lib/vendor/blamejs/lib/api-snapshot.js +458 -0
  275. package/lib/vendor/blamejs/lib/app-shutdown.js +557 -0
  276. package/lib/vendor/blamejs/lib/app.js +365 -0
  277. package/lib/vendor/blamejs/lib/archive.js +547 -0
  278. package/lib/vendor/blamejs/lib/arg-parser.js +697 -0
  279. package/lib/vendor/blamejs/lib/argon2-builtin.js +173 -0
  280. package/lib/vendor/blamejs/lib/asn1-der.js +424 -0
  281. package/lib/vendor/blamejs/lib/asyncapi-bindings.js +160 -0
  282. package/lib/vendor/blamejs/lib/asyncapi-traits.js +143 -0
  283. package/lib/vendor/blamejs/lib/asyncapi.js +575 -0
  284. package/lib/vendor/blamejs/lib/atomic-file.js +1023 -0
  285. package/lib/vendor/blamejs/lib/audit-chain.js +266 -0
  286. package/lib/vendor/blamejs/lib/audit-daily-review.js +389 -0
  287. package/lib/vendor/blamejs/lib/audit-sign.js +751 -0
  288. package/lib/vendor/blamejs/lib/audit-tools.js +1113 -0
  289. package/lib/vendor/blamejs/lib/audit.js +1671 -0
  290. package/lib/vendor/blamejs/lib/auth/aal.js +169 -0
  291. package/lib/vendor/blamejs/lib/auth/access-lock.js +220 -0
  292. package/lib/vendor/blamejs/lib/auth/acr-vocabulary.js +265 -0
  293. package/lib/vendor/blamejs/lib/auth/ato-kill-switch.js +112 -0
  294. package/lib/vendor/blamejs/lib/auth/auth-time-tracker.js +111 -0
  295. package/lib/vendor/blamejs/lib/auth/bot-challenge.js +573 -0
  296. package/lib/vendor/blamejs/lib/auth/ciba.js +637 -0
  297. package/lib/vendor/blamejs/lib/auth/dpop.js +516 -0
  298. package/lib/vendor/blamejs/lib/auth/elevation-grant.js +306 -0
  299. package/lib/vendor/blamejs/lib/auth/fal.js +229 -0
  300. package/lib/vendor/blamejs/lib/auth/fido-mds3.js +681 -0
  301. package/lib/vendor/blamejs/lib/auth/jwt-external.js +519 -0
  302. package/lib/vendor/blamejs/lib/auth/jwt.js +430 -0
  303. package/lib/vendor/blamejs/lib/auth/lockout.js +449 -0
  304. package/lib/vendor/blamejs/lib/auth/oauth.js +2141 -0
  305. package/lib/vendor/blamejs/lib/auth/oid4vci.js +657 -0
  306. package/lib/vendor/blamejs/lib/auth/oid4vp.js +531 -0
  307. package/lib/vendor/blamejs/lib/auth/openid-federation.js +600 -0
  308. package/lib/vendor/blamejs/lib/auth/passkey.js +676 -0
  309. package/lib/vendor/blamejs/lib/auth/password.js +693 -0
  310. package/lib/vendor/blamejs/lib/auth/saml.js +2109 -0
  311. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-disclosure.js +95 -0
  312. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-holder.js +225 -0
  313. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-issuer.js +197 -0
  314. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +728 -0
  315. package/lib/vendor/blamejs/lib/auth/status-list.js +272 -0
  316. package/lib/vendor/blamejs/lib/auth/step-up-policy.js +335 -0
  317. package/lib/vendor/blamejs/lib/auth/step-up.js +454 -0
  318. package/lib/vendor/blamejs/lib/auth-bot-challenge.js +505 -0
  319. package/lib/vendor/blamejs/lib/auth-header.js +148 -0
  320. package/lib/vendor/blamejs/lib/backup/bundle.js +265 -0
  321. package/lib/vendor/blamejs/lib/backup/crypto.js +176 -0
  322. package/lib/vendor/blamejs/lib/backup/index.js +1001 -0
  323. package/lib/vendor/blamejs/lib/backup/manifest.js +443 -0
  324. package/lib/vendor/blamejs/lib/boot-gates.js +174 -0
  325. package/lib/vendor/blamejs/lib/breach-deadline.js +272 -0
  326. package/lib/vendor/blamejs/lib/break-glass.js +1753 -0
  327. package/lib/vendor/blamejs/lib/budr.js +205 -0
  328. package/lib/vendor/blamejs/lib/bundler.js +461 -0
  329. package/lib/vendor/blamejs/lib/cache-redis.js +256 -0
  330. package/lib/vendor/blamejs/lib/cache-status.js +288 -0
  331. package/lib/vendor/blamejs/lib/cache.js +1331 -0
  332. package/lib/vendor/blamejs/lib/calendar.js +1240 -0
  333. package/lib/vendor/blamejs/lib/canonical-json.js +143 -0
  334. package/lib/vendor/blamejs/lib/cdn-cache-control.js +473 -0
  335. package/lib/vendor/blamejs/lib/cert.js +763 -0
  336. package/lib/vendor/blamejs/lib/chain-writer.js +259 -0
  337. package/lib/vendor/blamejs/lib/circuit-breaker.js +101 -0
  338. package/lib/vendor/blamejs/lib/cli-helpers.js +237 -0
  339. package/lib/vendor/blamejs/lib/cli.js +2328 -0
  340. package/lib/vendor/blamejs/lib/client-hints.js +318 -0
  341. package/lib/vendor/blamejs/lib/cloud-events.js +277 -0
  342. package/lib/vendor/blamejs/lib/cluster-provider-db.js +317 -0
  343. package/lib/vendor/blamejs/lib/cluster-storage.js +351 -0
  344. package/lib/vendor/blamejs/lib/cluster.js +1017 -0
  345. package/lib/vendor/blamejs/lib/cms-codec.js +826 -0
  346. package/lib/vendor/blamejs/lib/codepoint-class.js +262 -0
  347. package/lib/vendor/blamejs/lib/compliance-ai-act-logging.js +190 -0
  348. package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +205 -0
  349. package/lib/vendor/blamejs/lib/compliance-ai-act-risk.js +189 -0
  350. package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +200 -0
  351. package/lib/vendor/blamejs/lib/compliance-ai-act.js +821 -0
  352. package/lib/vendor/blamejs/lib/compliance-eaa.js +204 -0
  353. package/lib/vendor/blamejs/lib/compliance-sanctions-aliases.js +167 -0
  354. package/lib/vendor/blamejs/lib/compliance-sanctions-fetcher.js +206 -0
  355. package/lib/vendor/blamejs/lib/compliance-sanctions-fuzzy.js +297 -0
  356. package/lib/vendor/blamejs/lib/compliance-sanctions.js +569 -0
  357. package/lib/vendor/blamejs/lib/compliance.js +1558 -0
  358. package/lib/vendor/blamejs/lib/config-drift.js +426 -0
  359. package/lib/vendor/blamejs/lib/config.js +446 -0
  360. package/lib/vendor/blamejs/lib/consent.js +369 -0
  361. package/lib/vendor/blamejs/lib/constants.js +209 -0
  362. package/lib/vendor/blamejs/lib/content-credentials.js +704 -0
  363. package/lib/vendor/blamejs/lib/cookies.js +560 -0
  364. package/lib/vendor/blamejs/lib/cra-report.js +299 -0
  365. package/lib/vendor/blamejs/lib/credential-hash.js +394 -0
  366. package/lib/vendor/blamejs/lib/crypto-field.js +1017 -0
  367. package/lib/vendor/blamejs/lib/crypto-hpke-pq.js +187 -0
  368. package/lib/vendor/blamejs/lib/crypto-hpke.js +256 -0
  369. package/lib/vendor/blamejs/lib/crypto.js +1908 -0
  370. package/lib/vendor/blamejs/lib/csp.js +271 -0
  371. package/lib/vendor/blamejs/lib/csv.js +418 -0
  372. package/lib/vendor/blamejs/lib/daemon.js +481 -0
  373. package/lib/vendor/blamejs/lib/dark-patterns.js +488 -0
  374. package/lib/vendor/blamejs/lib/data-act.js +328 -0
  375. package/lib/vendor/blamejs/lib/db-collection.js +587 -0
  376. package/lib/vendor/blamejs/lib/db-declare-row-policy.js +267 -0
  377. package/lib/vendor/blamejs/lib/db-declare-view.js +420 -0
  378. package/lib/vendor/blamejs/lib/db-file-lifecycle.js +333 -0
  379. package/lib/vendor/blamejs/lib/db-query.js +802 -0
  380. package/lib/vendor/blamejs/lib/db-role-context.js +50 -0
  381. package/lib/vendor/blamejs/lib/db-schema.js +322 -0
  382. package/lib/vendor/blamejs/lib/db.js +3111 -0
  383. package/lib/vendor/blamejs/lib/dbsc.js +299 -0
  384. package/lib/vendor/blamejs/lib/ddl-change-control.js +523 -0
  385. package/lib/vendor/blamejs/lib/deprecate.js +377 -0
  386. package/lib/vendor/blamejs/lib/dev.js +405 -0
  387. package/lib/vendor/blamejs/lib/dora.js +402 -0
  388. package/lib/vendor/blamejs/lib/dr-runbook.js +368 -0
  389. package/lib/vendor/blamejs/lib/dsr.js +1188 -0
  390. package/lib/vendor/blamejs/lib/dual-control.js +526 -0
  391. package/lib/vendor/blamejs/lib/early-hints.js +212 -0
  392. package/lib/vendor/blamejs/lib/error-page.js +420 -0
  393. package/lib/vendor/blamejs/lib/events.js +214 -0
  394. package/lib/vendor/blamejs/lib/external-db-migrate.js +659 -0
  395. package/lib/vendor/blamejs/lib/external-db.js +1877 -0
  396. package/lib/vendor/blamejs/lib/fapi2.js +394 -0
  397. package/lib/vendor/blamejs/lib/fda-21cfr11.js +395 -0
  398. package/lib/vendor/blamejs/lib/fdx.js +370 -0
  399. package/lib/vendor/blamejs/lib/fedcm.js +264 -0
  400. package/lib/vendor/blamejs/lib/file-type.js +360 -0
  401. package/lib/vendor/blamejs/lib/file-upload.js +1256 -0
  402. package/lib/vendor/blamejs/lib/flag-cache.js +136 -0
  403. package/lib/vendor/blamejs/lib/flag-evaluation-context.js +135 -0
  404. package/lib/vendor/blamejs/lib/flag-providers.js +279 -0
  405. package/lib/vendor/blamejs/lib/flag-targeting.js +210 -0
  406. package/lib/vendor/blamejs/lib/flag.js +346 -0
  407. package/lib/vendor/blamejs/lib/forms.js +525 -0
  408. package/lib/vendor/blamejs/lib/framework-error.js +724 -0
  409. package/lib/vendor/blamejs/lib/framework-schema.js +845 -0
  410. package/lib/vendor/blamejs/lib/framework-sha1-hibp.js +34 -0
  411. package/lib/vendor/blamejs/lib/fsm.js +469 -0
  412. package/lib/vendor/blamejs/lib/gate-contract.js +1661 -0
  413. package/lib/vendor/blamejs/lib/gdpr-ropa.js +261 -0
  414. package/lib/vendor/blamejs/lib/graphql-federation.js +234 -0
  415. package/lib/vendor/blamejs/lib/guard-agent-registry.js +179 -0
  416. package/lib/vendor/blamejs/lib/guard-all.js +555 -0
  417. package/lib/vendor/blamejs/lib/guard-archive.js +901 -0
  418. package/lib/vendor/blamejs/lib/guard-auth.js +451 -0
  419. package/lib/vendor/blamejs/lib/guard-cidr.js +676 -0
  420. package/lib/vendor/blamejs/lib/guard-csv.js +1176 -0
  421. package/lib/vendor/blamejs/lib/guard-domain.js +814 -0
  422. package/lib/vendor/blamejs/lib/guard-dsn.js +382 -0
  423. package/lib/vendor/blamejs/lib/guard-email.js +951 -0
  424. package/lib/vendor/blamejs/lib/guard-envelope.js +294 -0
  425. package/lib/vendor/blamejs/lib/guard-event-bus-payload.js +217 -0
  426. package/lib/vendor/blamejs/lib/guard-event-bus-topic.js +150 -0
  427. package/lib/vendor/blamejs/lib/guard-filename.js +956 -0
  428. package/lib/vendor/blamejs/lib/guard-graphql.js +731 -0
  429. package/lib/vendor/blamejs/lib/guard-html-wcag-aria.js +164 -0
  430. package/lib/vendor/blamejs/lib/guard-html-wcag-forms.js +144 -0
  431. package/lib/vendor/blamejs/lib/guard-html-wcag-tables.js +154 -0
  432. package/lib/vendor/blamejs/lib/guard-html-wcag-tagwalk.js +44 -0
  433. package/lib/vendor/blamejs/lib/guard-html-wcag.js +470 -0
  434. package/lib/vendor/blamejs/lib/guard-html.js +1209 -0
  435. package/lib/vendor/blamejs/lib/guard-idempotency-key.js +151 -0
  436. package/lib/vendor/blamejs/lib/guard-image.js +584 -0
  437. package/lib/vendor/blamejs/lib/guard-imap-command.js +337 -0
  438. package/lib/vendor/blamejs/lib/guard-jmap.js +321 -0
  439. package/lib/vendor/blamejs/lib/guard-json.js +935 -0
  440. package/lib/vendor/blamejs/lib/guard-jsonpath.js +512 -0
  441. package/lib/vendor/blamejs/lib/guard-jwt.js +772 -0
  442. package/lib/vendor/blamejs/lib/guard-list-id.js +318 -0
  443. package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +412 -0
  444. package/lib/vendor/blamejs/lib/guard-mail-compose.js +282 -0
  445. package/lib/vendor/blamejs/lib/guard-mail-move.js +202 -0
  446. package/lib/vendor/blamejs/lib/guard-mail-query.js +310 -0
  447. package/lib/vendor/blamejs/lib/guard-mail-reply.js +172 -0
  448. package/lib/vendor/blamejs/lib/guard-mail-sieve.js +207 -0
  449. package/lib/vendor/blamejs/lib/guard-managesieve-command.js +566 -0
  450. package/lib/vendor/blamejs/lib/guard-markdown.js +768 -0
  451. package/lib/vendor/blamejs/lib/guard-message-id.js +267 -0
  452. package/lib/vendor/blamejs/lib/guard-mime.js +609 -0
  453. package/lib/vendor/blamejs/lib/guard-oauth.js +650 -0
  454. package/lib/vendor/blamejs/lib/guard-pdf.js +569 -0
  455. package/lib/vendor/blamejs/lib/guard-pop3-command.js +317 -0
  456. package/lib/vendor/blamejs/lib/guard-posture-chain.js +201 -0
  457. package/lib/vendor/blamejs/lib/guard-regex.js +632 -0
  458. package/lib/vendor/blamejs/lib/guard-saga-config.js +157 -0
  459. package/lib/vendor/blamejs/lib/guard-shell.js +522 -0
  460. package/lib/vendor/blamejs/lib/guard-smtp-command.js +594 -0
  461. package/lib/vendor/blamejs/lib/guard-snapshot-envelope.js +168 -0
  462. package/lib/vendor/blamejs/lib/guard-stream-args.js +166 -0
  463. package/lib/vendor/blamejs/lib/guard-svg.js +1163 -0
  464. package/lib/vendor/blamejs/lib/guard-template.js +490 -0
  465. package/lib/vendor/blamejs/lib/guard-tenant-id.js +138 -0
  466. package/lib/vendor/blamejs/lib/guard-time.js +586 -0
  467. package/lib/vendor/blamejs/lib/guard-trace-context.js +172 -0
  468. package/lib/vendor/blamejs/lib/guard-uuid.js +548 -0
  469. package/lib/vendor/blamejs/lib/guard-xml.js +666 -0
  470. package/lib/vendor/blamejs/lib/guard-yaml.js +726 -0
  471. package/lib/vendor/blamejs/lib/hal.js +125 -0
  472. package/lib/vendor/blamejs/lib/handlers.js +350 -0
  473. package/lib/vendor/blamejs/lib/honeytoken.js +168 -0
  474. package/lib/vendor/blamejs/lib/html-balance.js +347 -0
  475. package/lib/vendor/blamejs/lib/http-client-cache.js +923 -0
  476. package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +519 -0
  477. package/lib/vendor/blamejs/lib/http-client.js +2152 -0
  478. package/lib/vendor/blamejs/lib/http-message-signature.js +589 -0
  479. package/lib/vendor/blamejs/lib/http2-teardown.js +34 -0
  480. package/lib/vendor/blamejs/lib/i18n-messageformat.js +398 -0
  481. package/lib/vendor/blamejs/lib/i18n.js +931 -0
  482. package/lib/vendor/blamejs/lib/iab-mspa.js +257 -0
  483. package/lib/vendor/blamejs/lib/iab-tcf.js +461 -0
  484. package/lib/vendor/blamejs/lib/importmap-integrity.js +90 -0
  485. package/lib/vendor/blamejs/lib/inbox.js +435 -0
  486. package/lib/vendor/blamejs/lib/incident-report.js +314 -0
  487. package/lib/vendor/blamejs/lib/ip-utils.js +102 -0
  488. package/lib/vendor/blamejs/lib/jobs.js +185 -0
  489. package/lib/vendor/blamejs/lib/jose-jwe-experimental.js +228 -0
  490. package/lib/vendor/blamejs/lib/jsonapi.js +230 -0
  491. package/lib/vendor/blamejs/lib/keychain.js +865 -0
  492. package/lib/vendor/blamejs/lib/lazy-require.js +48 -0
  493. package/lib/vendor/blamejs/lib/legal-hold.js +374 -0
  494. package/lib/vendor/blamejs/lib/local-db-thin.js +321 -0
  495. package/lib/vendor/blamejs/lib/log-stream-cloudwatch.js +369 -0
  496. package/lib/vendor/blamejs/lib/log-stream-local.js +146 -0
  497. package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +410 -0
  498. package/lib/vendor/blamejs/lib/log-stream-otlp.js +286 -0
  499. package/lib/vendor/blamejs/lib/log-stream-syslog.js +310 -0
  500. package/lib/vendor/blamejs/lib/log-stream-webhook.js +199 -0
  501. package/lib/vendor/blamejs/lib/log-stream.js +584 -0
  502. package/lib/vendor/blamejs/lib/log.js +625 -0
  503. package/lib/vendor/blamejs/lib/lro.js +200 -0
  504. package/lib/vendor/blamejs/lib/mail-agent.js +786 -0
  505. package/lib/vendor/blamejs/lib/mail-arc-sign.js +417 -0
  506. package/lib/vendor/blamejs/lib/mail-arf.js +343 -0
  507. package/lib/vendor/blamejs/lib/mail-auth.js +2144 -0
  508. package/lib/vendor/blamejs/lib/mail-bimi.js +1047 -0
  509. package/lib/vendor/blamejs/lib/mail-bounce.js +955 -0
  510. package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +1286 -0
  511. package/lib/vendor/blamejs/lib/mail-crypto-smime.js +789 -0
  512. package/lib/vendor/blamejs/lib/mail-crypto.js +108 -0
  513. package/lib/vendor/blamejs/lib/mail-dav.js +1224 -0
  514. package/lib/vendor/blamejs/lib/mail-deploy.js +1119 -0
  515. package/lib/vendor/blamejs/lib/mail-dkim.js +1250 -0
  516. package/lib/vendor/blamejs/lib/mail-greylist.js +448 -0
  517. package/lib/vendor/blamejs/lib/mail-helo.js +473 -0
  518. package/lib/vendor/blamejs/lib/mail-journal.js +435 -0
  519. package/lib/vendor/blamejs/lib/mail-mdn.js +424 -0
  520. package/lib/vendor/blamejs/lib/mail-rbl.js +392 -0
  521. package/lib/vendor/blamejs/lib/mail-require-tls.js +198 -0
  522. package/lib/vendor/blamejs/lib/mail-scan.js +502 -0
  523. package/lib/vendor/blamejs/lib/mail-send-deliver.js +629 -0
  524. package/lib/vendor/blamejs/lib/mail-server-imap.js +1858 -0
  525. package/lib/vendor/blamejs/lib/mail-server-jmap.js +1565 -0
  526. package/lib/vendor/blamejs/lib/mail-server-managesieve.js +908 -0
  527. package/lib/vendor/blamejs/lib/mail-server-mx.js +969 -0
  528. package/lib/vendor/blamejs/lib/mail-server-pop3.js +915 -0
  529. package/lib/vendor/blamejs/lib/mail-server-rate-limit.js +315 -0
  530. package/lib/vendor/blamejs/lib/mail-server-registry.js +378 -0
  531. package/lib/vendor/blamejs/lib/mail-server-submission.js +1396 -0
  532. package/lib/vendor/blamejs/lib/mail-server-tls.js +445 -0
  533. package/lib/vendor/blamejs/lib/mail-sieve.js +557 -0
  534. package/lib/vendor/blamejs/lib/mail-spam-score.js +284 -0
  535. package/lib/vendor/blamejs/lib/mail-srs.js +248 -0
  536. package/lib/vendor/blamejs/lib/mail-store-fts.js +394 -0
  537. package/lib/vendor/blamejs/lib/mail-store.js +929 -0
  538. package/lib/vendor/blamejs/lib/mail-unsubscribe.js +400 -0
  539. package/lib/vendor/blamejs/lib/mail.js +1971 -0
  540. package/lib/vendor/blamejs/lib/mcp-tool-registry.js +473 -0
  541. package/lib/vendor/blamejs/lib/mcp.js +950 -0
  542. package/lib/vendor/blamejs/lib/metrics.js +1503 -0
  543. package/lib/vendor/blamejs/lib/middleware/age-gate.js +177 -0
  544. package/lib/vendor/blamejs/lib/middleware/ai-act-disclosure.js +203 -0
  545. package/lib/vendor/blamejs/lib/middleware/api-encrypt.js +981 -0
  546. package/lib/vendor/blamejs/lib/middleware/assetlinks.js +137 -0
  547. package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +171 -0
  548. package/lib/vendor/blamejs/lib/middleware/attach-user.js +220 -0
  549. package/lib/vendor/blamejs/lib/middleware/bearer-auth.js +293 -0
  550. package/lib/vendor/blamejs/lib/middleware/body-parser.js +1519 -0
  551. package/lib/vendor/blamejs/lib/middleware/bot-disclose.js +183 -0
  552. package/lib/vendor/blamejs/lib/middleware/bot-guard.js +217 -0
  553. package/lib/vendor/blamejs/lib/middleware/clear-site-data.js +122 -0
  554. package/lib/vendor/blamejs/lib/middleware/compose-pipeline.js +355 -0
  555. package/lib/vendor/blamejs/lib/middleware/compression.js +489 -0
  556. package/lib/vendor/blamejs/lib/middleware/cookies.js +130 -0
  557. package/lib/vendor/blamejs/lib/middleware/cors.js +386 -0
  558. package/lib/vendor/blamejs/lib/middleware/csp-nonce.js +388 -0
  559. package/lib/vendor/blamejs/lib/middleware/csp-report.js +167 -0
  560. package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +499 -0
  561. package/lib/vendor/blamejs/lib/middleware/daily-byte-quota.js +243 -0
  562. package/lib/vendor/blamejs/lib/middleware/db-role-for.js +304 -0
  563. package/lib/vendor/blamejs/lib/middleware/dpop.js +402 -0
  564. package/lib/vendor/blamejs/lib/middleware/error-handler.js +69 -0
  565. package/lib/vendor/blamejs/lib/middleware/fetch-metadata.js +168 -0
  566. package/lib/vendor/blamejs/lib/middleware/flag-context.js +110 -0
  567. package/lib/vendor/blamejs/lib/middleware/gpc.js +153 -0
  568. package/lib/vendor/blamejs/lib/middleware/headers.js +242 -0
  569. package/lib/vendor/blamejs/lib/middleware/health.js +438 -0
  570. package/lib/vendor/blamejs/lib/middleware/host-allowlist.js +189 -0
  571. package/lib/vendor/blamejs/lib/middleware/idempotency-key.js +964 -0
  572. package/lib/vendor/blamejs/lib/middleware/index.js +183 -0
  573. package/lib/vendor/blamejs/lib/middleware/nel.js +214 -0
  574. package/lib/vendor/blamejs/lib/middleware/network-allowlist.js +237 -0
  575. package/lib/vendor/blamejs/lib/middleware/no-cache.js +106 -0
  576. package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +177 -0
  577. package/lib/vendor/blamejs/lib/middleware/protected-resource-metadata.js +277 -0
  578. package/lib/vendor/blamejs/lib/middleware/rate-limit.js +556 -0
  579. package/lib/vendor/blamejs/lib/middleware/request-id.js +79 -0
  580. package/lib/vendor/blamejs/lib/middleware/request-log.js +205 -0
  581. package/lib/vendor/blamejs/lib/middleware/require-aal.js +138 -0
  582. package/lib/vendor/blamejs/lib/middleware/require-auth.js +144 -0
  583. package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +290 -0
  584. package/lib/vendor/blamejs/lib/middleware/require-content-type.js +113 -0
  585. package/lib/vendor/blamejs/lib/middleware/require-methods.js +97 -0
  586. package/lib/vendor/blamejs/lib/middleware/require-mtls.js +212 -0
  587. package/lib/vendor/blamejs/lib/middleware/require-step-up.js +226 -0
  588. package/lib/vendor/blamejs/lib/middleware/scim-server.js +375 -0
  589. package/lib/vendor/blamejs/lib/middleware/security-headers.js +285 -0
  590. package/lib/vendor/blamejs/lib/middleware/security-txt.js +170 -0
  591. package/lib/vendor/blamejs/lib/middleware/span-http-server.js +280 -0
  592. package/lib/vendor/blamejs/lib/middleware/speculation-rules.js +323 -0
  593. package/lib/vendor/blamejs/lib/middleware/sse.js +200 -0
  594. package/lib/vendor/blamejs/lib/middleware/trace-log-correlation.js +167 -0
  595. package/lib/vendor/blamejs/lib/middleware/trace-propagate.js +148 -0
  596. package/lib/vendor/blamejs/lib/middleware/tus-upload.js +749 -0
  597. package/lib/vendor/blamejs/lib/middleware/web-app-manifest.js +164 -0
  598. package/lib/vendor/blamejs/lib/migration-files.js +37 -0
  599. package/lib/vendor/blamejs/lib/migrations.js +385 -0
  600. package/lib/vendor/blamejs/lib/mime-parse.js +198 -0
  601. package/lib/vendor/blamejs/lib/money.js +699 -0
  602. package/lib/vendor/blamejs/lib/mtls-ca.js +572 -0
  603. package/lib/vendor/blamejs/lib/mtls-engine-default.js +501 -0
  604. package/lib/vendor/blamejs/lib/network-byte-quota.js +308 -0
  605. package/lib/vendor/blamejs/lib/network-dns-resolver.js +533 -0
  606. package/lib/vendor/blamejs/lib/network-dns.js +1930 -0
  607. package/lib/vendor/blamejs/lib/network-heartbeat.js +425 -0
  608. package/lib/vendor/blamejs/lib/network-nts.js +574 -0
  609. package/lib/vendor/blamejs/lib/network-proxy.js +265 -0
  610. package/lib/vendor/blamejs/lib/network-smtp-policy.js +836 -0
  611. package/lib/vendor/blamejs/lib/network-tls.js +3126 -0
  612. package/lib/vendor/blamejs/lib/network.js +346 -0
  613. package/lib/vendor/blamejs/lib/nis2-report.js +181 -0
  614. package/lib/vendor/blamejs/lib/nist-crosswalk.js +293 -0
  615. package/lib/vendor/blamejs/lib/nonce-store.js +177 -0
  616. package/lib/vendor/blamejs/lib/notify.js +683 -0
  617. package/lib/vendor/blamejs/lib/ntp-check.js +458 -0
  618. package/lib/vendor/blamejs/lib/numeric-bounds.js +111 -0
  619. package/lib/vendor/blamejs/lib/numeric-checks.js +40 -0
  620. package/lib/vendor/blamejs/lib/object-store/azure-blob-bucket-ops.js +349 -0
  621. package/lib/vendor/blamejs/lib/object-store/azure-blob.js +488 -0
  622. package/lib/vendor/blamejs/lib/object-store/gcs-bucket-ops.js +351 -0
  623. package/lib/vendor/blamejs/lib/object-store/gcs.js +515 -0
  624. package/lib/vendor/blamejs/lib/object-store/http-put.js +153 -0
  625. package/lib/vendor/blamejs/lib/object-store/http-request.js +38 -0
  626. package/lib/vendor/blamejs/lib/object-store/index.js +197 -0
  627. package/lib/vendor/blamejs/lib/object-store/local.js +163 -0
  628. package/lib/vendor/blamejs/lib/object-store/sigv4-bucket-ops.js +1133 -0
  629. package/lib/vendor/blamejs/lib/object-store/sigv4.js +957 -0
  630. package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +420 -0
  631. package/lib/vendor/blamejs/lib/observability-tracer.js +395 -0
  632. package/lib/vendor/blamejs/lib/observability.js +720 -0
  633. package/lib/vendor/blamejs/lib/openapi-paths-builder.js +248 -0
  634. package/lib/vendor/blamejs/lib/openapi-schema-walk.js +192 -0
  635. package/lib/vendor/blamejs/lib/openapi-security.js +169 -0
  636. package/lib/vendor/blamejs/lib/openapi-yaml.js +154 -0
  637. package/lib/vendor/blamejs/lib/openapi.js +489 -0
  638. package/lib/vendor/blamejs/lib/otel-export.js +278 -0
  639. package/lib/vendor/blamejs/lib/outbox.js +547 -0
  640. package/lib/vendor/blamejs/lib/pagination.js +542 -0
  641. package/lib/vendor/blamejs/lib/parsers/index.js +91 -0
  642. package/lib/vendor/blamejs/lib/parsers/safe-env.js +642 -0
  643. package/lib/vendor/blamejs/lib/parsers/safe-ini.js +293 -0
  644. package/lib/vendor/blamejs/lib/parsers/safe-toml.js +784 -0
  645. package/lib/vendor/blamejs/lib/parsers/safe-xml.js +390 -0
  646. package/lib/vendor/blamejs/lib/parsers/safe-yaml.js +1015 -0
  647. package/lib/vendor/blamejs/lib/permissions.js +793 -0
  648. package/lib/vendor/blamejs/lib/pick.js +105 -0
  649. package/lib/vendor/blamejs/lib/pqc-agent.js +351 -0
  650. package/lib/vendor/blamejs/lib/pqc-gate.js +279 -0
  651. package/lib/vendor/blamejs/lib/pqc-software.js +271 -0
  652. package/lib/vendor/blamejs/lib/problem-details.js +482 -0
  653. package/lib/vendor/blamejs/lib/process-spawn.js +196 -0
  654. package/lib/vendor/blamejs/lib/promise-pool.js +162 -0
  655. package/lib/vendor/blamejs/lib/protobuf-encoder.js +190 -0
  656. package/lib/vendor/blamejs/lib/protocol-dispatcher.js +161 -0
  657. package/lib/vendor/blamejs/lib/public-suffix.js +403 -0
  658. package/lib/vendor/blamejs/lib/pubsub-cluster.js +154 -0
  659. package/lib/vendor/blamejs/lib/pubsub-redis.js +167 -0
  660. package/lib/vendor/blamejs/lib/pubsub.js +463 -0
  661. package/lib/vendor/blamejs/lib/queue-local.js +476 -0
  662. package/lib/vendor/blamejs/lib/queue-redis.js +745 -0
  663. package/lib/vendor/blamejs/lib/queue-sqs.js +319 -0
  664. package/lib/vendor/blamejs/lib/queue.js +1016 -0
  665. package/lib/vendor/blamejs/lib/redact.js +1007 -0
  666. package/lib/vendor/blamejs/lib/redis-client.js +520 -0
  667. package/lib/vendor/blamejs/lib/render.js +285 -0
  668. package/lib/vendor/blamejs/lib/request-helpers.js +767 -0
  669. package/lib/vendor/blamejs/lib/resource-access-lock.js +116 -0
  670. package/lib/vendor/blamejs/lib/restore-bundle.js +340 -0
  671. package/lib/vendor/blamejs/lib/restore-rollback.js +365 -0
  672. package/lib/vendor/blamejs/lib/restore.js +409 -0
  673. package/lib/vendor/blamejs/lib/retention.js +640 -0
  674. package/lib/vendor/blamejs/lib/retry.js +523 -0
  675. package/lib/vendor/blamejs/lib/router.js +1289 -0
  676. package/lib/vendor/blamejs/lib/safe-async.js +1184 -0
  677. package/lib/vendor/blamejs/lib/safe-buffer.js +562 -0
  678. package/lib/vendor/blamejs/lib/safe-decompress.js +297 -0
  679. package/lib/vendor/blamejs/lib/safe-dns.js +665 -0
  680. package/lib/vendor/blamejs/lib/safe-ical.js +634 -0
  681. package/lib/vendor/blamejs/lib/safe-icap.js +502 -0
  682. package/lib/vendor/blamejs/lib/safe-json.js +946 -0
  683. package/lib/vendor/blamejs/lib/safe-jsonpath.js +285 -0
  684. package/lib/vendor/blamejs/lib/safe-mime.js +831 -0
  685. package/lib/vendor/blamejs/lib/safe-mount-info.js +306 -0
  686. package/lib/vendor/blamejs/lib/safe-path.js +254 -0
  687. package/lib/vendor/blamejs/lib/safe-redirect.js +106 -0
  688. package/lib/vendor/blamejs/lib/safe-schema.js +1810 -0
  689. package/lib/vendor/blamejs/lib/safe-sieve.js +684 -0
  690. package/lib/vendor/blamejs/lib/safe-smtp.js +185 -0
  691. package/lib/vendor/blamejs/lib/safe-sql.js +363 -0
  692. package/lib/vendor/blamejs/lib/safe-url.js +428 -0
  693. package/lib/vendor/blamejs/lib/safe-vcard.js +473 -0
  694. package/lib/vendor/blamejs/lib/sandbox-worker.js +135 -0
  695. package/lib/vendor/blamejs/lib/sandbox.js +358 -0
  696. package/lib/vendor/blamejs/lib/scheduler.js +827 -0
  697. package/lib/vendor/blamejs/lib/sd-notify.js +269 -0
  698. package/lib/vendor/blamejs/lib/sec-cyber.js +214 -0
  699. package/lib/vendor/blamejs/lib/security-assert.js +395 -0
  700. package/lib/vendor/blamejs/lib/seeders.js +620 -0
  701. package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +309 -0
  702. package/lib/vendor/blamejs/lib/self-update.js +804 -0
  703. package/lib/vendor/blamejs/lib/server-timing.js +174 -0
  704. package/lib/vendor/blamejs/lib/session-device-binding.js +431 -0
  705. package/lib/vendor/blamejs/lib/session-stores.js +138 -0
  706. package/lib/vendor/blamejs/lib/session.js +1162 -0
  707. package/lib/vendor/blamejs/lib/slug.js +381 -0
  708. package/lib/vendor/blamejs/lib/sse.js +349 -0
  709. package/lib/vendor/blamejs/lib/ssrf-guard.js +792 -0
  710. package/lib/vendor/blamejs/lib/standard-webhooks.js +183 -0
  711. package/lib/vendor/blamejs/lib/static.js +1249 -0
  712. package/lib/vendor/blamejs/lib/storage.js +1272 -0
  713. package/lib/vendor/blamejs/lib/stream-throttle.js +235 -0
  714. package/lib/vendor/blamejs/lib/structured-fields.js +244 -0
  715. package/lib/vendor/blamejs/lib/subject.js +667 -0
  716. package/lib/vendor/blamejs/lib/tcpa-10dlc.js +175 -0
  717. package/lib/vendor/blamejs/lib/template.js +931 -0
  718. package/lib/vendor/blamejs/lib/tenant-quota.js +545 -0
  719. package/lib/vendor/blamejs/lib/test-harness.js +275 -0
  720. package/lib/vendor/blamejs/lib/testing.js +1185 -0
  721. package/lib/vendor/blamejs/lib/time.js +578 -0
  722. package/lib/vendor/blamejs/lib/tls-exporter.js +239 -0
  723. package/lib/vendor/blamejs/lib/totp.js +318 -0
  724. package/lib/vendor/blamejs/lib/tracing.js +546 -0
  725. package/lib/vendor/blamejs/lib/uuid.js +207 -0
  726. package/lib/vendor/blamejs/lib/validate-opts.js +381 -0
  727. package/lib/vendor/blamejs/lib/vault/index.js +638 -0
  728. package/lib/vendor/blamejs/lib/vault/passphrase-ops.js +311 -0
  729. package/lib/vendor/blamejs/lib/vault/passphrase-source.js +198 -0
  730. package/lib/vendor/blamejs/lib/vault/rotate.js +803 -0
  731. package/lib/vendor/blamejs/lib/vault/seal-pem-file.js +471 -0
  732. package/lib/vendor/blamejs/lib/vault/wrap.js +296 -0
  733. package/lib/vendor/blamejs/lib/vault-aad.js +259 -0
  734. package/lib/vendor/blamejs/lib/vendor/.vendor-data-pubkey +4 -0
  735. package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +161 -0
  736. package/lib/vendor/blamejs/lib/vendor/bimi-trust-anchors.data.js +68 -0
  737. package/lib/vendor/blamejs/lib/vendor/bimi-trust-anchors.pem +33 -0
  738. package/lib/vendor/blamejs/lib/vendor/common-passwords-top-10000.data.js +1325 -0
  739. package/lib/vendor/blamejs/lib/vendor/common-passwords-top-10000.txt +10002 -0
  740. package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +9 -0
  741. package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +18 -0
  742. package/lib/vendor/blamejs/lib/vendor/pki.cjs +181 -0
  743. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +16382 -0
  744. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5881 -0
  745. package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +328 -0
  746. package/lib/vendor/blamejs/lib/vendor/vendor-data-pubkey.js +16 -0
  747. package/lib/vendor/blamejs/lib/vendor-data.js +520 -0
  748. package/lib/vendor/blamejs/lib/vex.js +630 -0
  749. package/lib/vendor/blamejs/lib/watcher.js +608 -0
  750. package/lib/vendor/blamejs/lib/web-push-vapid.js +322 -0
  751. package/lib/vendor/blamejs/lib/webhook.js +977 -0
  752. package/lib/vendor/blamejs/lib/websocket-channels.js +327 -0
  753. package/lib/vendor/blamejs/lib/websocket.js +1561 -0
  754. package/lib/vendor/blamejs/lib/wiki-concepts.js +338 -0
  755. package/lib/vendor/blamejs/lib/worker-pool.js +464 -0
  756. package/lib/vendor/blamejs/lib/ws-client.js +978 -0
  757. package/lib/vendor/blamejs/lib/xml-c14n.js +506 -0
  758. package/lib/vendor/blamejs/memory/specs/node-26-map-getorinsert-migration.md +164 -0
  759. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +19 -0
  760. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/README.md +88 -0
  761. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/build.sh +26 -0
  762. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/project.yaml +28 -0
  763. package/lib/vendor/blamejs/package.json +81 -0
  764. package/lib/vendor/blamejs/release-notes/v0.0.x.json +310 -0
  765. package/lib/vendor/blamejs/release-notes/v0.1.x.json +1798 -0
  766. package/lib/vendor/blamejs/release-notes/v0.10.x.json +1288 -0
  767. package/lib/vendor/blamejs/release-notes/v0.11.x.json +2551 -0
  768. package/lib/vendor/blamejs/release-notes/v0.12.0.json +64 -0
  769. package/lib/vendor/blamejs/release-notes/v0.12.1.json +32 -0
  770. package/lib/vendor/blamejs/release-notes/v0.12.2.json +45 -0
  771. package/lib/vendor/blamejs/release-notes/v0.2.x.json +706 -0
  772. package/lib/vendor/blamejs/release-notes/v0.3.x.json +786 -0
  773. package/lib/vendor/blamejs/release-notes/v0.4.x.json +588 -0
  774. package/lib/vendor/blamejs/release-notes/v0.5.x.json +390 -0
  775. package/lib/vendor/blamejs/release-notes/v0.6.x.json +1947 -0
  776. package/lib/vendor/blamejs/release-notes/v0.7.x.json +3811 -0
  777. package/lib/vendor/blamejs/release-notes/v0.8.x.json +3318 -0
  778. package/lib/vendor/blamejs/release-notes/v0.9.x.json +2257 -0
  779. package/lib/vendor/blamejs/scripts/build-vendored-sbom.js +325 -0
  780. package/lib/vendor/blamejs/scripts/check-api-snapshot.js +62 -0
  781. package/lib/vendor/blamejs/scripts/check-changelog-extract.js +108 -0
  782. package/lib/vendor/blamejs/scripts/check-pack-against-gitignore.js +83 -0
  783. package/lib/vendor/blamejs/scripts/check-services.js +483 -0
  784. package/lib/vendor/blamejs/scripts/check-vendor-currency.js +349 -0
  785. package/lib/vendor/blamejs/scripts/consolidate-release-notes.js +216 -0
  786. package/lib/vendor/blamejs/scripts/gen-migrating.js +275 -0
  787. package/lib/vendor/blamejs/scripts/generate-changelog-entry.js +577 -0
  788. package/lib/vendor/blamejs/scripts/generate-release-signing-key.js +79 -0
  789. package/lib/vendor/blamejs/scripts/publish-dep-confusion-placeholder.sh +101 -0
  790. package/lib/vendor/blamejs/scripts/refresh-api-snapshot.js +31 -0
  791. package/lib/vendor/blamejs/scripts/refresh-vendor-manifest.js +132 -0
  792. package/lib/vendor/blamejs/scripts/release.js +652 -0
  793. package/lib/vendor/blamejs/scripts/sha3-digest.js +62 -0
  794. package/lib/vendor/blamejs/scripts/sign-release-artifact.js +92 -0
  795. package/lib/vendor/blamejs/scripts/test-integration.js +181 -0
  796. package/lib/vendor/blamejs/scripts/test-wiki-integration.js +126 -0
  797. package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +77 -0
  798. package/lib/vendor/blamejs/scripts/vendor-data-gen.js +186 -0
  799. package/lib/vendor/blamejs/scripts/vendor-data-keygen.js +101 -0
  800. package/lib/vendor/blamejs/scripts/vendor-update.sh +278 -0
  801. package/lib/vendor/blamejs/test/00-primitives.js +19075 -0
  802. package/lib/vendor/blamejs/test/10-state.js +622 -0
  803. package/lib/vendor/blamejs/test/20-db.js +561 -0
  804. package/lib/vendor/blamejs/test/30-chain.js +2110 -0
  805. package/lib/vendor/blamejs/test/40-consumers.js +2453 -0
  806. package/lib/vendor/blamejs/test/50-integration.js +486 -0
  807. package/lib/vendor/blamejs/test/_helpers.js +10 -0
  808. package/lib/vendor/blamejs/test/_smoke-worker.js +69 -0
  809. package/lib/vendor/blamejs/test/fixtures/exploit-corpus/corpus.json +368 -0
  810. package/lib/vendor/blamejs/test/fixtures/http-client-stream-payload.txt +2 -0
  811. package/lib/vendor/blamejs/test/fixtures/worker-pool/echo.js +52 -0
  812. package/lib/vendor/blamejs/test/helpers/_codebase-shingle-worker.js +24 -0
  813. package/lib/vendor/blamejs/test/helpers/_codebase-shingle.js +203 -0
  814. package/lib/vendor/blamejs/test/helpers/_shape-match.js +513 -0
  815. package/lib/vendor/blamejs/test/helpers/check.js +36 -0
  816. package/lib/vendor/blamejs/test/helpers/cluster.js +70 -0
  817. package/lib/vendor/blamejs/test/helpers/db.js +143 -0
  818. package/lib/vendor/blamejs/test/helpers/drivers.js +207 -0
  819. package/lib/vendor/blamejs/test/helpers/fs-watch.js +101 -0
  820. package/lib/vendor/blamejs/test/helpers/http.js +14 -0
  821. package/lib/vendor/blamejs/test/helpers/index.js +93 -0
  822. package/lib/vendor/blamejs/test/helpers/json-round-trip.js +120 -0
  823. package/lib/vendor/blamejs/test/helpers/mocks.js +20 -0
  824. package/lib/vendor/blamejs/test/helpers/otel.js +13 -0
  825. package/lib/vendor/blamejs/test/helpers/services.js +380 -0
  826. package/lib/vendor/blamejs/test/helpers/wait.js +206 -0
  827. package/lib/vendor/blamejs/test/integration/cache.test.js +235 -0
  828. package/lib/vendor/blamejs/test/integration/cluster-provider-mysql.test.js +174 -0
  829. package/lib/vendor/blamejs/test/integration/federation-auth.test.js +611 -0
  830. package/lib/vendor/blamejs/test/integration/http-client.test.js +129 -0
  831. package/lib/vendor/blamejs/test/integration/log-stream.test.js +219 -0
  832. package/lib/vendor/blamejs/test/integration/mail-crypto-smime.test.js +181 -0
  833. package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +152 -0
  834. package/lib/vendor/blamejs/test/integration/mail-smtp.test.js +161 -0
  835. package/lib/vendor/blamejs/test/integration/mtls-ca.test.js +289 -0
  836. package/lib/vendor/blamejs/test/integration/network-dns.test.js +123 -0
  837. package/lib/vendor/blamejs/test/integration/network-heartbeat.test.js +101 -0
  838. package/lib/vendor/blamejs/test/integration/ntp-check.test.js +89 -0
  839. package/lib/vendor/blamejs/test/integration/object-store-sigv4.test.js +403 -0
  840. package/lib/vendor/blamejs/test/integration/pqc-pkcs8-forward-compat.test.js +271 -0
  841. package/lib/vendor/blamejs/test/integration/pubsub.test.js +137 -0
  842. package/lib/vendor/blamejs/test/integration/queue-redis.test.js +352 -0
  843. package/lib/vendor/blamejs/test/integration/redis-client-tls.test.js +96 -0
  844. package/lib/vendor/blamejs/test/integration/ssrf-guard.test.js +98 -0
  845. package/lib/vendor/blamejs/test/integration/websocket-permessage-deflate.test.js +261 -0
  846. package/lib/vendor/blamejs/test/integration/ws-client-roundtrip.test.js +230 -0
  847. package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +211 -0
  848. package/lib/vendor/blamejs/test/layer-0-primitives/a2a.test.js +59 -0
  849. package/lib/vendor/blamejs/test/layer-0-primitives/access-lock.test.js +136 -0
  850. package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +219 -0
  851. package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +69 -0
  852. package/lib/vendor/blamejs/test/layer-0-primitives/agent-event-bus.test.js +266 -0
  853. package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +262 -0
  854. package/lib/vendor/blamejs/test/layer-0-primitives/agent-orchestrator.test.js +390 -0
  855. package/lib/vendor/blamejs/test/layer-0-primitives/agent-posture-chain.test.js +174 -0
  856. package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +279 -0
  857. package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +322 -0
  858. package/lib/vendor/blamejs/test/layer-0-primitives/agent-stream.test.js +227 -0
  859. package/lib/vendor/blamejs/test/layer-0-primitives/agent-tenant.test.js +302 -0
  860. package/lib/vendor/blamejs/test/layer-0-primitives/agent-trace.test.js +150 -0
  861. package/lib/vendor/blamejs/test/layer-0-primitives/ai-adverse-decision.test.js +44 -0
  862. package/lib/vendor/blamejs/test/layer-0-primitives/ai-content-detect.test.js +150 -0
  863. package/lib/vendor/blamejs/test/layer-0-primitives/ai-input.test.js +50 -0
  864. package/lib/vendor/blamejs/test/layer-0-primitives/ai-model-manifest.test.js +96 -0
  865. package/lib/vendor/blamejs/test/layer-0-primitives/ai-pref.test.js +76 -0
  866. package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +1080 -0
  867. package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +311 -0
  868. package/lib/vendor/blamejs/test/layer-0-primitives/archive-zip-stream.test.js +291 -0
  869. package/lib/vendor/blamejs/test/layer-0-primitives/archive.test.js +140 -0
  870. package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +267 -0
  871. package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +108 -0
  872. package/lib/vendor/blamejs/test/layer-0-primitives/asyncapi.test.js +929 -0
  873. package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file-conflict-path.test.js +80 -0
  874. package/lib/vendor/blamejs/test/layer-0-primitives/audit-cve-defensive.test.js +176 -0
  875. package/lib/vendor/blamejs/test/layer-0-primitives/audit-daily-review.test.js +132 -0
  876. package/lib/vendor/blamejs/test/layer-0-primitives/audit-export-cadf.test.js +97 -0
  877. package/lib/vendor/blamejs/test/layer-0-primitives/audit-framework-namespaces.test.js +141 -0
  878. package/lib/vendor/blamejs/test/layer-0-primitives/audit-segregation.test.js +115 -0
  879. package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-ml-dsa-65.test.js +163 -0
  880. package/lib/vendor/blamejs/test/layer-0-primitives/audit-use-store.test.js +246 -0
  881. package/lib/vendor/blamejs/test/layer-0-primitives/auth-bot-challenge-verifier.test.js +485 -0
  882. package/lib/vendor/blamejs/test/layer-0-primitives/auth-bot-challenge.test.js +331 -0
  883. package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +352 -0
  884. package/lib/vendor/blamejs/test/layer-0-primitives/auth-lockout.test.js +572 -0
  885. package/lib/vendor/blamejs/test/layer-0-primitives/auth-password-audit.test.js +61 -0
  886. package/lib/vendor/blamejs/test/layer-0-primitives/azure-blob-bucket-ops.test.js +258 -0
  887. package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +105 -0
  888. package/lib/vendor/blamejs/test/layer-0-primitives/backup-worker.test.js +34 -0
  889. package/lib/vendor/blamejs/test/layer-0-primitives/bearer-auth.test.js +107 -0
  890. package/lib/vendor/blamejs/test/layer-0-primitives/body-parser-chunked-malformed.test.js +131 -0
  891. package/lib/vendor/blamejs/test/layer-0-primitives/body-parser-smuggling.test.js +118 -0
  892. package/lib/vendor/blamejs/test/layer-0-primitives/boot-gates.test.js +85 -0
  893. package/lib/vendor/blamejs/test/layer-0-primitives/breach-deadline.test.js +38 -0
  894. package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +861 -0
  895. package/lib/vendor/blamejs/test/layer-0-primitives/budr.test.js +55 -0
  896. package/lib/vendor/blamejs/test/layer-0-primitives/bundler-engine.test.js +209 -0
  897. package/lib/vendor/blamejs/test/layer-0-primitives/cache-status.test.js +129 -0
  898. package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +871 -0
  899. package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +891 -0
  900. package/lib/vendor/blamejs/test/layer-0-primitives/canonical-json-jcs.test.js +43 -0
  901. package/lib/vendor/blamejs/test/layer-0-primitives/cdn-cache-control.test.js +243 -0
  902. package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +550 -0
  903. package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +107 -0
  904. package/lib/vendor/blamejs/test/layer-0-primitives/cli-api-key.test.js +147 -0
  905. package/lib/vendor/blamejs/test/layer-0-primitives/cli-audit-verify-chain.test.js +104 -0
  906. package/lib/vendor/blamejs/test/layer-0-primitives/cli-backup.test.js +135 -0
  907. package/lib/vendor/blamejs/test/layer-0-primitives/cli-config-drift.test.js +67 -0
  908. package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +75 -0
  909. package/lib/vendor/blamejs/test/layer-0-primitives/cli-file-type.test.js +98 -0
  910. package/lib/vendor/blamejs/test/layer-0-primitives/cli-helpers.test.js +145 -0
  911. package/lib/vendor/blamejs/test/layer-0-primitives/cli-mtls.test.js +133 -0
  912. package/lib/vendor/blamejs/test/layer-0-primitives/cli-password.test.js +97 -0
  913. package/lib/vendor/blamejs/test/layer-0-primitives/cli-restore.test.js +160 -0
  914. package/lib/vendor/blamejs/test/layer-0-primitives/cli-retention.test.js +84 -0
  915. package/lib/vendor/blamejs/test/layer-0-primitives/cli-security.test.js +69 -0
  916. package/lib/vendor/blamejs/test/layer-0-primitives/cli-vault.test.js +142 -0
  917. package/lib/vendor/blamejs/test/layer-0-primitives/client-hints.test.js +133 -0
  918. package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +237 -0
  919. package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +9600 -0
  920. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +575 -0
  921. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-cascade.test.js +89 -0
  922. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-eaa.test.js +36 -0
  923. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +712 -0
  924. package/lib/vendor/blamejs/test/layer-0-primitives/compliance.test.js +278 -0
  925. package/lib/vendor/blamejs/test/layer-0-primitives/config-drift.test.js +97 -0
  926. package/lib/vendor/blamejs/test/layer-0-primitives/config.test.js +424 -0
  927. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +94 -0
  928. package/lib/vendor/blamejs/test/layer-0-primitives/cors.test.js +357 -0
  929. package/lib/vendor/blamejs/test/layer-0-primitives/cra-report.test.js +31 -0
  930. package/lib/vendor/blamejs/test/layer-0-primitives/credential-hash.test.js +226 -0
  931. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-base64url.test.js +86 -0
  932. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-envelope.test.js +85 -0
  933. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +193 -0
  934. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +98 -0
  935. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hpke-pq.test.js +132 -0
  936. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hpke.test.js +155 -0
  937. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-mlkem768-x25519.test.js +129 -0
  938. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-namespace-hash.test.js +0 -0
  939. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-random-int.test.js +72 -0
  940. package/lib/vendor/blamejs/test/layer-0-primitives/csp-builder.test.js +96 -0
  941. package/lib/vendor/blamejs/test/layer-0-primitives/csp-nonce.test.js +401 -0
  942. package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +34 -0
  943. package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +180 -0
  944. package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +210 -0
  945. package/lib/vendor/blamejs/test/layer-0-primitives/daily-byte-quota.test.js +153 -0
  946. package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +66 -0
  947. package/lib/vendor/blamejs/test/layer-0-primitives/data-act.test.js +74 -0
  948. package/lib/vendor/blamejs/test/layer-0-primitives/db-collection-extensions.test.js +226 -0
  949. package/lib/vendor/blamejs/test/layer-0-primitives/db-collection.test.js +136 -0
  950. package/lib/vendor/blamejs/test/layer-0-primitives/db-init-extensions.test.js +165 -0
  951. package/lib/vendor/blamejs/test/layer-0-primitives/db-query-cross-schema.test.js +150 -0
  952. package/lib/vendor/blamejs/test/layer-0-primitives/db-query-extensions.test.js +191 -0
  953. package/lib/vendor/blamejs/test/layer-0-primitives/db-role-for.test.js +228 -0
  954. package/lib/vendor/blamejs/test/layer-0-primitives/db-vacuum.test.js +55 -0
  955. package/lib/vendor/blamejs/test/layer-0-primitives/db-worm.test.js +89 -0
  956. package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +184 -0
  957. package/lib/vendor/blamejs/test/layer-0-primitives/declare-row-policy.test.js +203 -0
  958. package/lib/vendor/blamejs/test/layer-0-primitives/declare-view.test.js +303 -0
  959. package/lib/vendor/blamejs/test/layer-0-primitives/dns-dnssec-algorithm.test.js +163 -0
  960. package/lib/vendor/blamejs/test/layer-0-primitives/dns-null-mx.test.js +39 -0
  961. package/lib/vendor/blamejs/test/layer-0-primitives/dora.test.js +165 -0
  962. package/lib/vendor/blamejs/test/layer-0-primitives/dr-runbook.test.js +59 -0
  963. package/lib/vendor/blamejs/test/layer-0-primitives/dsr-state-rules.test.js +55 -0
  964. package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +786 -0
  965. package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +105 -0
  966. package/lib/vendor/blamejs/test/layer-0-primitives/early-hints.test.js +147 -0
  967. package/lib/vendor/blamejs/test/layer-0-primitives/events.test.js +105 -0
  968. package/lib/vendor/blamejs/test/layer-0-primitives/exploit-replay.test.js +243 -0
  969. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-hardening.test.js +181 -0
  970. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +190 -0
  971. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-routing.test.js +531 -0
  972. package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +118 -0
  973. package/lib/vendor/blamejs/test/layer-0-primitives/fapi2.test.js +89 -0
  974. package/lib/vendor/blamejs/test/layer-0-primitives/fda-21cfr11.test.js +156 -0
  975. package/lib/vendor/blamejs/test/layer-0-primitives/fdx.test.js +79 -0
  976. package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +216 -0
  977. package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +434 -0
  978. package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +432 -0
  979. package/lib/vendor/blamejs/test/layer-0-primitives/file-type.test.js +81 -0
  980. package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +887 -0
  981. package/lib/vendor/blamejs/test/layer-0-primitives/forensic-snapshot.test.js +51 -0
  982. package/lib/vendor/blamejs/test/layer-0-primitives/fsm.test.js +375 -0
  983. package/lib/vendor/blamejs/test/layer-0-primitives/gcs-bucket-ops.test.js +321 -0
  984. package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +41 -0
  985. package/lib/vendor/blamejs/test/layer-0-primitives/graphql-federation.test.js +32 -0
  986. package/lib/vendor/blamejs/test/layer-0-primitives/guard-agent-registry.test.js +87 -0
  987. package/lib/vendor/blamejs/test/layer-0-primitives/guard-all.test.js +328 -0
  988. package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +339 -0
  989. package/lib/vendor/blamejs/test/layer-0-primitives/guard-csv.test.js +694 -0
  990. package/lib/vendor/blamejs/test/layer-0-primitives/guard-dsn.test.js +296 -0
  991. package/lib/vendor/blamejs/test/layer-0-primitives/guard-email.test.js +234 -0
  992. package/lib/vendor/blamejs/test/layer-0-primitives/guard-envelope.test.js +192 -0
  993. package/lib/vendor/blamejs/test/layer-0-primitives/guard-event-bus-payload.test.js +89 -0
  994. package/lib/vendor/blamejs/test/layer-0-primitives/guard-event-bus-topic.test.js +71 -0
  995. package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +386 -0
  996. package/lib/vendor/blamejs/test/layer-0-primitives/guard-html-wcag.test.js +859 -0
  997. package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +357 -0
  998. package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +92 -0
  999. package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
  1000. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +174 -0
  1001. package/lib/vendor/blamejs/test/layer-0-primitives/guard-json.test.js +317 -0
  1002. package/lib/vendor/blamejs/test/layer-0-primitives/guard-list-id.test.js +199 -0
  1003. package/lib/vendor/blamejs/test/layer-0-primitives/guard-list-unsubscribe.test.js +214 -0
  1004. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-compose.test.js +111 -0
  1005. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-move.test.js +110 -0
  1006. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-query.test.js +112 -0
  1007. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-reply.test.js +86 -0
  1008. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-sieve.test.js +92 -0
  1009. package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +301 -0
  1010. package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +265 -0
  1011. package/lib/vendor/blamejs/test/layer-0-primitives/guard-message-id.test.js +0 -0
  1012. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +161 -0
  1013. package/lib/vendor/blamejs/test/layer-0-primitives/guard-posture-chain.test.js +100 -0
  1014. package/lib/vendor/blamejs/test/layer-0-primitives/guard-saga-config.test.js +79 -0
  1015. package/lib/vendor/blamejs/test/layer-0-primitives/guard-smtp-command.test.js +269 -0
  1016. package/lib/vendor/blamejs/test/layer-0-primitives/guard-snapshot-envelope.test.js +89 -0
  1017. package/lib/vendor/blamejs/test/layer-0-primitives/guard-stream-args.test.js +78 -0
  1018. package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +288 -0
  1019. package/lib/vendor/blamejs/test/layer-0-primitives/guard-tenant-id.test.js +69 -0
  1020. package/lib/vendor/blamejs/test/layer-0-primitives/guard-trace-context.test.js +102 -0
  1021. package/lib/vendor/blamejs/test/layer-0-primitives/guard-xml.test.js +202 -0
  1022. package/lib/vendor/blamejs/test/layer-0-primitives/guard-yaml.test.js +203 -0
  1023. package/lib/vendor/blamejs/test/layer-0-primitives/hal.test.js +51 -0
  1024. package/lib/vendor/blamejs/test/layer-0-primitives/honeytoken.test.js +50 -0
  1025. package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +37 -0
  1026. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +692 -0
  1027. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-stream.test.js +280 -0
  1028. package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +225 -0
  1029. package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +203 -0
  1030. package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +991 -0
  1031. package/lib/vendor/blamejs/test/layer-0-primitives/iab-mspa.test.js +63 -0
  1032. package/lib/vendor/blamejs/test/layer-0-primitives/iab-tcf.test.js +73 -0
  1033. package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +612 -0
  1034. package/lib/vendor/blamejs/test/layer-0-primitives/importmap-integrity.test.js +56 -0
  1035. package/lib/vendor/blamejs/test/layer-0-primitives/inbox.test.js +166 -0
  1036. package/lib/vendor/blamejs/test/layer-0-primitives/incident-report.test.js +29 -0
  1037. package/lib/vendor/blamejs/test/layer-0-primitives/jose-jwe-experimental.test.js +121 -0
  1038. package/lib/vendor/blamejs/test/layer-0-primitives/json-api.test.js +58 -0
  1039. package/lib/vendor/blamejs/test/layer-0-primitives/json-round-trip-helper.test.js +110 -0
  1040. package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +159 -0
  1041. package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
  1042. package/lib/vendor/blamejs/test/layer-0-primitives/legal-hold.test.js +118 -0
  1043. package/lib/vendor/blamejs/test/layer-0-primitives/local-db-thin.test.js +150 -0
  1044. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-cloudwatch.test.js +489 -0
  1045. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-otlp-grpc.test.js +207 -0
  1046. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-otlp.test.js +283 -0
  1047. package/lib/vendor/blamejs/test/layer-0-primitives/lro.test.js +65 -0
  1048. package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +417 -0
  1049. package/lib/vendor/blamejs/test/layer-0-primitives/mail-arf.test.js +208 -0
  1050. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +910 -0
  1051. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +502 -0
  1052. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +680 -0
  1053. package/lib/vendor/blamejs/test/layer-0-primitives/mail-canspam.test.js +128 -0
  1054. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +149 -0
  1055. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +323 -0
  1056. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +297 -0
  1057. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +514 -0
  1058. package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy-tlsrpt.test.js +369 -0
  1059. package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +199 -0
  1060. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +627 -0
  1061. package/lib/vendor/blamejs/test/layer-0-primitives/mail-feedback-id.test.js +56 -0
  1062. package/lib/vendor/blamejs/test/layer-0-primitives/mail-greylist.test.js +217 -0
  1063. package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +283 -0
  1064. package/lib/vendor/blamejs/test/layer-0-primitives/mail-journal.test.js +217 -0
  1065. package/lib/vendor/blamejs/test/layer-0-primitives/mail-mdn.test.js +334 -0
  1066. package/lib/vendor/blamejs/test/layer-0-primitives/mail-rbl.test.js +271 -0
  1067. package/lib/vendor/blamejs/test/layer-0-primitives/mail-require-tls.test.js +128 -0
  1068. package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +215 -0
  1069. package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +336 -0
  1070. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +732 -0
  1071. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +840 -0
  1072. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +130 -0
  1073. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +285 -0
  1074. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +74 -0
  1075. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +112 -0
  1076. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +229 -0
  1077. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +394 -0
  1078. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-tls.test.js +147 -0
  1079. package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +151 -0
  1080. package/lib/vendor/blamejs/test/layer-0-primitives/mail-spam-score.test.js +204 -0
  1081. package/lib/vendor/blamejs/test/layer-0-primitives/mail-srs.test.js +152 -0
  1082. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +279 -0
  1083. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +323 -0
  1084. package/lib/vendor/blamejs/test/layer-0-primitives/mail-unsubscribe.test.js +165 -0
  1085. package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +439 -0
  1086. package/lib/vendor/blamejs/test/layer-0-primitives/mcp-tool-registry.test.js +202 -0
  1087. package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +155 -0
  1088. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-shadow-registry.test.js +112 -0
  1089. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +224 -0
  1090. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-compose-pipeline.test.js +278 -0
  1091. package/lib/vendor/blamejs/test/layer-0-primitives/money.test.js +376 -0
  1092. package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-paths.test.js +89 -0
  1093. package/lib/vendor/blamejs/test/layer-0-primitives/nel.test.js +200 -0
  1094. package/lib/vendor/blamejs/test/layer-0-primitives/network-allowlist.test.js +106 -0
  1095. package/lib/vendor/blamejs/test/layer-0-primitives/network-byte-quota.test.js +133 -0
  1096. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +372 -0
  1097. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +635 -0
  1098. package/lib/vendor/blamejs/test/layer-0-primitives/network-heartbeat-passive.test.js +128 -0
  1099. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls-build-options.test.js +130 -0
  1100. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls-ct-inclusion.test.js +179 -0
  1101. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +447 -0
  1102. package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +369 -0
  1103. package/lib/vendor/blamejs/test/layer-0-primitives/nis2-report.test.js +21 -0
  1104. package/lib/vendor/blamejs/test/layer-0-primitives/nist-crosswalk.test.js +42 -0
  1105. package/lib/vendor/blamejs/test/layer-0-primitives/no-cache.test.js +98 -0
  1106. package/lib/vendor/blamejs/test/layer-0-primitives/notify.test.js +707 -0
  1107. package/lib/vendor/blamejs/test/layer-0-primitives/numeric-bounds.test.js +142 -0
  1108. package/lib/vendor/blamejs/test/layer-0-primitives/oauth-callback.test.js +72 -0
  1109. package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +597 -0
  1110. package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +190 -0
  1111. package/lib/vendor/blamejs/test/layer-0-primitives/openapi.test.js +877 -0
  1112. package/lib/vendor/blamejs/test/layer-0-primitives/otel-export.test.js +257 -0
  1113. package/lib/vendor/blamejs/test/layer-0-primitives/pagination.test.js +522 -0
  1114. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +216 -0
  1115. package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +324 -0
  1116. package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +546 -0
  1117. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +153 -0
  1118. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-software.test.js +94 -0
  1119. package/lib/vendor/blamejs/test/layer-0-primitives/problem-details.test.js +195 -0
  1120. package/lib/vendor/blamejs/test/layer-0-primitives/process-spawn.test.js +62 -0
  1121. package/lib/vendor/blamejs/test/layer-0-primitives/promise-pool.test.js +93 -0
  1122. package/lib/vendor/blamejs/test/layer-0-primitives/protected-resource-metadata.test.js +68 -0
  1123. package/lib/vendor/blamejs/test/layer-0-primitives/protobuf-encoder.test.js +138 -0
  1124. package/lib/vendor/blamejs/test/layer-0-primitives/protocol-dispatcher.test.js +174 -0
  1125. package/lib/vendor/blamejs/test/layer-0-primitives/public-suffix.test.js +197 -0
  1126. package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +232 -0
  1127. package/lib/vendor/blamejs/test/layer-0-primitives/queue-dlq-extend-lease.test.js +178 -0
  1128. package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +322 -0
  1129. package/lib/vendor/blamejs/test/layer-0-primitives/queue-priority-rate-progress.test.js +266 -0
  1130. package/lib/vendor/blamejs/test/layer-0-primitives/queue-sqs.test.js +300 -0
  1131. package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-cluster.test.js +338 -0
  1132. package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-registry.test.js +75 -0
  1133. package/lib/vendor/blamejs/test/layer-0-primitives/redact-dlp.test.js +246 -0
  1134. package/lib/vendor/blamejs/test/layer-0-primitives/redis-client.test.js +130 -0
  1135. package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +335 -0
  1136. package/lib/vendor/blamejs/test/layer-0-primitives/request-log.test.js +170 -0
  1137. package/lib/vendor/blamejs/test/layer-0-primitives/require-auth-cache-control.test.js +93 -0
  1138. package/lib/vendor/blamejs/test/layer-0-primitives/require-mtls.test.js +34 -0
  1139. package/lib/vendor/blamejs/test/layer-0-primitives/resource-access-lock.test.js +52 -0
  1140. package/lib/vendor/blamejs/test/layer-0-primitives/retention-floor.test.js +67 -0
  1141. package/lib/vendor/blamejs/test/layer-0-primitives/retry.test.js +535 -0
  1142. package/lib/vendor/blamejs/test/layer-0-primitives/router-cross-origin-redirect.test.js +0 -0
  1143. package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +128 -0
  1144. package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-loops.test.js +163 -0
  1145. package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-parallel.test.js +170 -0
  1146. package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +248 -0
  1147. package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +451 -0
  1148. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +289 -0
  1149. package/lib/vendor/blamejs/test/layer-0-primitives/safe-icap.test.js +206 -0
  1150. package/lib/vendor/blamejs/test/layer-0-primitives/safe-jsonpath.test.js +104 -0
  1151. package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +339 -0
  1152. package/lib/vendor/blamejs/test/layer-0-primitives/safe-mount-info.test.js +180 -0
  1153. package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +78 -0
  1154. package/lib/vendor/blamejs/test/layer-0-primitives/safe-sieve.test.js +123 -0
  1155. package/lib/vendor/blamejs/test/layer-0-primitives/safe-smtp.test.js +95 -0
  1156. package/lib/vendor/blamejs/test/layer-0-primitives/safe-url-idn-homograph.test.js +77 -0
  1157. package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +257 -0
  1158. package/lib/vendor/blamejs/test/layer-0-primitives/saml-slo.test.js +249 -0
  1159. package/lib/vendor/blamejs/test/layer-0-primitives/sandbox.test.js +228 -0
  1160. package/lib/vendor/blamejs/test/layer-0-primitives/scheduler-exactly-once.test.js +238 -0
  1161. package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +92 -0
  1162. package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +700 -0
  1163. package/lib/vendor/blamejs/test/layer-0-primitives/sd-notify.test.js +67 -0
  1164. package/lib/vendor/blamejs/test/layer-0-primitives/sec-cyber.test.js +85 -0
  1165. package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +107 -0
  1166. package/lib/vendor/blamejs/test/layer-0-primitives/security-headers.test.js +175 -0
  1167. package/lib/vendor/blamejs/test/layer-0-primitives/seeders.test.js +816 -0
  1168. package/lib/vendor/blamejs/test/layer-0-primitives/self-update-standalone-verifier.test.js +168 -0
  1169. package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +302 -0
  1170. package/lib/vendor/blamejs/test/layer-0-primitives/server-timing.test.js +93 -0
  1171. package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +247 -0
  1172. package/lib/vendor/blamejs/test/layer-0-primitives/session-extensions.test.js +295 -0
  1173. package/lib/vendor/blamejs/test/layer-0-primitives/shape-match.test.js +142 -0
  1174. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +952 -0
  1175. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-multipart-sse.test.js +441 -0
  1176. package/lib/vendor/blamejs/test/layer-0-primitives/slug.test.js +330 -0
  1177. package/lib/vendor/blamejs/test/layer-0-primitives/smtp-policy.test.js +233 -0
  1178. package/lib/vendor/blamejs/test/layer-0-primitives/source-comment-blocks.test.js +105 -0
  1179. package/lib/vendor/blamejs/test/layer-0-primitives/speculation-rules.test.js +319 -0
  1180. package/lib/vendor/blamejs/test/layer-0-primitives/sse.test.js +148 -0
  1181. package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +283 -0
  1182. package/lib/vendor/blamejs/test/layer-0-primitives/standard-webhooks.test.js +67 -0
  1183. package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +266 -0
  1184. package/lib/vendor/blamejs/test/layer-0-primitives/step-up.test.js +487 -0
  1185. package/lib/vendor/blamejs/test/layer-0-primitives/storage-chunk-scratch.test.js +0 -0
  1186. package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +773 -0
  1187. package/lib/vendor/blamejs/test/layer-0-primitives/stream-throttle.test.js +173 -0
  1188. package/lib/vendor/blamejs/test/layer-0-primitives/structured-fields.test.js +180 -0
  1189. package/lib/vendor/blamejs/test/layer-0-primitives/tcpa-10dlc.test.js +66 -0
  1190. package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +89 -0
  1191. package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +571 -0
  1192. package/lib/vendor/blamejs/test/layer-0-primitives/test-harness.test.js +190 -0
  1193. package/lib/vendor/blamejs/test/layer-0-primitives/testing-request.test.js +119 -0
  1194. package/lib/vendor/blamejs/test/layer-0-primitives/testing.test.js +522 -0
  1195. package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +151 -0
  1196. package/lib/vendor/blamejs/test/layer-0-primitives/tls-exporter.test.js +168 -0
  1197. package/lib/vendor/blamejs/test/layer-0-primitives/tls-ocsp-ct.test.js +275 -0
  1198. package/lib/vendor/blamejs/test/layer-0-primitives/tls-ocsp-verify.test.js +105 -0
  1199. package/lib/vendor/blamejs/test/layer-0-primitives/tls-pinset-drift.test.js +35 -0
  1200. package/lib/vendor/blamejs/test/layer-0-primitives/tls-preferred-groups.test.js +81 -0
  1201. package/lib/vendor/blamejs/test/layer-0-primitives/tracing.test.js +280 -0
  1202. package/lib/vendor/blamejs/test/layer-0-primitives/uuid.test.js +93 -0
  1203. package/lib/vendor/blamejs/test/layer-0-primitives/vault-aad.test.js +277 -0
  1204. package/lib/vendor/blamejs/test/layer-0-primitives/vault-seal-pem-file.test.js +252 -0
  1205. package/lib/vendor/blamejs/test/layer-0-primitives/vendor-data.test.js +149 -0
  1206. package/lib/vendor/blamejs/test/layer-0-primitives/vendor-manifest.test.js +92 -0
  1207. package/lib/vendor/blamejs/test/layer-0-primitives/vex.test.js +661 -0
  1208. package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +308 -0
  1209. package/lib/vendor/blamejs/test/layer-0-primitives/web-push-vapid.test.js +144 -0
  1210. package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +674 -0
  1211. package/lib/vendor/blamejs/test/layer-0-primitives/websocket-channels.test.js +360 -0
  1212. package/lib/vendor/blamejs/test/layer-0-primitives/worker-pool.test.js +302 -0
  1213. package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +349 -0
  1214. package/lib/vendor/blamejs/test/layer-1-state/api-key.test.js +717 -0
  1215. package/lib/vendor/blamejs/test/layer-5-integration/bundler-output.test.js +444 -0
  1216. package/lib/vendor/blamejs/test/layer-5-integration/guard-host-integration.test.js +597 -0
  1217. package/lib/vendor/blamejs/test/layer-5-integration/security-chaos.test.js +308 -0
  1218. package/lib/vendor/blamejs/test/smoke.js +431 -0
  1219. package/lib/webhooks.js +305 -0
  1220. 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
+ };