@hexclave/shared 1.0.41 → 1.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin-interface-Bv8rBJo-.d.ts +379 -0
- package/dist/admin-interface-Bv8rBJo-.d.ts.map +1 -0
- package/dist/admin-metrics-DyW8_G82.d.ts +807 -0
- package/dist/admin-metrics-DyW8_G82.d.ts.map +1 -0
- package/dist/ai/image-limits.d.ts.map +1 -1
- package/dist/ai/image-limits.js +6 -7
- package/dist/ai/image-limits.js.map +1 -1
- package/dist/ai/llms/llms.d.ts.map +1 -1
- package/dist/ai/llms/llms.js +2 -4
- package/dist/ai/llms/llms.js.map +1 -1
- package/dist/ai/unified-prompts/reminders.js +2 -4
- package/dist/ai/unified-prompts/reminders.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +2 -5
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/brain.js +3 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/brain.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/cli-help.js +3 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/cli-help.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/config-docs.js +3 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/config-docs.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js +3 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js +3 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +5 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +1 -2
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +3 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js +3 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt.js +2 -4
- package/dist/ai/unified-prompts/skill-site-prompt.js.map +1 -1
- package/dist/analytics-IjkAsefy.d.ts +14 -0
- package/dist/analytics-IjkAsefy.d.ts.map +1 -0
- package/dist/apps/apps-config.d.ts.map +1 -1
- package/dist/apps/apps-config.js +2 -3
- package/dist/apps/apps-config.js.map +1 -1
- package/dist/apps/apps-ui.d.ts +1 -2
- package/dist/apps/apps-ui.d.ts.map +1 -1
- package/dist/apps/apps-ui.js +4 -5
- package/dist/apps/apps-ui.js.map +1 -1
- package/dist/client-interface-CGrvUtX0.d.ts +447 -0
- package/dist/client-interface-CGrvUtX0.d.ts.map +1 -0
- package/dist/config/db-sync-mappings.js +2 -3
- package/dist/config/db-sync-mappings.js.map +1 -1
- package/dist/config/format.d.ts +2 -61
- package/dist/config/format.js +2 -192
- package/dist/config/format.js.map +1 -1
- package/dist/config/migrate-catalogs-to-product-lines.d.ts.map +1 -1
- package/dist/config/migrate-catalogs-to-product-lines.js +2 -196
- package/dist/config/migrate-catalogs-to-product-lines.js.map +1 -1
- package/dist/config/schema-fuzzer.test.js +18 -172
- package/dist/config/schema-fuzzer.test.js.map +1 -1
- package/dist/config/schema.d.ts +2 -2328
- package/dist/config/schema.js +6 -351
- package/dist/config/schema.js.map +1 -1
- package/dist/config-authoring.d.ts +1 -1
- package/dist/config-authoring.d.ts.map +1 -1
- package/dist/config-authoring.js +2 -3
- package/dist/config-authoring.js.map +1 -1
- package/dist/config-authoring.test.js +1 -3
- package/dist/config-authoring.test.js.map +1 -1
- package/dist/config-eval.d.ts.map +1 -1
- package/dist/config-eval.js +4 -46
- package/dist/config-eval.js.map +1 -1
- package/dist/config-rendering.d.ts.map +1 -1
- package/dist/config-rendering.js +2 -48
- package/dist/config-rendering.js.map +1 -1
- package/dist/connected-accounts-D5CKe50A.d.ts +67 -0
- package/dist/connected-accounts-D5CKe50A.d.ts.map +1 -0
- package/dist/contact-channels-DW8yQxlc.d.ts +180 -0
- package/dist/contact-channels-DW8yQxlc.d.ts.map +1 -0
- package/dist/country-codes-CRWDroBE.d.ts +11 -0
- package/dist/country-codes-CRWDroBE.d.ts.map +1 -0
- package/dist/crud-CqmEW9s6.d.ts +98 -0
- package/dist/crud-CqmEW9s6.d.ts.map +1 -0
- package/dist/crud.d.ts +2 -98
- package/dist/crud.js +3 -71
- package/dist/crud.js.map +1 -1
- package/dist/currency-constants-Cq_q8twn.d.ts +45 -0
- package/dist/currency-constants-Cq_q8twn.d.ts.map +1 -0
- package/dist/current-user-Dvf8Ttjo.d.ts +284 -0
- package/dist/current-user-Dvf8Ttjo.d.ts.map +1 -0
- package/dist/dates-B6ne9iOR.d.ts +23 -0
- package/dist/dates-B6ne9iOR.d.ts.map +1 -0
- package/dist/email-outbox-BVqBaXpn.d.ts +1464 -0
- package/dist/{interface/crud/email-outbox.d.ts.map → email-outbox-BVqBaXpn.d.ts.map} +1 -1
- package/dist/emails-Ba4yEaCS.d.ts +40 -0
- package/dist/emails-Ba4yEaCS.d.ts.map +1 -0
- package/dist/errors-Cl-RUyed.d.ts +238 -0
- package/dist/errors-Cl-RUyed.d.ts.map +1 -0
- package/dist/esm/ai/image-limits.d.ts.map +1 -1
- package/dist/esm/ai/image-limits.js +5 -5
- package/dist/esm/ai/image-limits.js.map +1 -1
- package/dist/esm/ai/llms/llms.d.ts +1 -1
- package/dist/esm/ai/llms/llms.d.ts.map +1 -1
- package/dist/esm/ai/llms/llms.js +1 -2
- package/dist/esm/ai/llms/llms.js.map +1 -1
- package/dist/esm/ai/unified-prompts/reminders.js +1 -2
- package/dist/esm/ai/unified-prompts/reminders.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +25 -28
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/brain.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/brain.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/cli-help.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/cli-help.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/config-docs.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/config-docs.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +2 -3
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt.js.map +1 -1
- package/dist/esm/apps/apps-config.d.ts.map +1 -1
- package/dist/esm/apps/apps-config.js +1 -1
- package/dist/esm/apps/apps-config.js.map +1 -1
- package/dist/esm/apps/apps-ui.d.ts +2 -3
- package/dist/esm/apps/apps-ui.d.ts.map +1 -1
- package/dist/esm/apps/apps-ui.js +2 -3
- package/dist/esm/apps/apps-ui.js.map +1 -1
- package/dist/esm/config/db-sync-mappings.js +1 -1
- package/dist/esm/config/db-sync-mappings.js.map +1 -1
- package/dist/esm/config/format.d.ts +1 -1
- package/dist/esm/config/format.d.ts.map +1 -1
- package/dist/esm/config/format.js +1 -190
- package/dist/esm/config/format.js.map +1 -1
- package/dist/esm/config/migrate-catalogs-to-product-lines.d.ts.map +1 -1
- package/dist/esm/config/migrate-catalogs-to-product-lines.js +1 -194
- package/dist/esm/config/migrate-catalogs-to-product-lines.js.map +1 -1
- package/dist/esm/config/schema-fuzzer.test.js +20 -173
- package/dist/esm/config/schema-fuzzer.test.js.map +1 -1
- package/dist/esm/config/schema.d.ts +249 -250
- package/dist/esm/config/schema.d.ts.map +1 -1
- package/dist/esm/config/schema.js +2 -347
- package/dist/esm/config/schema.js.map +1 -1
- package/dist/esm/config-authoring.d.ts +1 -1
- package/dist/esm/config-authoring.d.ts.map +1 -1
- package/dist/esm/config-authoring.js +1 -1
- package/dist/esm/config-authoring.js.map +1 -1
- package/dist/esm/config-authoring.test.js +2 -3
- package/dist/esm/config-authoring.test.js.map +1 -1
- package/dist/esm/config-eval.d.ts +1 -1
- package/dist/esm/config-eval.d.ts.map +1 -1
- package/dist/esm/config-eval.js +1 -43
- package/dist/esm/config-eval.js.map +1 -1
- package/dist/esm/config-rendering.d.ts.map +1 -1
- package/dist/esm/config-rendering.js +1 -46
- package/dist/esm/config-rendering.js.map +1 -1
- package/dist/esm/crud.d.ts +1 -1
- package/dist/esm/crud.d.ts.map +1 -1
- package/dist/esm/crud.js +2 -69
- package/dist/esm/crud.js.map +1 -1
- package/dist/esm/helpers/emails.js +1 -2
- package/dist/esm/helpers/emails.js.map +1 -1
- package/dist/esm/helpers/init-prompt.d.ts.map +1 -1
- package/dist/esm/helpers/init-prompt.js +1 -2
- package/dist/esm/helpers/init-prompt.js.map +1 -1
- package/dist/esm/helpers/password.d.ts +1 -1
- package/dist/esm/helpers/password.d.ts.map +1 -1
- package/dist/esm/helpers/password.js +1 -2
- package/dist/esm/helpers/password.js.map +1 -1
- package/dist/esm/helpers/production-mode.d.ts +1 -1
- package/dist/esm/helpers/production-mode.d.ts.map +1 -1
- package/dist/esm/helpers/production-mode.js +1 -2
- package/dist/esm/helpers/production-mode.js.map +1 -1
- package/dist/esm/helpers/support-sla.d.ts.map +1 -1
- package/dist/esm/helpers/support-sla.js +1 -1
- package/dist/esm/helpers/support-sla.js.map +1 -1
- package/dist/esm/helpers/support-sla.test.js +2 -3
- package/dist/esm/helpers/support-sla.test.js.map +1 -1
- package/dist/esm/helpers/vault/client-side.d.ts.map +1 -1
- package/dist/esm/helpers/vault/client-side.js +1 -20
- package/dist/esm/helpers/vault/client-side.js.map +1 -1
- package/dist/esm/helpers/vault/server-side.js +1 -2
- package/dist/esm/helpers/vault/server-side.js.map +1 -1
- package/dist/esm/hooks/use-async-callback.d.ts.map +1 -1
- package/dist/esm/hooks/use-async-callback.js +1 -2
- package/dist/esm/hooks/use-async-callback.js.map +1 -1
- package/dist/esm/hooks/use-async-external-store.d.ts +1 -1
- package/dist/esm/hooks/use-async-external-store.d.ts.map +1 -1
- package/dist/esm/hooks/use-async-external-store.js +1 -2
- package/dist/esm/hooks/use-async-external-store.js.map +1 -1
- package/dist/esm/hooks/use-hash.js +1 -2
- package/dist/esm/hooks/use-hash.js.map +1 -1
- package/dist/esm/hooks/use-hover.d.ts.map +1 -1
- package/dist/esm/hooks/use-hover.js +1 -2
- package/dist/esm/hooks/use-hover.js.map +1 -1
- package/dist/esm/hooks/use-strict-memo.d.ts.map +1 -1
- package/dist/esm/hooks/use-strict-memo.js +1 -70
- package/dist/esm/hooks/use-strict-memo.js.map +1 -1
- package/dist/esm/index.d.ts +4 -4
- package/dist/esm/index.js +1 -2
- package/dist/esm/interface/admin-interface.d.ts +19 -19
- package/dist/esm/interface/admin-interface.d.ts.map +1 -1
- package/dist/esm/interface/admin-interface.js +1 -2
- package/dist/esm/interface/admin-interface.js.map +1 -1
- package/dist/esm/interface/admin-metrics.d.ts +11 -11
- package/dist/esm/interface/admin-metrics.d.ts.map +1 -1
- package/dist/esm/interface/admin-metrics.js +1 -2
- package/dist/esm/interface/admin-metrics.js.map +1 -1
- package/dist/esm/interface/client-interface.d.ts +22 -22
- package/dist/esm/interface/client-interface.d.ts.map +1 -1
- package/dist/esm/interface/client-interface.js +31 -15
- package/dist/esm/interface/client-interface.js.map +1 -1
- package/dist/esm/interface/client-interface.test.js +84 -13
- package/dist/esm/interface/client-interface.test.js.map +1 -1
- package/dist/esm/interface/conversations.d.ts +33 -33
- package/dist/esm/interface/conversations.d.ts.map +1 -1
- package/dist/esm/interface/conversations.js +1 -2
- package/dist/esm/interface/conversations.js.map +1 -1
- package/dist/esm/interface/crud/analytics.d.ts.map +1 -1
- package/dist/esm/interface/crud/analytics.js +1 -1
- package/dist/esm/interface/crud/connected-accounts.d.ts +15 -17
- package/dist/esm/interface/crud/connected-accounts.d.ts.map +1 -1
- package/dist/esm/interface/crud/connected-accounts.js +1 -2
- package/dist/esm/interface/crud/connected-accounts.js.map +1 -1
- package/dist/esm/interface/crud/contact-channels.d.ts +24 -26
- package/dist/esm/interface/crud/contact-channels.d.ts.map +1 -1
- package/dist/esm/interface/crud/contact-channels.js +1 -2
- package/dist/esm/interface/crud/contact-channels.js.map +1 -1
- package/dist/esm/interface/crud/current-user.d.ts +20 -22
- package/dist/esm/interface/crud/current-user.d.ts.map +1 -1
- package/dist/esm/interface/crud/current-user.js +25 -29
- package/dist/esm/interface/crud/current-user.js.map +1 -1
- package/dist/esm/interface/crud/email-outbox.d.ts +32 -34
- package/dist/esm/interface/crud/email-outbox.d.ts.map +1 -1
- package/dist/esm/interface/crud/email-outbox.js +1 -2
- package/dist/esm/interface/crud/email-outbox.js.map +1 -1
- package/dist/esm/interface/crud/email-templates.d.ts +16 -18
- package/dist/esm/interface/crud/email-templates.d.ts.map +1 -1
- package/dist/esm/interface/crud/email-templates.js +1 -2
- package/dist/esm/interface/crud/email-templates.js.map +1 -1
- package/dist/esm/interface/crud/emails.d.ts +6 -8
- package/dist/esm/interface/crud/emails.d.ts.map +1 -1
- package/dist/esm/interface/crud/emails.js +1 -2
- package/dist/esm/interface/crud/emails.js.map +1 -1
- package/dist/esm/interface/crud/internal-api-keys.d.ts +16 -18
- package/dist/esm/interface/crud/internal-api-keys.d.ts.map +1 -1
- package/dist/esm/interface/crud/internal-api-keys.js +1 -2
- package/dist/esm/interface/crud/internal-api-keys.js.map +1 -1
- package/dist/esm/interface/crud/invoices.d.ts +2 -2
- package/dist/esm/interface/crud/invoices.d.ts.map +1 -1
- package/dist/esm/interface/crud/invoices.js +1 -2
- package/dist/esm/interface/crud/invoices.js.map +1 -1
- package/dist/esm/interface/crud/items.d.ts +6 -8
- package/dist/esm/interface/crud/items.d.ts.map +1 -1
- package/dist/esm/interface/crud/items.js +12 -16
- package/dist/esm/interface/crud/items.js.map +1 -1
- package/dist/esm/interface/crud/notification-preferences.d.ts +6 -8
- package/dist/esm/interface/crud/notification-preferences.d.ts.map +1 -1
- package/dist/esm/interface/crud/notification-preferences.js +8 -12
- package/dist/esm/interface/crud/notification-preferences.js.map +1 -1
- package/dist/esm/interface/crud/oauth-providers.d.ts +24 -26
- package/dist/esm/interface/crud/oauth-providers.d.ts.map +1 -1
- package/dist/esm/interface/crud/oauth-providers.js +1 -2
- package/dist/esm/interface/crud/oauth-providers.js.map +1 -1
- package/dist/esm/interface/crud/products.d.ts +21 -22
- package/dist/esm/interface/crud/products.d.ts.map +1 -1
- package/dist/esm/interface/crud/products.js +3 -2
- package/dist/esm/interface/crud/products.js.map +1 -1
- package/dist/esm/interface/crud/project-api-keys.d.ts +5 -6
- package/dist/esm/interface/crud/project-api-keys.d.ts.map +1 -1
- package/dist/esm/interface/crud/project-api-keys.js +1 -2
- package/dist/esm/interface/crud/project-api-keys.js.map +1 -1
- package/dist/esm/interface/crud/project-permissions.d.ts +29 -31
- package/dist/esm/interface/crud/project-permissions.d.ts.map +1 -1
- package/dist/esm/interface/crud/project-permissions.js +1 -2
- package/dist/esm/interface/crud/project-permissions.js.map +1 -1
- package/dist/esm/interface/crud/projects.d.ts +71 -73
- package/dist/esm/interface/crud/projects.d.ts.map +1 -1
- package/dist/esm/interface/crud/projects.js +3 -2
- package/dist/esm/interface/crud/projects.js.map +1 -1
- package/dist/esm/interface/crud/session-replays.d.ts.map +1 -1
- package/dist/esm/interface/crud/session-replays.js +1 -1
- package/dist/esm/interface/crud/sessions.d.ts +15 -17
- package/dist/esm/interface/crud/sessions.d.ts.map +1 -1
- package/dist/esm/interface/crud/sessions.js +1 -2
- package/dist/esm/interface/crud/sessions.js.map +1 -1
- package/dist/esm/interface/crud/sign-up-rules.d.ts.map +1 -1
- package/dist/esm/interface/crud/sign-up-rules.js +1 -1
- package/dist/esm/interface/crud/svix-token.d.ts +8 -10
- package/dist/esm/interface/crud/svix-token.d.ts.map +1 -1
- package/dist/esm/interface/crud/svix-token.js +1 -2
- package/dist/esm/interface/crud/svix-token.js.map +1 -1
- package/dist/esm/interface/crud/team-invitation-details.d.ts +6 -8
- package/dist/esm/interface/crud/team-invitation-details.d.ts.map +1 -1
- package/dist/esm/interface/crud/team-invitation-details.js +1 -2
- package/dist/esm/interface/crud/team-invitation-details.js.map +1 -1
- package/dist/esm/interface/crud/team-invitation.d.ts +7 -9
- package/dist/esm/interface/crud/team-invitation.d.ts.map +1 -1
- package/dist/esm/interface/crud/team-invitation.js +1 -2
- package/dist/esm/interface/crud/team-invitation.js.map +1 -1
- package/dist/esm/interface/crud/team-member-profiles.d.ts +26 -28
- package/dist/esm/interface/crud/team-member-profiles.d.ts.map +1 -1
- package/dist/esm/interface/crud/team-member-profiles.js +1 -2
- package/dist/esm/interface/crud/team-member-profiles.js.map +1 -1
- package/dist/esm/interface/crud/team-memberships.d.ts +14 -16
- package/dist/esm/interface/crud/team-memberships.d.ts.map +1 -1
- package/dist/esm/interface/crud/team-memberships.js +1 -2
- package/dist/esm/interface/crud/team-memberships.js.map +1 -1
- package/dist/esm/interface/crud/team-permissions.d.ts +29 -31
- package/dist/esm/interface/crud/team-permissions.d.ts.map +1 -1
- package/dist/esm/interface/crud/team-permissions.js +1 -2
- package/dist/esm/interface/crud/team-permissions.js.map +1 -1
- package/dist/esm/interface/crud/teams.d.ts +36 -38
- package/dist/esm/interface/crud/teams.d.ts.map +1 -1
- package/dist/esm/interface/crud/teams.js +2 -4
- package/dist/esm/interface/crud/teams.js.map +1 -1
- package/dist/esm/interface/crud/transactions.d.ts +14 -16
- package/dist/esm/interface/crud/transactions.d.ts.map +1 -1
- package/dist/esm/interface/crud/transactions.js +7 -13
- package/dist/esm/interface/crud/transactions.js.map +1 -1
- package/dist/esm/interface/crud/users.d.ts +11 -12
- package/dist/esm/interface/crud/users.d.ts.map +1 -1
- package/dist/esm/interface/crud/users.js +9 -5
- package/dist/esm/interface/crud/users.js.map +1 -1
- package/dist/esm/interface/handler-urls.d.ts +1 -1
- package/dist/esm/interface/handler-urls.d.ts.map +1 -1
- package/dist/esm/interface/handler-urls.js +1 -2
- package/dist/esm/interface/page-component-versions.d.ts +1 -1
- package/dist/esm/interface/page-component-versions.d.ts.map +1 -1
- package/dist/esm/interface/page-component-versions.js +1 -2
- package/dist/esm/interface/page-component-versions.js.map +1 -1
- package/dist/esm/interface/plan-usage.d.ts +1 -1
- package/dist/esm/interface/plan-usage.d.ts.map +1 -1
- package/dist/esm/interface/plan-usage.js +1 -2
- package/dist/esm/interface/plan-usage.js.map +1 -1
- package/dist/esm/interface/server-interface.d.ts +19 -19
- package/dist/esm/interface/server-interface.d.ts.map +1 -1
- package/dist/esm/interface/server-interface.js +1 -2
- package/dist/esm/interface/server-interface.js.map +1 -1
- package/dist/esm/interface/webhooks.d.ts +2 -2
- package/dist/esm/interface/webhooks.d.ts.map +1 -1
- package/dist/esm/interface/webhooks.js +1 -2
- package/dist/esm/interface/webhooks.js.map +1 -1
- package/dist/esm/known-errors.d.ts +2 -2
- package/dist/esm/known-errors.d.ts.map +1 -1
- package/dist/esm/known-errors.js +10 -21
- package/dist/esm/known-errors.js.map +1 -1
- package/dist/esm/payments/payment-methods.d.ts.map +1 -1
- package/dist/esm/payments/payment-methods.js +1 -1
- package/dist/esm/payments/payment-methods.js.map +1 -1
- package/dist/esm/payments/stripe-limits.d.ts.map +1 -1
- package/dist/esm/payments/stripe-limits.js +1 -1
- package/dist/esm/payments/stripe-limits.js.map +1 -1
- package/dist/esm/plans.d.ts.map +1 -1
- package/dist/esm/plans.js +1 -1
- package/dist/esm/plans.js.map +1 -1
- package/dist/esm/schema-fields.d.ts +14 -14
- package/dist/esm/schema-fields.d.ts.map +1 -1
- package/dist/esm/schema-fields.js +3 -64
- package/dist/esm/schema-fields.js.map +1 -1
- package/dist/esm/sessions.d.ts +6 -6
- package/dist/esm/sessions.d.ts.map +1 -1
- package/dist/esm/sessions.js +1 -2
- package/dist/esm/sessions.js.map +1 -1
- package/dist/esm/sessions.test.js +2 -3
- package/dist/esm/sessions.test.js.map +1 -1
- package/dist/esm/utils/analytics-clickmap-overlay.d.ts.map +1 -1
- package/dist/esm/utils/analytics-clickmap-overlay.js +1 -1
- package/dist/esm/utils/api-keys.d.ts.map +1 -1
- package/dist/esm/utils/api-keys.js +1 -2
- package/dist/esm/utils/api-keys.js.map +1 -1
- package/dist/esm/utils/arrays.d.ts.map +1 -1
- package/dist/esm/utils/arrays.js +1 -470
- package/dist/esm/utils/arrays.js.map +1 -1
- package/dist/esm/utils/auth-methods.d.ts.map +1 -1
- package/dist/esm/utils/auth-methods.js +1 -1
- package/dist/esm/utils/auth-methods.js.map +1 -1
- package/dist/esm/utils/base64.d.ts.map +1 -1
- package/dist/esm/utils/base64.js +1 -10
- package/dist/esm/utils/base64.js.map +1 -1
- package/dist/esm/utils/booleans.d.ts.map +1 -1
- package/dist/esm/utils/booleans.js +1 -25
- package/dist/esm/utils/booleans.js.map +1 -1
- package/dist/esm/utils/browser-compat.d.ts.map +1 -1
- package/dist/esm/utils/browser-compat.js +1 -1
- package/dist/esm/utils/browser-compat.js.map +1 -1
- package/dist/esm/utils/bytes.d.ts.map +1 -1
- package/dist/esm/utils/bytes.js +3 -198
- package/dist/esm/utils/bytes.js.map +1 -1
- package/dist/esm/utils/caches.d.ts +1 -1
- package/dist/esm/utils/caches.d.ts.map +1 -1
- package/dist/esm/utils/caches.js +1 -27
- package/dist/esm/utils/caches.js.map +1 -1
- package/dist/esm/utils/cel-fields.d.ts.map +1 -1
- package/dist/esm/utils/cel-fields.js +1 -2
- package/dist/esm/utils/cel-fields.js.map +1 -1
- package/dist/esm/utils/cloud-hosts.d.ts.map +1 -1
- package/dist/esm/utils/cloud-hosts.js +1 -27
- package/dist/esm/utils/cloud-hosts.js.map +1 -1
- package/dist/esm/utils/compile-time.d.ts.map +1 -1
- package/dist/esm/utils/compile-time.js +1 -1
- package/dist/esm/utils/compile-time.js.map +1 -1
- package/dist/esm/utils/country-codes.d.ts.map +1 -1
- package/dist/esm/utils/country-codes.js +1 -16
- package/dist/esm/utils/country-codes.js.map +1 -1
- package/dist/esm/utils/crypto.d.ts.map +1 -1
- package/dist/esm/utils/crypto.js +3 -113
- package/dist/esm/utils/crypto.js.map +1 -1
- package/dist/esm/utils/currencies.d.ts +1 -1
- package/dist/esm/utils/currencies.d.ts.map +1 -1
- package/dist/esm/utils/currencies.js +2 -37
- package/dist/esm/utils/currencies.js.map +1 -1
- package/dist/esm/utils/currency-constants.d.ts.map +1 -1
- package/dist/esm/utils/currency-constants.js +1 -1
- package/dist/esm/utils/currency-constants.js.map +1 -1
- package/dist/esm/utils/dates.d.ts.map +1 -1
- package/dist/esm/utils/dates.js +1 -44
- package/dist/esm/utils/dates.js.map +1 -1
- package/dist/esm/utils/dev-env-state-path.d.ts.map +1 -1
- package/dist/esm/utils/dev-env-state-path.js +1 -2
- package/dist/esm/utils/dev-env-state-path.js.map +1 -1
- package/dist/esm/utils/dev-tool.d.ts.map +1 -1
- package/dist/esm/utils/dev-tool.js +1 -1
- package/dist/esm/utils/dom.d.ts.map +1 -1
- package/dist/esm/utils/dom.js +1 -1
- package/dist/esm/utils/dom.js.map +1 -1
- package/dist/esm/utils/elements-chain.d.ts.map +1 -1
- package/dist/esm/utils/elements-chain.js +5 -50
- package/dist/esm/utils/elements-chain.js.map +1 -1
- package/dist/esm/utils/env.d.ts.map +1 -1
- package/dist/esm/utils/env.js +1 -2
- package/dist/esm/utils/env.js.map +1 -1
- package/dist/esm/utils/env.test.js +2 -3
- package/dist/esm/utils/env.test.js.map +1 -1
- package/dist/esm/utils/errors.d.ts +1 -1
- package/dist/esm/utils/errors.d.ts.map +1 -1
- package/dist/esm/utils/errors.js +1 -2
- package/dist/esm/utils/errors.js.map +1 -1
- package/dist/esm/utils/esbuild.d.ts +1 -1
- package/dist/esm/utils/esbuild.d.ts.map +1 -1
- package/dist/esm/utils/esbuild.js +2 -3
- package/dist/esm/utils/esbuild.js.map +1 -1
- package/dist/esm/utils/featurebase.d.ts.map +1 -1
- package/dist/esm/utils/featurebase.js +1 -2
- package/dist/esm/utils/featurebase.js.map +1 -1
- package/dist/esm/utils/fs.d.ts.map +1 -1
- package/dist/esm/utils/fs.js +1 -2
- package/dist/esm/utils/fs.js.map +1 -1
- package/dist/esm/utils/functions.d.ts.map +1 -1
- package/dist/esm/utils/functions.js +1 -24
- package/dist/esm/utils/functions.js.map +1 -1
- package/dist/esm/utils/geo.d.ts.map +1 -1
- package/dist/esm/utils/geo.js +1 -2
- package/dist/esm/utils/geo.js.map +1 -1
- package/dist/esm/utils/globals.d.ts.map +1 -1
- package/dist/esm/utils/globals.js +1 -1
- package/dist/esm/utils/globals.js.map +1 -1
- package/dist/esm/utils/hashes.d.ts.map +1 -1
- package/dist/esm/utils/hashes.js +1 -2
- package/dist/esm/utils/hashes.js.map +1 -1
- package/dist/esm/utils/html.d.ts.map +1 -1
- package/dist/esm/utils/html.js +1 -19
- package/dist/esm/utils/html.js.map +1 -1
- package/dist/esm/utils/http.d.ts.map +1 -1
- package/dist/esm/utils/http.js +1 -19
- package/dist/esm/utils/http.js.map +1 -1
- package/dist/esm/utils/ips.d.ts.map +1 -1
- package/dist/esm/utils/ips.js +1 -25
- package/dist/esm/utils/ips.js.map +1 -1
- package/dist/esm/utils/json.d.ts +1 -1
- package/dist/esm/utils/json.d.ts.map +1 -1
- package/dist/esm/utils/json.js +1 -155
- package/dist/esm/utils/json.js.map +1 -1
- package/dist/esm/utils/jsx-editable-transpiler.d.ts.map +1 -1
- package/dist/esm/utils/jsx-editable-transpiler.js +1 -2
- package/dist/esm/utils/jsx-editable-transpiler.js.map +1 -1
- package/dist/esm/utils/jsx-editable-transpiler.test.js +2 -3
- package/dist/esm/utils/jsx-editable-transpiler.test.js.map +1 -1
- package/dist/esm/utils/jwt.d.ts.map +1 -1
- package/dist/esm/utils/jwt.js +1 -2
- package/dist/esm/utils/jwt.js.map +1 -1
- package/dist/esm/utils/locks.d.ts.map +1 -1
- package/dist/esm/utils/locks.js +1 -2
- package/dist/esm/utils/locks.js.map +1 -1
- package/dist/esm/utils/maps.d.ts.map +1 -1
- package/dist/esm/utils/maps.js +1 -111
- package/dist/esm/utils/maps.js.map +1 -1
- package/dist/esm/utils/math.d.ts.map +1 -1
- package/dist/esm/utils/math.js +1 -11
- package/dist/esm/utils/math.js.map +1 -1
- package/dist/esm/utils/monkey-patch.d.ts.map +1 -1
- package/dist/esm/utils/monkey-patch.js +2 -3
- package/dist/esm/utils/monkey-patch.js.map +1 -1
- package/dist/esm/utils/node-http.js +1 -2
- package/dist/esm/utils/node-http.js.map +1 -1
- package/dist/esm/utils/numbers.d.ts.map +1 -1
- package/dist/esm/utils/numbers.js +1 -45
- package/dist/esm/utils/numbers.js.map +1 -1
- package/dist/esm/utils/oauth.d.ts.map +1 -1
- package/dist/esm/utils/oauth.js +1 -1
- package/dist/esm/utils/oauth.js.map +1 -1
- package/dist/esm/utils/objects.d.ts.map +1 -1
- package/dist/esm/utils/objects.js +1 -622
- package/dist/esm/utils/objects.js.map +1 -1
- package/dist/esm/utils/paginated-lists.d.ts.map +1 -1
- package/dist/esm/utils/paginated-lists.js +1 -2
- package/dist/esm/utils/paginated-lists.js.map +1 -1
- package/dist/esm/utils/paginated-lists.test.js +2 -3
- package/dist/esm/utils/paginated-lists.test.js.map +1 -1
- package/dist/esm/utils/passkey.d.ts +1 -1
- package/dist/esm/utils/passkey.js +1 -1
- package/dist/esm/utils/promises.d.ts +1 -1
- package/dist/esm/utils/promises.d.ts.map +1 -1
- package/dist/esm/utils/promises.js +1 -160
- package/dist/esm/utils/promises.js.map +1 -1
- package/dist/esm/utils/proxies.d.ts.map +1 -1
- package/dist/esm/utils/proxies.js +1 -37
- package/dist/esm/utils/proxies.js.map +1 -1
- package/dist/esm/utils/react.d.ts.map +1 -1
- package/dist/esm/utils/react.js +1 -41
- package/dist/esm/utils/react.js.map +1 -1
- package/dist/esm/utils/redirect-urls.d.ts.map +1 -1
- package/dist/esm/utils/redirect-urls.js +2 -92
- package/dist/esm/utils/redirect-urls.js.map +1 -1
- package/dist/esm/utils/regex.js +1 -1
- package/dist/esm/utils/regex.js.map +1 -1
- package/dist/esm/utils/results.d.ts.map +1 -1
- package/dist/esm/utils/results.js +1 -213
- package/dist/esm/utils/results.js.map +1 -1
- package/dist/esm/utils/sentry.js +1 -1
- package/dist/esm/utils/sentry.js.map +1 -1
- package/dist/esm/utils/stores.d.ts +3 -3
- package/dist/esm/utils/stores.d.ts.map +1 -1
- package/dist/esm/utils/stores.js +1 -2
- package/dist/esm/utils/stores.js.map +1 -1
- package/dist/esm/utils/strings.d.ts.map +1 -1
- package/dist/esm/utils/strings.js +1 -251
- package/dist/esm/utils/strings.js.map +1 -1
- package/dist/esm/utils/strings.nicify.test.js +2 -3
- package/dist/esm/utils/strings.nicify.test.js.map +1 -1
- package/dist/esm/utils/telemetry.d.ts.map +1 -1
- package/dist/esm/utils/telemetry.js +1 -2
- package/dist/esm/utils/telemetry.js.map +1 -1
- package/dist/esm/utils/turnstile-browser.d.ts +1 -1
- package/dist/esm/utils/turnstile-browser.d.ts.map +1 -1
- package/dist/esm/utils/turnstile-browser.js +1 -2
- package/dist/esm/utils/turnstile-browser.js.map +1 -1
- package/dist/esm/utils/turnstile-flow.d.ts +1 -1
- package/dist/esm/utils/turnstile-flow.d.ts.map +1 -1
- package/dist/esm/utils/turnstile-flow.js +1 -2
- package/dist/esm/utils/turnstile-flow.js.map +1 -1
- package/dist/esm/utils/turnstile-flow.test.js +2 -3
- package/dist/esm/utils/turnstile-flow.test.js.map +1 -1
- package/dist/esm/utils/turnstile.d.ts.map +1 -1
- package/dist/esm/utils/turnstile.js +1 -1
- package/dist/esm/utils/turnstile.js.map +1 -1
- package/dist/esm/utils/typed-arrays.js +1 -2
- package/dist/esm/utils/typed-arrays.js.map +1 -1
- package/dist/esm/utils/types.d.ts +1 -1
- package/dist/esm/utils/types.d.ts.map +1 -1
- package/dist/esm/utils/types.js +1 -1
- package/dist/esm/utils/types.js.map +1 -1
- package/dist/esm/utils/unicode.d.ts.map +1 -1
- package/dist/esm/utils/unicode.js +1 -13
- package/dist/esm/utils/unicode.js.map +1 -1
- package/dist/esm/utils/urls.d.ts.map +1 -1
- package/dist/esm/utils/urls.js +1 -151
- package/dist/esm/utils/urls.js.map +1 -1
- package/dist/esm/utils/uuids.d.ts.map +1 -1
- package/dist/esm/utils/uuids.js +2 -26
- package/dist/esm/utils/uuids.js.map +1 -1
- package/dist/format-4JG1MGv5.d.ts +61 -0
- package/dist/format-4JG1MGv5.d.ts.map +1 -0
- package/dist/handler-urls-BHt3v8Ai.d.ts +70 -0
- package/dist/handler-urls-BHt3v8Ai.d.ts.map +1 -0
- package/dist/helpers/emails.js +2 -4
- package/dist/helpers/emails.js.map +1 -1
- package/dist/helpers/init-prompt.d.ts.map +1 -1
- package/dist/helpers/init-prompt.js +2 -4
- package/dist/helpers/init-prompt.js.map +1 -1
- package/dist/helpers/password.d.ts +1 -1
- package/dist/helpers/password.d.ts.map +1 -1
- package/dist/helpers/password.js +2 -4
- package/dist/helpers/password.js.map +1 -1
- package/dist/helpers/production-mode.d.ts +1 -1
- package/dist/helpers/production-mode.d.ts.map +1 -1
- package/dist/helpers/production-mode.js +2 -4
- package/dist/helpers/production-mode.js.map +1 -1
- package/dist/helpers/support-sla.d.ts.map +1 -1
- package/dist/helpers/support-sla.js +2 -3
- package/dist/helpers/support-sla.js.map +1 -1
- package/dist/helpers/support-sla.test.js +1 -3
- package/dist/helpers/support-sla.test.js.map +1 -1
- package/dist/helpers/vault/client-side.d.ts.map +1 -1
- package/dist/helpers/vault/client-side.js +2 -22
- package/dist/helpers/vault/client-side.js.map +1 -1
- package/dist/helpers/vault/server-side.js +2 -4
- package/dist/helpers/vault/server-side.js.map +1 -1
- package/dist/hooks/use-async-callback.d.ts.map +1 -1
- package/dist/hooks/use-async-callback.js +4 -5
- package/dist/hooks/use-async-callback.js.map +1 -1
- package/dist/hooks/use-async-external-store.d.ts +1 -1
- package/dist/hooks/use-async-external-store.d.ts.map +1 -1
- package/dist/hooks/use-async-external-store.js +2 -4
- package/dist/hooks/use-async-external-store.js.map +1 -1
- package/dist/hooks/use-hash.js +2 -4
- package/dist/hooks/use-hash.js.map +1 -1
- package/dist/hooks/use-hover.d.ts.map +1 -1
- package/dist/hooks/use-hover.js +2 -4
- package/dist/hooks/use-hover.js.map +1 -1
- package/dist/hooks/use-strict-memo.d.ts.map +1 -1
- package/dist/hooks/use-strict-memo.js +2 -72
- package/dist/hooks/use-strict-memo.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +27 -29
- package/dist/interface/admin-interface.d.ts +3 -379
- package/dist/interface/admin-interface.js +2 -4
- package/dist/interface/admin-interface.js.map +1 -1
- package/dist/interface/admin-metrics.d.ts +2 -807
- package/dist/interface/admin-metrics.js +2 -4
- package/dist/interface/admin-metrics.js.map +1 -1
- package/dist/interface/client-interface.d.ts +2 -447
- package/dist/interface/client-interface.js +32 -17
- package/dist/interface/client-interface.js.map +1 -1
- package/dist/interface/client-interface.test.js +83 -13
- package/dist/interface/client-interface.test.js.map +1 -1
- package/dist/interface/conversations.d.ts +33 -33
- package/dist/interface/conversations.d.ts.map +1 -1
- package/dist/interface/conversations.js +2 -4
- package/dist/interface/conversations.js.map +1 -1
- package/dist/interface/crud/analytics.d.ts +2 -14
- package/dist/interface/crud/connected-accounts.d.ts +2 -68
- package/dist/interface/crud/connected-accounts.js +2 -4
- package/dist/interface/crud/connected-accounts.js.map +1 -1
- package/dist/interface/crud/contact-channels.d.ts +2 -181
- package/dist/interface/crud/contact-channels.js +2 -4
- package/dist/interface/crud/contact-channels.js.map +1 -1
- package/dist/interface/crud/current-user.d.ts +2 -285
- package/dist/interface/crud/current-user.js +2 -4
- package/dist/interface/crud/current-user.js.map +1 -1
- package/dist/interface/crud/email-outbox.d.ts +2 -1465
- package/dist/interface/crud/email-outbox.js +4 -5
- package/dist/interface/crud/email-outbox.js.map +1 -1
- package/dist/interface/crud/email-templates.d.ts +15 -16
- package/dist/interface/crud/email-templates.d.ts.map +1 -1
- package/dist/interface/crud/email-templates.js +2 -4
- package/dist/interface/crud/email-templates.js.map +1 -1
- package/dist/interface/crud/emails.d.ts +2 -41
- package/dist/interface/crud/emails.js +4 -5
- package/dist/interface/crud/emails.js.map +1 -1
- package/dist/interface/crud/internal-api-keys.d.ts +2 -140
- package/dist/interface/crud/internal-api-keys.js +2 -4
- package/dist/interface/crud/internal-api-keys.js.map +1 -1
- package/dist/interface/crud/invoices.d.ts +2 -43
- package/dist/interface/crud/invoices.js +2 -4
- package/dist/interface/crud/invoices.js.map +1 -1
- package/dist/interface/crud/items.d.ts +2 -30
- package/dist/interface/crud/items.js +2 -4
- package/dist/interface/crud/items.js.map +1 -1
- package/dist/interface/crud/notification-preferences.d.ts +2 -38
- package/dist/interface/crud/notification-preferences.js +2 -4
- package/dist/interface/crud/notification-preferences.js.map +1 -1
- package/dist/interface/crud/oauth-providers.d.ts +2 -186
- package/dist/interface/crud/oauth-providers.js +2 -4
- package/dist/interface/crud/oauth-providers.js.map +1 -1
- package/dist/interface/crud/products.d.ts +2 -182
- package/dist/interface/crud/products.js +4 -4
- package/dist/interface/crud/products.js.map +1 -1
- package/dist/interface/crud/project-api-keys.d.ts +2 -203
- package/dist/interface/crud/project-api-keys.js +2 -4
- package/dist/interface/crud/project-api-keys.js.map +1 -1
- package/dist/interface/crud/project-permissions.d.ts +2 -161
- package/dist/interface/crud/project-permissions.js +4 -5
- package/dist/interface/crud/project-permissions.js.map +1 -1
- package/dist/interface/crud/projects.d.ts +2 -901
- package/dist/interface/crud/projects.js +6 -5
- package/dist/interface/crud/projects.js.map +1 -1
- package/dist/interface/crud/session-replays.d.ts +2 -83
- package/dist/interface/crud/sessions.d.ts +2 -150
- package/dist/interface/crud/sessions.js +2 -4
- package/dist/interface/crud/sessions.js.map +1 -1
- package/dist/interface/crud/sign-up-rules.d.ts.map +1 -1
- package/dist/interface/crud/svix-token.d.ts +2 -31
- package/dist/interface/crud/svix-token.js +2 -4
- package/dist/interface/crud/svix-token.js.map +1 -1
- package/dist/interface/crud/team-invitation-details.d.ts +5 -6
- package/dist/interface/crud/team-invitation-details.d.ts.map +1 -1
- package/dist/interface/crud/team-invitation-details.js +4 -5
- package/dist/interface/crud/team-invitation-details.js.map +1 -1
- package/dist/interface/crud/team-invitation.d.ts +2 -54
- package/dist/interface/crud/team-invitation.js +4 -5
- package/dist/interface/crud/team-invitation.js.map +1 -1
- package/dist/interface/crud/team-member-profiles.d.ts +2 -286
- package/dist/interface/crud/team-member-profiles.js +4 -5
- package/dist/interface/crud/team-member-profiles.js.map +1 -1
- package/dist/interface/crud/team-memberships.d.ts +2 -75
- package/dist/interface/crud/team-memberships.js +2 -4
- package/dist/interface/crud/team-memberships.js.map +1 -1
- package/dist/interface/crud/team-permissions.d.ts +2 -169
- package/dist/interface/crud/team-permissions.js +4 -5
- package/dist/interface/crud/team-permissions.js.map +1 -1
- package/dist/interface/crud/teams.d.ts +2 -299
- package/dist/interface/crud/teams.js +5 -7
- package/dist/interface/crud/teams.js.map +1 -1
- package/dist/interface/crud/transactions.d.ts +2 -183
- package/dist/interface/crud/transactions.js +2 -4
- package/dist/interface/crud/transactions.js.map +1 -1
- package/dist/interface/crud/users.d.ts +2 -653
- package/dist/interface/crud/users.js +12 -8
- package/dist/interface/crud/users.js.map +1 -1
- package/dist/interface/handler-urls.d.ts +2 -51
- package/dist/interface/handler-urls.js +12 -14
- package/dist/interface/page-component-versions.d.ts +2 -25
- package/dist/interface/page-component-versions.js +2 -4
- package/dist/interface/page-component-versions.js.map +1 -1
- package/dist/interface/plan-usage.d.ts +2 -57
- package/dist/interface/plan-usage.js +2 -4
- package/dist/interface/plan-usage.js.map +1 -1
- package/dist/interface/server-interface.d.ts +2 -257
- package/dist/interface/server-interface.js +2 -4
- package/dist/interface/server-interface.js.map +1 -1
- package/dist/interface/webhooks.d.ts +2 -326
- package/dist/interface/webhooks.js +2 -4
- package/dist/interface/webhooks.js.map +1 -1
- package/dist/internal-api-keys-D8IYDodH.d.ts +139 -0
- package/dist/internal-api-keys-D8IYDodH.d.ts.map +1 -0
- package/dist/invoices-U65KzAZX.d.ts +43 -0
- package/dist/invoices-U65KzAZX.d.ts.map +1 -0
- package/dist/items-DlLSlVUD.d.ts +29 -0
- package/dist/items-DlLSlVUD.d.ts.map +1 -0
- package/dist/json-a1QIXu5z.d.ts +15 -0
- package/dist/json-a1QIXu5z.d.ts.map +1 -0
- package/dist/known-errors-Bm4a61wL.d.ts +575 -0
- package/dist/known-errors-Bm4a61wL.d.ts.map +1 -0
- package/dist/known-errors.d.ts +2 -575
- package/dist/known-errors.js +11 -23
- package/dist/known-errors.js.map +1 -1
- package/dist/notification-preferences-Bmzr_EOY.d.ts +37 -0
- package/dist/notification-preferences-Bmzr_EOY.d.ts.map +1 -0
- package/dist/oauth-providers-BMkKSSlA.d.ts +185 -0
- package/dist/oauth-providers-BMkKSSlA.d.ts.map +1 -0
- package/dist/objects-DkCkeBWE.d.ts +59 -0
- package/dist/objects-DkCkeBWE.d.ts.map +1 -0
- package/dist/passkey-CKg87UH-.d.ts +2 -0
- package/dist/payments/payment-methods.d.ts.map +1 -1
- package/dist/payments/payment-methods.js +2 -3
- package/dist/payments/payment-methods.js.map +1 -1
- package/dist/payments/stripe-limits.d.ts.map +1 -1
- package/dist/payments/stripe-limits.js +2 -3
- package/dist/payments/stripe-limits.js.map +1 -1
- package/dist/plan-usage-DfDoj5K4.d.ts +57 -0
- package/dist/plan-usage-DfDoj5K4.d.ts.map +1 -0
- package/dist/plans.d.ts.map +1 -1
- package/dist/plans.js +2 -3
- package/dist/plans.js.map +1 -1
- package/dist/products-Bs74ld-v.d.ts +182 -0
- package/dist/products-Bs74ld-v.d.ts.map +1 -0
- package/dist/project-api-keys--7V5X_UW.d.ts +203 -0
- package/dist/project-api-keys--7V5X_UW.d.ts.map +1 -0
- package/dist/project-permissions-kdi675F-.d.ts +160 -0
- package/dist/project-permissions-kdi675F-.d.ts.map +1 -0
- package/dist/projects-CgFGB3nO.d.ts +900 -0
- package/dist/projects-CgFGB3nO.d.ts.map +1 -0
- package/dist/results-DP3BzoL6.d.ts +70 -0
- package/dist/results-DP3BzoL6.d.ts.map +1 -0
- package/dist/{chunk-BE-pF4vm.js → rolldown-runtime-D6vf50IK.js} +12 -18
- package/dist/schema-01nWxmb4.d.ts +2328 -0
- package/dist/schema-01nWxmb4.d.ts.map +1 -0
- package/dist/schema-fields-DqGQ4kF7.d.ts +517 -0
- package/dist/schema-fields-DqGQ4kF7.d.ts.map +1 -0
- package/dist/schema-fields.d.ts +3 -518
- package/dist/schema-fields.js +21 -82
- package/dist/schema-fields.js.map +1 -1
- package/dist/server-interface-BUPG1kor.d.ts +257 -0
- package/dist/server-interface-BUPG1kor.d.ts.map +1 -0
- package/dist/session-replays-CXqhDpZq.d.ts +83 -0
- package/dist/session-replays-CXqhDpZq.d.ts.map +1 -0
- package/dist/sessions-B7Ko2Ldr.d.ts +149 -0
- package/dist/sessions-B7Ko2Ldr.d.ts.map +1 -0
- package/dist/sessions-d8qtvBUB.d.ts +175 -0
- package/dist/sessions-d8qtvBUB.d.ts.map +1 -0
- package/dist/sessions.d.ts +2 -175
- package/dist/sessions.js +4 -5
- package/dist/sessions.js.map +1 -1
- package/dist/sessions.test.js +1 -3
- package/dist/sessions.test.js.map +1 -1
- package/dist/strings-DWgkUybS.d.ts +76 -0
- package/dist/strings-DWgkUybS.d.ts.map +1 -0
- package/dist/svix-token-BsMrLGvy.d.ts +30 -0
- package/dist/svix-token-BsMrLGvy.d.ts.map +1 -0
- package/dist/team-invitation-Cyqt9oWw.d.ts +53 -0
- package/dist/team-invitation-Cyqt9oWw.d.ts.map +1 -0
- package/dist/team-member-profiles-uTluO8XI.d.ts +285 -0
- package/dist/team-member-profiles-uTluO8XI.d.ts.map +1 -0
- package/dist/team-memberships-DZHk2A5b.d.ts +74 -0
- package/dist/team-memberships-DZHk2A5b.d.ts.map +1 -0
- package/dist/team-permissions-DqOpaOWh.d.ts +168 -0
- package/dist/team-permissions-DqOpaOWh.d.ts.map +1 -0
- package/dist/teams-CQMcBnjM.d.ts +298 -0
- package/dist/teams-CQMcBnjM.d.ts.map +1 -0
- package/dist/transactions-DhnbvGH5.d.ts +182 -0
- package/dist/transactions-DhnbvGH5.d.ts.map +1 -0
- package/dist/types-DfTcxNtM.d.ts +77 -0
- package/dist/types-DfTcxNtM.d.ts.map +1 -0
- package/dist/users-CmBBuF00.d.ts +653 -0
- package/dist/users-CmBBuF00.d.ts.map +1 -0
- package/dist/utils/analytics-clickmap-overlay.d.ts.map +1 -1
- package/dist/utils/analytics-clickmap-overlay.js +2 -3
- package/dist/utils/analytics-clickmap-overlay.js.map +1 -1
- package/dist/utils/api-keys.d.ts.map +1 -1
- package/dist/utils/api-keys.js +4 -5
- package/dist/utils/api-keys.js.map +1 -1
- package/dist/utils/arrays.d.ts.map +1 -1
- package/dist/utils/arrays.js +2 -472
- package/dist/utils/arrays.js.map +1 -1
- package/dist/utils/auth-methods.d.ts.map +1 -1
- package/dist/utils/auth-methods.js +2 -3
- package/dist/utils/auth-methods.js.map +1 -1
- package/dist/utils/base64.d.ts.map +1 -1
- package/dist/utils/base64.js +2 -12
- package/dist/utils/base64.js.map +1 -1
- package/dist/utils/booleans.d.ts.map +1 -1
- package/dist/utils/booleans.js +2 -27
- package/dist/utils/booleans.js.map +1 -1
- package/dist/utils/browser-compat.d.ts.map +1 -1
- package/dist/utils/browser-compat.js +2 -3
- package/dist/utils/browser-compat.js.map +1 -1
- package/dist/utils/bytes.d.ts.map +1 -1
- package/dist/utils/bytes.js +4 -200
- package/dist/utils/bytes.js.map +1 -1
- package/dist/utils/caches.d.ts.map +1 -1
- package/dist/utils/caches.js +2 -29
- package/dist/utils/caches.js.map +1 -1
- package/dist/utils/cel-fields.d.ts.map +1 -1
- package/dist/utils/cel-fields.js +2 -4
- package/dist/utils/cel-fields.js.map +1 -1
- package/dist/utils/cloud-hosts.d.ts.map +1 -1
- package/dist/utils/cloud-hosts.js +2 -29
- package/dist/utils/cloud-hosts.js.map +1 -1
- package/dist/utils/compile-time.d.ts.map +1 -1
- package/dist/utils/compile-time.js +2 -3
- package/dist/utils/compile-time.js.map +1 -1
- package/dist/utils/country-codes.d.ts +2 -11
- package/dist/utils/country-codes.js +2 -18
- package/dist/utils/country-codes.js.map +1 -1
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +4 -115
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/currencies.d.ts +1 -1
- package/dist/utils/currencies.d.ts.map +1 -1
- package/dist/utils/currencies.js +3 -39
- package/dist/utils/currencies.js.map +1 -1
- package/dist/utils/currency-constants.d.ts +2 -45
- package/dist/utils/currency-constants.js +2 -3
- package/dist/utils/currency-constants.js.map +1 -1
- package/dist/utils/dates.d.ts +2 -23
- package/dist/utils/dates.js +2 -46
- package/dist/utils/dates.js.map +1 -1
- package/dist/utils/dev-env-state-path.d.ts.map +1 -1
- package/dist/utils/dev-env-state-path.js +2 -4
- package/dist/utils/dev-env-state-path.js.map +1 -1
- package/dist/utils/dev-tool.d.ts.map +1 -1
- package/dist/utils/dev-tool.js +2 -3
- package/dist/utils/dev-tool.js.map +1 -1
- package/dist/utils/dom.d.ts.map +1 -1
- package/dist/utils/dom.js +2 -3
- package/dist/utils/dom.js.map +1 -1
- package/dist/utils/elements-chain.d.ts.map +1 -1
- package/dist/utils/elements-chain.js +6 -52
- package/dist/utils/elements-chain.js.map +1 -1
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/env.js +2 -4
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/env.test.js +1 -3
- package/dist/utils/env.test.js.map +1 -1
- package/dist/utils/errors.d.ts +2 -238
- package/dist/utils/errors.js +2 -4
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/esbuild.d.ts +1 -1
- package/dist/utils/esbuild.d.ts.map +1 -1
- package/dist/utils/esbuild.js +5 -6
- package/dist/utils/esbuild.js.map +1 -1
- package/dist/utils/featurebase.d.ts.map +1 -1
- package/dist/utils/featurebase.js +2 -4
- package/dist/utils/featurebase.js.map +1 -1
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +5 -6
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/functions.d.ts.map +1 -1
- package/dist/utils/functions.js +2 -26
- package/dist/utils/functions.js.map +1 -1
- package/dist/utils/geo.d.ts.map +1 -1
- package/dist/utils/geo.js +2 -4
- package/dist/utils/geo.js.map +1 -1
- package/dist/utils/globals.d.ts.map +1 -1
- package/dist/utils/globals.js +2 -3
- package/dist/utils/globals.js.map +1 -1
- package/dist/utils/hashes.d.ts.map +1 -1
- package/dist/utils/hashes.js +4 -5
- package/dist/utils/hashes.js.map +1 -1
- package/dist/utils/html.d.ts.map +1 -1
- package/dist/utils/html.js +2 -21
- package/dist/utils/html.js.map +1 -1
- package/dist/utils/http.d.ts.map +1 -1
- package/dist/utils/http.js +2 -21
- package/dist/utils/http.js.map +1 -1
- package/dist/utils/ips.d.ts.map +1 -1
- package/dist/utils/ips.js +4 -28
- package/dist/utils/ips.js.map +1 -1
- package/dist/utils/json.d.ts +2 -15
- package/dist/utils/json.js +2 -157
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/jsx-editable-transpiler.d.ts.map +1 -1
- package/dist/utils/jsx-editable-transpiler.js +7 -8
- package/dist/utils/jsx-editable-transpiler.js.map +1 -1
- package/dist/utils/jsx-editable-transpiler.test.js +1 -3
- package/dist/utils/jsx-editable-transpiler.test.js.map +1 -1
- package/dist/utils/jwt.d.ts.map +1 -1
- package/dist/utils/jwt.js +6 -7
- package/dist/utils/jwt.js.map +1 -1
- package/dist/utils/locks.d.ts.map +1 -1
- package/dist/utils/locks.js +2 -4
- package/dist/utils/locks.js.map +1 -1
- package/dist/utils/maps.d.ts.map +1 -1
- package/dist/utils/maps.js +2 -113
- package/dist/utils/maps.js.map +1 -1
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +2 -13
- package/dist/utils/math.js.map +1 -1
- package/dist/utils/monkey-patch.d.ts.map +1 -1
- package/dist/utils/monkey-patch.js +3 -5
- package/dist/utils/monkey-patch.js.map +1 -1
- package/dist/utils/node-http.js +2 -4
- package/dist/utils/node-http.js.map +1 -1
- package/dist/utils/numbers.d.ts.map +1 -1
- package/dist/utils/numbers.js +2 -47
- package/dist/utils/numbers.js.map +1 -1
- package/dist/utils/oauth.d.ts.map +1 -1
- package/dist/utils/oauth.js +2 -3
- package/dist/utils/oauth.js.map +1 -1
- package/dist/utils/objects.d.ts +2 -59
- package/dist/utils/objects.js +2 -624
- package/dist/utils/objects.js.map +1 -1
- package/dist/utils/paginated-lists.d.ts.map +1 -1
- package/dist/utils/paginated-lists.js +2 -4
- package/dist/utils/paginated-lists.js.map +1 -1
- package/dist/utils/paginated-lists.test.js +1 -3
- package/dist/utils/paginated-lists.test.js.map +1 -1
- package/dist/utils/passkey.d.ts +2 -2
- package/dist/utils/promises.d.ts +1 -1
- package/dist/utils/promises.d.ts.map +1 -1
- package/dist/utils/promises.js +2 -162
- package/dist/utils/promises.js.map +1 -1
- package/dist/utils/proxies.d.ts.map +1 -1
- package/dist/utils/proxies.js +2 -39
- package/dist/utils/proxies.js.map +1 -1
- package/dist/utils/react.d.ts.map +1 -1
- package/dist/utils/react.js +4 -44
- package/dist/utils/react.js.map +1 -1
- package/dist/utils/redirect-urls.d.ts.map +1 -1
- package/dist/utils/redirect-urls.js +3 -94
- package/dist/utils/redirect-urls.js.map +1 -1
- package/dist/utils/regex.js +2 -3
- package/dist/utils/regex.js.map +1 -1
- package/dist/utils/results.d.ts +2 -70
- package/dist/utils/results.js +2 -215
- package/dist/utils/results.js.map +1 -1
- package/dist/utils/sentry.js +2 -3
- package/dist/utils/sentry.js.map +1 -1
- package/dist/utils/stores.d.ts +1 -1
- package/dist/utils/stores.d.ts.map +1 -1
- package/dist/utils/stores.js +2 -4
- package/dist/utils/stores.js.map +1 -1
- package/dist/utils/strings.d.ts +2 -76
- package/dist/utils/strings.js +2 -253
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/strings.nicify.test.js +1 -3
- package/dist/utils/strings.nicify.test.js.map +1 -1
- package/dist/utils/telemetry.d.ts.map +1 -1
- package/dist/utils/telemetry.js +2 -4
- package/dist/utils/telemetry.js.map +1 -1
- package/dist/utils/turnstile-browser.d.ts.map +1 -1
- package/dist/utils/turnstile-browser.js +2 -4
- package/dist/utils/turnstile-browser.js.map +1 -1
- package/dist/utils/turnstile-flow.d.ts.map +1 -1
- package/dist/utils/turnstile-flow.js +2 -4
- package/dist/utils/turnstile-flow.js.map +1 -1
- package/dist/utils/turnstile-flow.test.js +1 -3
- package/dist/utils/turnstile-flow.test.js.map +1 -1
- package/dist/utils/turnstile.d.ts.map +1 -1
- package/dist/utils/turnstile.js +2 -3
- package/dist/utils/turnstile.js.map +1 -1
- package/dist/utils/typed-arrays.js +2 -4
- package/dist/utils/typed-arrays.js.map +1 -1
- package/dist/utils/types.d.ts +2 -77
- package/dist/utils/types.js +2 -3
- package/dist/utils/types.js.map +1 -1
- package/dist/utils/unicode.d.ts.map +1 -1
- package/dist/utils/unicode.js +2 -15
- package/dist/utils/unicode.js.map +1 -1
- package/dist/utils/urls.d.ts.map +1 -1
- package/dist/utils/urls.js +2 -153
- package/dist/utils/urls.js.map +1 -1
- package/dist/utils/uuids.d.ts.map +1 -1
- package/dist/utils/uuids.js +3 -28
- package/dist/utils/uuids.js.map +1 -1
- package/dist/webhooks-ByXrdSOx.d.ts +326 -0
- package/dist/webhooks-ByXrdSOx.d.ts.map +1 -0
- package/package.json +2 -8
- package/src/interface/client-interface.test.ts +77 -12
- package/src/interface/client-interface.ts +9 -9
- package/dist/config/format.d.ts.map +0 -1
- package/dist/config/schema.d.ts.map +0 -1
- package/dist/crud.d.ts.map +0 -1
- package/dist/interface/admin-interface.d.ts.map +0 -1
- package/dist/interface/admin-metrics.d.ts.map +0 -1
- package/dist/interface/client-interface.d.ts.map +0 -1
- package/dist/interface/crud/analytics.d.ts.map +0 -1
- package/dist/interface/crud/connected-accounts.d.ts.map +0 -1
- package/dist/interface/crud/contact-channels.d.ts.map +0 -1
- package/dist/interface/crud/current-user.d.ts.map +0 -1
- package/dist/interface/crud/emails.d.ts.map +0 -1
- package/dist/interface/crud/internal-api-keys.d.ts.map +0 -1
- package/dist/interface/crud/invoices.d.ts.map +0 -1
- package/dist/interface/crud/items.d.ts.map +0 -1
- package/dist/interface/crud/notification-preferences.d.ts.map +0 -1
- package/dist/interface/crud/oauth-providers.d.ts.map +0 -1
- package/dist/interface/crud/products.d.ts.map +0 -1
- package/dist/interface/crud/project-api-keys.d.ts.map +0 -1
- package/dist/interface/crud/project-permissions.d.ts.map +0 -1
- package/dist/interface/crud/projects.d.ts.map +0 -1
- package/dist/interface/crud/session-replays.d.ts.map +0 -1
- package/dist/interface/crud/sessions.d.ts.map +0 -1
- package/dist/interface/crud/svix-token.d.ts.map +0 -1
- package/dist/interface/crud/team-invitation.d.ts.map +0 -1
- package/dist/interface/crud/team-member-profiles.d.ts.map +0 -1
- package/dist/interface/crud/team-memberships.d.ts.map +0 -1
- package/dist/interface/crud/team-permissions.d.ts.map +0 -1
- package/dist/interface/crud/teams.d.ts.map +0 -1
- package/dist/interface/crud/transactions.d.ts.map +0 -1
- package/dist/interface/crud/users.d.ts.map +0 -1
- package/dist/interface/handler-urls.d.ts.map +0 -1
- package/dist/interface/page-component-versions.d.ts.map +0 -1
- package/dist/interface/plan-usage.d.ts.map +0 -1
- package/dist/interface/server-interface.d.ts.map +0 -1
- package/dist/interface/webhooks.d.ts.map +0 -1
- package/dist/known-errors.d.ts.map +0 -1
- package/dist/schema-fields.d.ts.map +0 -1
- package/dist/sessions.d.ts.map +0 -1
- package/dist/utils/country-codes.d.ts.map +0 -1
- package/dist/utils/currency-constants.d.ts.map +0 -1
- package/dist/utils/dates.d.ts.map +0 -1
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/json.d.ts.map +0 -1
- package/dist/utils/objects.d.ts.map +0 -1
- package/dist/utils/results.d.ts.map +0 -1
- package/dist/utils/strings.d.ts.map +0 -1
- package/dist/utils/types.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"production-mode.d.ts","names":[],"sources":["../../../src/helpers/production-mode.ts"],"mappings":";;;KAIY,mBAAA;EACV,OAAA;EACA,
|
|
1
|
+
{"version":3,"file":"production-mode.d.ts","names":[],"sources":["../../../src/helpers/production-mode.ts"],"mappings":";;;KAIY,mBAAA;EACV,OAAA;EACA,cAAc;AAAA;AAAA,iBAGA,uBAAA,CAAwB,OAAA,EAAS,YAAA,oBAAgC,mBAAmB"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { HexclaveAssertionError, captureError } from "../utils/errors.js";
|
|
2
2
|
import { isLocalhost } from "../utils/urls.js";
|
|
3
|
-
|
|
4
3
|
//#region src/helpers/production-mode.ts
|
|
5
4
|
function getProductionModeErrors(project) {
|
|
6
5
|
const errors = [];
|
|
@@ -40,7 +39,7 @@ function getProductionModeErrors(project) {
|
|
|
40
39
|
}
|
|
41
40
|
return errors;
|
|
42
41
|
}
|
|
43
|
-
|
|
44
42
|
//#endregion
|
|
45
43
|
export { getProductionModeErrors };
|
|
44
|
+
|
|
46
45
|
//# sourceMappingURL=production-mode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"production-mode.js","names":[],"sources":["../../../src/helpers/production-mode.ts"],"sourcesContent":["import { ProjectsCrud } from \"../interface/crud/projects\";\nimport { HexclaveAssertionError, captureError } from \"../utils/errors\";\nimport { isLocalhost } from \"../utils/urls\";\n\nexport type ProductionModeError = {\n message: string,\n relativeFixUrl: `/${string}`,\n};\n\nexport function getProductionModeErrors(project: ProjectsCrud[\"Admin\"][\"Read\"]): ProductionModeError[] {\n const errors: ProductionModeError[] = [];\n const domainsFixUrl = `/projects/${project.id}/domains` as const;\n\n if (project.config.allow_localhost) {\n errors.push({\n message: \"Localhost is not allowed in production mode, turn off 'Allow localhost' in project settings\",\n relativeFixUrl: domainsFixUrl,\n });\n }\n\n for (const { domain } of project.config.domains) {\n let url;\n try {\n // For wildcard domains, replace wildcards with a valid placeholder to validate the URL structure\n const normalizedDomain = domain.replace(/\\*+/g, 'wildcard-placeholder');\n url = new URL(normalizedDomain);\n } catch (e) {\n captureError(\"production-mode-domain-not-valid\", new HexclaveAssertionError(\"Domain was somehow not a valid URL; we should've caught this when setting the domain in the first place\", {\n domain,\n projectId: project\n }));\n errors.push({\n message: \"Trusted domain is not a valid URL: \" + domain,\n relativeFixUrl: domainsFixUrl,\n });\n continue;\n }\n\n if (isLocalhost(url)) {\n errors.push({\n message: \"Localhost domains are not allowed to be trusted in production mode: \" + domain,\n relativeFixUrl: domainsFixUrl,\n });\n } else if (url.hostname.match(/^\\d+(\\.\\d+)*$/)) {\n errors.push({\n message: \"Direct IPs are not valid for trusted domains in production mode: \" + domain,\n relativeFixUrl: domainsFixUrl,\n });\n } else if (url.protocol !== \"https:\") {\n errors.push({\n message: \"Trusted domains should be HTTPS: \" + domain,\n relativeFixUrl: domainsFixUrl,\n });\n }\n }\n\n return errors;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"production-mode.js","names":[],"sources":["../../../src/helpers/production-mode.ts"],"sourcesContent":["import { ProjectsCrud } from \"../interface/crud/projects\";\nimport { HexclaveAssertionError, captureError } from \"../utils/errors\";\nimport { isLocalhost } from \"../utils/urls\";\n\nexport type ProductionModeError = {\n message: string,\n relativeFixUrl: `/${string}`,\n};\n\nexport function getProductionModeErrors(project: ProjectsCrud[\"Admin\"][\"Read\"]): ProductionModeError[] {\n const errors: ProductionModeError[] = [];\n const domainsFixUrl = `/projects/${project.id}/domains` as const;\n\n if (project.config.allow_localhost) {\n errors.push({\n message: \"Localhost is not allowed in production mode, turn off 'Allow localhost' in project settings\",\n relativeFixUrl: domainsFixUrl,\n });\n }\n\n for (const { domain } of project.config.domains) {\n let url;\n try {\n // For wildcard domains, replace wildcards with a valid placeholder to validate the URL structure\n const normalizedDomain = domain.replace(/\\*+/g, 'wildcard-placeholder');\n url = new URL(normalizedDomain);\n } catch (e) {\n captureError(\"production-mode-domain-not-valid\", new HexclaveAssertionError(\"Domain was somehow not a valid URL; we should've caught this when setting the domain in the first place\", {\n domain,\n projectId: project\n }));\n errors.push({\n message: \"Trusted domain is not a valid URL: \" + domain,\n relativeFixUrl: domainsFixUrl,\n });\n continue;\n }\n\n if (isLocalhost(url)) {\n errors.push({\n message: \"Localhost domains are not allowed to be trusted in production mode: \" + domain,\n relativeFixUrl: domainsFixUrl,\n });\n } else if (url.hostname.match(/^\\d+(\\.\\d+)*$/)) {\n errors.push({\n message: \"Direct IPs are not valid for trusted domains in production mode: \" + domain,\n relativeFixUrl: domainsFixUrl,\n });\n } else if (url.protocol !== \"https:\") {\n errors.push({\n message: \"Trusted domains should be HTTPS: \" + domain,\n relativeFixUrl: domainsFixUrl,\n });\n }\n }\n\n return errors;\n}\n"],"mappings":";;;AASA,SAAgB,wBAAwB,SAA+D;CACrG,MAAM,SAAgC,CAAC;CACvC,MAAM,gBAAgB,aAAa,QAAQ,GAAG;CAE9C,IAAI,QAAQ,OAAO,iBACjB,OAAO,KAAK;EACV,SAAS;EACT,gBAAgB;CAClB,CAAC;CAGH,KAAK,MAAM,EAAE,YAAY,QAAQ,OAAO,SAAS;EAC/C,IAAI;EACJ,IAAI;GAEF,MAAM,mBAAmB,OAAO,QAAQ,QAAQ,sBAAsB;GACtE,MAAM,IAAI,IAAI,gBAAgB;EAChC,SAAS,GAAG;GACV,aAAa,oCAAoC,IAAI,uBAAuB,2GAA2G;IACrL;IACA,WAAW;GACb,CAAC,CAAC;GACF,OAAO,KAAK;IACV,SAAS,wCAAwC;IACjD,gBAAgB;GAClB,CAAC;GACD;EACF;EAEA,IAAI,YAAY,GAAG,GACjB,OAAO,KAAK;GACV,SAAS,yEAAyE;GAClF,gBAAgB;EAClB,CAAC;OACI,IAAI,IAAI,SAAS,MAAM,eAAe,GAC3C,OAAO,KAAK;GACV,SAAS,sEAAsE;GAC/E,gBAAgB;EAClB,CAAC;OACI,IAAI,IAAI,aAAa,UAC1B,OAAO,KAAK;GACV,SAAS,sCAAsC;GAC/C,gBAAgB;EAClB,CAAC;CAEL;CAEA,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support-sla.d.ts","names":[],"sources":["../../../src/helpers/support-sla.ts"],"mappings":";KAAY,gBAAA;EACV,OAAA;EACA,oBAAA;EACA,mBAAA;AAAA;AAAA,cAGW,mBAAA,EAAqB,
|
|
1
|
+
{"version":3,"file":"support-sla.d.ts","names":[],"sources":["../../../src/helpers/support-sla.ts"],"mappings":";KAAY,gBAAA;EACV,OAAA;EACA,oBAAA;EACA,mBAAA;AAAA;AAAA,cAGW,mBAAA,EAAqB,gBAIjC;;;;AAPoB;iBAkBL,yBAAA,CACd,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,gBAAA,GACJ,IAAA;;;;AAdF;AAWD;iBAagB,wBAAA,CACd,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,gBAAA,GACJ,IAAA;AAAA,KAKS,UAAA;;;;;;cAOC,uBAAA;;;;;;AAzBN;cAiCM,wBAAA;;;;;;;;;;;iBAYG,iBAAA,CACd,KAAA,EAAO,IAAA,EACP,GAAA,EAAK,IAAA,EACL,OAAA;EAAY,eAAA,GAAkB,IAAA;AAAA,IAC7B,UAAA"}
|
|
@@ -59,7 +59,7 @@ function computeSlaUrgency(dueAt, now, options) {
|
|
|
59
59
|
if (remainingMs <= warningThresholdMs) return "warning";
|
|
60
60
|
return "ok";
|
|
61
61
|
}
|
|
62
|
-
|
|
63
62
|
//#endregion
|
|
64
63
|
export { DEFAULT_SUPPORT_SLA, SLA_URGENT_THRESHOLD_MS, SLA_WARNING_THRESHOLD_MS, computeFirstResponseDueAt, computeNextResponseDueAt, computeSlaUrgency };
|
|
64
|
+
|
|
65
65
|
//# sourceMappingURL=support-sla.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support-sla.js","names":[],"sources":["../../../src/helpers/support-sla.ts"],"sourcesContent":["export type SupportSlaConfig = {\n enabled: boolean,\n firstResponseMinutes: number | null,\n nextResponseMinutes: number | null,\n};\n\nexport const DEFAULT_SUPPORT_SLA: SupportSlaConfig = {\n enabled: false,\n firstResponseMinutes: null,\n nextResponseMinutes: null,\n};\n\nfunction addMinutesOrNull(now: Date, minutes: number | null): Date | null {\n if (minutes == null || !Number.isFinite(minutes) || minutes <= 0) return null;\n return new Date(now.getTime() + minutes * 60_000);\n}\n\n/**\n * Returns the target first-response due timestamp for a new conversation,\n * or `null` if SLA tracking is off or no target is set.\n */\nexport function computeFirstResponseDueAt(\n now: Date,\n sla: SupportSlaConfig,\n): Date | null {\n if (!sla.enabled) return null;\n return addMinutesOrNull(now, sla.firstResponseMinutes);\n}\n\n/**\n * Returns the target next-response due timestamp when a conversation has been\n * re-opened by a user reply, or `null` if SLA tracking is off or no target\n * is set.\n */\nexport function computeNextResponseDueAt(\n now: Date,\n sla: SupportSlaConfig,\n): Date | null {\n if (!sla.enabled) return null;\n return addMinutesOrNull(now, sla.nextResponseMinutes);\n}\n\nexport type SlaUrgency = \"ok\" | \"warning\" | \"urgent\" | \"overdue\";\n\n/**\n * How soon (in milliseconds) before a due timestamp we switch into the\n * \"urgent\" state. Within this window the due timestamp should be rendered\n * with a strong alert treatment.\n */\nexport const SLA_URGENT_THRESHOLD_MS = 15 * 60 * 1000;\n\n/**\n * How soon (in milliseconds) before a due timestamp we switch into the\n * \"warning\" state. Within this window the due timestamp should be rendered\n * with a subtle alert treatment so agents can notice it without being\n * distracted.\n */\nexport const SLA_WARNING_THRESHOLD_MS = 60 * 60 * 1000;\n\n/**\n * Classifies how close a due timestamp is to `now` so we can subtly alert\n * agents as it approaches (and after it passes).\n *\n * If `windowStartedAt` is provided, thresholds scale with the total SLA\n * window length - so a 5-minute SLA doesn't read as \"urgent\" from t=0 - and\n * are capped by the fixed wall-clock thresholds so a 24-hour SLA doesn't\n * sit in \"warning\" for 12 hours. If `windowStartedAt` isn't known, we fall\n * back to the fixed wall-clock thresholds.\n */\nexport function computeSlaUrgency(\n dueAt: Date,\n now: Date,\n options?: { windowStartedAt?: Date | null },\n): SlaUrgency {\n const remainingMs = dueAt.getTime() - now.getTime();\n if (remainingMs <= 0) return \"overdue\";\n\n const windowStartedAt = options?.windowStartedAt ?? null;\n const totalWindowMs = windowStartedAt != null\n ? Math.max(1, dueAt.getTime() - windowStartedAt.getTime())\n : null;\n\n const urgentThresholdMs = totalWindowMs != null\n ? Math.min(totalWindowMs * 0.25, SLA_URGENT_THRESHOLD_MS)\n : SLA_URGENT_THRESHOLD_MS;\n const warningThresholdMs = totalWindowMs != null\n ? Math.min(totalWindowMs * 0.5, SLA_WARNING_THRESHOLD_MS)\n : SLA_WARNING_THRESHOLD_MS;\n\n if (remainingMs <= urgentThresholdMs) return \"urgent\";\n if (remainingMs <= warningThresholdMs) return \"warning\";\n return \"ok\";\n}\n"],"mappings":";AAMA,MAAa,sBAAwC;CACnD,SAAS;CACT,sBAAsB;CACtB,qBAAqB;
|
|
1
|
+
{"version":3,"file":"support-sla.js","names":[],"sources":["../../../src/helpers/support-sla.ts"],"sourcesContent":["export type SupportSlaConfig = {\n enabled: boolean,\n firstResponseMinutes: number | null,\n nextResponseMinutes: number | null,\n};\n\nexport const DEFAULT_SUPPORT_SLA: SupportSlaConfig = {\n enabled: false,\n firstResponseMinutes: null,\n nextResponseMinutes: null,\n};\n\nfunction addMinutesOrNull(now: Date, minutes: number | null): Date | null {\n if (minutes == null || !Number.isFinite(minutes) || minutes <= 0) return null;\n return new Date(now.getTime() + minutes * 60_000);\n}\n\n/**\n * Returns the target first-response due timestamp for a new conversation,\n * or `null` if SLA tracking is off or no target is set.\n */\nexport function computeFirstResponseDueAt(\n now: Date,\n sla: SupportSlaConfig,\n): Date | null {\n if (!sla.enabled) return null;\n return addMinutesOrNull(now, sla.firstResponseMinutes);\n}\n\n/**\n * Returns the target next-response due timestamp when a conversation has been\n * re-opened by a user reply, or `null` if SLA tracking is off or no target\n * is set.\n */\nexport function computeNextResponseDueAt(\n now: Date,\n sla: SupportSlaConfig,\n): Date | null {\n if (!sla.enabled) return null;\n return addMinutesOrNull(now, sla.nextResponseMinutes);\n}\n\nexport type SlaUrgency = \"ok\" | \"warning\" | \"urgent\" | \"overdue\";\n\n/**\n * How soon (in milliseconds) before a due timestamp we switch into the\n * \"urgent\" state. Within this window the due timestamp should be rendered\n * with a strong alert treatment.\n */\nexport const SLA_URGENT_THRESHOLD_MS = 15 * 60 * 1000;\n\n/**\n * How soon (in milliseconds) before a due timestamp we switch into the\n * \"warning\" state. Within this window the due timestamp should be rendered\n * with a subtle alert treatment so agents can notice it without being\n * distracted.\n */\nexport const SLA_WARNING_THRESHOLD_MS = 60 * 60 * 1000;\n\n/**\n * Classifies how close a due timestamp is to `now` so we can subtly alert\n * agents as it approaches (and after it passes).\n *\n * If `windowStartedAt` is provided, thresholds scale with the total SLA\n * window length - so a 5-minute SLA doesn't read as \"urgent\" from t=0 - and\n * are capped by the fixed wall-clock thresholds so a 24-hour SLA doesn't\n * sit in \"warning\" for 12 hours. If `windowStartedAt` isn't known, we fall\n * back to the fixed wall-clock thresholds.\n */\nexport function computeSlaUrgency(\n dueAt: Date,\n now: Date,\n options?: { windowStartedAt?: Date | null },\n): SlaUrgency {\n const remainingMs = dueAt.getTime() - now.getTime();\n if (remainingMs <= 0) return \"overdue\";\n\n const windowStartedAt = options?.windowStartedAt ?? null;\n const totalWindowMs = windowStartedAt != null\n ? Math.max(1, dueAt.getTime() - windowStartedAt.getTime())\n : null;\n\n const urgentThresholdMs = totalWindowMs != null\n ? Math.min(totalWindowMs * 0.25, SLA_URGENT_THRESHOLD_MS)\n : SLA_URGENT_THRESHOLD_MS;\n const warningThresholdMs = totalWindowMs != null\n ? Math.min(totalWindowMs * 0.5, SLA_WARNING_THRESHOLD_MS)\n : SLA_WARNING_THRESHOLD_MS;\n\n if (remainingMs <= urgentThresholdMs) return \"urgent\";\n if (remainingMs <= warningThresholdMs) return \"warning\";\n return \"ok\";\n}\n"],"mappings":";AAMA,MAAa,sBAAwC;CACnD,SAAS;CACT,sBAAsB;CACtB,qBAAqB;AACvB;AAEA,SAAS,iBAAiB,KAAW,SAAqC;CACxE,IAAI,WAAW,QAAQ,CAAC,OAAO,SAAS,OAAO,KAAK,WAAW,GAAG,OAAO;CACzE,OAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,UAAU,GAAM;AAClD;;;;;AAMA,SAAgB,0BACd,KACA,KACa;CACb,IAAI,CAAC,IAAI,SAAS,OAAO;CACzB,OAAO,iBAAiB,KAAK,IAAI,oBAAoB;AACvD;;;;;;AAOA,SAAgB,yBACd,KACA,KACa;CACb,IAAI,CAAC,IAAI,SAAS,OAAO;CACzB,OAAO,iBAAiB,KAAK,IAAI,mBAAmB;AACtD;;;;;;AASA,MAAa,0BAA0B,MAAU;;;;;;;AAQjD,MAAa,2BAA2B,OAAU;;;;;;;;;;;AAYlD,SAAgB,kBACd,OACA,KACA,SACY;CACZ,MAAM,cAAc,MAAM,QAAQ,IAAI,IAAI,QAAQ;CAClD,IAAI,eAAe,GAAG,OAAO;CAE7B,MAAM,kBAAkB,SAAS,mBAAmB;CACpD,MAAM,gBAAgB,mBAAmB,OACrC,KAAK,IAAI,GAAG,MAAM,QAAQ,IAAI,gBAAgB,QAAQ,CAAC,IACvD;CAEJ,MAAM,oBAAoB,iBAAiB,OACvC,KAAK,IAAI,gBAAgB,KAAM,uBAAuB,IACtD;CACJ,MAAM,qBAAqB,iBAAiB,OACxC,KAAK,IAAI,gBAAgB,IAAK,wBAAwB,IACtD;CAEJ,IAAI,eAAe,mBAAmB,OAAO;CAC7C,IAAI,eAAe,oBAAoB,OAAO;CAC9C,OAAO;AACT"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import { SLA_URGENT_THRESHOLD_MS, SLA_WARNING_THRESHOLD_MS, computeFirstResponseDueAt, computeNextResponseDueAt, computeSlaUrgency } from "./support-sla.js";
|
|
3
|
-
|
|
4
3
|
//#region src/helpers/support-sla.test.ts
|
|
5
4
|
const enabledSla = {
|
|
6
5
|
enabled: true,
|
|
@@ -96,7 +95,7 @@ describe("computeSlaUrgency", () => {
|
|
|
96
95
|
});
|
|
97
96
|
});
|
|
98
97
|
});
|
|
99
|
-
|
|
100
98
|
//#endregion
|
|
101
|
-
export {
|
|
99
|
+
export {};
|
|
100
|
+
|
|
102
101
|
//# sourceMappingURL=support-sla.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support-sla.test.js","names":[],"sources":["../../../src/helpers/support-sla.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport {\n computeFirstResponseDueAt,\n computeNextResponseDueAt,\n computeSlaUrgency,\n SLA_URGENT_THRESHOLD_MS,\n SLA_WARNING_THRESHOLD_MS,\n type SupportSlaConfig,\n} from \"./support-sla\";\n\nconst enabledSla: SupportSlaConfig = {\n enabled: true,\n firstResponseMinutes: 60,\n nextResponseMinutes: 120,\n};\n\ndescribe(\"computeFirstResponseDueAt\", () => {\n const now = new Date(\"2026-04-22T12:00:00.000Z\");\n\n it(\"returns null when SLA is disabled\", () => {\n expect(computeFirstResponseDueAt(now, { ...enabledSla, enabled: false })).toBeNull();\n });\n\n it(\"returns null when no target is set\", () => {\n expect(computeFirstResponseDueAt(now, { ...enabledSla, firstResponseMinutes: null })).toBeNull();\n });\n\n it(\"adds the configured minutes to now\", () => {\n const due = computeFirstResponseDueAt(now, enabledSla);\n expect(due).not.toBeNull();\n expect(due!.toISOString()).toBe(\"2026-04-22T13:00:00.000Z\");\n });\n\n it(\"returns null when the configured value is non-positive\", () => {\n expect(computeFirstResponseDueAt(now, { ...enabledSla, firstResponseMinutes: 0 })).toBeNull();\n });\n});\n\ndescribe(\"computeNextResponseDueAt\", () => {\n const now = new Date(\"2026-04-22T12:00:00.000Z\");\n\n it(\"returns null when SLA is disabled\", () => {\n expect(computeNextResponseDueAt(now, { ...enabledSla, enabled: false })).toBeNull();\n });\n\n it(\"returns null when no target is set\", () => {\n expect(computeNextResponseDueAt(now, { ...enabledSla, nextResponseMinutes: null })).toBeNull();\n });\n\n it(\"adds the configured next-response minutes to now\", () => {\n const due = computeNextResponseDueAt(now, enabledSla);\n expect(due!.toISOString()).toBe(\"2026-04-22T14:00:00.000Z\");\n });\n});\n\ndescribe(\"computeSlaUrgency\", () => {\n const now = new Date(\"2026-04-22T12:00:00.000Z\");\n\n it(\"returns 'overdue' when the due timestamp is in the past\", () => {\n expect(computeSlaUrgency(new Date(now.getTime() - 1), now)).toBe(\"overdue\");\n expect(computeSlaUrgency(new Date(now.getTime() - 60_000), now)).toBe(\"overdue\");\n });\n\n it(\"returns 'overdue' when the due timestamp is exactly now\", () => {\n expect(computeSlaUrgency(now, now)).toBe(\"overdue\");\n });\n\n it(\"returns 'urgent' within the urgent threshold\", () => {\n expect(computeSlaUrgency(new Date(now.getTime() + 60_000), now)).toBe(\"urgent\");\n expect(computeSlaUrgency(new Date(now.getTime() + SLA_URGENT_THRESHOLD_MS), now)).toBe(\"urgent\");\n });\n\n it(\"returns 'warning' within the warning threshold\", () => {\n expect(computeSlaUrgency(new Date(now.getTime() + SLA_URGENT_THRESHOLD_MS + 60_000), now)).toBe(\"warning\");\n expect(computeSlaUrgency(new Date(now.getTime() + SLA_WARNING_THRESHOLD_MS), now)).toBe(\"warning\");\n });\n\n it(\"returns 'ok' when comfortably before the warning threshold\", () => {\n expect(computeSlaUrgency(new Date(now.getTime() + SLA_WARNING_THRESHOLD_MS + 60_000), now)).toBe(\"ok\");\n expect(computeSlaUrgency(new Date(now.getTime() + 24 * 60 * 60 * 1000), now)).toBe(\"ok\");\n });\n\n describe(\"with a windowStartedAt\", () => {\n it(\"scales thresholds down for short SLA windows so t=0 is not immediately urgent\", () => {\n // 5-minute SLA window: due 5 min after it started.\n const windowStartedAt = now;\n const dueAt = new Date(now.getTime() + 5 * 60_000);\n // Right at the start, 5 min remaining — should be 'ok' (>50% of window remaining).\n expect(computeSlaUrgency(dueAt, now, { windowStartedAt })).toBe(\"ok\");\n // At t+2min (3 min remaining, 60% of window remaining) — still 'ok'.\n const twoMinLater = new Date(now.getTime() + 2 * 60_000);\n expect(computeSlaUrgency(dueAt, twoMinLater, { windowStartedAt })).toBe(\"ok\");\n // At t+3min (2 min remaining, 40% of window) — 'warning'.\n const threeMinLater = new Date(now.getTime() + 3 * 60_000);\n expect(computeSlaUrgency(dueAt, threeMinLater, { windowStartedAt })).toBe(\"warning\");\n // At t+4min (1 min remaining, 20% of window) — 'urgent'.\n const fourMinLater = new Date(now.getTime() + 4 * 60_000);\n expect(computeSlaUrgency(dueAt, fourMinLater, { windowStartedAt })).toBe(\"urgent\");\n });\n\n it(\"caps thresholds at the fixed wall-clock windows for long SLAs\", () => {\n // 24-hour SLA window.\n const windowStartedAt = now;\n const dueAt = new Date(now.getTime() + 24 * 60 * 60 * 1000);\n // 2 hours remaining (long past the 50% mark of the 24h window) — should\n // still be 'ok' because the warning cap is 60 min.\n const tMinusTwoHours = new Date(dueAt.getTime() - 2 * 60 * 60 * 1000);\n expect(computeSlaUrgency(dueAt, tMinusTwoHours, { windowStartedAt })).toBe(\"ok\");\n // 45 minutes remaining — 'warning' (inside the 60-min cap).\n const tMinus45Min = new Date(dueAt.getTime() - 45 * 60_000);\n expect(computeSlaUrgency(dueAt, tMinus45Min, { windowStartedAt })).toBe(\"warning\");\n // 10 minutes remaining — 'urgent' (inside the 15-min cap).\n const tMinus10Min = new Date(dueAt.getTime() - 10 * 60_000);\n expect(computeSlaUrgency(dueAt, tMinus10Min, { windowStartedAt })).toBe(\"urgent\");\n });\n\n it(\"falls back to fixed thresholds when windowStartedAt is nullish\", () => {\n const dueAt = new Date(now.getTime() + 30 * 60_000);\n expect(computeSlaUrgency(dueAt, now)).toBe(\"warning\");\n expect(computeSlaUrgency(dueAt, now, { windowStartedAt: null })).toBe(\"warning\");\n expect(computeSlaUrgency(dueAt, now, { windowStartedAt: undefined })).toBe(\"warning\");\n });\n });\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"support-sla.test.js","names":[],"sources":["../../../src/helpers/support-sla.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport {\n computeFirstResponseDueAt,\n computeNextResponseDueAt,\n computeSlaUrgency,\n SLA_URGENT_THRESHOLD_MS,\n SLA_WARNING_THRESHOLD_MS,\n type SupportSlaConfig,\n} from \"./support-sla\";\n\nconst enabledSla: SupportSlaConfig = {\n enabled: true,\n firstResponseMinutes: 60,\n nextResponseMinutes: 120,\n};\n\ndescribe(\"computeFirstResponseDueAt\", () => {\n const now = new Date(\"2026-04-22T12:00:00.000Z\");\n\n it(\"returns null when SLA is disabled\", () => {\n expect(computeFirstResponseDueAt(now, { ...enabledSla, enabled: false })).toBeNull();\n });\n\n it(\"returns null when no target is set\", () => {\n expect(computeFirstResponseDueAt(now, { ...enabledSla, firstResponseMinutes: null })).toBeNull();\n });\n\n it(\"adds the configured minutes to now\", () => {\n const due = computeFirstResponseDueAt(now, enabledSla);\n expect(due).not.toBeNull();\n expect(due!.toISOString()).toBe(\"2026-04-22T13:00:00.000Z\");\n });\n\n it(\"returns null when the configured value is non-positive\", () => {\n expect(computeFirstResponseDueAt(now, { ...enabledSla, firstResponseMinutes: 0 })).toBeNull();\n });\n});\n\ndescribe(\"computeNextResponseDueAt\", () => {\n const now = new Date(\"2026-04-22T12:00:00.000Z\");\n\n it(\"returns null when SLA is disabled\", () => {\n expect(computeNextResponseDueAt(now, { ...enabledSla, enabled: false })).toBeNull();\n });\n\n it(\"returns null when no target is set\", () => {\n expect(computeNextResponseDueAt(now, { ...enabledSla, nextResponseMinutes: null })).toBeNull();\n });\n\n it(\"adds the configured next-response minutes to now\", () => {\n const due = computeNextResponseDueAt(now, enabledSla);\n expect(due!.toISOString()).toBe(\"2026-04-22T14:00:00.000Z\");\n });\n});\n\ndescribe(\"computeSlaUrgency\", () => {\n const now = new Date(\"2026-04-22T12:00:00.000Z\");\n\n it(\"returns 'overdue' when the due timestamp is in the past\", () => {\n expect(computeSlaUrgency(new Date(now.getTime() - 1), now)).toBe(\"overdue\");\n expect(computeSlaUrgency(new Date(now.getTime() - 60_000), now)).toBe(\"overdue\");\n });\n\n it(\"returns 'overdue' when the due timestamp is exactly now\", () => {\n expect(computeSlaUrgency(now, now)).toBe(\"overdue\");\n });\n\n it(\"returns 'urgent' within the urgent threshold\", () => {\n expect(computeSlaUrgency(new Date(now.getTime() + 60_000), now)).toBe(\"urgent\");\n expect(computeSlaUrgency(new Date(now.getTime() + SLA_URGENT_THRESHOLD_MS), now)).toBe(\"urgent\");\n });\n\n it(\"returns 'warning' within the warning threshold\", () => {\n expect(computeSlaUrgency(new Date(now.getTime() + SLA_URGENT_THRESHOLD_MS + 60_000), now)).toBe(\"warning\");\n expect(computeSlaUrgency(new Date(now.getTime() + SLA_WARNING_THRESHOLD_MS), now)).toBe(\"warning\");\n });\n\n it(\"returns 'ok' when comfortably before the warning threshold\", () => {\n expect(computeSlaUrgency(new Date(now.getTime() + SLA_WARNING_THRESHOLD_MS + 60_000), now)).toBe(\"ok\");\n expect(computeSlaUrgency(new Date(now.getTime() + 24 * 60 * 60 * 1000), now)).toBe(\"ok\");\n });\n\n describe(\"with a windowStartedAt\", () => {\n it(\"scales thresholds down for short SLA windows so t=0 is not immediately urgent\", () => {\n // 5-minute SLA window: due 5 min after it started.\n const windowStartedAt = now;\n const dueAt = new Date(now.getTime() + 5 * 60_000);\n // Right at the start, 5 min remaining — should be 'ok' (>50% of window remaining).\n expect(computeSlaUrgency(dueAt, now, { windowStartedAt })).toBe(\"ok\");\n // At t+2min (3 min remaining, 60% of window remaining) — still 'ok'.\n const twoMinLater = new Date(now.getTime() + 2 * 60_000);\n expect(computeSlaUrgency(dueAt, twoMinLater, { windowStartedAt })).toBe(\"ok\");\n // At t+3min (2 min remaining, 40% of window) — 'warning'.\n const threeMinLater = new Date(now.getTime() + 3 * 60_000);\n expect(computeSlaUrgency(dueAt, threeMinLater, { windowStartedAt })).toBe(\"warning\");\n // At t+4min (1 min remaining, 20% of window) — 'urgent'.\n const fourMinLater = new Date(now.getTime() + 4 * 60_000);\n expect(computeSlaUrgency(dueAt, fourMinLater, { windowStartedAt })).toBe(\"urgent\");\n });\n\n it(\"caps thresholds at the fixed wall-clock windows for long SLAs\", () => {\n // 24-hour SLA window.\n const windowStartedAt = now;\n const dueAt = new Date(now.getTime() + 24 * 60 * 60 * 1000);\n // 2 hours remaining (long past the 50% mark of the 24h window) — should\n // still be 'ok' because the warning cap is 60 min.\n const tMinusTwoHours = new Date(dueAt.getTime() - 2 * 60 * 60 * 1000);\n expect(computeSlaUrgency(dueAt, tMinusTwoHours, { windowStartedAt })).toBe(\"ok\");\n // 45 minutes remaining — 'warning' (inside the 60-min cap).\n const tMinus45Min = new Date(dueAt.getTime() - 45 * 60_000);\n expect(computeSlaUrgency(dueAt, tMinus45Min, { windowStartedAt })).toBe(\"warning\");\n // 10 minutes remaining — 'urgent' (inside the 15-min cap).\n const tMinus10Min = new Date(dueAt.getTime() - 10 * 60_000);\n expect(computeSlaUrgency(dueAt, tMinus10Min, { windowStartedAt })).toBe(\"urgent\");\n });\n\n it(\"falls back to fixed thresholds when windowStartedAt is nullish\", () => {\n const dueAt = new Date(now.getTime() + 30 * 60_000);\n expect(computeSlaUrgency(dueAt, now)).toBe(\"warning\");\n expect(computeSlaUrgency(dueAt, now, { windowStartedAt: null })).toBe(\"warning\");\n expect(computeSlaUrgency(dueAt, now, { windowStartedAt: undefined })).toBe(\"warning\");\n });\n });\n});\n"],"mappings":";;;AAUA,MAAM,aAA+B;CACnC,SAAS;CACT,sBAAsB;CACtB,qBAAqB;AACvB;AAEA,SAAS,mCAAmC;CAC1C,MAAM,sBAAM,IAAI,KAAK,0BAA0B;CAE/C,GAAG,2CAA2C;EAC5C,OAAO,0BAA0B,KAAK;GAAE,GAAG;GAAY,SAAS;EAAM,CAAC,CAAC,CAAC,CAAC,SAAS;CACrF,CAAC;CAED,GAAG,4CAA4C;EAC7C,OAAO,0BAA0B,KAAK;GAAE,GAAG;GAAY,sBAAsB;EAAK,CAAC,CAAC,CAAC,CAAC,SAAS;CACjG,CAAC;CAED,GAAG,4CAA4C;EAC7C,MAAM,MAAM,0BAA0B,KAAK,UAAU;EACrD,OAAO,GAAG,CAAC,CAAC,IAAI,SAAS;EACzB,OAAO,IAAK,YAAY,CAAC,CAAC,CAAC,KAAK,0BAA0B;CAC5D,CAAC;CAED,GAAG,gEAAgE;EACjE,OAAO,0BAA0B,KAAK;GAAE,GAAG;GAAY,sBAAsB;EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;CAC9F,CAAC;AACH,CAAC;AAED,SAAS,kCAAkC;CACzC,MAAM,sBAAM,IAAI,KAAK,0BAA0B;CAE/C,GAAG,2CAA2C;EAC5C,OAAO,yBAAyB,KAAK;GAAE,GAAG;GAAY,SAAS;EAAM,CAAC,CAAC,CAAC,CAAC,SAAS;CACpF,CAAC;CAED,GAAG,4CAA4C;EAC7C,OAAO,yBAAyB,KAAK;GAAE,GAAG;GAAY,qBAAqB;EAAK,CAAC,CAAC,CAAC,CAAC,SAAS;CAC/F,CAAC;CAED,GAAG,0DAA0D;EAE3D,OADY,yBAAyB,KAAK,UACjC,CAAC,CAAE,YAAY,CAAC,CAAC,CAAC,KAAK,0BAA0B;CAC5D,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B;CAClC,MAAM,sBAAM,IAAI,KAAK,0BAA0B;CAE/C,GAAG,iEAAiE;EAClE,OAAO,kCAAkB,IAAI,KAAK,IAAI,QAAQ,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS;EAC1E,OAAO,kCAAkB,IAAI,KAAK,IAAI,QAAQ,IAAI,GAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS;CACjF,CAAC;CAED,GAAG,iEAAiE;EAClE,OAAO,kBAAkB,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS;CACpD,CAAC;CAED,GAAG,sDAAsD;EACvD,OAAO,kBAAkB,IAAI,KAAK,IAAI,QAAQ,IAAI,GAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ;EAC9E,OAAO,kBAAkB,IAAI,KAAK,IAAI,QAAQ,IAAI,uBAAuB,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ;CACjG,CAAC;CAED,GAAG,wDAAwD;EACzD,OAAO,kBAAkB,IAAI,KAAK,IAAI,QAAQ,IAAI,0BAA0B,GAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS;EACzG,OAAO,kBAAkB,IAAI,KAAK,IAAI,QAAQ,IAAI,wBAAwB,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS;CACnG,CAAC;CAED,GAAG,oEAAoE;EACrE,OAAO,kBAAkB,IAAI,KAAK,IAAI,QAAQ,IAAI,2BAA2B,GAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;EACrG,OAAO,kBAAkB,IAAI,KAAK,IAAI,QAAQ,IAAI,OAAU,KAAK,GAAI,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;CACzF,CAAC;CAED,SAAS,gCAAgC;EACvC,GAAG,uFAAuF;GAExF,MAAM,kBAAkB;GACxB,MAAM,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,GAAM;GAEjD,OAAO,kBAAkB,OAAO,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;GAGpE,OAAO,kBAAkB,OAAO,IADR,KAAK,IAAI,QAAQ,IAAI,IAAI,GACP,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;GAG5E,OAAO,kBAAkB,OAAO,IADN,KAAK,IAAI,QAAQ,IAAI,IAAI,GACP,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;GAGnF,OAAO,kBAAkB,OAAO,IADP,KAAK,IAAI,QAAQ,IAAI,IAAI,GACP,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ;EACnF,CAAC;EAED,GAAG,uEAAuE;GAExE,MAAM,kBAAkB;GACxB,MAAM,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,OAAU,KAAK,GAAI;GAI1D,OAAO,kBAAkB,uBAAO,IADL,KAAK,MAAM,QAAQ,IAAI,OAAc,GACnB,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;GAG/E,OAAO,kBAAkB,uBAAO,IADR,KAAK,MAAM,QAAQ,IAAI,KAAK,GACV,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;GAGjF,OAAO,kBAAkB,uBAAO,IADR,KAAK,MAAM,QAAQ,IAAI,KAAK,GACV,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ;EAClF,CAAC;EAED,GAAG,wEAAwE;GACzE,MAAM,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,GAAM;GAClD,OAAO,kBAAkB,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS;GACpD,OAAO,kBAAkB,OAAO,KAAK,EAAE,iBAAiB,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;GAC/E,OAAO,kBAAkB,OAAO,KAAK,EAAE,iBAAiB,KAAA,EAAU,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;EACtF,CAAC;CACH,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-side.d.ts","names":[],"sources":["../../../../src/helpers/vault/client-side.ts"],"mappings":";;AAuBA;;iBAAsB,OAAA,CAAQ,MAAA,UAAgB,GAAA,WAAW,OAAA;;;;iBAWnC,YAAA,CAAa,MAAA,UAAgB,GAAA,UAAa,KAAA,WAAa,OAAA
|
|
1
|
+
{"version":3,"file":"client-side.d.ts","names":[],"sources":["../../../../src/helpers/vault/client-side.ts"],"mappings":";;AAuBA;;iBAAsB,OAAA,CAAQ,MAAA,UAAgB,GAAA,WAAW,OAAA;;;;iBAWnC,YAAA,CAAa,MAAA,UAAgB,GAAA,UAAa,KAAA,WAAa,OAAA;;AAXpB;AAWzD;iBAcsB,YAAA,CAAa,MAAA,UAAgB,GAAA,UAAa,cAAA,WAAsB,OAAA"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { decodeBase64, encodeBase64 } from "../../utils/bytes.js";
|
|
2
2
|
import { decrypt, encrypt, hash, iteratedHash } from "../../utils/crypto.js";
|
|
3
|
-
|
|
4
3
|
//#region src/helpers/vault/client-side.ts
|
|
5
4
|
const hashPurpose = "stack-data-vault-client-side-encryption-key-hash";
|
|
6
5
|
const encryptionSecretPurpose = "stack-data-vault-client-side-encryption-value-encryption-key-hash";
|
|
@@ -45,25 +44,7 @@ async function decryptValue(secret, key, encryptedValue) {
|
|
|
45
44
|
if (bytesResult.status === "error") throw new Error("Data vault client-side decryption failed. Are you sure you're using the correct secret?", { cause: bytesResult.error });
|
|
46
45
|
return new TextDecoder().decode(bytesResult.data);
|
|
47
46
|
}
|
|
48
|
-
(void 0)?.describe("encryptValue & decryptValue", () => {
|
|
49
|
-
(void 0)?.it("should encrypt and decrypt a value", async ({ expect }) => {
|
|
50
|
-
const secret = "test-secret";
|
|
51
|
-
const value = "test-value";
|
|
52
|
-
expect(await decryptValue(secret, "key", await encryptValue(secret, "key", value))).toEqual(value);
|
|
53
|
-
});
|
|
54
|
-
(void 0)?.it("should not decrypt a value with a different secret", async ({ expect }) => {
|
|
55
|
-
await expect(decryptValue("different-secret", "key", await encryptValue("test-secret", "key", "test-value"))).rejects.toThrow();
|
|
56
|
-
});
|
|
57
|
-
(void 0)?.it("should not decrypt a value with a different key", async ({ expect }) => {
|
|
58
|
-
const secret = "test-secret";
|
|
59
|
-
await expect(decryptValue(secret, "different-key", await encryptValue(secret, "key", "test-value"))).rejects.toThrow();
|
|
60
|
-
});
|
|
61
|
-
(void 0)?.it("should not decrypt a value if the cipher was tampered with", async ({ expect }) => {
|
|
62
|
-
const secret = "test-secret";
|
|
63
|
-
await expect(decryptValue(secret, "key", await encryptValue(secret, "key", "test-value") + "7")).rejects.toThrow();
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
47
|
//#endregion
|
|
68
48
|
export { decryptValue, encryptValue, hashKey };
|
|
49
|
+
|
|
69
50
|
//# sourceMappingURL=client-side.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-side.js","names":[],"sources":["../../../../src/helpers/vault/client-side.ts"],"sourcesContent":["import { decodeBase64, encodeBase64 } from \"../../utils/bytes\";\nimport { decrypt, encrypt, hash, iteratedHash } from \"../../utils/crypto\";\n\n// NOTE (Hexclave rebrand): do NOT rename these \"stack-*\" purpose tags. They are mixed into the\n// vault's key derivation and value encryption; renaming any of them would make every\n// previously-stored vault value undecryptable. Internal constants, never user-visible.\nconst hashPurpose = \"stack-data-vault-client-side-encryption-key-hash\";\nconst encryptionSecretPurpose = \"stack-data-vault-client-side-encryption-value-encryption-key-hash\";\nconst encryptionValuePurpose = \"stack-data-vault-client-side-encryption-value-encryption-value-encryption\";\n\n\nasync function getDerivedKey(secret: string, key: string) {\n return await iteratedHash({\n purpose: encryptionSecretPurpose,\n extra: secret,\n value: key,\n iterations: 100_000,\n });\n}\n\n/**\n * Use to hash the key so the server cannot infer it.\n */\nexport async function hashKey(secret: string, key: string) {\n return encodeBase64(await hash({\n purpose: hashPurpose,\n extra: secret,\n value: await getDerivedKey(secret, key),\n }));\n}\n\n/**\n * Use to encrypt the value so that the server cannot read the value without knowing the key.\n */\nexport async function encryptValue(secret: string, key: string, value: string) {\n const valueEncryptionDerivedKey = await getDerivedKey(secret, key);\n\n const bytes = await encrypt({\n purpose: encryptionValuePurpose,\n secret: valueEncryptionDerivedKey,\n value: new TextEncoder().encode(value)\n });\n return encodeBase64(bytes);\n}\n\n/**\n * Use to decrypt the value. See encryptValue.\n */\nexport async function decryptValue(secret: string, key: string, encryptedValue: string) {\n const valueEncryptionDerivedKey = await getDerivedKey(secret, key);\n\n const bytesResult = await decrypt({\n purpose: encryptionValuePurpose,\n secret: valueEncryptionDerivedKey,\n cipher: decodeBase64(encryptedValue),\n });\n if (bytesResult.status === \"error\") throw new Error(\"Data vault client-side decryption failed. Are you sure you're using the correct secret?\", { cause: bytesResult.error });\n return new TextDecoder().decode(bytesResult.data);\n}\n\n\nimport.meta.vitest?.describe(\"encryptValue & decryptValue\", () => {\n import.meta.vitest?.it(\"should encrypt and decrypt a value\", async ({ expect }) => {\n const secret = \"test-secret\";\n const value = \"test-value\";\n const encrypted = await encryptValue(secret, \"key\", value);\n const decrypted = await decryptValue(secret, \"key\", encrypted);\n expect(decrypted).toEqual(value);\n });\n\n import.meta.vitest?.it(\"should not decrypt a value with a different secret\", async ({ expect }) => {\n const secret = \"test-secret\";\n const value = \"test-value\";\n const encrypted = await encryptValue(secret, \"key\", value);\n await expect(decryptValue(\"different-secret\", \"key\", encrypted)).rejects.toThrow();\n });\n\n import.meta.vitest?.it(\"should not decrypt a value with a different key\", async ({ expect }) => {\n const secret = \"test-secret\";\n const value = \"test-value\";\n const encrypted = await encryptValue(secret, \"key\", value);\n await expect(decryptValue(secret, \"different-key\", encrypted)).rejects.toThrow();\n });\n\n import.meta.vitest?.it(\"should not decrypt a value if the cipher was tampered with\", async ({ expect }) => {\n const secret = \"test-secret\";\n const value = \"test-value\";\n const encrypted = await encryptValue(secret, \"key\", value);\n const tampered = encrypted + \"7\";\n await expect(decryptValue(secret, \"key\", tampered)).rejects.toThrow();\n });\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"client-side.js","names":[],"sources":["../../../../src/helpers/vault/client-side.ts"],"sourcesContent":["import { decodeBase64, encodeBase64 } from \"../../utils/bytes\";\nimport { decrypt, encrypt, hash, iteratedHash } from \"../../utils/crypto\";\n\n// NOTE (Hexclave rebrand): do NOT rename these \"stack-*\" purpose tags. They are mixed into the\n// vault's key derivation and value encryption; renaming any of them would make every\n// previously-stored vault value undecryptable. Internal constants, never user-visible.\nconst hashPurpose = \"stack-data-vault-client-side-encryption-key-hash\";\nconst encryptionSecretPurpose = \"stack-data-vault-client-side-encryption-value-encryption-key-hash\";\nconst encryptionValuePurpose = \"stack-data-vault-client-side-encryption-value-encryption-value-encryption\";\n\n\nasync function getDerivedKey(secret: string, key: string) {\n return await iteratedHash({\n purpose: encryptionSecretPurpose,\n extra: secret,\n value: key,\n iterations: 100_000,\n });\n}\n\n/**\n * Use to hash the key so the server cannot infer it.\n */\nexport async function hashKey(secret: string, key: string) {\n return encodeBase64(await hash({\n purpose: hashPurpose,\n extra: secret,\n value: await getDerivedKey(secret, key),\n }));\n}\n\n/**\n * Use to encrypt the value so that the server cannot read the value without knowing the key.\n */\nexport async function encryptValue(secret: string, key: string, value: string) {\n const valueEncryptionDerivedKey = await getDerivedKey(secret, key);\n\n const bytes = await encrypt({\n purpose: encryptionValuePurpose,\n secret: valueEncryptionDerivedKey,\n value: new TextEncoder().encode(value)\n });\n return encodeBase64(bytes);\n}\n\n/**\n * Use to decrypt the value. See encryptValue.\n */\nexport async function decryptValue(secret: string, key: string, encryptedValue: string) {\n const valueEncryptionDerivedKey = await getDerivedKey(secret, key);\n\n const bytesResult = await decrypt({\n purpose: encryptionValuePurpose,\n secret: valueEncryptionDerivedKey,\n cipher: decodeBase64(encryptedValue),\n });\n if (bytesResult.status === \"error\") throw new Error(\"Data vault client-side decryption failed. Are you sure you're using the correct secret?\", { cause: bytesResult.error });\n return new TextDecoder().decode(bytesResult.data);\n}\n\n\nimport.meta.vitest?.describe(\"encryptValue & decryptValue\", () => {\n import.meta.vitest?.it(\"should encrypt and decrypt a value\", async ({ expect }) => {\n const secret = \"test-secret\";\n const value = \"test-value\";\n const encrypted = await encryptValue(secret, \"key\", value);\n const decrypted = await decryptValue(secret, \"key\", encrypted);\n expect(decrypted).toEqual(value);\n });\n\n import.meta.vitest?.it(\"should not decrypt a value with a different secret\", async ({ expect }) => {\n const secret = \"test-secret\";\n const value = \"test-value\";\n const encrypted = await encryptValue(secret, \"key\", value);\n await expect(decryptValue(\"different-secret\", \"key\", encrypted)).rejects.toThrow();\n });\n\n import.meta.vitest?.it(\"should not decrypt a value with a different key\", async ({ expect }) => {\n const secret = \"test-secret\";\n const value = \"test-value\";\n const encrypted = await encryptValue(secret, \"key\", value);\n await expect(decryptValue(secret, \"different-key\", encrypted)).rejects.toThrow();\n });\n\n import.meta.vitest?.it(\"should not decrypt a value if the cipher was tampered with\", async ({ expect }) => {\n const secret = \"test-secret\";\n const value = \"test-value\";\n const encrypted = await encryptValue(secret, \"key\", value);\n const tampered = encrypted + \"7\";\n await expect(decryptValue(secret, \"key\", tampered)).rejects.toThrow();\n });\n});\n"],"mappings":";;;AAMA,MAAM,cAAc;AACpB,MAAM,0BAA0B;AAChC,MAAM,yBAAyB;AAG/B,eAAe,cAAc,QAAgB,KAAa;CACxD,OAAO,MAAM,aAAa;EACxB,SAAS;EACT,OAAO;EACP,OAAO;EACP,YAAY;CACd,CAAC;AACH;;;;AAKA,eAAsB,QAAQ,QAAgB,KAAa;CACzD,OAAO,aAAa,MAAM,KAAK;EAC7B,SAAS;EACT,OAAO;EACP,OAAO,MAAM,cAAc,QAAQ,GAAG;CACxC,CAAC,CAAC;AACJ;;;;AAKA,eAAsB,aAAa,QAAgB,KAAa,OAAe;CAQ7E,OAAO,aAAa,MALA,QAAQ;EAC1B,SAAS;EACT,QAAQ,MAJ8B,cAAc,QAAQ,GAAG;EAK/D,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK;CACvC,CAAC,CACwB;AAC3B;;;;AAKA,eAAsB,aAAa,QAAgB,KAAa,gBAAwB;CAGtF,MAAM,cAAc,MAAM,QAAQ;EAChC,SAAS;EACT,QAAQ,MAJ8B,cAAc,QAAQ,GAAG;EAK/D,QAAQ,aAAa,cAAc;CACrC,CAAC;CACD,IAAI,YAAY,WAAW,SAAS,MAAM,IAAI,MAAM,2FAA2F,EAAE,OAAO,YAAY,MAAM,CAAC;CAC3K,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,YAAY,IAAI;AAClD"}
|
|
@@ -3,7 +3,6 @@ import { decrypt, encrypt } from "../../utils/crypto.js";
|
|
|
3
3
|
import { CreateAliasCommand, CreateKeyCommand, DecryptCommand, DescribeKeyCommand, GenerateDataKeyCommand, KMSClient } from "@aws-sdk/client-kms";
|
|
4
4
|
import { getEnvVariable } from "../../utils/env.js";
|
|
5
5
|
import { Result } from "../../utils/results.js";
|
|
6
|
-
|
|
7
6
|
//#region src/helpers/vault/server-side.ts
|
|
8
7
|
async function getAwsCredentials() {
|
|
9
8
|
const vercelRoleArn = getEnvVariable("STACK_AWS_VERCEL_OIDC_ROLE_ARN", "");
|
|
@@ -117,7 +116,7 @@ async function decryptWithKms(encrypted) {
|
|
|
117
116
|
dekBytes.fill(0);
|
|
118
117
|
}
|
|
119
118
|
}
|
|
120
|
-
|
|
121
119
|
//#endregion
|
|
122
120
|
export { decryptWithKms, encryptWithKms };
|
|
121
|
+
|
|
123
122
|
//# sourceMappingURL=server-side.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-side.js","names":[],"sources":["../../../../src/helpers/vault/server-side.ts"],"sourcesContent":["import {\n CreateAliasCommand,\n CreateKeyCommand,\n DecryptCommand,\n DescribeKeyCommand,\n GenerateDataKeyCommand,\n KMSClient\n} from \"@aws-sdk/client-kms\";\nimport { decodeBase64, encodeBase64 } from \"../../utils/bytes\";\nimport { decrypt, encrypt } from \"../../utils/crypto\";\nimport { getEnvVariable } from \"../../utils/env\";\nimport { Result } from \"../../utils/results\";\n\n\nasync function getAwsCredentials() {\n // 1. Vercel OIDC: Vercel injects an OIDC token that can be exchanged for AWS credentials\n const vercelRoleArn = getEnvVariable(\"STACK_AWS_VERCEL_OIDC_ROLE_ARN\", \"\");\n if (vercelRoleArn) {\n const { awsCredentialsProvider } = await import(\"@vercel/functions/oidc\");\n return awsCredentialsProvider({ roleArn: vercelRoleArn });\n }\n\n // 2. GCP Workload Identity Federation: Cloud Run gets a GCP ID token from the metadata server,\n // then exchanges it for temporary AWS credentials via STS AssumeRoleWithWebIdentity.\n // Requires:\n // - An OIDC identity provider in AWS IAM (issuer: https://accounts.google.com)\n // - An IAM role with a trust policy allowing the GCP service account\n // - STACK_AWS_GCP_WIF_ROLE_ARN set to that role's ARN\n // - STACK_AWS_GCP_WIF_AUDIENCE set to the audience configured in the AWS OIDC provider\n const gcpWifRoleArn = getEnvVariable(\"STACK_AWS_GCP_WIF_ROLE_ARN\", \"\");\n if (gcpWifRoleArn) {\n const { fromWebToken } = await import(\"@aws-sdk/credential-provider-web-identity\");\n const audience = getEnvVariable(\"STACK_AWS_GCP_WIF_AUDIENCE\", \"sts.amazonaws.com\");\n // Return a provider that fetches a fresh GCP ID token on each invocation.\n // GCP metadata tokens expire after ~1h, so we can't bake a single token into the closure.\n return async () => {\n return await fromWebToken({\n roleArn: gcpWifRoleArn,\n roleSessionName: \"stack-backend-cloudrun\",\n webIdentityToken: await fetchGcpIdToken(audience),\n })();\n };\n }\n\n // 3. Static credentials: fallback for self-hosted / local development\n return {\n accessKeyId: getEnvVariable(\"STACK_AWS_ACCESS_KEY_ID\"),\n secretAccessKey: getEnvVariable(\"STACK_AWS_SECRET_ACCESS_KEY\"),\n };\n}\n\n/**\n * Fetches a GCP ID token from the metadata server (available on Cloud Run, GCE, GKE).\n * The token is a Google-signed JWT with the specified audience, suitable for\n * AWS STS AssumeRoleWithWebIdentity.\n */\nasync function fetchGcpIdToken(audience: string): Promise<string> {\n const metadataUrl = `http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=${encodeURIComponent(audience)}`;\n const response = await fetch(metadataUrl, {\n headers: { \"Metadata-Flavor\": \"Google\" },\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch GCP ID token: ${response.status} ${await response.text()}`);\n }\n return await response.text();\n}\n\nlet kmsClientCache: KMSClient | undefined;\n\nasync function getKmsClient() {\n if (!kmsClientCache) {\n kmsClientCache = new KMSClient({\n region: getEnvVariable(\"STACK_AWS_REGION\"),\n endpoint: getEnvVariable(\"STACK_AWS_KMS_ENDPOINT\"),\n credentials: await getAwsCredentials(),\n });\n }\n return kmsClientCache;\n}\n\nasync function getOrCreateKekId(): Promise<string> {\n // NOTE (Hexclave rebrand): do NOT rename this \"stack-*\" alias. It is the AWS KMS key alias for\n // the existing key-encryption key; renaming it would point at a non-existent key and break\n // wrap/unwrap of all stored data keys. Internal infrastructure constant, never user-visible.\n const id = \"alias/stack-data-vault-server-side-kek\";\n const kms = await getKmsClient();\n try {\n const describeResult = await kms.send(new DescribeKeyCommand({ KeyId: id }));\n if (describeResult.KeyMetadata?.KeyId) return describeResult.KeyMetadata.KeyId;\n } catch (e) {\n if (e instanceof Error && e.name !== \"NotFoundException\") {\n throw e;\n }\n }\n const { KeyMetadata } = await kms.send(new CreateKeyCommand({\n KeyUsage: \"ENCRYPT_DECRYPT\",\n Description: \"DataVault KEK\"\n }));\n await kms.send(new CreateAliasCommand({ AliasName: id, TargetKeyId: KeyMetadata!.KeyId! }));\n return id;\n}\n\nasync function genDEK() {\n const kekId = await getOrCreateKekId();\n const kms = await getKmsClient();\n const out = await kms.send(new GenerateDataKeyCommand({ KeyId: kekId, KeySpec: \"AES_256\" }));\n if (!out.Plaintext || !out.CiphertextBlob) throw new Error(\"GenerateDataKey failed\");\n return {\n dekBytes: out.Plaintext,\n edkBytes: out.CiphertextBlob,\n };\n}\n\nasync function unwrapDEK(edk_b64: string) {\n const edkBytes = decodeBase64(edk_b64);\n const kms = await getKmsClient();\n const out = await kms.send(new DecryptCommand({ CiphertextBlob: edkBytes }));\n if (!out.Plaintext) throw new Error(\"KMS Decrypt failed\");\n return {\n dekBytes: out.Plaintext,\n edkBytes,\n };\n}\n\nexport async function encryptWithKms(value: string) {\n const { dekBytes, edkBytes } = await genDEK();\n try {\n const ciphertext = await encrypt({\n // NOTE (Hexclave rebrand): do NOT rename this \"stack-*\" purpose tag — it must match the one\n // used in decryptWithKms below, or already-encrypted values become undecryptable.\n purpose: \"stack-data-vault-server-side-encryption\",\n secret: dekBytes,\n value: new TextEncoder().encode(value),\n });\n return { edkBase64: encodeBase64(edkBytes), ciphertextBase64: encodeBase64(ciphertext) };\n } finally {\n dekBytes.fill(0);\n }\n}\n\nexport async function decryptWithKms(encrypted: Awaited<ReturnType<typeof encryptWithKms>>) {\n const { dekBytes } = await unwrapDEK(encrypted.edkBase64);\n try {\n const value = Result.orThrow(await decrypt({\n purpose: \"stack-data-vault-server-side-encryption\",\n secret: dekBytes,\n cipher: decodeBase64(encrypted.ciphertextBase64),\n }));\n return new TextDecoder().decode(value);\n } finally {\n dekBytes.fill(0);\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"server-side.js","names":[],"sources":["../../../../src/helpers/vault/server-side.ts"],"sourcesContent":["import {\n CreateAliasCommand,\n CreateKeyCommand,\n DecryptCommand,\n DescribeKeyCommand,\n GenerateDataKeyCommand,\n KMSClient\n} from \"@aws-sdk/client-kms\";\nimport { decodeBase64, encodeBase64 } from \"../../utils/bytes\";\nimport { decrypt, encrypt } from \"../../utils/crypto\";\nimport { getEnvVariable } from \"../../utils/env\";\nimport { Result } from \"../../utils/results\";\n\n\nasync function getAwsCredentials() {\n // 1. Vercel OIDC: Vercel injects an OIDC token that can be exchanged for AWS credentials\n const vercelRoleArn = getEnvVariable(\"STACK_AWS_VERCEL_OIDC_ROLE_ARN\", \"\");\n if (vercelRoleArn) {\n const { awsCredentialsProvider } = await import(\"@vercel/functions/oidc\");\n return awsCredentialsProvider({ roleArn: vercelRoleArn });\n }\n\n // 2. GCP Workload Identity Federation: Cloud Run gets a GCP ID token from the metadata server,\n // then exchanges it for temporary AWS credentials via STS AssumeRoleWithWebIdentity.\n // Requires:\n // - An OIDC identity provider in AWS IAM (issuer: https://accounts.google.com)\n // - An IAM role with a trust policy allowing the GCP service account\n // - STACK_AWS_GCP_WIF_ROLE_ARN set to that role's ARN\n // - STACK_AWS_GCP_WIF_AUDIENCE set to the audience configured in the AWS OIDC provider\n const gcpWifRoleArn = getEnvVariable(\"STACK_AWS_GCP_WIF_ROLE_ARN\", \"\");\n if (gcpWifRoleArn) {\n const { fromWebToken } = await import(\"@aws-sdk/credential-provider-web-identity\");\n const audience = getEnvVariable(\"STACK_AWS_GCP_WIF_AUDIENCE\", \"sts.amazonaws.com\");\n // Return a provider that fetches a fresh GCP ID token on each invocation.\n // GCP metadata tokens expire after ~1h, so we can't bake a single token into the closure.\n return async () => {\n return await fromWebToken({\n roleArn: gcpWifRoleArn,\n roleSessionName: \"stack-backend-cloudrun\",\n webIdentityToken: await fetchGcpIdToken(audience),\n })();\n };\n }\n\n // 3. Static credentials: fallback for self-hosted / local development\n return {\n accessKeyId: getEnvVariable(\"STACK_AWS_ACCESS_KEY_ID\"),\n secretAccessKey: getEnvVariable(\"STACK_AWS_SECRET_ACCESS_KEY\"),\n };\n}\n\n/**\n * Fetches a GCP ID token from the metadata server (available on Cloud Run, GCE, GKE).\n * The token is a Google-signed JWT with the specified audience, suitable for\n * AWS STS AssumeRoleWithWebIdentity.\n */\nasync function fetchGcpIdToken(audience: string): Promise<string> {\n const metadataUrl = `http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=${encodeURIComponent(audience)}`;\n const response = await fetch(metadataUrl, {\n headers: { \"Metadata-Flavor\": \"Google\" },\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch GCP ID token: ${response.status} ${await response.text()}`);\n }\n return await response.text();\n}\n\nlet kmsClientCache: KMSClient | undefined;\n\nasync function getKmsClient() {\n if (!kmsClientCache) {\n kmsClientCache = new KMSClient({\n region: getEnvVariable(\"STACK_AWS_REGION\"),\n endpoint: getEnvVariable(\"STACK_AWS_KMS_ENDPOINT\"),\n credentials: await getAwsCredentials(),\n });\n }\n return kmsClientCache;\n}\n\nasync function getOrCreateKekId(): Promise<string> {\n // NOTE (Hexclave rebrand): do NOT rename this \"stack-*\" alias. It is the AWS KMS key alias for\n // the existing key-encryption key; renaming it would point at a non-existent key and break\n // wrap/unwrap of all stored data keys. Internal infrastructure constant, never user-visible.\n const id = \"alias/stack-data-vault-server-side-kek\";\n const kms = await getKmsClient();\n try {\n const describeResult = await kms.send(new DescribeKeyCommand({ KeyId: id }));\n if (describeResult.KeyMetadata?.KeyId) return describeResult.KeyMetadata.KeyId;\n } catch (e) {\n if (e instanceof Error && e.name !== \"NotFoundException\") {\n throw e;\n }\n }\n const { KeyMetadata } = await kms.send(new CreateKeyCommand({\n KeyUsage: \"ENCRYPT_DECRYPT\",\n Description: \"DataVault KEK\"\n }));\n await kms.send(new CreateAliasCommand({ AliasName: id, TargetKeyId: KeyMetadata!.KeyId! }));\n return id;\n}\n\nasync function genDEK() {\n const kekId = await getOrCreateKekId();\n const kms = await getKmsClient();\n const out = await kms.send(new GenerateDataKeyCommand({ KeyId: kekId, KeySpec: \"AES_256\" }));\n if (!out.Plaintext || !out.CiphertextBlob) throw new Error(\"GenerateDataKey failed\");\n return {\n dekBytes: out.Plaintext,\n edkBytes: out.CiphertextBlob,\n };\n}\n\nasync function unwrapDEK(edk_b64: string) {\n const edkBytes = decodeBase64(edk_b64);\n const kms = await getKmsClient();\n const out = await kms.send(new DecryptCommand({ CiphertextBlob: edkBytes }));\n if (!out.Plaintext) throw new Error(\"KMS Decrypt failed\");\n return {\n dekBytes: out.Plaintext,\n edkBytes,\n };\n}\n\nexport async function encryptWithKms(value: string) {\n const { dekBytes, edkBytes } = await genDEK();\n try {\n const ciphertext = await encrypt({\n // NOTE (Hexclave rebrand): do NOT rename this \"stack-*\" purpose tag — it must match the one\n // used in decryptWithKms below, or already-encrypted values become undecryptable.\n purpose: \"stack-data-vault-server-side-encryption\",\n secret: dekBytes,\n value: new TextEncoder().encode(value),\n });\n return { edkBase64: encodeBase64(edkBytes), ciphertextBase64: encodeBase64(ciphertext) };\n } finally {\n dekBytes.fill(0);\n }\n}\n\nexport async function decryptWithKms(encrypted: Awaited<ReturnType<typeof encryptWithKms>>) {\n const { dekBytes } = await unwrapDEK(encrypted.edkBase64);\n try {\n const value = Result.orThrow(await decrypt({\n purpose: \"stack-data-vault-server-side-encryption\",\n secret: dekBytes,\n cipher: decodeBase64(encrypted.ciphertextBase64),\n }));\n return new TextDecoder().decode(value);\n } finally {\n dekBytes.fill(0);\n }\n}\n"],"mappings":";;;;;;AAcA,eAAe,oBAAoB;CAEjC,MAAM,gBAAgB,eAAe,kCAAkC,EAAE;CACzE,IAAI,eAAe;EACjB,MAAM,EAAE,2BAA2B,MAAM,OAAO;EAChD,OAAO,uBAAuB,EAAE,SAAS,cAAc,CAAC;CAC1D;CASA,MAAM,gBAAgB,eAAe,8BAA8B,EAAE;CACrE,IAAI,eAAe;EACjB,MAAM,EAAE,iBAAiB,MAAM,OAAO;EACtC,MAAM,WAAW,eAAe,8BAA8B,mBAAmB;EAGjF,OAAO,YAAY;GACjB,OAAO,MAAM,aAAa;IACxB,SAAS;IACT,iBAAiB;IACjB,kBAAkB,MAAM,gBAAgB,QAAQ;GAClD,CAAC,CAAC,CAAC;EACL;CACF;CAGA,OAAO;EACL,aAAa,eAAe,yBAAyB;EACrD,iBAAiB,eAAe,6BAA6B;CAC/D;AACF;;;;;;AAOA,eAAe,gBAAgB,UAAmC;CAChE,MAAM,cAAc,0GAA0G,mBAAmB,QAAQ;CACzJ,MAAM,WAAW,MAAM,MAAM,aAAa,EACxC,SAAS,EAAE,mBAAmB,SAAS,EACzC,CAAC;CACD,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,MAAM,iCAAiC,SAAS,OAAO,GAAG,MAAM,SAAS,KAAK,GAAG;CAE7F,OAAO,MAAM,SAAS,KAAK;AAC7B;AAEA,IAAI;AAEJ,eAAe,eAAe;CAC5B,IAAI,CAAC,gBACH,iBAAiB,IAAI,UAAU;EAC7B,QAAQ,eAAe,kBAAkB;EACzC,UAAU,eAAe,wBAAwB;EACjD,aAAa,MAAM,kBAAkB;CACvC,CAAC;CAEH,OAAO;AACT;AAEA,eAAe,mBAAoC;CAIjD,MAAM,KAAK;CACX,MAAM,MAAM,MAAM,aAAa;CAC/B,IAAI;EACF,MAAM,iBAAiB,MAAM,IAAI,KAAK,IAAI,mBAAmB,EAAE,OAAO,GAAG,CAAC,CAAC;EAC3E,IAAI,eAAe,aAAa,OAAO,OAAO,eAAe,YAAY;CAC3E,SAAS,GAAG;EACV,IAAI,aAAa,SAAS,EAAE,SAAS,qBACnC,MAAM;CAEV;CACA,MAAM,EAAE,gBAAgB,MAAM,IAAI,KAAK,IAAI,iBAAiB;EAC1D,UAAU;EACV,aAAa;CACf,CAAC,CAAC;CACF,MAAM,IAAI,KAAK,IAAI,mBAAmB;EAAE,WAAW;EAAI,aAAa,YAAa;CAAO,CAAC,CAAC;CAC1F,OAAO;AACT;AAEA,eAAe,SAAS;CACtB,MAAM,QAAQ,MAAM,iBAAiB;CAErC,MAAM,MAAM,OAAM,MADA,aAAa,EAAA,CACT,KAAK,IAAI,uBAAuB;EAAE,OAAO;EAAO,SAAS;CAAU,CAAC,CAAC;CAC3F,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,gBAAgB,MAAM,IAAI,MAAM,wBAAwB;CACnF,OAAO;EACL,UAAU,IAAI;EACd,UAAU,IAAI;CAChB;AACF;AAEA,eAAe,UAAU,SAAiB;CACxC,MAAM,WAAW,aAAa,OAAO;CAErC,MAAM,MAAM,OAAM,MADA,aAAa,EAAA,CACT,KAAK,IAAI,eAAe,EAAE,gBAAgB,SAAS,CAAC,CAAC;CAC3E,IAAI,CAAC,IAAI,WAAW,MAAM,IAAI,MAAM,oBAAoB;CACxD,OAAO;EACL,UAAU,IAAI;EACd;CACF;AACF;AAEA,eAAsB,eAAe,OAAe;CAClD,MAAM,EAAE,UAAU,aAAa,MAAM,OAAO;CAC5C,IAAI;EACF,MAAM,aAAa,MAAM,QAAQ;GAG/B,SAAS;GACT,QAAQ;GACR,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK;EACvC,CAAC;EACD,OAAO;GAAE,WAAW,aAAa,QAAQ;GAAG,kBAAkB,aAAa,UAAU;EAAE;CACzF,UAAU;EACR,SAAS,KAAK,CAAC;CACjB;AACF;AAEA,eAAsB,eAAe,WAAuD;CAC1F,MAAM,EAAE,aAAa,MAAM,UAAU,UAAU,SAAS;CACxD,IAAI;EACF,MAAM,QAAQ,OAAO,QAAQ,MAAM,QAAQ;GACzC,SAAS;GACT,QAAQ;GACR,QAAQ,aAAa,UAAU,gBAAgB;EACjD,CAAC,CAAC;EACF,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK;CACvC,UAAU;EACR,SAAS,KAAK,CAAC;CACjB;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-async-callback.d.ts","names":[],"sources":["../../../src/hooks/use-async-callback.tsx"],"mappings":";;;iBAGgB,gBAAA,
|
|
1
|
+
{"version":3,"file":"use-async-callback.d.ts","names":[],"sources":["../../../src/hooks/use-async-callback.tsx"],"mappings":";;;iBAGgB,gBAAA,qBACd,QAAA,MAAc,IAAA,EAAM,CAAA,KAAM,OAAA,CAAQ,CAAA,GAClC,IAAA,EAAM,KAAA,CAAM,cAAA,IACV,EAAA,MAAQ,IAAA,EAAM,CAAA,KAAM,OAAA,CAAQ,CAAA,GAAI,OAAA,WAAkB,KAAA;AAAA,iBAsBtC,+BAAA,qBACd,QAAA,MAAc,IAAA,EAAM,CAAA,KAAM,OAAA,CAAQ,CAAA,GAClC,IAAA,EAAM,KAAA,CAAM,cAAA,IACV,EAAA,MAAQ,IAAA,EAAM,CAAA,KAAM,OAAA,CAAQ,CAAA,GAAI,OAAA"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { captureError } from "../utils/errors.js";
|
|
3
|
-
|
|
4
3
|
//#region src/hooks/use-async-callback.tsx
|
|
5
4
|
function useAsyncCallback(callback, deps) {
|
|
6
5
|
const [error, setError] = React.useState(void 0);
|
|
@@ -32,7 +31,7 @@ function useAsyncCallbackWithLoggedError(callback, deps) {
|
|
|
32
31
|
}, deps);
|
|
33
32
|
return [newCallback, loading];
|
|
34
33
|
}
|
|
35
|
-
|
|
36
34
|
//#endregion
|
|
37
35
|
export { useAsyncCallback, useAsyncCallbackWithLoggedError };
|
|
36
|
+
|
|
38
37
|
//# sourceMappingURL=use-async-callback.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-async-callback.js","names":[],"sources":["../../../src/hooks/use-async-callback.tsx"],"sourcesContent":["import React from \"react\";\nimport { captureError } from \"../utils/errors\";\n\nexport function useAsyncCallback<A extends any[], R>(\n callback: (...args: A) => Promise<R>,\n deps: React.DependencyList\n): [cb: (...args: A) => Promise<R>, loading: boolean, error: unknown | undefined] {\n const [error, setError] = React.useState<unknown | undefined>(undefined);\n const [loadingCount, setLoadingCount] = React.useState(0);\n\n const cb = React.useCallback(\n async (...args: A) => {\n setLoadingCount((c) => c + 1);\n try {\n return await callback(...args);\n } catch (e) {\n setError(e);\n throw e;\n } finally {\n setLoadingCount((c) => c - 1);\n }\n },\n deps,\n );\n\n return [cb, loadingCount > 0, error];\n}\n\nexport function useAsyncCallbackWithLoggedError<A extends any[], R>(\n callback: (...args: A) => Promise<R>,\n deps: React.DependencyList\n): [cb: (...args: A) => Promise<R>, loading: boolean] {\n const [newCallback, loading] = useAsyncCallback<A, R>(async (...args) => {\n try {\n return await callback(...args);\n } catch (e) {\n captureError(\"async-callback\", e);\n throw e;\n }\n }, deps);\n\n return [newCallback, loading];\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-async-callback.js","names":[],"sources":["../../../src/hooks/use-async-callback.tsx"],"sourcesContent":["import React from \"react\";\nimport { captureError } from \"../utils/errors\";\n\nexport function useAsyncCallback<A extends any[], R>(\n callback: (...args: A) => Promise<R>,\n deps: React.DependencyList\n): [cb: (...args: A) => Promise<R>, loading: boolean, error: unknown | undefined] {\n const [error, setError] = React.useState<unknown | undefined>(undefined);\n const [loadingCount, setLoadingCount] = React.useState(0);\n\n const cb = React.useCallback(\n async (...args: A) => {\n setLoadingCount((c) => c + 1);\n try {\n return await callback(...args);\n } catch (e) {\n setError(e);\n throw e;\n } finally {\n setLoadingCount((c) => c - 1);\n }\n },\n deps,\n );\n\n return [cb, loadingCount > 0, error];\n}\n\nexport function useAsyncCallbackWithLoggedError<A extends any[], R>(\n callback: (...args: A) => Promise<R>,\n deps: React.DependencyList\n): [cb: (...args: A) => Promise<R>, loading: boolean] {\n const [newCallback, loading] = useAsyncCallback<A, R>(async (...args) => {\n try {\n return await callback(...args);\n } catch (e) {\n captureError(\"async-callback\", e);\n throw e;\n }\n }, deps);\n\n return [newCallback, loading];\n}\n"],"mappings":";;;AAGA,SAAgB,iBACd,UACA,MACgF;CAChF,MAAM,CAAC,OAAO,YAAY,MAAM,SAA8B,KAAA,CAAS;CACvE,MAAM,CAAC,cAAc,mBAAmB,MAAM,SAAS,CAAC;CAiBxD,OAAO;EAfI,MAAM,YACf,OAAO,GAAG,SAAY;GACpB,iBAAiB,MAAM,IAAI,CAAC;GAC5B,IAAI;IACF,OAAO,MAAM,SAAS,GAAG,IAAI;GAC/B,SAAS,GAAG;IACV,SAAS,CAAC;IACV,MAAM;GACR,UAAU;IACR,iBAAiB,MAAM,IAAI,CAAC;GAC9B;EACF,GACA,IAGO;EAAG,eAAe;EAAG;CAAK;AACrC;AAEA,SAAgB,gCACd,UACA,MACoD;CACpD,MAAM,CAAC,aAAa,WAAW,iBAAuB,OAAO,GAAG,SAAS;EACvE,IAAI;GACF,OAAO,MAAM,SAAS,GAAG,IAAI;EAC/B,SAAS,GAAG;GACV,aAAa,kBAAkB,CAAC;GAChC,MAAM;EACR;CACF,GAAG,IAAI;CAEP,OAAO,CAAC,aAAa,OAAO;AAC9B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AsyncResult } from "../utils/results";
|
|
1
|
+
import { AsyncResult } from "../utils/results.js";
|
|
2
2
|
|
|
3
3
|
//#region src/hooks/use-async-external-store.d.ts
|
|
4
4
|
declare function useAsyncExternalStore<T>(subscribe: (callback: (t: T) => void) => (() => void)): AsyncResult<T, never> & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-async-external-store.d.ts","names":[],"sources":["../../../src/hooks/use-async-external-store.tsx"],"mappings":";;;iBAGgB,qBAAA,
|
|
1
|
+
{"version":3,"file":"use-async-external-store.d.ts","names":[],"sources":["../../../src/hooks/use-async-external-store.tsx"],"mappings":";;;iBAGgB,qBAAA,IACd,SAAA,GAAY,QAAA,GAAW,CAAA,EAAG,CAAA,6BACzB,WAAA,CAAY,CAAA;EAAc,MAAA;AAAA"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { useEffect, useState } from "react";
|
|
2
2
|
import { AsyncResult } from "../utils/results.js";
|
|
3
|
-
|
|
4
3
|
//#region src/hooks/use-async-external-store.tsx
|
|
5
4
|
function useAsyncExternalStore(subscribe) {
|
|
6
5
|
const [isAvailable, setIsAvailable] = useState(false);
|
|
@@ -14,7 +13,7 @@ function useAsyncExternalStore(subscribe) {
|
|
|
14
13
|
if (isAvailable) return AsyncResult.ok(value);
|
|
15
14
|
else return AsyncResult.pending();
|
|
16
15
|
}
|
|
17
|
-
|
|
18
16
|
//#endregion
|
|
19
17
|
export { useAsyncExternalStore };
|
|
18
|
+
|
|
20
19
|
//# sourceMappingURL=use-async-external-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-async-external-store.js","names":[],"sources":["../../../src/hooks/use-async-external-store.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { AsyncResult } from \"../utils/results\";\n\nexport function useAsyncExternalStore<T>(\n subscribe: (callback: (t: T) => void) => (() => void),\n): AsyncResult<T, never> & { status: \"ok\" | \"pending\" } {\n // sure, the \"sync\" in useSyncExternalStore refers to \"synchronize a store\" and not \"sync/async\", but it's too good of a name to pass up on\n\n const [isAvailable, setIsAvailable] = useState(false);\n const [value, setValue] = useState<T>();\n useEffect(() => {\n const unsubscribe = subscribe((value: T) => {\n setValue(() => value);\n setIsAvailable(() => true);\n });\n return unsubscribe;\n }, [subscribe]);\n\n if (isAvailable) {\n return AsyncResult.ok(value as T);\n } else {\n return AsyncResult.pending();\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-async-external-store.js","names":[],"sources":["../../../src/hooks/use-async-external-store.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { AsyncResult } from \"../utils/results\";\n\nexport function useAsyncExternalStore<T>(\n subscribe: (callback: (t: T) => void) => (() => void),\n): AsyncResult<T, never> & { status: \"ok\" | \"pending\" } {\n // sure, the \"sync\" in useSyncExternalStore refers to \"synchronize a store\" and not \"sync/async\", but it's too good of a name to pass up on\n\n const [isAvailable, setIsAvailable] = useState(false);\n const [value, setValue] = useState<T>();\n useEffect(() => {\n const unsubscribe = subscribe((value: T) => {\n setValue(() => value);\n setIsAvailable(() => true);\n });\n return unsubscribe;\n }, [subscribe]);\n\n if (isAvailable) {\n return AsyncResult.ok(value as T);\n } else {\n return AsyncResult.pending();\n }\n}\n"],"mappings":";;;AAGA,SAAgB,sBACd,WACsD;CAGtD,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CACpD,MAAM,CAAC,OAAO,YAAY,SAAY;CACtC,gBAAgB;EAKd,OAJoB,WAAW,UAAa;GAC1C,eAAe,KAAK;GACpB,qBAAqB,IAAI;EAC3B,CACiB;CACnB,GAAG,CAAC,SAAS,CAAC;CAEd,IAAI,aACF,OAAO,YAAY,GAAG,KAAU;MAEhC,OAAO,YAAY,QAAQ;AAE/B"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { useSyncExternalStore } from "react";
|
|
2
2
|
import { suspendIfSsr } from "../utils/react.js";
|
|
3
|
-
|
|
4
3
|
//#region src/hooks/use-hash.tsx
|
|
5
4
|
const useHash = () => {
|
|
6
5
|
suspendIfSsr("useHash");
|
|
@@ -9,7 +8,7 @@ const useHash = () => {
|
|
|
9
8
|
return () => clearInterval(interval);
|
|
10
9
|
}, () => window.location.hash.substring(1));
|
|
11
10
|
};
|
|
12
|
-
|
|
13
11
|
//#endregion
|
|
14
12
|
export { useHash };
|
|
13
|
+
|
|
15
14
|
//# sourceMappingURL=use-hash.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-hash.js","names":[],"sources":["../../../src/hooks/use-hash.tsx"],"sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport { suspendIfSsr } from \"../utils/react\";\n\nexport const useHash = () => {\n suspendIfSsr(\"useHash\");\n return useSyncExternalStore(\n (onChange) => {\n const interval = setInterval(() => onChange(), 10);\n return () => clearInterval(interval);\n },\n () => window.location.hash.substring(1)\n );\n};\n\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-hash.js","names":[],"sources":["../../../src/hooks/use-hash.tsx"],"sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport { suspendIfSsr } from \"../utils/react\";\n\nexport const useHash = () => {\n suspendIfSsr(\"useHash\");\n return useSyncExternalStore(\n (onChange) => {\n const interval = setInterval(() => onChange(), 10);\n return () => clearInterval(interval);\n },\n () => window.location.hash.substring(1)\n );\n};\n\n"],"mappings":";;;AAGA,MAAa,gBAAgB;CAC3B,aAAa,SAAS;CACtB,OAAO,sBACJ,aAAa;EACZ,MAAM,WAAW,kBAAkB,SAAS,GAAG,EAAE;EACjD,aAAa,cAAc,QAAQ;CACrC,SACM,OAAO,SAAS,KAAK,UAAU,CAAC,CACxC;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-hover.d.ts","names":[],"sources":["../../../src/hooks/use-hover.tsx"],"mappings":";iBAGgB,QAAA,WAAmB,WAAA,
|
|
1
|
+
{"version":3,"file":"use-hover.d.ts","names":[],"sources":["../../../src/hooks/use-hover.tsx"],"mappings":";iBAGgB,QAAA,WAAmB,WAAA,SACjC,GAAA,EAAK,KAAA,CAAM,SAAA,CAAU,CAAA,GACrB,OAAA;EACE,YAAA;EACA,YAAA;AAAA"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { useLayoutEffect } from "react";
|
|
2
2
|
import { useRefState } from "../utils/react.js";
|
|
3
|
-
|
|
4
3
|
//#region src/hooks/use-hover.tsx
|
|
5
4
|
function useHover(ref, options = {}) {
|
|
6
5
|
const counter = useRefState(0);
|
|
@@ -53,7 +52,7 @@ function useHover(ref, options = {}) {
|
|
|
53
52
|
}, []);
|
|
54
53
|
return counter.current > 0;
|
|
55
54
|
}
|
|
56
|
-
|
|
57
55
|
//#endregion
|
|
58
56
|
export { useHover };
|
|
57
|
+
|
|
59
58
|
//# sourceMappingURL=use-hover.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-hover.js","names":[],"sources":["../../../src/hooks/use-hover.tsx"],"sourcesContent":["import { useLayoutEffect } from \"react\";\nimport { useRefState } from \"../utils/react\";\n\nexport function useHover<T extends HTMLElement | null>(\n ref: React.RefObject<T>,\n options: {\n onMouseEnter?: () => void,\n onMouseLeave?: () => void,\n } = {},\n): boolean {\n // Internal counter: mouseenter++ / mouseleave-- (isHovering = counter > 0)\n const counter = useRefState(0);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n let incr = 0;\n let prevInside = false;\n\n const contains = (r: DOMRect, x: number, y: number) =>\n x >= r.left && x <= r.right && y >= r.top && y <= r.bottom;\n\n const enter = () => {\n incr++;\n counter.set(c => c + 1);\n if (counter.current === 1) {\n options.onMouseEnter?.();\n }\n };\n\n const leave = () => {\n incr--;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n counter.set(c => c - 1);\n if (counter.current === 0) {\n options.onMouseLeave?.();\n }\n });\n });\n };\n\n const topMatchesTarget = (x: number, y: number) => {\n const top = document.elementFromPoint(x, y);\n return !!(top && (top === el || el.contains(top)));\n };\n\n const processPoint = (x: number, y: number) => {\n const rect = el.getBoundingClientRect();\n\n // True “hoverability”: inside rect AND not occluded by others\n const inside = contains(rect, x, y) && topMatchesTarget(x, y);\n if (inside && !prevInside) {\n enter();\n } else if (!inside && prevInside) {\n leave();\n }\n prevInside = inside;\n };\n\n const onMove = (e: PointerEvent) => {\n if (e.pointerType !== \"mouse\") return; // keep it hover-only\n // Use coalesced points when available\n const batch = e.getCoalescedEvents();\n if (batch.length) {\n for (let eventIndex = 0; eventIndex < batch.length - 1; eventIndex++) {\n const e1 = batch[eventIndex];\n const e2 = batch[eventIndex + 1];\n const steps = 10;\n for (let i = 0; i <= steps; i++) {\n processPoint(e1.clientX + (e2.clientX - e1.clientX) * i / steps, e1.clientY + (e2.clientY - e1.clientY) * i / steps);\n }\n }\n } else {\n processPoint(e.clientX, e.clientY);\n }\n };\n\n window.addEventListener(\"pointermove\", onMove, { passive: true });\n\n return () => {\n window.removeEventListener(\"pointermove\", onMove);\n counter.set(c => c - incr);\n };\n }, []);\n\n return counter.current > 0;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-hover.js","names":[],"sources":["../../../src/hooks/use-hover.tsx"],"sourcesContent":["import { useLayoutEffect } from \"react\";\nimport { useRefState } from \"../utils/react\";\n\nexport function useHover<T extends HTMLElement | null>(\n ref: React.RefObject<T>,\n options: {\n onMouseEnter?: () => void,\n onMouseLeave?: () => void,\n } = {},\n): boolean {\n // Internal counter: mouseenter++ / mouseleave-- (isHovering = counter > 0)\n const counter = useRefState(0);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n let incr = 0;\n let prevInside = false;\n\n const contains = (r: DOMRect, x: number, y: number) =>\n x >= r.left && x <= r.right && y >= r.top && y <= r.bottom;\n\n const enter = () => {\n incr++;\n counter.set(c => c + 1);\n if (counter.current === 1) {\n options.onMouseEnter?.();\n }\n };\n\n const leave = () => {\n incr--;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n counter.set(c => c - 1);\n if (counter.current === 0) {\n options.onMouseLeave?.();\n }\n });\n });\n };\n\n const topMatchesTarget = (x: number, y: number) => {\n const top = document.elementFromPoint(x, y);\n return !!(top && (top === el || el.contains(top)));\n };\n\n const processPoint = (x: number, y: number) => {\n const rect = el.getBoundingClientRect();\n\n // True “hoverability”: inside rect AND not occluded by others\n const inside = contains(rect, x, y) && topMatchesTarget(x, y);\n if (inside && !prevInside) {\n enter();\n } else if (!inside && prevInside) {\n leave();\n }\n prevInside = inside;\n };\n\n const onMove = (e: PointerEvent) => {\n if (e.pointerType !== \"mouse\") return; // keep it hover-only\n // Use coalesced points when available\n const batch = e.getCoalescedEvents();\n if (batch.length) {\n for (let eventIndex = 0; eventIndex < batch.length - 1; eventIndex++) {\n const e1 = batch[eventIndex];\n const e2 = batch[eventIndex + 1];\n const steps = 10;\n for (let i = 0; i <= steps; i++) {\n processPoint(e1.clientX + (e2.clientX - e1.clientX) * i / steps, e1.clientY + (e2.clientY - e1.clientY) * i / steps);\n }\n }\n } else {\n processPoint(e.clientX, e.clientY);\n }\n };\n\n window.addEventListener(\"pointermove\", onMove, { passive: true });\n\n return () => {\n window.removeEventListener(\"pointermove\", onMove);\n counter.set(c => c - incr);\n };\n }, []);\n\n return counter.current > 0;\n}\n"],"mappings":";;;AAGA,SAAgB,SACd,KACA,UAGI,CAAC,GACI;CAET,MAAM,UAAU,YAAY,CAAC;CAE7B,sBAAsB;EACpB,MAAM,KAAK,IAAI;EACf,IAAI,CAAC,IAAI;EACT,IAAI,OAAO;EACX,IAAI,aAAa;EAEjB,MAAM,YAAY,GAAY,GAAW,MACvC,KAAK,EAAE,QAAQ,KAAK,EAAE,SAAS,KAAK,EAAE,OAAO,KAAK,EAAE;EAEtD,MAAM,cAAc;GAClB;GACA,QAAQ,KAAI,MAAK,IAAI,CAAC;GACtB,IAAI,QAAQ,YAAY,GACtB,QAAQ,eAAe;EAE3B;EAEA,MAAM,cAAc;GAClB;GACA,4BAA4B;IAC1B,4BAA4B;KAC1B,QAAQ,KAAI,MAAK,IAAI,CAAC;KACtB,IAAI,QAAQ,YAAY,GACtB,QAAQ,eAAe;IAE3B,CAAC;GACH,CAAC;EACH;EAEA,MAAM,oBAAoB,GAAW,MAAc;GACjD,MAAM,MAAM,SAAS,iBAAiB,GAAG,CAAC;GAC1C,OAAO,CAAC,EAAE,QAAQ,QAAQ,MAAM,GAAG,SAAS,GAAG;EACjD;EAEA,MAAM,gBAAgB,GAAW,MAAc;GAI7C,MAAM,SAAS,SAHF,GAAG,sBAGW,GAAG,GAAG,CAAC,KAAK,iBAAiB,GAAG,CAAC;GAC5D,IAAI,UAAU,CAAC,YACb,MAAM;QACD,IAAI,CAAC,UAAU,YACpB,MAAM;GAER,aAAa;EACf;EAEA,MAAM,UAAU,MAAoB;GAClC,IAAI,EAAE,gBAAgB,SAAS;GAE/B,MAAM,QAAQ,EAAE,mBAAmB;GACnC,IAAI,MAAM,QACR,KAAK,IAAI,aAAa,GAAG,aAAa,MAAM,SAAS,GAAG,cAAc;IACpE,MAAM,KAAK,MAAM;IACjB,MAAM,KAAK,MAAM,aAAa;IAC9B,MAAM,QAAQ;IACd,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,KAC1B,aAAa,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,IAAI,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,IAAI,KAAK;GAEvH;QAEA,aAAa,EAAE,SAAS,EAAE,OAAO;EAErC;EAEA,OAAO,iBAAiB,eAAe,QAAQ,EAAE,SAAS,KAAK,CAAC;EAEhE,aAAa;GACX,OAAO,oBAAoB,eAAe,MAAM;GAChD,QAAQ,KAAI,MAAK,IAAI,IAAI;EAC3B;CACF,GAAG,CAAC,CAAC;CAEL,OAAO,QAAQ,UAAU;AAC3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-strict-memo.d.ts","names":[],"sources":["../../../src/hooks/use-strict-memo.tsx"],"mappings":";;AA0IA;;;;iBAAgB,aAAA,
|
|
1
|
+
{"version":3,"file":"use-strict-memo.d.ts","names":[],"sources":["../../../src/hooks/use-strict-memo.tsx"],"mappings":";;AA0IA;;;;iBAAgB,aAAA,IAAiB,QAAA,QAAgB,CAAA,EAAG,YAAA,UAAsB,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { useId, useInsertionEffect } from "react";
|
|
2
2
|
import { Result } from "../utils/results.js";
|
|
3
|
-
|
|
4
3
|
//#region src/hooks/use-strict-memo.tsx
|
|
5
4
|
const cached = /* @__PURE__ */ new Map();
|
|
6
5
|
function unwrapFromInner(dependencies, inner) {
|
|
@@ -15,33 +14,6 @@ function unwrapFromInner(dependencies, inner) {
|
|
|
15
14
|
return unwrapFromInner(rest, newInner);
|
|
16
15
|
}
|
|
17
16
|
}
|
|
18
|
-
(void 0)?.test("unwrapFromInner", ({ expect }) => {
|
|
19
|
-
const nonNestedMap = {
|
|
20
|
-
isNotNestedMap: true,
|
|
21
|
-
value: "test"
|
|
22
|
-
};
|
|
23
|
-
const result1 = unwrapFromInner([], nonNestedMap);
|
|
24
|
-
expect(result1.status).toBe("ok");
|
|
25
|
-
if (result1.status === "ok") expect(result1.data).toBe("test");
|
|
26
|
-
expect(unwrapFromInner(["key"], nonNestedMap).status).toBe("error");
|
|
27
|
-
const nestedMap = new Map([["key", {
|
|
28
|
-
isNotNestedMap: true,
|
|
29
|
-
value: "test"
|
|
30
|
-
}]]);
|
|
31
|
-
expect(unwrapFromInner([], nestedMap).status).toBe("error");
|
|
32
|
-
const result2 = unwrapFromInner(["key"], nestedMap);
|
|
33
|
-
expect(result2.status).toBe("ok");
|
|
34
|
-
if (result2.status === "ok") expect(result2.data).toBe("test");
|
|
35
|
-
expect(unwrapFromInner(["wrongKey"], nestedMap).status).toBe("error");
|
|
36
|
-
const deeplyNestedMap = new Map([["key1", new Map([["key2", {
|
|
37
|
-
isNotNestedMap: true,
|
|
38
|
-
value: "nested"
|
|
39
|
-
}]])]]);
|
|
40
|
-
const result3 = unwrapFromInner(["key1", "key2"], deeplyNestedMap);
|
|
41
|
-
expect(result3.status).toBe("ok");
|
|
42
|
-
if (result3.status === "ok") expect(result3.data).toBe("nested");
|
|
43
|
-
expect(unwrapFromInner(["key1", "wrongKey"], deeplyNestedMap).status).toBe("error");
|
|
44
|
-
});
|
|
45
17
|
function wrapToInner(dependencies, value) {
|
|
46
18
|
if (dependencies.length === 0) return {
|
|
47
19
|
isNotNestedMap: true,
|
|
@@ -51,47 +23,6 @@ function wrapToInner(dependencies, value) {
|
|
|
51
23
|
const inner = wrapToInner(rest, value);
|
|
52
24
|
return new (typeof key === "object" && key !== null || typeof key === "symbol" && Symbol.keyFor(key) === void 0 ? WeakMap : Map)([[key, inner]]);
|
|
53
25
|
}
|
|
54
|
-
(void 0)?.test("wrapToInner", ({ expect }) => {
|
|
55
|
-
expect(wrapToInner([], "test")).toEqual({
|
|
56
|
-
isNotNestedMap: true,
|
|
57
|
-
value: "test"
|
|
58
|
-
});
|
|
59
|
-
const singleResult = wrapToInner(["key"], "test");
|
|
60
|
-
expect(singleResult instanceof Map).toBe(true);
|
|
61
|
-
expect(singleResult.get("key")).toEqual({
|
|
62
|
-
isNotNestedMap: true,
|
|
63
|
-
value: "test"
|
|
64
|
-
});
|
|
65
|
-
const multiResult = wrapToInner(["key1", "key2"], "test");
|
|
66
|
-
expect(multiResult instanceof Map).toBe(true);
|
|
67
|
-
const innerMap = multiResult.get("key1");
|
|
68
|
-
expect(innerMap instanceof Map).toBe(true);
|
|
69
|
-
expect(innerMap.get("key2")).toEqual({
|
|
70
|
-
isNotNestedMap: true,
|
|
71
|
-
value: "test"
|
|
72
|
-
});
|
|
73
|
-
const obj = { test: true };
|
|
74
|
-
const objResult = wrapToInner([obj], "test");
|
|
75
|
-
expect(objResult instanceof WeakMap).toBe(true);
|
|
76
|
-
expect(objResult.get(obj)).toEqual({
|
|
77
|
-
isNotNestedMap: true,
|
|
78
|
-
value: "test"
|
|
79
|
-
});
|
|
80
|
-
const symbolObj = Symbol("test");
|
|
81
|
-
const symbolResult = wrapToInner([symbolObj], "test");
|
|
82
|
-
expect(symbolResult instanceof WeakMap).toBe(true);
|
|
83
|
-
expect(symbolResult.get(symbolObj)).toEqual({
|
|
84
|
-
isNotNestedMap: true,
|
|
85
|
-
value: "test"
|
|
86
|
-
});
|
|
87
|
-
const registeredSymbol = Symbol.for("test");
|
|
88
|
-
const registeredSymbolResult = wrapToInner([registeredSymbol], "test");
|
|
89
|
-
expect(registeredSymbolResult instanceof Map).toBe(true);
|
|
90
|
-
expect(registeredSymbolResult.get(registeredSymbol)).toEqual({
|
|
91
|
-
isNotNestedMap: true,
|
|
92
|
-
value: "test"
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
26
|
/**
|
|
96
27
|
* Like memo, but minimizes recomputation of the value at all costs (instead of useMemo which recomputes whenever the renderer feels like it).
|
|
97
28
|
*
|
|
@@ -113,7 +44,7 @@ function useStrictMemo(callback, dependencies) {
|
|
|
113
44
|
cached.set(id, wrapToInner(dependencies, value));
|
|
114
45
|
return value;
|
|
115
46
|
}
|
|
116
|
-
|
|
117
47
|
//#endregion
|
|
118
48
|
export { useStrictMemo };
|
|
49
|
+
|
|
119
50
|
//# sourceMappingURL=use-strict-memo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-strict-memo.js","names":[],"sources":["../../../src/hooks/use-strict-memo.tsx"],"sourcesContent":["import { useId, useInsertionEffect, useMemo } from \"react\";\nimport { Result } from \"../utils/results\";\n\ntype CacheInner = Map<unknown, CacheInner> | WeakMap<WeakKey, CacheInner> | { isNotNestedMap: true, value: any };\n\nconst cached = new Map<string, CacheInner>();\n\nfunction unwrapFromInner(dependencies: any[], inner: CacheInner): Result<any, void> {\n if ((dependencies.length === 0) !== (\"isNotNestedMap\" in inner)) {\n return Result.error(undefined);\n }\n if (\"isNotNestedMap\" in inner) {\n if (dependencies.length === 0) {\n return Result.ok(inner.value);\n } else {\n return Result.error(undefined);\n }\n } else {\n if (dependencies.length === 0) {\n return Result.error(undefined);\n } else {\n const [key, ...rest] = dependencies;\n const newInner = inner.get(key);\n if (!newInner) {\n return Result.error(undefined);\n }\n return unwrapFromInner(rest, newInner);\n }\n }\n}\nimport.meta.vitest?.test(\"unwrapFromInner\", ({ expect }) => {\n // Test with empty dependencies and non-nested map\n const nonNestedMap = { isNotNestedMap: true, value: \"test\" } as CacheInner;\n const result1 = unwrapFromInner([], nonNestedMap);\n expect(result1.status).toBe(\"ok\");\n if (result1.status === \"ok\") {\n expect(result1.data).toBe(\"test\");\n }\n\n // Test with non-empty dependencies and non-nested map (should error)\n expect(unwrapFromInner([\"key\"], nonNestedMap).status).toBe(\"error\");\n\n // Test with empty dependencies and nested map (should error)\n const nestedMap = new Map([[\"key\", { isNotNestedMap: true, value: \"test\" } as CacheInner]]) as CacheInner;\n expect(unwrapFromInner([], nestedMap).status).toBe(\"error\");\n\n // Test with matching dependencies and nested map\n const result2 = unwrapFromInner([\"key\"], nestedMap);\n expect(result2.status).toBe(\"ok\");\n if (result2.status === \"ok\") {\n expect(result2.data).toBe(\"test\");\n }\n\n // Test with non-matching dependencies and nested map\n expect(unwrapFromInner([\"wrongKey\"], nestedMap).status).toBe(\"error\");\n\n // Test with deeply nested map\n const deeplyNestedMap = new Map([\n [\"key1\", new Map([\n [\"key2\", { isNotNestedMap: true, value: \"nested\" } as CacheInner]\n ]) as CacheInner]\n ]) as CacheInner;\n\n const result3 = unwrapFromInner([\"key1\", \"key2\"], deeplyNestedMap);\n expect(result3.status).toBe(\"ok\");\n if (result3.status === \"ok\") {\n expect(result3.data).toBe(\"nested\");\n }\n\n // Test with partial match in deeply nested map\n expect(unwrapFromInner([\"key1\", \"wrongKey\"], deeplyNestedMap).status).toBe(\"error\");\n});\n\nfunction wrapToInner(dependencies: any[], value: any): CacheInner {\n if (dependencies.length === 0) {\n return { isNotNestedMap: true, value };\n }\n const [key, ...rest] = dependencies;\n const inner = wrapToInner(rest, value);\n\n const isObject = (typeof key === \"object\" && key !== null);\n const isUnregisteredSymbol = (typeof key === \"symbol\" && Symbol.keyFor(key) === undefined);\n const isWeak = isObject || isUnregisteredSymbol;\n const mapType = isWeak ? WeakMap : Map;\n\n return new mapType([[key, inner]]);\n}\nimport.meta.vitest?.test(\"wrapToInner\", ({ expect }) => {\n // Test with empty dependencies\n const emptyResult = wrapToInner([], \"test\");\n expect(emptyResult).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with single string dependency\n const singleResult = wrapToInner([\"key\"], \"test\");\n expect(singleResult instanceof Map).toBe(true);\n // Need to cast to access Map methods\n const singleMap = singleResult as Map<unknown, CacheInner>;\n expect(singleMap.get(\"key\")).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with multiple string dependencies\n const multiResult = wrapToInner([\"key1\", \"key2\"], \"test\");\n expect(multiResult instanceof Map).toBe(true);\n // Need to cast to access Map methods\n const multiMap = multiResult as Map<unknown, CacheInner>;\n const innerMap = multiMap.get(\"key1\") as Map<unknown, CacheInner>;\n expect(innerMap instanceof Map).toBe(true);\n expect(innerMap.get(\"key2\")).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with object dependency (should use WeakMap)\n const obj = { test: true };\n const objResult = wrapToInner([obj], \"test\");\n expect(objResult instanceof WeakMap).toBe(true);\n // Need to cast to access WeakMap methods\n const objMap = objResult as WeakMap<WeakKey, CacheInner>;\n expect(objMap.get(obj)).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with unregistered symbol dependency (should use WeakMap)\n const symbolObj = Symbol(\"test\");\n const symbolResult = wrapToInner([symbolObj], \"test\");\n expect(symbolResult instanceof WeakMap).toBe(true);\n // Need to cast to access WeakMap methods\n const symbolMap = symbolResult as WeakMap<WeakKey, CacheInner>;\n expect(symbolMap.get(symbolObj as unknown as object)).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with registered symbol dependency (should use Map)\n const registeredSymbol = Symbol.for(\"test\");\n const registeredSymbolResult = wrapToInner([registeredSymbol], \"test\");\n expect(registeredSymbolResult instanceof Map).toBe(true);\n // Need to cast to access Map methods\n const registeredSymbolMap = registeredSymbolResult as Map<unknown, CacheInner>;\n expect(registeredSymbolMap.get(registeredSymbol)).toEqual({ isNotNestedMap: true, value: \"test\" });\n});\n\n/**\n * Like memo, but minimizes recomputation of the value at all costs (instead of useMemo which recomputes whenever the renderer feels like it).\n *\n * The most recent value will be kept from garbage collection until one of the dependencies becomes unreachable. This may be true even after the component no longer renders. Be wary of memory leaks.\n */\nexport function useStrictMemo<T>(callback: () => T, dependencies: any[]): T {\n const id = useId();\n useInsertionEffect(() => {\n return () => {\n cached.delete(id);\n };\n }, [id]);\n\n const c = cached.get(id);\n if (c) {\n const unwrapped = unwrapFromInner(dependencies, c);\n if (unwrapped.status === \"ok\") {\n return unwrapped.data;\n }\n }\n const value = callback();\n cached.set(id, wrapToInner(dependencies, value));\n return value;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-strict-memo.js","names":[],"sources":["../../../src/hooks/use-strict-memo.tsx"],"sourcesContent":["import { useId, useInsertionEffect, useMemo } from \"react\";\nimport { Result } from \"../utils/results\";\n\ntype CacheInner = Map<unknown, CacheInner> | WeakMap<WeakKey, CacheInner> | { isNotNestedMap: true, value: any };\n\nconst cached = new Map<string, CacheInner>();\n\nfunction unwrapFromInner(dependencies: any[], inner: CacheInner): Result<any, void> {\n if ((dependencies.length === 0) !== (\"isNotNestedMap\" in inner)) {\n return Result.error(undefined);\n }\n if (\"isNotNestedMap\" in inner) {\n if (dependencies.length === 0) {\n return Result.ok(inner.value);\n } else {\n return Result.error(undefined);\n }\n } else {\n if (dependencies.length === 0) {\n return Result.error(undefined);\n } else {\n const [key, ...rest] = dependencies;\n const newInner = inner.get(key);\n if (!newInner) {\n return Result.error(undefined);\n }\n return unwrapFromInner(rest, newInner);\n }\n }\n}\nimport.meta.vitest?.test(\"unwrapFromInner\", ({ expect }) => {\n // Test with empty dependencies and non-nested map\n const nonNestedMap = { isNotNestedMap: true, value: \"test\" } as CacheInner;\n const result1 = unwrapFromInner([], nonNestedMap);\n expect(result1.status).toBe(\"ok\");\n if (result1.status === \"ok\") {\n expect(result1.data).toBe(\"test\");\n }\n\n // Test with non-empty dependencies and non-nested map (should error)\n expect(unwrapFromInner([\"key\"], nonNestedMap).status).toBe(\"error\");\n\n // Test with empty dependencies and nested map (should error)\n const nestedMap = new Map([[\"key\", { isNotNestedMap: true, value: \"test\" } as CacheInner]]) as CacheInner;\n expect(unwrapFromInner([], nestedMap).status).toBe(\"error\");\n\n // Test with matching dependencies and nested map\n const result2 = unwrapFromInner([\"key\"], nestedMap);\n expect(result2.status).toBe(\"ok\");\n if (result2.status === \"ok\") {\n expect(result2.data).toBe(\"test\");\n }\n\n // Test with non-matching dependencies and nested map\n expect(unwrapFromInner([\"wrongKey\"], nestedMap).status).toBe(\"error\");\n\n // Test with deeply nested map\n const deeplyNestedMap = new Map([\n [\"key1\", new Map([\n [\"key2\", { isNotNestedMap: true, value: \"nested\" } as CacheInner]\n ]) as CacheInner]\n ]) as CacheInner;\n\n const result3 = unwrapFromInner([\"key1\", \"key2\"], deeplyNestedMap);\n expect(result3.status).toBe(\"ok\");\n if (result3.status === \"ok\") {\n expect(result3.data).toBe(\"nested\");\n }\n\n // Test with partial match in deeply nested map\n expect(unwrapFromInner([\"key1\", \"wrongKey\"], deeplyNestedMap).status).toBe(\"error\");\n});\n\nfunction wrapToInner(dependencies: any[], value: any): CacheInner {\n if (dependencies.length === 0) {\n return { isNotNestedMap: true, value };\n }\n const [key, ...rest] = dependencies;\n const inner = wrapToInner(rest, value);\n\n const isObject = (typeof key === \"object\" && key !== null);\n const isUnregisteredSymbol = (typeof key === \"symbol\" && Symbol.keyFor(key) === undefined);\n const isWeak = isObject || isUnregisteredSymbol;\n const mapType = isWeak ? WeakMap : Map;\n\n return new mapType([[key, inner]]);\n}\nimport.meta.vitest?.test(\"wrapToInner\", ({ expect }) => {\n // Test with empty dependencies\n const emptyResult = wrapToInner([], \"test\");\n expect(emptyResult).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with single string dependency\n const singleResult = wrapToInner([\"key\"], \"test\");\n expect(singleResult instanceof Map).toBe(true);\n // Need to cast to access Map methods\n const singleMap = singleResult as Map<unknown, CacheInner>;\n expect(singleMap.get(\"key\")).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with multiple string dependencies\n const multiResult = wrapToInner([\"key1\", \"key2\"], \"test\");\n expect(multiResult instanceof Map).toBe(true);\n // Need to cast to access Map methods\n const multiMap = multiResult as Map<unknown, CacheInner>;\n const innerMap = multiMap.get(\"key1\") as Map<unknown, CacheInner>;\n expect(innerMap instanceof Map).toBe(true);\n expect(innerMap.get(\"key2\")).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with object dependency (should use WeakMap)\n const obj = { test: true };\n const objResult = wrapToInner([obj], \"test\");\n expect(objResult instanceof WeakMap).toBe(true);\n // Need to cast to access WeakMap methods\n const objMap = objResult as WeakMap<WeakKey, CacheInner>;\n expect(objMap.get(obj)).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with unregistered symbol dependency (should use WeakMap)\n const symbolObj = Symbol(\"test\");\n const symbolResult = wrapToInner([symbolObj], \"test\");\n expect(symbolResult instanceof WeakMap).toBe(true);\n // Need to cast to access WeakMap methods\n const symbolMap = symbolResult as WeakMap<WeakKey, CacheInner>;\n expect(symbolMap.get(symbolObj as unknown as object)).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with registered symbol dependency (should use Map)\n const registeredSymbol = Symbol.for(\"test\");\n const registeredSymbolResult = wrapToInner([registeredSymbol], \"test\");\n expect(registeredSymbolResult instanceof Map).toBe(true);\n // Need to cast to access Map methods\n const registeredSymbolMap = registeredSymbolResult as Map<unknown, CacheInner>;\n expect(registeredSymbolMap.get(registeredSymbol)).toEqual({ isNotNestedMap: true, value: \"test\" });\n});\n\n/**\n * Like memo, but minimizes recomputation of the value at all costs (instead of useMemo which recomputes whenever the renderer feels like it).\n *\n * The most recent value will be kept from garbage collection until one of the dependencies becomes unreachable. This may be true even after the component no longer renders. Be wary of memory leaks.\n */\nexport function useStrictMemo<T>(callback: () => T, dependencies: any[]): T {\n const id = useId();\n useInsertionEffect(() => {\n return () => {\n cached.delete(id);\n };\n }, [id]);\n\n const c = cached.get(id);\n if (c) {\n const unwrapped = unwrapFromInner(dependencies, c);\n if (unwrapped.status === \"ok\") {\n return unwrapped.data;\n }\n }\n const value = callback();\n cached.set(id, wrapToInner(dependencies, value));\n return value;\n}\n"],"mappings":";;;AAKA,MAAM,yBAAS,IAAI,IAAwB;AAE3C,SAAS,gBAAgB,cAAqB,OAAsC;CAClF,IAAK,aAAa,WAAW,MAAQ,oBAAoB,OACvD,OAAO,OAAO,MAAM,KAAA,CAAS;CAE/B,IAAI,oBAAoB,OACtB,IAAI,aAAa,WAAW,GAC1B,OAAO,OAAO,GAAG,MAAM,KAAK;MAE5B,OAAO,OAAO,MAAM,KAAA,CAAS;MAG/B,IAAI,aAAa,WAAW,GAC1B,OAAO,OAAO,MAAM,KAAA,CAAS;MACxB;EACL,MAAM,CAAC,KAAK,GAAG,QAAQ;EACvB,MAAM,WAAW,MAAM,IAAI,GAAG;EAC9B,IAAI,CAAC,UACH,OAAO,OAAO,MAAM,KAAA,CAAS;EAE/B,OAAO,gBAAgB,MAAM,QAAQ;CACvC;AAEJ;AA4CA,SAAS,YAAY,cAAqB,OAAwB;CAChE,IAAI,aAAa,WAAW,GAC1B,OAAO;EAAE,gBAAgB;EAAM;CAAM;CAEvC,MAAM,CAAC,KAAK,GAAG,QAAQ;CACvB,MAAM,QAAQ,YAAY,MAAM,KAAK;CAOrC,OAAO,KALW,OAAO,QAAQ,YAAY,QAAQ,QACvB,OAAO,QAAQ,YAAY,OAAO,OAAO,GAAG,MAAM,KAAA,IAEvD,UAAU,KAEhB,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;AACnC;;;;;;AAoDA,SAAgB,cAAiB,UAAmB,cAAwB;CAC1E,MAAM,KAAK,MAAM;CACjB,yBAAyB;EACvB,aAAa;GACX,OAAO,OAAO,EAAE;EAClB;CACF,GAAG,CAAC,EAAE,CAAC;CAEP,MAAM,IAAI,OAAO,IAAI,EAAE;CACvB,IAAI,GAAG;EACL,MAAM,YAAY,gBAAgB,cAAc,CAAC;EACjD,IAAI,UAAU,WAAW,MACvB,OAAO,UAAU;CAErB;CACA,MAAM,QAAQ,SAAS;CACvB,OAAO,IAAI,IAAI,YAAY,cAAc,KAAK,CAAC;CAC/C,OAAO;AACT"}
|