@hexclave/shared 1.0.41 → 1.0.42
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-Y9EZqwD6.d.ts +379 -0
- package/dist/admin-interface-Y9EZqwD6.d.ts.map +1 -0
- package/dist/admin-metrics-bsOkw4YQ.d.ts +807 -0
- package/dist/admin-metrics-bsOkw4YQ.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 +3 -6
- 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-iIw4nU5k.d.ts +447 -0
- package/dist/client-interface-iIw4nU5k.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-BBoN3hsn.d.ts +284 -0
- package/dist/current-user-BBoN3hsn.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-B1wmVPRG.d.ts +1464 -0
- package/dist/{interface/crud/email-outbox.d.ts.map → email-outbox-B1wmVPRG.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 +2 -3
- 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 +227 -228
- 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 +2 -3
- package/dist/esm/interface/admin-interface.js.map +1 -1
- package/dist/esm/interface/admin-metrics.d.ts +10 -10
- 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 +32 -16
- 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 +8 -8
- 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 +22 -24
- 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 +30 -32
- 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.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 +63 -65
- 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 +36 -38
- 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 +21 -22
- 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 +2 -3
- package/dist/esm/interface/server-interface.js.map +1 -1
- package/dist/esm/interface/webhooks.d.ts +4 -4
- 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 +2 -161
- 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 +3 -5
- 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 +33 -18
- 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 +8 -8
- 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 +3 -5
- 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-CHo9YKbI.d.ts +43 -0
- package/dist/invoices-CHo9YKbI.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-CFTNXRfG.d.ts +900 -0
- package/dist/projects-CFTNXRfG.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-CJwkGkdf.d.ts +2328 -0
- package/dist/schema-CJwkGkdf.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-CgpxsLT_.d.ts +257 -0
- package/dist/server-interface-CgpxsLT_.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-BoDEqx-0.d.ts +285 -0
- package/dist/team-member-profiles-BoDEqx-0.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-DHNRwoSz.d.ts +653 -0
- package/dist/users-DHNRwoSz.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 +3 -163
- 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-8Ts1Clcb.d.ts +326 -0
- package/dist/webhooks-8Ts1Clcb.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":"emails.js","names":[],"sources":["../../src/helpers/emails.ts"],"sourcesContent":["import { deindent } from \"../utils/strings\";\n\nexport const defaultNewTemplateSource = deindent`\n import { type } from \"arktype\"\n import { Container } from \"@react-email/components\";\n import { Subject, NotificationCategory, Props } from \"@stackframe/emails\";\n\n export const variablesSchema = type({\n count: \"number\"\n });\n\n export function EmailTemplate({ user, variables }: Props<typeof variablesSchema.infer>) {\n return (\n <Container>\n <Subject value={\\`Hello \\${user.displayName}!\\`} />\n <NotificationCategory value=\"Transactional\" />\n <div className=\"font-bold\">Hi {user.displayName}!</div>\n <br />\n count is {variables.count}\n </Container>\n );\n }\n\n EmailTemplate.PreviewVariables = {\n count: 10\n } satisfies typeof variablesSchema.infer\n`;\n\nexport const previewTemplateSource = deindent`\n import { Button, Section, Hr, Text, Heading } from \"@react-email/components\";\n import { Subject, NotificationCategory } from \"@stackframe/emails\";\n\n export const variablesSchema = v => v;\n\n export function EmailTemplate({ user, project }) {\n return (\n <>\n <Subject value={\\`Verify your email at \\${project.displayName}\\`} />\n <NotificationCategory value=\"Transactional\" />\n <div className=\"font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\">\n <Section>\n <Heading as=\"h3\" className=\"font-sans font-bold text-[20px] text-center py-4 px-6 m-0\">\n Verify your email at {project.displayName}\n </Heading>\n <Text className=\"font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0 opacity-80\">\n Hi{user.displayName ? (\", \" + user.displayName) : ''}! Please click on the following button to verify your email.\n </Text>\n <div className=\"text-center py-3 px-6\">\n <Button\n href=\"#\"\n className=\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\"\n >\n Verify my email\n </Button>\n </div>\n <div className=\"py-4 px-6\">\n <Hr className=\"opacity-20\" />\n </div>\n <Text className=\"font-sans font-normal text-[12px] text-center pt-1 px-6 pb-6 m-0 opacity-60\">\n If you were not expecting this email, you can safely ignore it. \n </Text>\n </Section>\n </div>\n </>\n )\n }\n`;\n\nexport const emptyEmailTheme = deindent`\n import { Html, Tailwind, Body } from '@react-email/components';\n export function EmailTheme({ children }: { children: React.ReactNode }) {\n return (\n <Html>\n <Tailwind>\n <Body>\n {children}\n </Body>\n </Tailwind>\n </Html>\n );\n }\n`;\n\nexport const LightEmailTheme = `import { Html, Head, Tailwind, Body, Container, Section } from '@react-email/components';\nimport { ThemeProps, ProjectLogo } from \"@stackframe/emails\";\n\nexport function EmailTheme({ children, unsubscribeLink, projectLogos }: ThemeProps) {\n return (\n <Html>\n <Head />\n <Tailwind>\n <Body className=\"bg-[#fafbfb] font-sans text-base m-0 p-0\" style={{ overflowX: 'hidden' }}>\n <div className=\"py-8 px-4 flex justify-center\">\n <Container className=\"bg-white p-[45px] rounded-lg shadow-sm mx-auto\" style={{ width: '100%', maxWidth: '600px' }}>\n <ProjectLogo data={projectLogos} mode=\"light\" />\n {children}\n </Container>\n </div>\n {unsubscribeLink && (\n <Section className=\"p-4 opacity-60 text-center\" style={{ textAlign: 'center' }}>\n <a href={unsubscribeLink} className=\"text-blue-600\" target=\"_blank\" rel=\"noopener noreferrer\">Click here</a> to unsubscribe from these emails\n </Section>\n )}\n </Body>\n </Tailwind>\n </Html>\n );\n}\n\nEmailTheme.PreviewProps = {\n unsubscribeLink: \"https://example.com\",\n} satisfies Partial<ThemeProps>\n`;\n\n\nconst DarkEmailTheme = `import { Html, Head, Tailwind, Body, Container, Section } from '@react-email/components';\nimport { ThemeProps, ProjectLogo } from \"@stackframe/emails\";\n\nexport function EmailTheme({ children, unsubscribeLink, projectLogos }: ThemeProps) {\n return (\n <Html>\n <Head />\n <Tailwind>\n <Body className=\"bg-[#323232] font-sans text-white m-0 p-0\" style={{ overflowX: 'hidden' }}>\n <div className=\"py-8 px-4 flex justify-center\">\n <Container className=\"bg-black p-[45px] rounded-lg shadow-sm mx-auto\" style={{ width: '100%', maxWidth: '600px' }}>\n <ProjectLogo data={projectLogos} mode=\"dark\" />\n {children}\n </Container>\n </div>\n {unsubscribeLink && (\n <Section className=\"p-4 opacity-60 text-center\" style={{ textAlign: 'center' }}>\n <a href={unsubscribeLink} className=\"text-blue-600\" target=\"_blank\" rel=\"noopener noreferrer\">Click here</a> to unsubscribe from these emails\n </Section>\n )}\n </Body>\n </Tailwind>\n </Html>\n );\n}\n\nEmailTheme.PreviewProps = {\n unsubscribeLink: \"https://example.com\",\n} satisfies Partial<ThemeProps>\n`;\n\n\nconst ColorfulEmailTheme = `import { Html, Head, Tailwind, Body, Container, Section } from '@react-email/components';\nimport { ThemeProps, ProjectLogo } from \"@stackframe/emails\";\n\nexport function EmailTheme({ children, unsubscribeLink, projectLogos }: ThemeProps) {\n return (\n <Html>\n <Head />\n <Tailwind>\n <Body className=\"bg-[#f0eef6] font-sans text-base m-0 p-0\" style={{ overflowX: 'hidden' }}>\n <div className=\"py-8 px-4 flex justify-center\">\n <Container className=\"bg-white p-[45px] rounded-2xl mx-auto\" style={{ width: '100%', maxWidth: '600px', borderTop: '4px solid #7c5ce0' }}>\n <ProjectLogo data={projectLogos} mode=\"light\" />\n {children}\n </Container>\n </div>\n {unsubscribeLink && (\n <Section className=\"p-4 opacity-60 text-center\" style={{ textAlign: 'center' }}>\n <a href={unsubscribeLink} className=\"text-[#7c5ce0]\" target=\"_blank\" rel=\"noopener noreferrer\">Click here</a> to unsubscribe from these emails\n </Section>\n )}\n </Body>\n </Tailwind>\n </Html>\n );\n}\n\nEmailTheme.PreviewProps = {\n unsubscribeLink: \"https://example.com\",\n} satisfies Partial<ThemeProps>\n`;\n\nexport const DEFAULT_EMAIL_THEME_ID = \"1df07ae6-abf3-4a40-83a5-a1a2cbe336ac\";\n\nexport const DEFAULT_EMAIL_THEMES = {\n [DEFAULT_EMAIL_THEME_ID]: {\n displayName: 'Default Light',\n tsxSource: LightEmailTheme,\n },\n \"a0172b5d-cff0-463b-83bb-85124697373a\": {\n displayName: 'Default Dark',\n tsxSource: DarkEmailTheme,\n },\n \"c7e2d94f-8a1b-4e6d-b3f5-9d0a2e7c1b8f\": {\n displayName: 'Default Colorful',\n tsxSource: ColorfulEmailTheme,\n },\n};\n\nconst EMAIL_TEMPLATE_EMAIL_VERIFICATION_ID = \"e7d009ce-8d47-4528-b245-5bf119f2ffa3\";\nconst EMAIL_TEMPLATE_PASSWORD_RESET_ID = \"a70fb3a4-56c1-4e42-af25-49d25603abd0\";\nconst EMAIL_TEMPLATE_MAGIC_LINK_ID = \"822687fe-8d0a-4467-a0d1-416b6e639478\";\nconst EMAIL_TEMPLATE_TEAM_INVITATION_ID = \"e84de395-2076-4831-9c19-8e9a96a868e4\";\nconst EMAIL_TEMPLATE_SIGN_IN_INVITATION_ID = \"066dd73c-36da-4fd0-b6d6-ebf87683f8bc\";\nconst EMAIL_TEMPLATE_PAYMENT_RECEIPT_ID = \"70372aee-0441-4d80-974c-2e858e40123a\";\nconst EMAIL_TEMPLATE_PAYMENT_FAILED_ID = \"f64b1afe-27ec-4a28-a277-7178f3261f9a\";\n\nexport const DEFAULT_EMAIL_TEMPLATES = {\n [EMAIL_TEMPLATE_EMAIL_VERIFICATION_ID]: {\n \"displayName\": \"Email Verification\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\"\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n emailVerificationLink: \\\"string\\\"\\n})\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={`Verify your email at ${project.displayName}`} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section>\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n Verify your email at {project.displayName}\\n </Heading>\\n <p className=\\\"font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0 opacity-80\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : ''}! Please click on the following button to verify your email.\\n </p>\\n <div className=\\\"text-center py-3 px-6\\\">\\n <Button\\n href={variables.emailVerificationLink}\\n className=\\\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\\\"\\n >\\n Verify my email\\n </Button>\\n </div>\\n <div className=\\\"py-4 px-6\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n <p className=\\\"font-sans font-normal text-[12px] text-center pt-1 px-6 pb-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it. \\n </p>\\n </Section>\\n </div>\\n </>\\n )\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n emailVerificationLink: \\\"#\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_PASSWORD_RESET_ID]: {\n \"displayName\": \"Password Reset\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\"\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\"\\nimport { Subject, NotificationCategory, Props} from \\\"@stackframe/emails\\\"\\n\\nexport const variablesSchema = type({\\n passwordResetLink: \\\"string\\\"\\n})\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Reset your password at \\\" + project.displayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-tight leading-relaxed py-8 w-full min-h-full\\\">\\n <Section>\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n Reset your password at {project.displayName}\\n </Heading>\\n\\n <p className=\\\"text-sm font-sans font-normal text-center pt-2 pb-4 px-6 m-0 opacity-80\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : \\\"\\\"}! Please click on the following button to start the password reset process.\\n </p>\\n\\n <div className=\\\"text-center px-6 py-3\\\">\\n <Button\\n href={variables.passwordResetLink}\\n className=\\\"text-black text-sm font-sans font-bold bg-[#f0f0f0] rounded-[4px] inline-block py-3 px-5 no-underline border-none\\\"\\n target=\\\"_blank\\\"\\n >\\n Reset my password\\n </Button>\\n </div>\\n\\n <div className=\\\"px-6 py-4\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n\\n <p className=\\\"text-xs font-sans font-normal text-center pt-1 pb-6 px-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n )\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n passwordResetLink: \\\"#\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_MAGIC_LINK_ID]: {\n \"displayName\": \"Magic Link/OTP\",\n \"tsxSource\": \"import { type } from 'arktype';\\nimport { Section, Hr, Text, Heading } from '@react-email/components';\\nimport { Subject, NotificationCategory, Props } from '@stackframe/emails';\\n\\nexport const variablesSchema = type({\\n magicLink: 'string',\\n otp: 'string',\\n});\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Sign in to \\\" + project.displayName + \\\": Your code is \\\" + variables.otp} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-[0.15008px] leading-6 m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"mx-auto\\\">\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-xl text-center px-6 py-4 m-0\\\">\\n Sign in to {project.displayName}\\n </Heading>\\n <p className=\\\"text-sm font-sans font-normal text-center px-6 py-4 m-0 opacity-80\\\">\\n Hi{user.displayName ? \\\", \\\" + user.displayName : \\\"\\\"}! This is your one-time-password for signing in:\\n </p>\\n <p className=\\\"text-2xl font-mono font-bold text-center px-6 py-4 m-0\\\">\\n {variables.otp}\\n </p>\\n <p className=\\\"text-sm font-sans font-normal text-center px-6 py-4 m-0\\\">\\n Or you can click on{' '}\\n <a\\n key={20}\\n href={variables.magicLink}\\n rel=\\\"noopener noreferrer\\\"\\n className=\\\"text-blue-600 underline\\\"\\n >\\n this link\\n </a>{' '}\\n to sign in\\n </p>\\n <Hr className=\\\"px-6 py-4 opacity-20\\\" />\\n <p className=\\\"text-xs font-sans font-normal text-center px-6 pt-1 pb-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n magicLink: \\\"#\\\",\\n otp: \\\"3SLSWZ\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_TEAM_INVITATION_ID]: {\n \"displayName\": \"Team Invitation\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\";\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\n\\nexport const variablesSchema = type({\\n teamDisplayName: \\\"string\\\",\\n teamInvitationLink: \\\"string\\\"\\n});\\n\\nexport function EmailTemplate({ user, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"You have been invited to join \\\" + variables.teamDisplayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"mx-auto max-w-lg\\\">\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-xl text-center px-6 pt-8 m-0\\\">\\n You are invited to {variables.teamDisplayName}\\n </Heading>\\n <p className=\\\"text-sm font-sans font-normal text-center px-6 pt-2 pb-4 m-0 opacity-80\\\">\\n Hi{user.displayName ? \\\", \\\" + user.displayName : \\\"\\\"}! Please click the button below to join the team {variables.teamDisplayName}\\n </p>\\n <div className=\\\"text-center px-6 py-3\\\">\\n <Button\\n href={variables.teamInvitationLink}\\n className=\\\"text-black text-sm font-sans font-bold bg-[#f0f0f0] rounded-md inline-block px-5 py-3 no-underline border-0\\\"\\n >\\n Join team\\n </Button>\\n </div>\\n <div className=\\\"px-6 py-4\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n <p className=\\\"text-xs font-sans font-normal text-center px-6 pb-6 pt-1 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n teamDisplayName: \\\"My Team\\\",\\n teamInvitationLink: \\\"#\\\"\\n} satisfies typeof variablesSchema.infer \",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_SIGN_IN_INVITATION_ID]: {\n \"displayName\": \"Sign In Invitation\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\"\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n signInInvitationLink: \\\"string\\\",\\n teamDisplayName: \\\"string\\\"\\n})\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject\\n value={\\\"You have been invited to sign in to \\\" + project.displayName}\\n />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n\\n <div className=\\\"font-sans text-base font-normal leading-normal w-full min-h-full m-0 py-8\\\">\\n <Section>\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-xl text-center pt-8 px-6 m-0\\\">\\n You are invited to sign in to {variables.teamDisplayName}\\n </Heading>\\n\\n <p className=\\\"text-sm font-sans font-normal text-center pt-2 pb-4 px-6 m-0 opacity-80\\\">\\n Hi\\n {user.displayName ? \\\", \\\" + user.displayName : \\\"\\\"}! Please click on the following\\n link to sign in to your account\\n </p>\\n\\n <div className=\\\"text-center px-6 py-3\\\">\\n <Button\\n href={variables.signInInvitationLink}\\n className=\\\"text-black text-sm font-sans font-bold bg-gray-200 rounded-md inline-block py-3 px-5 no-underline border-none\\\"\\n >\\n Sign in\\n </Button>\\n </div>\\n\\n <div className=\\\"px-6 py-4\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n\\n <p className=\\\"text-xs font-sans font-normal text-center pt-1 pb-6 px-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n )\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n signInInvitationLink: \\\"#\\\",\\n teamDisplayName: \\\"My Team\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_PAYMENT_RECEIPT_ID]: {\n \"displayName\": \"Payment Receipt\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\";\\nimport { Button, Section, Hr } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n productName: \\\"string\\\",\\n quantity: \\\"number\\\",\\n amount: \\\"string\\\",\\n receiptLink: \\\"string?\\\"\\n});\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Your receipt from \\\" + project.displayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"bg-white text-[#242424] font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"bg-white\\\">\\n <h3 className=\\\"text-black font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n Thanks for your purchase\\n </h3>\\n <p className=\\\"text-[#474849] font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : \\\"\\\"}! Your payment for {variables.productName} is complete.\\n </p>\\n <div className=\\\"px-6\\\">\\n <p className=\\\"text-black font-sans font-bold text-[16px] text-center m-0\\\">\\n Total paid: {variables.amount}\\n </p>\\n <p className=\\\"text-[#474849] font-sans text-[13px] text-center mt-2 mb-0\\\">\\n Quantity: {variables.quantity}\\n </p>\\n </div>\\n {variables.receiptLink ? (\\n <div className=\\\"text-center py-4 px-6\\\">\\n <Button\\n href={variables.receiptLink}\\n target=\\\"_blank\\\"\\n className=\\\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\\\"\\n >\\n View receipt\\n </Button>\\n </div>\\n ) : null}\\n <div className=\\\"py-4 px-6\\\">\\n <Hr />\\n </div>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n productName: \\\"Pro Plan\\\",\\n quantity: 1,\\n amount: \\\"$29.00\\\",\\n receiptLink: \\\"https://example.com/receipt\\\"\\n} satisfies typeof variablesSchema.infer;\\n\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_PAYMENT_FAILED_ID]: {\n \"displayName\": \"Payment Failed\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\";\\nimport { Button, Section, Hr } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n productName: \\\"string\\\",\\n amount: \\\"string\\\",\\n invoiceUrl: \\\"string?\\\",\\n failureReason: \\\"string?\\\"\\n});\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Payment failed for \\\" + project.displayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"bg-white text-[#242424] font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"bg-white\\\">\\n <h3 className=\\\"text-black font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n We couldn't process your payment\\n </h3>\\n <p className=\\\"text-[#474849] font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : \\\"\\\"}! Your payment for {variables.productName} ({variables.amount}) did not go through.\\n </p>\\n {variables.failureReason ? (\\n <p className=\\\"text-[#8a8b8b] font-sans text-[12px] text-center px-6 pb-2 m-0\\\">\\n Reason: {variables.failureReason}\\n </p>\\n ) : null}\\n {variables.invoiceUrl ? (\\n <div className=\\\"text-center py-3 px-6\\\">\\n <Button\\n href={variables.invoiceUrl}\\n target=\\\"_blank\\\"\\n className=\\\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\\\"\\n >\\n View invoice\\n </Button>\\n </div>\\n ) : null}\\n <div className=\\\"py-4 px-6\\\">\\n <Hr />\\n </div>\\n <p className=\\\"text-[#474849] font-sans font-normal text-[12px] text-center pt-1 px-6 pb-6 m-0\\\">\\n Please update your payment details to avoid service interruption.\\n </p>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n productName: \\\"Pro Plan\\\",\\n amount: \\\"$29.00\\\",\\n invoiceUrl: \\\"https://example.com/billing\\\",\\n failureReason: \\\"Your card was declined\\\"\\n} satisfies typeof variablesSchema.infer;\\n\",\n \"themeId\": undefined,\n }\n};\n\nexport const DEFAULT_TEMPLATE_IDS = {\n email_verification: EMAIL_TEMPLATE_EMAIL_VERIFICATION_ID,\n password_reset: EMAIL_TEMPLATE_PASSWORD_RESET_ID,\n magic_link: EMAIL_TEMPLATE_MAGIC_LINK_ID,\n team_invitation: EMAIL_TEMPLATE_TEAM_INVITATION_ID,\n sign_in_invitation: EMAIL_TEMPLATE_SIGN_IN_INVITATION_ID,\n payment_receipt: EMAIL_TEMPLATE_PAYMENT_RECEIPT_ID,\n payment_failed: EMAIL_TEMPLATE_PAYMENT_FAILED_ID,\n} as const;\n"],"mappings":";;;;;AAEA,MAAa,2BAA2B,4BAAQ;;;;;;;;;;;;;;;;;;;;;;;;;AA0BhD,MAAa,wBAAwB,4BAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwC7C,MAAa,kBAAkB,4BAAQ;;;;;;;;;;;;;;AAevC,MAAa,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgC/B,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCvB,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+B3B,MAAa,yBAAyB;AAEtC,MAAa,uBAAuB;EACjC,yBAAyB;EACxB,aAAa;EACb,WAAW;EACZ;CACD,wCAAwC;EACtC,aAAa;EACb,WAAW;EACZ;CACD,wCAAwC;EACtC,aAAa;EACb,WAAW;EACZ;CACF;AAED,MAAM,uCAAuC;AAC7C,MAAM,mCAAmC;AACzC,MAAM,+BAA+B;AACrC,MAAM,oCAAoC;AAC1C,MAAM,uCAAuC;AAC7C,MAAM,oCAAoC;AAC1C,MAAM,mCAAmC;AAEzC,MAAa,0BAA0B;EACpC,uCAAuC;EACtC,eAAe;EACf,aAAa;EACb,WAAW;EACZ;EACA,mCAAmC;EAClC,eAAe;EACf,aAAa;EACb,WAAW;EACZ;EACA,+BAA+B;EAC9B,eAAe;EACf,aAAa;EACb,WAAW;EACZ;EACA,oCAAoC;EACnC,eAAe;EACf,aAAa;EACb,WAAW;EACZ;EACA,uCAAuC;EACtC,eAAe;EACf,aAAa;EACb,WAAW;EACZ;EACA,oCAAoC;EACnC,eAAe;EACf,aAAa;EACb,WAAW;EACZ;EACA,mCAAmC;EAClC,eAAe;EACf,aAAa;EACb,WAAW;EACZ;CACF;AAED,MAAa,uBAAuB;CAClC,oBAAoB;CACpB,gBAAgB;CAChB,YAAY;CACZ,iBAAiB;CACjB,oBAAoB;CACpB,iBAAiB;CACjB,gBAAgB;CACjB"}
|
|
1
|
+
{"version":3,"file":"emails.js","names":[],"sources":["../../src/helpers/emails.ts"],"sourcesContent":["import { deindent } from \"../utils/strings\";\n\nexport const defaultNewTemplateSource = deindent`\n import { type } from \"arktype\"\n import { Container } from \"@react-email/components\";\n import { Subject, NotificationCategory, Props } from \"@stackframe/emails\";\n\n export const variablesSchema = type({\n count: \"number\"\n });\n\n export function EmailTemplate({ user, variables }: Props<typeof variablesSchema.infer>) {\n return (\n <Container>\n <Subject value={\\`Hello \\${user.displayName}!\\`} />\n <NotificationCategory value=\"Transactional\" />\n <div className=\"font-bold\">Hi {user.displayName}!</div>\n <br />\n count is {variables.count}\n </Container>\n );\n }\n\n EmailTemplate.PreviewVariables = {\n count: 10\n } satisfies typeof variablesSchema.infer\n`;\n\nexport const previewTemplateSource = deindent`\n import { Button, Section, Hr, Text, Heading } from \"@react-email/components\";\n import { Subject, NotificationCategory } from \"@stackframe/emails\";\n\n export const variablesSchema = v => v;\n\n export function EmailTemplate({ user, project }) {\n return (\n <>\n <Subject value={\\`Verify your email at \\${project.displayName}\\`} />\n <NotificationCategory value=\"Transactional\" />\n <div className=\"font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\">\n <Section>\n <Heading as=\"h3\" className=\"font-sans font-bold text-[20px] text-center py-4 px-6 m-0\">\n Verify your email at {project.displayName}\n </Heading>\n <Text className=\"font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0 opacity-80\">\n Hi{user.displayName ? (\", \" + user.displayName) : ''}! Please click on the following button to verify your email.\n </Text>\n <div className=\"text-center py-3 px-6\">\n <Button\n href=\"#\"\n className=\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\"\n >\n Verify my email\n </Button>\n </div>\n <div className=\"py-4 px-6\">\n <Hr className=\"opacity-20\" />\n </div>\n <Text className=\"font-sans font-normal text-[12px] text-center pt-1 px-6 pb-6 m-0 opacity-60\">\n If you were not expecting this email, you can safely ignore it. \n </Text>\n </Section>\n </div>\n </>\n )\n }\n`;\n\nexport const emptyEmailTheme = deindent`\n import { Html, Tailwind, Body } from '@react-email/components';\n export function EmailTheme({ children }: { children: React.ReactNode }) {\n return (\n <Html>\n <Tailwind>\n <Body>\n {children}\n </Body>\n </Tailwind>\n </Html>\n );\n }\n`;\n\nexport const LightEmailTheme = `import { Html, Head, Tailwind, Body, Container, Section } from '@react-email/components';\nimport { ThemeProps, ProjectLogo } from \"@stackframe/emails\";\n\nexport function EmailTheme({ children, unsubscribeLink, projectLogos }: ThemeProps) {\n return (\n <Html>\n <Head />\n <Tailwind>\n <Body className=\"bg-[#fafbfb] font-sans text-base m-0 p-0\" style={{ overflowX: 'hidden' }}>\n <div className=\"py-8 px-4 flex justify-center\">\n <Container className=\"bg-white p-[45px] rounded-lg shadow-sm mx-auto\" style={{ width: '100%', maxWidth: '600px' }}>\n <ProjectLogo data={projectLogos} mode=\"light\" />\n {children}\n </Container>\n </div>\n {unsubscribeLink && (\n <Section className=\"p-4 opacity-60 text-center\" style={{ textAlign: 'center' }}>\n <a href={unsubscribeLink} className=\"text-blue-600\" target=\"_blank\" rel=\"noopener noreferrer\">Click here</a> to unsubscribe from these emails\n </Section>\n )}\n </Body>\n </Tailwind>\n </Html>\n );\n}\n\nEmailTheme.PreviewProps = {\n unsubscribeLink: \"https://example.com\",\n} satisfies Partial<ThemeProps>\n`;\n\n\nconst DarkEmailTheme = `import { Html, Head, Tailwind, Body, Container, Section } from '@react-email/components';\nimport { ThemeProps, ProjectLogo } from \"@stackframe/emails\";\n\nexport function EmailTheme({ children, unsubscribeLink, projectLogos }: ThemeProps) {\n return (\n <Html>\n <Head />\n <Tailwind>\n <Body className=\"bg-[#323232] font-sans text-white m-0 p-0\" style={{ overflowX: 'hidden' }}>\n <div className=\"py-8 px-4 flex justify-center\">\n <Container className=\"bg-black p-[45px] rounded-lg shadow-sm mx-auto\" style={{ width: '100%', maxWidth: '600px' }}>\n <ProjectLogo data={projectLogos} mode=\"dark\" />\n {children}\n </Container>\n </div>\n {unsubscribeLink && (\n <Section className=\"p-4 opacity-60 text-center\" style={{ textAlign: 'center' }}>\n <a href={unsubscribeLink} className=\"text-blue-600\" target=\"_blank\" rel=\"noopener noreferrer\">Click here</a> to unsubscribe from these emails\n </Section>\n )}\n </Body>\n </Tailwind>\n </Html>\n );\n}\n\nEmailTheme.PreviewProps = {\n unsubscribeLink: \"https://example.com\",\n} satisfies Partial<ThemeProps>\n`;\n\n\nconst ColorfulEmailTheme = `import { Html, Head, Tailwind, Body, Container, Section } from '@react-email/components';\nimport { ThemeProps, ProjectLogo } from \"@stackframe/emails\";\n\nexport function EmailTheme({ children, unsubscribeLink, projectLogos }: ThemeProps) {\n return (\n <Html>\n <Head />\n <Tailwind>\n <Body className=\"bg-[#f0eef6] font-sans text-base m-0 p-0\" style={{ overflowX: 'hidden' }}>\n <div className=\"py-8 px-4 flex justify-center\">\n <Container className=\"bg-white p-[45px] rounded-2xl mx-auto\" style={{ width: '100%', maxWidth: '600px', borderTop: '4px solid #7c5ce0' }}>\n <ProjectLogo data={projectLogos} mode=\"light\" />\n {children}\n </Container>\n </div>\n {unsubscribeLink && (\n <Section className=\"p-4 opacity-60 text-center\" style={{ textAlign: 'center' }}>\n <a href={unsubscribeLink} className=\"text-[#7c5ce0]\" target=\"_blank\" rel=\"noopener noreferrer\">Click here</a> to unsubscribe from these emails\n </Section>\n )}\n </Body>\n </Tailwind>\n </Html>\n );\n}\n\nEmailTheme.PreviewProps = {\n unsubscribeLink: \"https://example.com\",\n} satisfies Partial<ThemeProps>\n`;\n\nexport const DEFAULT_EMAIL_THEME_ID = \"1df07ae6-abf3-4a40-83a5-a1a2cbe336ac\";\n\nexport const DEFAULT_EMAIL_THEMES = {\n [DEFAULT_EMAIL_THEME_ID]: {\n displayName: 'Default Light',\n tsxSource: LightEmailTheme,\n },\n \"a0172b5d-cff0-463b-83bb-85124697373a\": {\n displayName: 'Default Dark',\n tsxSource: DarkEmailTheme,\n },\n \"c7e2d94f-8a1b-4e6d-b3f5-9d0a2e7c1b8f\": {\n displayName: 'Default Colorful',\n tsxSource: ColorfulEmailTheme,\n },\n};\n\nconst EMAIL_TEMPLATE_EMAIL_VERIFICATION_ID = \"e7d009ce-8d47-4528-b245-5bf119f2ffa3\";\nconst EMAIL_TEMPLATE_PASSWORD_RESET_ID = \"a70fb3a4-56c1-4e42-af25-49d25603abd0\";\nconst EMAIL_TEMPLATE_MAGIC_LINK_ID = \"822687fe-8d0a-4467-a0d1-416b6e639478\";\nconst EMAIL_TEMPLATE_TEAM_INVITATION_ID = \"e84de395-2076-4831-9c19-8e9a96a868e4\";\nconst EMAIL_TEMPLATE_SIGN_IN_INVITATION_ID = \"066dd73c-36da-4fd0-b6d6-ebf87683f8bc\";\nconst EMAIL_TEMPLATE_PAYMENT_RECEIPT_ID = \"70372aee-0441-4d80-974c-2e858e40123a\";\nconst EMAIL_TEMPLATE_PAYMENT_FAILED_ID = \"f64b1afe-27ec-4a28-a277-7178f3261f9a\";\n\nexport const DEFAULT_EMAIL_TEMPLATES = {\n [EMAIL_TEMPLATE_EMAIL_VERIFICATION_ID]: {\n \"displayName\": \"Email Verification\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\"\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n emailVerificationLink: \\\"string\\\"\\n})\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={`Verify your email at ${project.displayName}`} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section>\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n Verify your email at {project.displayName}\\n </Heading>\\n <p className=\\\"font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0 opacity-80\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : ''}! Please click on the following button to verify your email.\\n </p>\\n <div className=\\\"text-center py-3 px-6\\\">\\n <Button\\n href={variables.emailVerificationLink}\\n className=\\\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\\\"\\n >\\n Verify my email\\n </Button>\\n </div>\\n <div className=\\\"py-4 px-6\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n <p className=\\\"font-sans font-normal text-[12px] text-center pt-1 px-6 pb-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it. \\n </p>\\n </Section>\\n </div>\\n </>\\n )\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n emailVerificationLink: \\\"#\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_PASSWORD_RESET_ID]: {\n \"displayName\": \"Password Reset\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\"\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\"\\nimport { Subject, NotificationCategory, Props} from \\\"@stackframe/emails\\\"\\n\\nexport const variablesSchema = type({\\n passwordResetLink: \\\"string\\\"\\n})\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Reset your password at \\\" + project.displayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-tight leading-relaxed py-8 w-full min-h-full\\\">\\n <Section>\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n Reset your password at {project.displayName}\\n </Heading>\\n\\n <p className=\\\"text-sm font-sans font-normal text-center pt-2 pb-4 px-6 m-0 opacity-80\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : \\\"\\\"}! Please click on the following button to start the password reset process.\\n </p>\\n\\n <div className=\\\"text-center px-6 py-3\\\">\\n <Button\\n href={variables.passwordResetLink}\\n className=\\\"text-black text-sm font-sans font-bold bg-[#f0f0f0] rounded-[4px] inline-block py-3 px-5 no-underline border-none\\\"\\n target=\\\"_blank\\\"\\n >\\n Reset my password\\n </Button>\\n </div>\\n\\n <div className=\\\"px-6 py-4\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n\\n <p className=\\\"text-xs font-sans font-normal text-center pt-1 pb-6 px-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n )\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n passwordResetLink: \\\"#\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_MAGIC_LINK_ID]: {\n \"displayName\": \"Magic Link/OTP\",\n \"tsxSource\": \"import { type } from 'arktype';\\nimport { Section, Hr, Text, Heading } from '@react-email/components';\\nimport { Subject, NotificationCategory, Props } from '@stackframe/emails';\\n\\nexport const variablesSchema = type({\\n magicLink: 'string',\\n otp: 'string',\\n});\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Sign in to \\\" + project.displayName + \\\": Your code is \\\" + variables.otp} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-[0.15008px] leading-6 m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"mx-auto\\\">\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-xl text-center px-6 py-4 m-0\\\">\\n Sign in to {project.displayName}\\n </Heading>\\n <p className=\\\"text-sm font-sans font-normal text-center px-6 py-4 m-0 opacity-80\\\">\\n Hi{user.displayName ? \\\", \\\" + user.displayName : \\\"\\\"}! This is your one-time-password for signing in:\\n </p>\\n <p className=\\\"text-2xl font-mono font-bold text-center px-6 py-4 m-0\\\">\\n {variables.otp}\\n </p>\\n <p className=\\\"text-sm font-sans font-normal text-center px-6 py-4 m-0\\\">\\n Or you can click on{' '}\\n <a\\n key={20}\\n href={variables.magicLink}\\n rel=\\\"noopener noreferrer\\\"\\n className=\\\"text-blue-600 underline\\\"\\n >\\n this link\\n </a>{' '}\\n to sign in\\n </p>\\n <Hr className=\\\"px-6 py-4 opacity-20\\\" />\\n <p className=\\\"text-xs font-sans font-normal text-center px-6 pt-1 pb-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n magicLink: \\\"#\\\",\\n otp: \\\"3SLSWZ\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_TEAM_INVITATION_ID]: {\n \"displayName\": \"Team Invitation\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\";\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\n\\nexport const variablesSchema = type({\\n teamDisplayName: \\\"string\\\",\\n teamInvitationLink: \\\"string\\\"\\n});\\n\\nexport function EmailTemplate({ user, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"You have been invited to join \\\" + variables.teamDisplayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"mx-auto max-w-lg\\\">\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-xl text-center px-6 pt-8 m-0\\\">\\n You are invited to {variables.teamDisplayName}\\n </Heading>\\n <p className=\\\"text-sm font-sans font-normal text-center px-6 pt-2 pb-4 m-0 opacity-80\\\">\\n Hi{user.displayName ? \\\", \\\" + user.displayName : \\\"\\\"}! Please click the button below to join the team {variables.teamDisplayName}\\n </p>\\n <div className=\\\"text-center px-6 py-3\\\">\\n <Button\\n href={variables.teamInvitationLink}\\n className=\\\"text-black text-sm font-sans font-bold bg-[#f0f0f0] rounded-md inline-block px-5 py-3 no-underline border-0\\\"\\n >\\n Join team\\n </Button>\\n </div>\\n <div className=\\\"px-6 py-4\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n <p className=\\\"text-xs font-sans font-normal text-center px-6 pb-6 pt-1 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n teamDisplayName: \\\"My Team\\\",\\n teamInvitationLink: \\\"#\\\"\\n} satisfies typeof variablesSchema.infer \",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_SIGN_IN_INVITATION_ID]: {\n \"displayName\": \"Sign In Invitation\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\"\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n signInInvitationLink: \\\"string\\\",\\n teamDisplayName: \\\"string\\\"\\n})\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject\\n value={\\\"You have been invited to sign in to \\\" + project.displayName}\\n />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n\\n <div className=\\\"font-sans text-base font-normal leading-normal w-full min-h-full m-0 py-8\\\">\\n <Section>\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-xl text-center pt-8 px-6 m-0\\\">\\n You are invited to sign in to {variables.teamDisplayName}\\n </Heading>\\n\\n <p className=\\\"text-sm font-sans font-normal text-center pt-2 pb-4 px-6 m-0 opacity-80\\\">\\n Hi\\n {user.displayName ? \\\", \\\" + user.displayName : \\\"\\\"}! Please click on the following\\n link to sign in to your account\\n </p>\\n\\n <div className=\\\"text-center px-6 py-3\\\">\\n <Button\\n href={variables.signInInvitationLink}\\n className=\\\"text-black text-sm font-sans font-bold bg-gray-200 rounded-md inline-block py-3 px-5 no-underline border-none\\\"\\n >\\n Sign in\\n </Button>\\n </div>\\n\\n <div className=\\\"px-6 py-4\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n\\n <p className=\\\"text-xs font-sans font-normal text-center pt-1 pb-6 px-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n )\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n signInInvitationLink: \\\"#\\\",\\n teamDisplayName: \\\"My Team\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_PAYMENT_RECEIPT_ID]: {\n \"displayName\": \"Payment Receipt\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\";\\nimport { Button, Section, Hr } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n productName: \\\"string\\\",\\n quantity: \\\"number\\\",\\n amount: \\\"string\\\",\\n receiptLink: \\\"string?\\\"\\n});\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Your receipt from \\\" + project.displayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"bg-white text-[#242424] font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"bg-white\\\">\\n <h3 className=\\\"text-black font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n Thanks for your purchase\\n </h3>\\n <p className=\\\"text-[#474849] font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : \\\"\\\"}! Your payment for {variables.productName} is complete.\\n </p>\\n <div className=\\\"px-6\\\">\\n <p className=\\\"text-black font-sans font-bold text-[16px] text-center m-0\\\">\\n Total paid: {variables.amount}\\n </p>\\n <p className=\\\"text-[#474849] font-sans text-[13px] text-center mt-2 mb-0\\\">\\n Quantity: {variables.quantity}\\n </p>\\n </div>\\n {variables.receiptLink ? (\\n <div className=\\\"text-center py-4 px-6\\\">\\n <Button\\n href={variables.receiptLink}\\n target=\\\"_blank\\\"\\n className=\\\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\\\"\\n >\\n View receipt\\n </Button>\\n </div>\\n ) : null}\\n <div className=\\\"py-4 px-6\\\">\\n <Hr />\\n </div>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n productName: \\\"Pro Plan\\\",\\n quantity: 1,\\n amount: \\\"$29.00\\\",\\n receiptLink: \\\"https://example.com/receipt\\\"\\n} satisfies typeof variablesSchema.infer;\\n\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_PAYMENT_FAILED_ID]: {\n \"displayName\": \"Payment Failed\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\";\\nimport { Button, Section, Hr } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n productName: \\\"string\\\",\\n amount: \\\"string\\\",\\n invoiceUrl: \\\"string?\\\",\\n failureReason: \\\"string?\\\"\\n});\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Payment failed for \\\" + project.displayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"bg-white text-[#242424] font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"bg-white\\\">\\n <h3 className=\\\"text-black font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n We couldn't process your payment\\n </h3>\\n <p className=\\\"text-[#474849] font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : \\\"\\\"}! Your payment for {variables.productName} ({variables.amount}) did not go through.\\n </p>\\n {variables.failureReason ? (\\n <p className=\\\"text-[#8a8b8b] font-sans text-[12px] text-center px-6 pb-2 m-0\\\">\\n Reason: {variables.failureReason}\\n </p>\\n ) : null}\\n {variables.invoiceUrl ? (\\n <div className=\\\"text-center py-3 px-6\\\">\\n <Button\\n href={variables.invoiceUrl}\\n target=\\\"_blank\\\"\\n className=\\\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\\\"\\n >\\n View invoice\\n </Button>\\n </div>\\n ) : null}\\n <div className=\\\"py-4 px-6\\\">\\n <Hr />\\n </div>\\n <p className=\\\"text-[#474849] font-sans font-normal text-[12px] text-center pt-1 px-6 pb-6 m-0\\\">\\n Please update your payment details to avoid service interruption.\\n </p>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n productName: \\\"Pro Plan\\\",\\n amount: \\\"$29.00\\\",\\n invoiceUrl: \\\"https://example.com/billing\\\",\\n failureReason: \\\"Your card was declined\\\"\\n} satisfies typeof variablesSchema.infer;\\n\",\n \"themeId\": undefined,\n }\n};\n\nexport const DEFAULT_TEMPLATE_IDS = {\n email_verification: EMAIL_TEMPLATE_EMAIL_VERIFICATION_ID,\n password_reset: EMAIL_TEMPLATE_PASSWORD_RESET_ID,\n magic_link: EMAIL_TEMPLATE_MAGIC_LINK_ID,\n team_invitation: EMAIL_TEMPLATE_TEAM_INVITATION_ID,\n sign_in_invitation: EMAIL_TEMPLATE_SIGN_IN_INVITATION_ID,\n payment_receipt: EMAIL_TEMPLATE_PAYMENT_RECEIPT_ID,\n payment_failed: EMAIL_TEMPLATE_PAYMENT_FAILED_ID,\n} as const;\n"],"mappings":";;;AAEA,MAAa,2BAA2B,oBAAA,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;AA0BhD,MAAa,wBAAwB,oBAAA,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwC7C,MAAa,kBAAkB,oBAAA,QAAQ;;;;;;;;;;;;;;AAevC,MAAa,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgC/B,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCvB,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+B3B,MAAa,yBAAyB;AAEtC,MAAa,uBAAuB;EACjC,yBAAyB;EACxB,aAAa;EACb,WAAW;CACb;CACA,wCAAwC;EACtC,aAAa;EACb,WAAW;CACb;CACA,wCAAwC;EACtC,aAAa;EACb,WAAW;CACb;AACF;AAEA,MAAM,uCAAuC;AAC7C,MAAM,mCAAmC;AACzC,MAAM,+BAA+B;AACrC,MAAM,oCAAoC;AAC1C,MAAM,uCAAuC;AAC7C,MAAM,oCAAoC;AAC1C,MAAM,mCAAmC;AAEzC,MAAa,0BAA0B;EACpC,uCAAuC;EACtC,eAAe;EACf,aAAa;EACb,WAAW,KAAA;CACb;EACC,mCAAmC;EAClC,eAAe;EACf,aAAa;EACb,WAAW,KAAA;CACb;EACC,+BAA+B;EAC9B,eAAe;EACf,aAAa;EACb,WAAW,KAAA;CACb;EACC,oCAAoC;EACnC,eAAe;EACf,aAAa;EACb,WAAW,KAAA;CACb;EACC,uCAAuC;EACtC,eAAe;EACf,aAAa;EACb,WAAW,KAAA;CACb;EACC,oCAAoC;EACnC,eAAe;EACf,aAAa;EACb,WAAW,KAAA;CACb;EACC,mCAAmC;EAClC,eAAe;EACf,aAAa;EACb,WAAW,KAAA;CACb;AACF;AAEA,MAAa,uBAAuB;CAClC,oBAAoB;CACpB,gBAAgB;CAChB,YAAY;CACZ,iBAAiB;CACjB,oBAAoB;CACpB,iBAAiB;CACjB,gBAAgB;AAClB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-prompt.d.ts","names":[],"sources":["../../src/helpers/init-prompt.ts"],"mappings":";cAsBa,gBAAA,GAAoB,GAAA,WAAc,
|
|
1
|
+
{"version":3,"file":"init-prompt.d.ts","names":[],"sources":["../../src/helpers/init-prompt.ts"],"mappings":";cAsBa,gBAAA,GAAoB,GAAA,WAAc,UAAmB"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value:
|
|
2
|
-
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
2
|
let ___ai_unified_prompts_skill_site_prompt_parts_ai_setup_prompt_js = require("../ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js");
|
|
4
|
-
|
|
5
3
|
//#region src/helpers/init-prompt.ts
|
|
6
4
|
function getCliProjectSetupContext(configPath) {
|
|
7
5
|
if (configPath != null) return `
|
|
@@ -36,7 +34,7 @@ Apply only the sections relevant to this project. For example, do not add Convex
|
|
|
36
34
|
|
|
37
35
|
${___ai_unified_prompts_skill_site_prompt_parts_ai_setup_prompt_js.aiSetupPrompt}
|
|
38
36
|
`;
|
|
39
|
-
|
|
40
37
|
//#endregion
|
|
41
38
|
exports.createInitPrompt = createInitPrompt;
|
|
39
|
+
|
|
42
40
|
//# sourceMappingURL=init-prompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-prompt.js","names":["aiSetupPrompt"],"sources":["../../src/helpers/init-prompt.ts"],"sourcesContent":["import { aiSetupPrompt } from \"../ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt\";\n\nfunction getCliProjectSetupContext(configPath?: string): string {\n if (configPath != null) {\n return `\nThe Hexclave CLI already created or linked this project to a local Hexclave development environment config file:\n\n\\`\\`\\`text\n${configPath}\n\\`\\`\\`\n\nDo not create or link another Hexclave project. When the SDK setup instructions mention creating \\`hexclave.config.ts\\` or wrapping the dev script with \\`hexclave dev --config-file\\`, use the config file path above.\n`;\n }\n\n return `\nThe Hexclave CLI already created or linked this project to a hosted Hexclave cloud project and wrote or printed the Hexclave environment variables.\n\nDo not create or link another Hexclave project. Use the existing environment variables in this workspace. If the variables were printed instead of written because the user declined to append them to an env file, tell the user exactly which variables still need to be added.\n`;\n}\n\nexport const createInitPrompt = (web: boolean, configPath?: string) => `=============================\nHEXCLAVE SETUP INSTRUCTIONS\n=============================\n\nThese instructions describe how to set up Hexclave.\n${web ? `\nFirst of all, use the full setup prompt below as the source of truth. Do not run the Hexclave CLI initializer unless the user explicitly asks for the CLI workflow.\n` : \"\"}\n\n${getCliProjectSetupContext(configPath)}\n\nUse the full setup guide below as the source of truth, with one important CLI-specific adjustment: the \"Setting up the project\" step is already complete. Use that section only to understand how the existing config/env files should connect to the SDK wiring; do not ask the user for project IDs or keys that the CLI already generated or linked.\n\nApply only the sections relevant to this project. For example, do not add Convex, Supabase, or command-line-app authentication unless the existing project already uses that surface or the user explicitly asked for it.\n\n${aiSetupPrompt}\n`;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"init-prompt.js","names":["aiSetupPrompt"],"sources":["../../src/helpers/init-prompt.ts"],"sourcesContent":["import { aiSetupPrompt } from \"../ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt\";\n\nfunction getCliProjectSetupContext(configPath?: string): string {\n if (configPath != null) {\n return `\nThe Hexclave CLI already created or linked this project to a local Hexclave development environment config file:\n\n\\`\\`\\`text\n${configPath}\n\\`\\`\\`\n\nDo not create or link another Hexclave project. When the SDK setup instructions mention creating \\`hexclave.config.ts\\` or wrapping the dev script with \\`hexclave dev --config-file\\`, use the config file path above.\n`;\n }\n\n return `\nThe Hexclave CLI already created or linked this project to a hosted Hexclave cloud project and wrote or printed the Hexclave environment variables.\n\nDo not create or link another Hexclave project. Use the existing environment variables in this workspace. If the variables were printed instead of written because the user declined to append them to an env file, tell the user exactly which variables still need to be added.\n`;\n}\n\nexport const createInitPrompt = (web: boolean, configPath?: string) => `=============================\nHEXCLAVE SETUP INSTRUCTIONS\n=============================\n\nThese instructions describe how to set up Hexclave.\n${web ? `\nFirst of all, use the full setup prompt below as the source of truth. Do not run the Hexclave CLI initializer unless the user explicitly asks for the CLI workflow.\n` : \"\"}\n\n${getCliProjectSetupContext(configPath)}\n\nUse the full setup guide below as the source of truth, with one important CLI-specific adjustment: the \"Setting up the project\" step is already complete. Use that section only to understand how the existing config/env files should connect to the SDK wiring; do not ask the user for project IDs or keys that the CLI already generated or linked.\n\nApply only the sections relevant to this project. For example, do not add Convex, Supabase, or command-line-app authentication unless the existing project already uses that surface or the user explicitly asked for it.\n\n${aiSetupPrompt}\n`;\n"],"mappings":";;;AAEA,SAAS,0BAA0B,YAA6B;CAC9D,IAAI,cAAc,MAChB,OAAO;;;;EAIT,WAAW;;;;;CAOX,OAAO;;;;;AAKT;AAEA,MAAa,oBAAoB,KAAc,eAAwB;;;;;EAKrE,MAAM;;IAEJ,GAAG;;EAEL,0BAA0B,UAAU,EAAE;;;;;;EAMtCA,iEAAAA,cAAc"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { KnownErrors } from "../known-errors.js";
|
|
1
|
+
import { a as KnownErrors } from "../known-errors-Bm4a61wL.js";
|
|
2
2
|
//#region src/helpers/password.d.ts
|
|
3
3
|
declare function getPasswordError(password: string): KnownErrors["PasswordRequirementsNotMet"] | undefined;
|
|
4
4
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password.d.ts","names":[],"sources":["../../src/helpers/password.ts"],"mappings":";;iBAKgB,gBAAA,CAAiB,QAAA,WAAmB,
|
|
1
|
+
{"version":3,"file":"password.d.ts","names":[],"sources":["../../src/helpers/password.ts"],"mappings":";;iBAKgB,gBAAA,CAAiB,QAAA,WAAmB,WAAW"}
|
package/dist/helpers/password.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value:
|
|
2
|
-
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
2
|
let ___index_js = require("../index.js");
|
|
4
|
-
|
|
5
3
|
//#region src/helpers/password.ts
|
|
6
4
|
const minLength = 8;
|
|
7
5
|
const maxLength = 70;
|
|
@@ -9,7 +7,7 @@ function getPasswordError(password) {
|
|
|
9
7
|
if (password.length < minLength) return new ___index_js.KnownErrors.PasswordTooShort(minLength);
|
|
10
8
|
if (password.length > maxLength) return new ___index_js.KnownErrors.PasswordTooLong(maxLength);
|
|
11
9
|
}
|
|
12
|
-
|
|
13
10
|
//#endregion
|
|
14
11
|
exports.getPasswordError = getPasswordError;
|
|
12
|
+
|
|
15
13
|
//# sourceMappingURL=password.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password.js","names":["KnownErrors"],"sources":["../../src/helpers/password.ts"],"sourcesContent":["import { KnownErrors } from \"..\";\n\nconst minLength = 8;\nconst maxLength = 70;\n\nexport function getPasswordError(password: string): KnownErrors[\"PasswordRequirementsNotMet\"] | undefined {\n if (password.length < minLength) {\n return new KnownErrors.PasswordTooShort(minLength);\n }\n\n if (password.length > maxLength) {\n return new KnownErrors.PasswordTooLong(maxLength);\n }\n\n return undefined;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"password.js","names":["KnownErrors"],"sources":["../../src/helpers/password.ts"],"sourcesContent":["import { KnownErrors } from \"..\";\n\nconst minLength = 8;\nconst maxLength = 70;\n\nexport function getPasswordError(password: string): KnownErrors[\"PasswordRequirementsNotMet\"] | undefined {\n if (password.length < minLength) {\n return new KnownErrors.PasswordTooShort(minLength);\n }\n\n if (password.length > maxLength) {\n return new KnownErrors.PasswordTooLong(maxLength);\n }\n\n return undefined;\n}\n"],"mappings":";;;AAEA,MAAM,YAAY;AAClB,MAAM,YAAY;AAElB,SAAgB,iBAAiB,UAAyE;CACxG,IAAI,SAAS,SAAS,WACpB,OAAO,IAAIA,YAAAA,YAAY,iBAAiB,SAAS;CAGnD,IAAI,SAAS,SAAS,WACpB,OAAO,IAAIA,YAAAA,YAAY,gBAAgB,SAAS;AAIpD"}
|
|
@@ -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,8 +1,6 @@
|
|
|
1
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value:
|
|
2
|
-
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
2
|
let ___utils_errors_js = require("../utils/errors.js");
|
|
4
3
|
let ___utils_urls_js = require("../utils/urls.js");
|
|
5
|
-
|
|
6
4
|
//#region src/helpers/production-mode.ts
|
|
7
5
|
function getProductionModeErrors(project) {
|
|
8
6
|
const errors = [];
|
|
@@ -42,7 +40,7 @@ function getProductionModeErrors(project) {
|
|
|
42
40
|
}
|
|
43
41
|
return errors;
|
|
44
42
|
}
|
|
45
|
-
|
|
46
43
|
//#endregion
|
|
47
44
|
exports.getProductionModeErrors = getProductionModeErrors;
|
|
45
|
+
|
|
48
46
|
//# sourceMappingURL=production-mode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"production-mode.js","names":["HexclaveAssertionError"],"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":["HexclaveAssertionError"],"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,CAAA,GAAA,mBAAA,aAAA,CAAa,oCAAoC,IAAIA,mBAAAA,uBAAuB,2GAA2G;IACrL;IACA,WAAW;GACb,CAAC,CAAC;GACF,OAAO,KAAK;IACV,SAAS,wCAAwC;IACjD,gBAAgB;GAClB,CAAC;GACD;EACF;EAEA,KAAA,GAAA,iBAAA,YAAA,CAAgB,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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value:
|
|
2
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
2
|
//#region src/helpers/support-sla.ts
|
|
4
3
|
const DEFAULT_SUPPORT_SLA = {
|
|
5
4
|
enabled: false,
|
|
@@ -61,7 +60,6 @@ function computeSlaUrgency(dueAt, now, options) {
|
|
|
61
60
|
if (remainingMs <= warningThresholdMs) return "warning";
|
|
62
61
|
return "ok";
|
|
63
62
|
}
|
|
64
|
-
|
|
65
63
|
//#endregion
|
|
66
64
|
exports.DEFAULT_SUPPORT_SLA = DEFAULT_SUPPORT_SLA;
|
|
67
65
|
exports.SLA_URGENT_THRESHOLD_MS = SLA_URGENT_THRESHOLD_MS;
|
|
@@ -69,4 +67,5 @@ exports.SLA_WARNING_THRESHOLD_MS = SLA_WARNING_THRESHOLD_MS;
|
|
|
69
67
|
exports.computeFirstResponseDueAt = computeFirstResponseDueAt;
|
|
70
68
|
exports.computeNextResponseDueAt = computeNextResponseDueAt;
|
|
71
69
|
exports.computeSlaUrgency = computeSlaUrgency;
|
|
70
|
+
|
|
72
71
|
//# 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":"
|
|
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,7 +1,5 @@
|
|
|
1
|
-
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
2
1
|
let vitest = require("vitest");
|
|
3
2
|
let __support_sla_js = require("./support-sla.js");
|
|
4
|
-
|
|
5
3
|
//#region src/helpers/support-sla.test.ts
|
|
6
4
|
const enabledSla = {
|
|
7
5
|
enabled: true,
|
|
@@ -97,6 +95,6 @@ const enabledSla = {
|
|
|
97
95
|
});
|
|
98
96
|
});
|
|
99
97
|
});
|
|
100
|
-
|
|
101
98
|
//#endregion
|
|
99
|
+
|
|
102
100
|
//# sourceMappingURL=support-sla.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support-sla.test.js","names":["SLA_URGENT_THRESHOLD_MS","SLA_WARNING_THRESHOLD_MS"],"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":"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"}
|
|
1
|
+
{"version":3,"file":"support-sla.test.js","names":["SLA_URGENT_THRESHOLD_MS","SLA_WARNING_THRESHOLD_MS"],"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":"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"}
|
|
@@ -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,8 +1,6 @@
|
|
|
1
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value:
|
|
2
|
-
const require_chunk = require('../../chunk-BE-pF4vm.js');
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
2
|
let ______utils_bytes_js = require("../../utils/bytes.js");
|
|
4
3
|
let ______utils_crypto_js = require("../../utils/crypto.js");
|
|
5
|
-
|
|
6
4
|
//#region src/helpers/vault/client-side.ts
|
|
7
5
|
const hashPurpose = "stack-data-vault-client-side-encryption-key-hash";
|
|
8
6
|
const encryptionSecretPurpose = "stack-data-vault-client-side-encryption-value-encryption-key-hash";
|
|
@@ -47,27 +45,9 @@ async function decryptValue(secret, key, encryptedValue) {
|
|
|
47
45
|
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 });
|
|
48
46
|
return new TextDecoder().decode(bytesResult.data);
|
|
49
47
|
}
|
|
50
|
-
(void 0)?.describe("encryptValue & decryptValue", () => {
|
|
51
|
-
(void 0)?.it("should encrypt and decrypt a value", async ({ expect }) => {
|
|
52
|
-
const secret = "test-secret";
|
|
53
|
-
const value = "test-value";
|
|
54
|
-
expect(await decryptValue(secret, "key", await encryptValue(secret, "key", value))).toEqual(value);
|
|
55
|
-
});
|
|
56
|
-
(void 0)?.it("should not decrypt a value with a different secret", async ({ expect }) => {
|
|
57
|
-
await expect(decryptValue("different-secret", "key", await encryptValue("test-secret", "key", "test-value"))).rejects.toThrow();
|
|
58
|
-
});
|
|
59
|
-
(void 0)?.it("should not decrypt a value with a different key", async ({ expect }) => {
|
|
60
|
-
const secret = "test-secret";
|
|
61
|
-
await expect(decryptValue(secret, "different-key", await encryptValue(secret, "key", "test-value"))).rejects.toThrow();
|
|
62
|
-
});
|
|
63
|
-
(void 0)?.it("should not decrypt a value if the cipher was tampered with", async ({ expect }) => {
|
|
64
|
-
const secret = "test-secret";
|
|
65
|
-
await expect(decryptValue(secret, "key", await encryptValue(secret, "key", "test-value") + "7")).rejects.toThrow();
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
|
|
69
48
|
//#endregion
|
|
70
49
|
exports.decryptValue = decryptValue;
|
|
71
50
|
exports.encryptValue = encryptValue;
|
|
72
51
|
exports.hashKey = hashKey;
|
|
52
|
+
|
|
73
53
|
//# 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,OAAA,GAAA,sBAAA,aAAA,CAAmB;EACxB,SAAS;EACT,OAAO;EACP,OAAO;EACP,YAAY;CACd,CAAC;AACH;;;;AAKA,eAAsB,QAAQ,QAAgB,KAAa;CACzD,QAAA,GAAA,qBAAA,aAAA,CAAoB,OAAA,GAAA,sBAAA,KAAA,CAAW;EAC7B,SAAS;EACT,OAAO;EACP,OAAO,MAAM,cAAc,QAAQ,GAAG;CACxC,CAAC,CAAC;AACJ;;;;AAKA,eAAsB,aAAa,QAAgB,KAAa,OAAe;CAQ7E,QAAA,GAAA,qBAAA,aAAA,CAAoB,OAAA,GAAA,sBAAA,QAAA,CALQ;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,OAAA,GAAA,sBAAA,QAAA,CAAc;EAChC,SAAS;EACT,QAAQ,MAJ8B,cAAc,QAAQ,GAAG;EAK/D,SAAA,GAAA,qBAAA,aAAA,CAAqB,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"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value:
|
|
2
|
-
const require_chunk = require('../../chunk-BE-pF4vm.js');
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
2
|
let ______utils_bytes_js = require("../../utils/bytes.js");
|
|
4
3
|
let ______utils_crypto_js = require("../../utils/crypto.js");
|
|
5
4
|
let _aws_sdk_client_kms = require("@aws-sdk/client-kms");
|
|
6
5
|
let ______utils_env_js = require("../../utils/env.js");
|
|
7
6
|
let ______utils_results_js = require("../../utils/results.js");
|
|
8
|
-
|
|
9
7
|
//#region src/helpers/vault/server-side.ts
|
|
10
8
|
async function getAwsCredentials() {
|
|
11
9
|
const vercelRoleArn = (0, ______utils_env_js.getEnvVariable)("STACK_AWS_VERCEL_OIDC_ROLE_ARN", "");
|
|
@@ -119,8 +117,8 @@ async function decryptWithKms(encrypted) {
|
|
|
119
117
|
dekBytes.fill(0);
|
|
120
118
|
}
|
|
121
119
|
}
|
|
122
|
-
|
|
123
120
|
//#endregion
|
|
124
121
|
exports.decryptWithKms = decryptWithKms;
|
|
125
122
|
exports.encryptWithKms = encryptWithKms;
|
|
123
|
+
|
|
126
124
|
//# sourceMappingURL=server-side.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-side.js","names":["KMSClient","DescribeKeyCommand","CreateKeyCommand","CreateAliasCommand","GenerateDataKeyCommand","DecryptCommand","Result"],"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":["KMSClient","DescribeKeyCommand","CreateKeyCommand","CreateAliasCommand","GenerateDataKeyCommand","DecryptCommand","Result"],"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":"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"}
|
|
@@ -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,9 +1,8 @@
|
|
|
1
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value:
|
|
2
|
-
const
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_rolldown_runtime = require("../rolldown-runtime-D6vf50IK.js");
|
|
3
3
|
let react = require("react");
|
|
4
|
-
react =
|
|
4
|
+
react = require_rolldown_runtime.__toESM(react);
|
|
5
5
|
let ___utils_errors_js = require("../utils/errors.js");
|
|
6
|
-
|
|
7
6
|
//#region src/hooks/use-async-callback.tsx
|
|
8
7
|
function useAsyncCallback(callback, deps) {
|
|
9
8
|
const [error, setError] = react.default.useState(void 0);
|
|
@@ -35,8 +34,8 @@ function useAsyncCallbackWithLoggedError(callback, deps) {
|
|
|
35
34
|
}, deps);
|
|
36
35
|
return [newCallback, loading];
|
|
37
36
|
}
|
|
38
|
-
|
|
39
37
|
//#endregion
|
|
40
38
|
exports.useAsyncCallback = useAsyncCallback;
|
|
41
39
|
exports.useAsyncCallbackWithLoggedError = useAsyncCallbackWithLoggedError;
|
|
40
|
+
|
|
42
41
|
//# sourceMappingURL=use-async-callback.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-async-callback.js","names":["React"],"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":["React"],"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,YAAYA,MAAAA,QAAM,SAA8B,KAAA,CAAS;CACvE,MAAM,CAAC,cAAc,mBAAmBA,MAAAA,QAAM,SAAS,CAAC;CAiBxD,OAAO;EAfIA,MAAAA,QAAM,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,CAAA,GAAA,mBAAA,aAAA,CAAa,kBAAkB,CAAC;GAChC,MAAM;EACR;CACF,GAAG,IAAI;CAEP,OAAO,CAAC,aAAa,OAAO;AAC9B"}
|