@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":"strings.js","names":[],"sources":["../../src/utils/strings.tsx"],"sourcesContent":["import { findLastIndex, unique } from \"./arrays\";\nimport { HexclaveAssertionError } from \"./errors\";\nimport { filterUndefined } from \"./objects\";\n\nexport type Join<T extends string[], Separator extends string> =\n T extends [] ? \"\"\n : T extends [infer U extends string, ...infer Rest extends string[]]\n ? `${U}${Rest extends [any, ...any[]] ? `${Separator}${Join<Rest, Separator>}` : \"\"}`\n : \"<error-joining-strings>\";\n\nexport function typedJoin<T extends string[], Separator extends string>(strings: T, separator: Separator): Join<T, Separator> {\n return strings.join(separator) as Join<T, Separator>;\n}\n\nexport function typedToLowercase<S extends string>(s: S): Lowercase<S> {\n if (typeof s !== \"string\") throw new HexclaveAssertionError(\"Expected a string for typedToLowercase\", { s });\n return s.toLowerCase() as Lowercase<S>;\n}\nimport.meta.vitest?.test(\"typedToLowercase\", ({ expect }) => {\n expect(typedToLowercase(\"\")).toBe(\"\");\n expect(typedToLowercase(\"HELLO\")).toBe(\"hello\");\n expect(typedToLowercase(\"Hello World\")).toBe(\"hello world\");\n expect(typedToLowercase(\"hello\")).toBe(\"hello\");\n expect(typedToLowercase(\"123\")).toBe(\"123\");\n expect(typedToLowercase(\"MIXED123case\")).toBe(\"mixed123case\");\n expect(typedToLowercase(\"Special@Chars!\")).toBe(\"special@chars!\");\n expect(() => typedToLowercase(123 as any)).toThrow(\"Expected a string for typedToLowercase\");\n});\n\nexport function typedToUppercase<S extends string>(s: S): Uppercase<S> {\n if (typeof s !== \"string\") throw new HexclaveAssertionError(\"Expected a string for typedToUppercase\", { s });\n return s.toUpperCase() as Uppercase<S>;\n}\nimport.meta.vitest?.test(\"typedToUppercase\", ({ expect }) => {\n expect(typedToUppercase(\"\")).toBe(\"\");\n expect(typedToUppercase(\"hello\")).toBe(\"HELLO\");\n expect(typedToUppercase(\"Hello World\")).toBe(\"HELLO WORLD\");\n expect(typedToUppercase(\"HELLO\")).toBe(\"HELLO\");\n expect(typedToUppercase(\"123\")).toBe(\"123\");\n expect(typedToUppercase(\"mixed123Case\")).toBe(\"MIXED123CASE\");\n expect(typedToUppercase(\"special@chars!\")).toBe(\"SPECIAL@CHARS!\");\n expect(() => typedToUppercase(123 as any)).toThrow(\"Expected a string for typedToUppercase\");\n});\n\nexport function typedCapitalize<S extends string>(s: S): Capitalize<S> {\n return s.charAt(0).toUpperCase() + s.slice(1) as Capitalize<S>;\n}\nimport.meta.vitest?.test(\"typedCapitalize\", ({ expect }) => {\n expect(typedCapitalize(\"\")).toBe(\"\");\n expect(typedCapitalize(\"hello\")).toBe(\"Hello\");\n expect(typedCapitalize(\"hello world\")).toBe(\"Hello world\");\n expect(typedCapitalize(\"HELLO\")).toBe(\"HELLO\");\n expect(typedCapitalize(\"123test\")).toBe(\"123test\");\n expect(typedCapitalize(\"already Capitalized\")).toBe(\"Already Capitalized\");\n expect(typedCapitalize(\"h\")).toBe(\"H\");\n});\n\n/**\n * Compares two strings in a way that is not dependent on the current locale.\n */\nexport function stringCompare(a: string, b: string): number {\n if (typeof a !== \"string\" || typeof b !== \"string\") throw new HexclaveAssertionError(`Expected two strings for stringCompare, found ${typeof a} and ${typeof b}`, { a, b });\n const cmp = (a: string, b: string) => a < b ? -1 : a > b ? 1 : 0;\n return cmp(a.toUpperCase(), b.toUpperCase()) || cmp(b, a);\n}\nimport.meta.vitest?.test(\"stringCompare\", ({ expect }) => {\n // Equal strings\n expect(stringCompare(\"a\", \"a\")).toBe(0);\n expect(stringCompare(\"\", \"\")).toBe(0);\n\n // Case comparison - note that this function is NOT case-insensitive\n // It compares uppercase versions first, then original strings\n expect(stringCompare(\"a\", \"A\")).toBe(-1); // lowercase comes after uppercase\n expect(stringCompare(\"A\", \"a\")).toBe(1); // uppercase comes before lowercase\n expect(stringCompare(\"abc\", \"ABC\")).toBe(-1);\n expect(stringCompare(\"ABC\", \"abc\")).toBe(1);\n\n // Different strings\n expect(stringCompare(\"a\", \"b\")).toBe(-1);\n expect(stringCompare(\"b\", \"a\")).toBe(1);\n\n // Strings with different lengths\n expect(stringCompare(\"abc\", \"abcd\")).toBe(-1);\n expect(stringCompare(\"abcd\", \"abc\")).toBe(1);\n\n // Strings with numbers\n expect(stringCompare(\"a1\", \"a2\")).toBe(-1);\n expect(stringCompare(\"a10\", \"a2\")).toBe(-1);\n\n // Strings with special characters\n expect(stringCompare(\"a\", \"a!\")).toBe(-1);\n expect(stringCompare(\"a!\", \"a\")).toBe(1);\n});\n\n/**\n * Returns all whitespace character at the start of the string.\n *\n * Uses the same definition for whitespace as `String.prototype.trim()`.\n */\nexport function getWhitespacePrefix(s: string): string {\n return s.substring(0, s.length - s.trimStart().length);\n}\nimport.meta.vitest?.test(\"getWhitespacePrefix\", ({ expect }) => {\n expect(getWhitespacePrefix(\"\")).toBe(\"\");\n expect(getWhitespacePrefix(\"hello\")).toBe(\"\");\n expect(getWhitespacePrefix(\" hello\")).toBe(\" \");\n expect(getWhitespacePrefix(\" hello\")).toBe(\" \");\n expect(getWhitespacePrefix(\"\\thello\")).toBe(\"\\t\");\n expect(getWhitespacePrefix(\"\\n hello\")).toBe(\"\\n \");\n expect(getWhitespacePrefix(\" \")).toBe(\" \");\n expect(getWhitespacePrefix(\" \\t\\n\\r\")).toBe(\" \\t\\n\\r\");\n});\n\n/**\n * Returns all whitespace character at the end of the string.\n *\n * Uses the same definition for whitespace as `String.prototype.trim()`.\n */\nexport function getWhitespaceSuffix(s: string): string {\n return s.substring(s.trimEnd().length);\n}\nimport.meta.vitest?.test(\"getWhitespaceSuffix\", ({ expect }) => {\n expect(getWhitespaceSuffix(\"\")).toBe(\"\");\n expect(getWhitespaceSuffix(\"hello\")).toBe(\"\");\n expect(getWhitespaceSuffix(\"hello \")).toBe(\" \");\n expect(getWhitespaceSuffix(\"hello \")).toBe(\" \");\n expect(getWhitespaceSuffix(\"hello\\t\")).toBe(\"\\t\");\n expect(getWhitespaceSuffix(\"hello \\n\")).toBe(\" \\n\");\n expect(getWhitespaceSuffix(\" \")).toBe(\" \");\n expect(getWhitespaceSuffix(\" \\t\\n\\r\")).toBe(\" \\t\\n\\r\");\n});\n\n/**\n * Returns a string with all empty or whitespace-only lines at the start removed.\n *\n * Uses the same definition for whitespace as `String.prototype.trim()`.\n */\nexport function trimEmptyLinesStart(s: string): string {\n const lines = s.split(\"\\n\");\n const firstNonEmptyLineIndex = lines.findIndex((line) => line.trim() !== \"\");\n // If all lines are empty or whitespace-only, return an empty string\n if (firstNonEmptyLineIndex === -1) return \"\";\n return lines.slice(firstNonEmptyLineIndex).join(\"\\n\");\n}\nimport.meta.vitest?.test(\"trimEmptyLinesStart\", ({ expect }) => {\n expect(trimEmptyLinesStart(\"\")).toBe(\"\");\n expect(trimEmptyLinesStart(\"hello\")).toBe(\"hello\");\n expect(trimEmptyLinesStart(\"\\nhello\")).toBe(\"hello\");\n expect(trimEmptyLinesStart(\"\\n\\nhello\")).toBe(\"hello\");\n expect(trimEmptyLinesStart(\" \\n\\t\\nhello\")).toBe(\"hello\");\n expect(trimEmptyLinesStart(\"\\n\\nhello\\nworld\")).toBe(\"hello\\nworld\");\n expect(trimEmptyLinesStart(\"hello\\n\\nworld\")).toBe(\"hello\\n\\nworld\");\n expect(trimEmptyLinesStart(\"hello\\nworld\\n\")).toBe(\"hello\\nworld\\n\");\n expect(trimEmptyLinesStart(\"\\n \\n\\nhello\\n \\nworld\")).toBe(\"hello\\n \\nworld\");\n // Edge case: all lines are empty\n expect(trimEmptyLinesStart(\"\\n\\n \\n\\t\")).toBe(\"\");\n});\n\n/**\n * Returns a string with all empty or whitespace-only lines at the end removed.\n *\n * Uses the same definition for whitespace as `String.prototype.trim()`.\n */\nexport function trimEmptyLinesEnd(s: string): string {\n const lines = s.split(\"\\n\");\n const lastNonEmptyLineIndex = findLastIndex(lines, (line) => line.trim() !== \"\");\n return lines.slice(0, lastNonEmptyLineIndex + 1).join(\"\\n\");\n}\nimport.meta.vitest?.test(\"trimEmptyLinesEnd\", ({ expect }) => {\n expect(trimEmptyLinesEnd(\"\")).toBe(\"\");\n expect(trimEmptyLinesEnd(\"hello\")).toBe(\"hello\");\n expect(trimEmptyLinesEnd(\"hello\\n\")).toBe(\"hello\");\n expect(trimEmptyLinesEnd(\"hello\\n\\n\")).toBe(\"hello\");\n expect(trimEmptyLinesEnd(\"hello\\n \\n\\t\")).toBe(\"hello\");\n expect(trimEmptyLinesEnd(\"hello\\nworld\\n\\n\")).toBe(\"hello\\nworld\");\n expect(trimEmptyLinesEnd(\"hello\\n\\nworld\")).toBe(\"hello\\n\\nworld\");\n expect(trimEmptyLinesEnd(\"\\nhello\\nworld\")).toBe(\"\\nhello\\nworld\");\n expect(trimEmptyLinesEnd(\"hello\\n \\nworld\\n\\n \")).toBe(\"hello\\n \\nworld\");\n // Edge case: all lines are empty\n expect(trimEmptyLinesEnd(\"\\n\\n \\n\\t\")).toBe(\"\");\n});\n\n/**\n * Returns a string with all empty or whitespace-only lines trimmed at the start and end.\n *\n * Uses the same definition for whitespace as `String.prototype.trim()`.\n */\nexport function trimLines(s: string): string {\n return trimEmptyLinesEnd(trimEmptyLinesStart(s));\n}\nimport.meta.vitest?.test(\"trimLines\", ({ expect }) => {\n expect(trimLines(\"\")).toBe(\"\");\n expect(trimLines(\" \")).toBe(\"\");\n expect(trimLines(\" \\n \")).toBe(\"\");\n expect(trimLines(\" abc \")).toBe(\" abc \");\n expect(trimLines(\"\\n \\nLine1\\nLine2\\n \\n\")).toBe(\"Line1\\nLine2\");\n expect(trimLines(\"Line1\\n \\nLine2\")).toBe(\"Line1\\n \\nLine2\");\n expect(trimLines(\" \\n \\n\\t\")).toBe(\"\");\n expect(trimLines(\" Hello World\")).toBe(\" Hello World\");\n expect(trimLines(\"\\n\")).toBe(\"\");\n expect(trimLines(\"\\t \\n\\t\\tLine1 \\n \\nLine2\\t\\t\\n\\t \")).toBe(\"\\t\\tLine1 \\n \\nLine2\\t\\t\");\n});\n\n\n/**\n * A template literal tag that returns the same string as the template literal without a tag.\n *\n * Useful for implementing your own template literal tags.\n */\nexport function templateIdentity(strings: TemplateStringsArray | readonly string[], ...values: string[]): string {\n if (values.length !== strings.length - 1) throw new HexclaveAssertionError(\"Invalid number of values; must be one less than strings\", { strings, values });\n\n return strings.reduce((result, str, i) => result + str + (values[i] ?? ''), '');\n}\nimport.meta.vitest?.test(\"templateIdentity\", ({ expect }) => {\n expect(templateIdentity`Hello World`).toBe(\"Hello World\");\n expect(templateIdentity`${\"Hello\"}`).toBe(\"Hello\");\n const greeting = \"Hello\";\n const subject = \"World\";\n expect(templateIdentity`${greeting}, ${subject}!`).toBe(\"Hello, World!\");\n expect(templateIdentity`${\"A\"}${\"B\"}${\"C\"}`).toBe(\"ABC\");\n expect(templateIdentity`Start${\"\"}Middle${\"\"}End`).toBe(\"StartMiddleEnd\");\n expect(templateIdentity``).toBe(\"\");\n expect(templateIdentity`Line1\nLine2`).toBe(\"Line1\\nLine2\");\n expect(templateIdentity([\"a \", \" scientific \", \"gun\"], \"certain\", \"rail\")).toBe(\"a certain scientific railgun\");\n expect(templateIdentity([\"only one part\"])).toBe(\"only one part\");\n expect(() => templateIdentity([\"a \", \"b\", \"c\"], \"only one\")).toThrow(\"Invalid number of values\");\n expect(() => templateIdentity([\"a\", \"b\"], \"x\", \"y\")).toThrow(\"Invalid number of values\");\n});\n\n\nexport function deindent(code: string): string;\nexport function deindent(strings: TemplateStringsArray | readonly string[], ...values: any[]): string;\nexport function deindent(strings: string | readonly string[], ...values: any[]): string {\n if (typeof strings === \"string\") return deindent([strings]);\n return templateIdentity(...deindentTemplate(strings, ...values));\n}\n\nexport function deindentTemplate(strings: TemplateStringsArray | readonly string[], ...values: any[]): [string[], ...string[]] {\n if (values.length !== strings.length - 1) throw new HexclaveAssertionError(\"Invalid number of values; must be one less than strings\", { strings, values });\n\n const trimmedStrings = [...strings];\n trimmedStrings[0] = trimEmptyLinesStart(trimmedStrings[0] + \"+\").slice(0, -1);\n trimmedStrings[trimmedStrings.length - 1] = trimEmptyLinesEnd(\"+\" + trimmedStrings[trimmedStrings.length - 1]).slice(1);\n\n const indentation = trimmedStrings\n .join(\"${SOME_VALUE}\")\n .split(\"\\n\")\n .filter((line) => line.trim() !== \"\")\n .map((line) => getWhitespacePrefix(line).length)\n .reduce((min, current) => Math.min(min, current), Infinity);\n\n const deindentedStrings = trimmedStrings\n .map((string, stringIndex) => {\n return string\n .split(\"\\n\")\n .map((line, lineIndex) => stringIndex !== 0 && lineIndex === 0 ? line : line.substring(indentation))\n .join(\"\\n\");\n });\n\n const indentedValues = values.map((value, i) => {\n const firstLineIndentation = getWhitespacePrefix(deindentedStrings[i].split(\"\\n\").at(-1)!);\n return `${value}`.replaceAll(\"\\n\", `\\n${firstLineIndentation}`);\n });\n\n return [deindentedStrings, ...indentedValues];\n}\nimport.meta.vitest?.test(\"deindent\", ({ expect }) => {\n // Test with string input\n expect(deindent(\" hello\")).toBe(\"hello\");\n expect(deindent(\" hello\\n world\")).toBe(\"hello\\nworld\");\n expect(deindent(\" hello\\n world\")).toBe(\"hello\\n world\");\n expect(deindent(\"\\n hello\\n world\\n\")).toBe(\"hello\\nworld\");\n\n // Test with empty input\n expect(deindent(\"\")).toBe(\"\");\n\n // Test with template literal\n expect(deindent`\n hello\n world\n `).toBe(\"hello\\nworld\");\n\n expect(deindent`\n hello\n world\n `).toBe(\"hello\\n world\");\n\n // Test with values\n const value = \"test\";\n expect(deindent`\n hello ${value}\n world\n `).toBe(`hello ${value}\\nworld`);\n\n // Test with multiline values\n expect(deindent`\n hello\n to ${\"line1\\n line2\"}\n world\n `).toBe(`hello\\n to line1\\n line2\\nworld`);\n\n // Leading whitespace values\n expect(deindent`\n ${\" \"}A\n ${\" \"}B\n ${\" \"}C\n `).toBe(` A\\n B\\n C`);\n\n // Trailing whitespaces (note: there are two whitespaces each after A and after C)\n expect(deindent`\n A \n B ${\" \"}\n C \n `).toBe(`A \\nB \\nC `);\n\n // Test with mixed indentation\n expect(deindent`\n hello\n world\n !\n `).toBe(\"hello\\n world\\n !\");\n\n // Test error cases\n expect(() => deindent([\"a\", \"b\", \"c\"], \"too\", \"many\", \"values\")).toThrow(\"Invalid number of values\");\n});\n\nexport function extractScopes(scope: string, removeDuplicates=true): string[] {\n // TODO what is this for? can we move this into the OAuth code in the backend?\n const trimmedString = scope.trim();\n const scopesArray = trimmedString.split(/\\s+/);\n const filtered = scopesArray.filter(scope => scope.length > 0);\n return removeDuplicates ? [...new Set(filtered)] : filtered;\n}\nimport.meta.vitest?.test(\"extractScopes\", ({ expect }) => {\n // Test with empty string\n expect(extractScopes(\"\")).toEqual([]);\n\n // Test with single scope\n expect(extractScopes(\"read\")).toEqual([\"read\"]);\n\n // Test with multiple scopes\n expect(extractScopes(\"read write\")).toEqual([\"read\", \"write\"]);\n\n // Test with extra whitespace\n expect(extractScopes(\" read write \")).toEqual([\"read\", \"write\"]);\n\n // Test with newlines and tabs\n expect(extractScopes(\"read\\nwrite\\tdelete\")).toEqual([\"read\", \"write\", \"delete\"]);\n\n // Test with duplicates (default behavior)\n expect(extractScopes(\"read write read\")).toEqual([\"read\", \"write\"]);\n\n // Test with duplicates (explicitly set to remove)\n expect(extractScopes(\"read write read\", true)).toEqual([\"read\", \"write\"]);\n\n // Test with duplicates (explicitly set to keep)\n expect(extractScopes(\"read write read\", false)).toEqual([\"read\", \"write\", \"read\"]);\n});\n\nexport function mergeScopeStrings(...scopes: string[]): string {\n // TODO what is this for? can we move this into the OAuth code in the backend?\n const allScope = scopes.map((s) => extractScopes(s)).flat().join(\" \");\n return extractScopes(allScope).join(\" \");\n}\nimport.meta.vitest?.test(\"mergeScopeStrings\", ({ expect }) => {\n // Test with empty input\n expect(mergeScopeStrings()).toBe(\"\");\n\n // Test with single scope string\n expect(mergeScopeStrings(\"read write\")).toBe(\"read write\");\n\n // Test with multiple scope strings\n expect(mergeScopeStrings(\"read\", \"write\")).toBe(\"read write\");\n\n // Test with overlapping scopes\n expect(mergeScopeStrings(\"read write\", \"write delete\")).toBe(\"read write delete\");\n\n // Test with extra whitespace\n expect(mergeScopeStrings(\" read write \", \" delete \")).toBe(\"read write delete\");\n\n // Test with duplicates across strings\n expect(mergeScopeStrings(\"read write\", \"write delete\", \"read\")).toBe(\"read write delete\");\n\n // Test with empty strings\n expect(mergeScopeStrings(\"read write\", \"\", \"delete\")).toBe(\"read write delete\");\n});\n\nexport function escapeTemplateLiteral(s: string): string {\n return s.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"`\", \"\\\\`\").replaceAll(\"${\", \"\\\\${\");\n}\nimport.meta.vitest?.test(\"escapeTemplateLiteral\", ({ expect }) => {\n // Test with empty string\n expect(escapeTemplateLiteral(\"\")).toBe(\"\");\n\n // Test with normal string (no special characters)\n expect(escapeTemplateLiteral(\"hello world\")).toBe(\"hello world\");\n\n // Test with backtick\n const input1 = \"hello `world`\";\n const output1 = escapeTemplateLiteral(input1);\n // Verify backticks are escaped\n expect(output1).toBe(\"hello \\\\`world\\\\`\");\n\n // Test with backslash\n const input2 = \"hello \\\\world\";\n const output2 = escapeTemplateLiteral(input2);\n // Verify backslashes are escaped\n expect(output2).toBe(\"hello \\\\\\\\world\");\n\n // Test with dollar sign\n const input3 = \"hello $world\";\n const output3 = escapeTemplateLiteral(input3);\n // Verify dollar signs are escaped\n expect(output3).toBe(\"hello $world\");\n\n // Test with dollar sign in interpolation\n const input4 = \"hello ${$world\";\n const output4 = escapeTemplateLiteral(input4);\n // Verify dollar signs are escaped\n expect(output4).toBe(\"hello \\\\${$world\");\n\n // Test with multiple special characters\n const input5 = \"`hello` ${world\\\\\";\n const output5 = escapeTemplateLiteral(input5);\n // Verify all special characters are escaped\n expect(output5).toBe(\"\\\\`hello\\\\` \\\\${world\\\\\\\\\");\n\n // Test with already escaped characters\n const input6 = \"\\\\`hello\\\\`\";\n const output6 = escapeTemplateLiteral(input6);\n expect(output6).toBe(\"\\\\\\\\\\\\`hello\\\\\\\\\\\\`\");\n});\n\n/**\n * Some classes have different constructor names in different environments (eg. `Headers` is sometimes called `_Headers`,\n * so we create an object of overrides to handle these cases.\n */\nconst nicifiableClassNameOverrides = new Map(Object.entries({\n Headers,\n} as Record<string, unknown>).map(([k, v]) => [v, k]));\nexport type Nicifiable = {\n getNicifiableKeys?(): PropertyKey[],\n getNicifiedObjectExtraLines?(): string[],\n};\nexport type NicifyOptions = {\n maxDepth: number,\n currentIndent: string,\n lineIndent: string,\n multiline: boolean,\n refs: Map<unknown, string>,\n path: string,\n parent: null | {\n options: NicifyOptions,\n value: unknown,\n },\n keyInParent: PropertyKey | null,\n hideFields: PropertyKey[],\n overrides: (...args: Parameters<typeof nicify>) => string | null,\n};\nexport function nicify(\n value: unknown,\n options: Partial<NicifyOptions> = {},\n): string {\n const fullOptions: NicifyOptions = {\n maxDepth: 5,\n currentIndent: \"\",\n lineIndent: \" \",\n multiline: true,\n refs: new Map(),\n path: \"value\",\n parent: null,\n overrides: () => null,\n keyInParent: null,\n hideFields: [],\n ...filterUndefined(options),\n };\n const {\n maxDepth,\n currentIndent,\n lineIndent,\n multiline,\n refs,\n path,\n overrides,\n hideFields,\n } = fullOptions;\n const nl = `\\n${currentIndent}`;\n\n const overrideResult = overrides(value, options);\n if (overrideResult !== null) return overrideResult;\n\n if ([\"function\", \"object\", \"symbol\"].includes(typeof value) && value !== null) {\n if (refs.has(value)) {\n return `Ref<${refs.get(value)}>`;\n }\n refs.set(value, path);\n }\n\n const newOptions: NicifyOptions = {\n maxDepth: maxDepth - 1,\n currentIndent,\n lineIndent,\n multiline,\n refs,\n path: path + \"->[unknown property]\",\n overrides,\n parent: { value, options: fullOptions },\n keyInParent: null,\n hideFields: [],\n };\n const nestedNicify = (newValue: unknown, newPath: string, keyInParent: PropertyKey | null, options: Partial<NicifyOptions> = {}) => {\n return nicify(newValue, {\n ...newOptions,\n path: newPath,\n currentIndent: currentIndent + lineIndent,\n keyInParent,\n ...options,\n });\n };\n\n switch (typeof value) {\n case \"boolean\": case \"number\": {\n return JSON.stringify(value);\n }\n case \"string\": {\n const isDeindentable = (v: string) => deindent(v) === v && v.includes(\"\\n\");\n const wrapInDeindent = (v: string) => deindent`\n deindent\\`\n ${currentIndent + lineIndent}${escapeTemplateLiteral(v).replaceAll(\"\\n\", nl + lineIndent)}\n ${currentIndent}\\`\n `;\n if (isDeindentable(value)) {\n return wrapInDeindent(value);\n } else if (value.endsWith(\"\\n\") && isDeindentable(value.slice(0, -1))) {\n return wrapInDeindent(value.slice(0, -1)) + ' + \"\\\\n\"';\n } else {\n return JSON.stringify(value);\n }\n }\n case \"undefined\": {\n return \"undefined\";\n }\n case \"symbol\": {\n return value.toString();\n }\n case \"bigint\": {\n return `${value}n`;\n }\n case \"function\": {\n if (value.name) return `function ${value.name}(...) { ... }`;\n return `(...) => { ... }`;\n }\n case \"object\": {\n if (value === null) return \"null\";\n if (Array.isArray(value)) {\n const extraLines = getNicifiedObjectExtraLines(value);\n const resValueLength = value.length + extraLines.length;\n if (resValueLength === 0) return \"[]\"; // early return in case maxDepth <= 0\n if (maxDepth <= 0) return `[...]`;\n const resValues = value.map((v, i) => nestedNicify(v, `${path}[${i}]`, i));\n resValues.push(...extraLines);\n if (resValues.length !== resValueLength) throw new HexclaveAssertionError(\"nicify of object: resValues.length !== resValueLength\", { value, resValues, resValueLength });\n const shouldIndent = resValues.length > 4 || resValues.some(x => (resValues.length > 1 && x.length > 4) || x.includes(\"\\n\"));\n if (shouldIndent) {\n return `[${nl}${resValues.map(x => `${lineIndent}${x},${nl}`).join(\"\")}]`;\n } else {\n return `[${resValues.join(\", \")}]`;\n }\n }\n if (value instanceof Date) {\n return `Date(${nestedNicify(value.toISOString(), `${path}.toISOString()`, null)})`;\n }\n if (value instanceof URL) {\n return `URL(${nestedNicify(value.toString(), `${path}.toString()`, null)})`;\n }\n if (ArrayBuffer.isView(value)) {\n return `${value.constructor.name}([${value.toString()}])`;\n }\n if (value instanceof ArrayBuffer) {\n return `ArrayBuffer [${new Uint8Array(value).toString()}]`;\n }\n if (value instanceof Error) {\n let stack = value.stack ?? \"\";\n const toString = value.toString();\n if (!stack.startsWith(toString)) stack = `${toString}\\n${stack}`; // some browsers don't include the error message in the stack, some do\n stack = stack.trimEnd();\n stack = stack.replace(/\\n\\s+/g, `\\n${lineIndent}${lineIndent}`);\n stack = stack.replace(\"\\n\", `\\n${lineIndent}Stack:\\n`);\n if (Object.keys(value).length > 0) {\n stack += `\\n${lineIndent}Extra properties: ${nestedNicify(Object.fromEntries(Object.entries(value)), path, null)}`;\n }\n if (value.cause) {\n stack += `\\n${lineIndent}Cause:\\n${lineIndent}${lineIndent}${nestedNicify(value.cause, path, null, { currentIndent: currentIndent + lineIndent + lineIndent })}`;\n }\n stack = stack.replaceAll(\"\\n\", `\\n${currentIndent}`);\n return stack;\n }\n\n const constructorName = [null, Object.prototype].includes(Object.getPrototypeOf(value)) ? null : (nicifiableClassNameOverrides.get(value.constructor) ?? value.constructor.name);\n const constructorString = constructorName ? `${constructorName} ` : \"\";\n\n const entries = getNicifiableEntries(value).filter(([k]) => !hideFields.includes(k));\n const extraLines = [\n ...getNicifiedObjectExtraLines(value),\n ...hideFields.length > 0 ? [`<some fields may have been hidden>`] : [],\n ];\n const resValueLength = entries.length + extraLines.length;\n if (resValueLength === 0) return `${constructorString}{}`;\n if (maxDepth <= 0) return `${constructorString}{ ... }`;\n const resValues = entries.map(([k, v], keyIndex) => {\n const keyNicified = nestedNicify(k, `Object.keys(${path})[${keyIndex}]`, null);\n const keyInObjectLiteral = typeof k === \"string\" ? nicifyPropertyString(k) : `[${keyNicified}]`;\n if (typeof v === \"function\" && v.name === k) {\n return `${keyInObjectLiteral}(...): { ... }`;\n } else {\n return `${keyInObjectLiteral}: ${nestedNicify(v, `${path}[${keyNicified}]`, k)}`;\n }\n });\n resValues.push(...extraLines);\n if (resValues.length !== resValueLength) throw new HexclaveAssertionError(\"nicify of object: resValues.length !== resValueLength\", { value, resValues, resValueLength });\n const shouldIndent = resValues.length > 1 || resValues.some(x => x.includes(\"\\n\"));\n\n if (resValues.length === 0) return `${constructorString}{}`;\n if (shouldIndent) {\n return `${constructorString}{${nl}${resValues.map(x => `${lineIndent}${x},${nl}`).join(\"\")}}`;\n } else {\n return `${constructorString}{ ${resValues.join(\", \")} }`;\n }\n }\n default: {\n return `${typeof value}<${value}>`;\n }\n }\n}\n\nexport function replaceAll(input: string, searchValue: string, replaceValue: string): string {\n if (searchValue === \"\") throw new HexclaveAssertionError(\"replaceAll: searchValue is empty\");\n return input.split(searchValue).join(replaceValue);\n}\nimport.meta.vitest?.test(\"replaceAll\", ({ expect }) => {\n expect(replaceAll(\"hello world\", \"o\", \"x\")).toBe(\"hellx wxrld\");\n expect(replaceAll(\"aaa\", \"a\", \"b\")).toBe(\"bbb\");\n expect(replaceAll(\"\", \"a\", \"b\")).toBe(\"\");\n expect(replaceAll(\"abc\", \"b\", \"\")).toBe(\"ac\");\n expect(replaceAll(\"test.test.test\", \".\", \"_\")).toBe(\"test_test_test\");\n expect(replaceAll(\"a.b*c\", \".\", \"x\")).toBe(\"axb*c\");\n expect(replaceAll(\"a*b*c\", \"*\", \"x\")).toBe(\"axbxc\");\n expect(replaceAll(\"hello hello\", \"hello\", \"hi\")).toBe(\"hi hi\");\n});\n\nfunction nicifyPropertyString(str: string) {\n return JSON.stringify(str);\n}\nimport.meta.vitest?.test(\"nicifyPropertyString\", ({ expect }) => {\n // Test valid identifiers\n expect(nicifyPropertyString(\"validName\")).toBe('\"validName\"');\n expect(nicifyPropertyString(\"_validName\")).toBe('\"_validName\"');\n expect(nicifyPropertyString(\"valid123Name\")).toBe('\"valid123Name\"');\n\n // Test invalid identifiers\n expect(nicifyPropertyString(\"123invalid\")).toBe('\"123invalid\"');\n expect(nicifyPropertyString(\"invalid-name\")).toBe('\"invalid-name\"');\n expect(nicifyPropertyString(\"invalid space\")).toBe('\"invalid space\"');\n expect(nicifyPropertyString(\"$invalid\")).toBe('\"$invalid\"');\n expect(nicifyPropertyString(\"\")).toBe('\"\"');\n\n // Test with special characters\n expect(nicifyPropertyString(\"property!\")).toBe('\"property!\"');\n expect(nicifyPropertyString(\"property.name\")).toBe('\"property.name\"');\n\n // Test with escaped characters\n expect(nicifyPropertyString(\"\\\\\")).toBe('\"\\\\\\\\\"');\n expect(nicifyPropertyString('\"')).toBe('\"\\\\\"\"');\n});\n\nfunction getNicifiableKeys(value: Nicifiable | object) {\n const overridden = (\"getNicifiableKeys\" in value ? value.getNicifiableKeys?.bind(value) : null)?.();\n if (overridden != null) return overridden;\n if (value instanceof Response) {\n return ['status', 'headers'];\n }\n const keys = Object.keys(value).sort();\n return unique(keys);\n}\nimport.meta.vitest?.test(\"getNicifiableKeys\", ({ expect }) => {\n // Test regular object\n expect(getNicifiableKeys({ b: 1, a: 2, c: 3 })).toEqual([\"a\", \"b\", \"c\"]);\n\n // Test empty object\n expect(getNicifiableKeys({})).toEqual([]);\n\n\n expect(getNicifiableKeys(new Response())).toEqual([\"status\", \"headers\"]);\n\n // Test object with custom getNicifiableKeys\n const customObject = {\n a: 1,\n b: 2,\n getNicifiableKeys() {\n return [\"customKey1\", \"customKey2\"];\n }\n };\n expect(getNicifiableKeys(customObject)).toEqual([\"customKey1\", \"customKey2\"]);\n});\n\nfunction getNicifiableEntries(value: Nicifiable | object): [PropertyKey, unknown][] {\n const recordLikes = [Headers];\n function isRecordLike(value: unknown): value is InstanceType<typeof recordLikes[number]> {\n return recordLikes.some(x => value instanceof x);\n }\n\n if (isRecordLike(value)) {\n return [...value.entries()].sort(([a], [b]) => stringCompare(`${a}`, `${b}`));\n }\n const keys = getNicifiableKeys(value);\n return keys.map((k) => [k, value[k as never]] as [PropertyKey, unknown]);\n}\n\nfunction getNicifiedObjectExtraLines(value: Nicifiable | object) {\n return (\"getNicifiedObjectExtraLines\" in value ? value.getNicifiedObjectExtraLines : null)?.() ?? [];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"strings.js","names":["HexclaveAssertionError"],"sources":["../../src/utils/strings.tsx"],"sourcesContent":["import { findLastIndex, unique } from \"./arrays\";\nimport { HexclaveAssertionError } from \"./errors\";\nimport { filterUndefined } from \"./objects\";\n\nexport type Join<T extends string[], Separator extends string> =\n T extends [] ? \"\"\n : T extends [infer U extends string, ...infer Rest extends string[]]\n ? `${U}${Rest extends [any, ...any[]] ? `${Separator}${Join<Rest, Separator>}` : \"\"}`\n : \"<error-joining-strings>\";\n\nexport function typedJoin<T extends string[], Separator extends string>(strings: T, separator: Separator): Join<T, Separator> {\n return strings.join(separator) as Join<T, Separator>;\n}\n\nexport function typedToLowercase<S extends string>(s: S): Lowercase<S> {\n if (typeof s !== \"string\") throw new HexclaveAssertionError(\"Expected a string for typedToLowercase\", { s });\n return s.toLowerCase() as Lowercase<S>;\n}\nimport.meta.vitest?.test(\"typedToLowercase\", ({ expect }) => {\n expect(typedToLowercase(\"\")).toBe(\"\");\n expect(typedToLowercase(\"HELLO\")).toBe(\"hello\");\n expect(typedToLowercase(\"Hello World\")).toBe(\"hello world\");\n expect(typedToLowercase(\"hello\")).toBe(\"hello\");\n expect(typedToLowercase(\"123\")).toBe(\"123\");\n expect(typedToLowercase(\"MIXED123case\")).toBe(\"mixed123case\");\n expect(typedToLowercase(\"Special@Chars!\")).toBe(\"special@chars!\");\n expect(() => typedToLowercase(123 as any)).toThrow(\"Expected a string for typedToLowercase\");\n});\n\nexport function typedToUppercase<S extends string>(s: S): Uppercase<S> {\n if (typeof s !== \"string\") throw new HexclaveAssertionError(\"Expected a string for typedToUppercase\", { s });\n return s.toUpperCase() as Uppercase<S>;\n}\nimport.meta.vitest?.test(\"typedToUppercase\", ({ expect }) => {\n expect(typedToUppercase(\"\")).toBe(\"\");\n expect(typedToUppercase(\"hello\")).toBe(\"HELLO\");\n expect(typedToUppercase(\"Hello World\")).toBe(\"HELLO WORLD\");\n expect(typedToUppercase(\"HELLO\")).toBe(\"HELLO\");\n expect(typedToUppercase(\"123\")).toBe(\"123\");\n expect(typedToUppercase(\"mixed123Case\")).toBe(\"MIXED123CASE\");\n expect(typedToUppercase(\"special@chars!\")).toBe(\"SPECIAL@CHARS!\");\n expect(() => typedToUppercase(123 as any)).toThrow(\"Expected a string for typedToUppercase\");\n});\n\nexport function typedCapitalize<S extends string>(s: S): Capitalize<S> {\n return s.charAt(0).toUpperCase() + s.slice(1) as Capitalize<S>;\n}\nimport.meta.vitest?.test(\"typedCapitalize\", ({ expect }) => {\n expect(typedCapitalize(\"\")).toBe(\"\");\n expect(typedCapitalize(\"hello\")).toBe(\"Hello\");\n expect(typedCapitalize(\"hello world\")).toBe(\"Hello world\");\n expect(typedCapitalize(\"HELLO\")).toBe(\"HELLO\");\n expect(typedCapitalize(\"123test\")).toBe(\"123test\");\n expect(typedCapitalize(\"already Capitalized\")).toBe(\"Already Capitalized\");\n expect(typedCapitalize(\"h\")).toBe(\"H\");\n});\n\n/**\n * Compares two strings in a way that is not dependent on the current locale.\n */\nexport function stringCompare(a: string, b: string): number {\n if (typeof a !== \"string\" || typeof b !== \"string\") throw new HexclaveAssertionError(`Expected two strings for stringCompare, found ${typeof a} and ${typeof b}`, { a, b });\n const cmp = (a: string, b: string) => a < b ? -1 : a > b ? 1 : 0;\n return cmp(a.toUpperCase(), b.toUpperCase()) || cmp(b, a);\n}\nimport.meta.vitest?.test(\"stringCompare\", ({ expect }) => {\n // Equal strings\n expect(stringCompare(\"a\", \"a\")).toBe(0);\n expect(stringCompare(\"\", \"\")).toBe(0);\n\n // Case comparison - note that this function is NOT case-insensitive\n // It compares uppercase versions first, then original strings\n expect(stringCompare(\"a\", \"A\")).toBe(-1); // lowercase comes after uppercase\n expect(stringCompare(\"A\", \"a\")).toBe(1); // uppercase comes before lowercase\n expect(stringCompare(\"abc\", \"ABC\")).toBe(-1);\n expect(stringCompare(\"ABC\", \"abc\")).toBe(1);\n\n // Different strings\n expect(stringCompare(\"a\", \"b\")).toBe(-1);\n expect(stringCompare(\"b\", \"a\")).toBe(1);\n\n // Strings with different lengths\n expect(stringCompare(\"abc\", \"abcd\")).toBe(-1);\n expect(stringCompare(\"abcd\", \"abc\")).toBe(1);\n\n // Strings with numbers\n expect(stringCompare(\"a1\", \"a2\")).toBe(-1);\n expect(stringCompare(\"a10\", \"a2\")).toBe(-1);\n\n // Strings with special characters\n expect(stringCompare(\"a\", \"a!\")).toBe(-1);\n expect(stringCompare(\"a!\", \"a\")).toBe(1);\n});\n\n/**\n * Returns all whitespace character at the start of the string.\n *\n * Uses the same definition for whitespace as `String.prototype.trim()`.\n */\nexport function getWhitespacePrefix(s: string): string {\n return s.substring(0, s.length - s.trimStart().length);\n}\nimport.meta.vitest?.test(\"getWhitespacePrefix\", ({ expect }) => {\n expect(getWhitespacePrefix(\"\")).toBe(\"\");\n expect(getWhitespacePrefix(\"hello\")).toBe(\"\");\n expect(getWhitespacePrefix(\" hello\")).toBe(\" \");\n expect(getWhitespacePrefix(\" hello\")).toBe(\" \");\n expect(getWhitespacePrefix(\"\\thello\")).toBe(\"\\t\");\n expect(getWhitespacePrefix(\"\\n hello\")).toBe(\"\\n \");\n expect(getWhitespacePrefix(\" \")).toBe(\" \");\n expect(getWhitespacePrefix(\" \\t\\n\\r\")).toBe(\" \\t\\n\\r\");\n});\n\n/**\n * Returns all whitespace character at the end of the string.\n *\n * Uses the same definition for whitespace as `String.prototype.trim()`.\n */\nexport function getWhitespaceSuffix(s: string): string {\n return s.substring(s.trimEnd().length);\n}\nimport.meta.vitest?.test(\"getWhitespaceSuffix\", ({ expect }) => {\n expect(getWhitespaceSuffix(\"\")).toBe(\"\");\n expect(getWhitespaceSuffix(\"hello\")).toBe(\"\");\n expect(getWhitespaceSuffix(\"hello \")).toBe(\" \");\n expect(getWhitespaceSuffix(\"hello \")).toBe(\" \");\n expect(getWhitespaceSuffix(\"hello\\t\")).toBe(\"\\t\");\n expect(getWhitespaceSuffix(\"hello \\n\")).toBe(\" \\n\");\n expect(getWhitespaceSuffix(\" \")).toBe(\" \");\n expect(getWhitespaceSuffix(\" \\t\\n\\r\")).toBe(\" \\t\\n\\r\");\n});\n\n/**\n * Returns a string with all empty or whitespace-only lines at the start removed.\n *\n * Uses the same definition for whitespace as `String.prototype.trim()`.\n */\nexport function trimEmptyLinesStart(s: string): string {\n const lines = s.split(\"\\n\");\n const firstNonEmptyLineIndex = lines.findIndex((line) => line.trim() !== \"\");\n // If all lines are empty or whitespace-only, return an empty string\n if (firstNonEmptyLineIndex === -1) return \"\";\n return lines.slice(firstNonEmptyLineIndex).join(\"\\n\");\n}\nimport.meta.vitest?.test(\"trimEmptyLinesStart\", ({ expect }) => {\n expect(trimEmptyLinesStart(\"\")).toBe(\"\");\n expect(trimEmptyLinesStart(\"hello\")).toBe(\"hello\");\n expect(trimEmptyLinesStart(\"\\nhello\")).toBe(\"hello\");\n expect(trimEmptyLinesStart(\"\\n\\nhello\")).toBe(\"hello\");\n expect(trimEmptyLinesStart(\" \\n\\t\\nhello\")).toBe(\"hello\");\n expect(trimEmptyLinesStart(\"\\n\\nhello\\nworld\")).toBe(\"hello\\nworld\");\n expect(trimEmptyLinesStart(\"hello\\n\\nworld\")).toBe(\"hello\\n\\nworld\");\n expect(trimEmptyLinesStart(\"hello\\nworld\\n\")).toBe(\"hello\\nworld\\n\");\n expect(trimEmptyLinesStart(\"\\n \\n\\nhello\\n \\nworld\")).toBe(\"hello\\n \\nworld\");\n // Edge case: all lines are empty\n expect(trimEmptyLinesStart(\"\\n\\n \\n\\t\")).toBe(\"\");\n});\n\n/**\n * Returns a string with all empty or whitespace-only lines at the end removed.\n *\n * Uses the same definition for whitespace as `String.prototype.trim()`.\n */\nexport function trimEmptyLinesEnd(s: string): string {\n const lines = s.split(\"\\n\");\n const lastNonEmptyLineIndex = findLastIndex(lines, (line) => line.trim() !== \"\");\n return lines.slice(0, lastNonEmptyLineIndex + 1).join(\"\\n\");\n}\nimport.meta.vitest?.test(\"trimEmptyLinesEnd\", ({ expect }) => {\n expect(trimEmptyLinesEnd(\"\")).toBe(\"\");\n expect(trimEmptyLinesEnd(\"hello\")).toBe(\"hello\");\n expect(trimEmptyLinesEnd(\"hello\\n\")).toBe(\"hello\");\n expect(trimEmptyLinesEnd(\"hello\\n\\n\")).toBe(\"hello\");\n expect(trimEmptyLinesEnd(\"hello\\n \\n\\t\")).toBe(\"hello\");\n expect(trimEmptyLinesEnd(\"hello\\nworld\\n\\n\")).toBe(\"hello\\nworld\");\n expect(trimEmptyLinesEnd(\"hello\\n\\nworld\")).toBe(\"hello\\n\\nworld\");\n expect(trimEmptyLinesEnd(\"\\nhello\\nworld\")).toBe(\"\\nhello\\nworld\");\n expect(trimEmptyLinesEnd(\"hello\\n \\nworld\\n\\n \")).toBe(\"hello\\n \\nworld\");\n // Edge case: all lines are empty\n expect(trimEmptyLinesEnd(\"\\n\\n \\n\\t\")).toBe(\"\");\n});\n\n/**\n * Returns a string with all empty or whitespace-only lines trimmed at the start and end.\n *\n * Uses the same definition for whitespace as `String.prototype.trim()`.\n */\nexport function trimLines(s: string): string {\n return trimEmptyLinesEnd(trimEmptyLinesStart(s));\n}\nimport.meta.vitest?.test(\"trimLines\", ({ expect }) => {\n expect(trimLines(\"\")).toBe(\"\");\n expect(trimLines(\" \")).toBe(\"\");\n expect(trimLines(\" \\n \")).toBe(\"\");\n expect(trimLines(\" abc \")).toBe(\" abc \");\n expect(trimLines(\"\\n \\nLine1\\nLine2\\n \\n\")).toBe(\"Line1\\nLine2\");\n expect(trimLines(\"Line1\\n \\nLine2\")).toBe(\"Line1\\n \\nLine2\");\n expect(trimLines(\" \\n \\n\\t\")).toBe(\"\");\n expect(trimLines(\" Hello World\")).toBe(\" Hello World\");\n expect(trimLines(\"\\n\")).toBe(\"\");\n expect(trimLines(\"\\t \\n\\t\\tLine1 \\n \\nLine2\\t\\t\\n\\t \")).toBe(\"\\t\\tLine1 \\n \\nLine2\\t\\t\");\n});\n\n\n/**\n * A template literal tag that returns the same string as the template literal without a tag.\n *\n * Useful for implementing your own template literal tags.\n */\nexport function templateIdentity(strings: TemplateStringsArray | readonly string[], ...values: string[]): string {\n if (values.length !== strings.length - 1) throw new HexclaveAssertionError(\"Invalid number of values; must be one less than strings\", { strings, values });\n\n return strings.reduce((result, str, i) => result + str + (values[i] ?? ''), '');\n}\nimport.meta.vitest?.test(\"templateIdentity\", ({ expect }) => {\n expect(templateIdentity`Hello World`).toBe(\"Hello World\");\n expect(templateIdentity`${\"Hello\"}`).toBe(\"Hello\");\n const greeting = \"Hello\";\n const subject = \"World\";\n expect(templateIdentity`${greeting}, ${subject}!`).toBe(\"Hello, World!\");\n expect(templateIdentity`${\"A\"}${\"B\"}${\"C\"}`).toBe(\"ABC\");\n expect(templateIdentity`Start${\"\"}Middle${\"\"}End`).toBe(\"StartMiddleEnd\");\n expect(templateIdentity``).toBe(\"\");\n expect(templateIdentity`Line1\nLine2`).toBe(\"Line1\\nLine2\");\n expect(templateIdentity([\"a \", \" scientific \", \"gun\"], \"certain\", \"rail\")).toBe(\"a certain scientific railgun\");\n expect(templateIdentity([\"only one part\"])).toBe(\"only one part\");\n expect(() => templateIdentity([\"a \", \"b\", \"c\"], \"only one\")).toThrow(\"Invalid number of values\");\n expect(() => templateIdentity([\"a\", \"b\"], \"x\", \"y\")).toThrow(\"Invalid number of values\");\n});\n\n\nexport function deindent(code: string): string;\nexport function deindent(strings: TemplateStringsArray | readonly string[], ...values: any[]): string;\nexport function deindent(strings: string | readonly string[], ...values: any[]): string {\n if (typeof strings === \"string\") return deindent([strings]);\n return templateIdentity(...deindentTemplate(strings, ...values));\n}\n\nexport function deindentTemplate(strings: TemplateStringsArray | readonly string[], ...values: any[]): [string[], ...string[]] {\n if (values.length !== strings.length - 1) throw new HexclaveAssertionError(\"Invalid number of values; must be one less than strings\", { strings, values });\n\n const trimmedStrings = [...strings];\n trimmedStrings[0] = trimEmptyLinesStart(trimmedStrings[0] + \"+\").slice(0, -1);\n trimmedStrings[trimmedStrings.length - 1] = trimEmptyLinesEnd(\"+\" + trimmedStrings[trimmedStrings.length - 1]).slice(1);\n\n const indentation = trimmedStrings\n .join(\"${SOME_VALUE}\")\n .split(\"\\n\")\n .filter((line) => line.trim() !== \"\")\n .map((line) => getWhitespacePrefix(line).length)\n .reduce((min, current) => Math.min(min, current), Infinity);\n\n const deindentedStrings = trimmedStrings\n .map((string, stringIndex) => {\n return string\n .split(\"\\n\")\n .map((line, lineIndex) => stringIndex !== 0 && lineIndex === 0 ? line : line.substring(indentation))\n .join(\"\\n\");\n });\n\n const indentedValues = values.map((value, i) => {\n const firstLineIndentation = getWhitespacePrefix(deindentedStrings[i].split(\"\\n\").at(-1)!);\n return `${value}`.replaceAll(\"\\n\", `\\n${firstLineIndentation}`);\n });\n\n return [deindentedStrings, ...indentedValues];\n}\nimport.meta.vitest?.test(\"deindent\", ({ expect }) => {\n // Test with string input\n expect(deindent(\" hello\")).toBe(\"hello\");\n expect(deindent(\" hello\\n world\")).toBe(\"hello\\nworld\");\n expect(deindent(\" hello\\n world\")).toBe(\"hello\\n world\");\n expect(deindent(\"\\n hello\\n world\\n\")).toBe(\"hello\\nworld\");\n\n // Test with empty input\n expect(deindent(\"\")).toBe(\"\");\n\n // Test with template literal\n expect(deindent`\n hello\n world\n `).toBe(\"hello\\nworld\");\n\n expect(deindent`\n hello\n world\n `).toBe(\"hello\\n world\");\n\n // Test with values\n const value = \"test\";\n expect(deindent`\n hello ${value}\n world\n `).toBe(`hello ${value}\\nworld`);\n\n // Test with multiline values\n expect(deindent`\n hello\n to ${\"line1\\n line2\"}\n world\n `).toBe(`hello\\n to line1\\n line2\\nworld`);\n\n // Leading whitespace values\n expect(deindent`\n ${\" \"}A\n ${\" \"}B\n ${\" \"}C\n `).toBe(` A\\n B\\n C`);\n\n // Trailing whitespaces (note: there are two whitespaces each after A and after C)\n expect(deindent`\n A \n B ${\" \"}\n C \n `).toBe(`A \\nB \\nC `);\n\n // Test with mixed indentation\n expect(deindent`\n hello\n world\n !\n `).toBe(\"hello\\n world\\n !\");\n\n // Test error cases\n expect(() => deindent([\"a\", \"b\", \"c\"], \"too\", \"many\", \"values\")).toThrow(\"Invalid number of values\");\n});\n\nexport function extractScopes(scope: string, removeDuplicates=true): string[] {\n // TODO what is this for? can we move this into the OAuth code in the backend?\n const trimmedString = scope.trim();\n const scopesArray = trimmedString.split(/\\s+/);\n const filtered = scopesArray.filter(scope => scope.length > 0);\n return removeDuplicates ? [...new Set(filtered)] : filtered;\n}\nimport.meta.vitest?.test(\"extractScopes\", ({ expect }) => {\n // Test with empty string\n expect(extractScopes(\"\")).toEqual([]);\n\n // Test with single scope\n expect(extractScopes(\"read\")).toEqual([\"read\"]);\n\n // Test with multiple scopes\n expect(extractScopes(\"read write\")).toEqual([\"read\", \"write\"]);\n\n // Test with extra whitespace\n expect(extractScopes(\" read write \")).toEqual([\"read\", \"write\"]);\n\n // Test with newlines and tabs\n expect(extractScopes(\"read\\nwrite\\tdelete\")).toEqual([\"read\", \"write\", \"delete\"]);\n\n // Test with duplicates (default behavior)\n expect(extractScopes(\"read write read\")).toEqual([\"read\", \"write\"]);\n\n // Test with duplicates (explicitly set to remove)\n expect(extractScopes(\"read write read\", true)).toEqual([\"read\", \"write\"]);\n\n // Test with duplicates (explicitly set to keep)\n expect(extractScopes(\"read write read\", false)).toEqual([\"read\", \"write\", \"read\"]);\n});\n\nexport function mergeScopeStrings(...scopes: string[]): string {\n // TODO what is this for? can we move this into the OAuth code in the backend?\n const allScope = scopes.map((s) => extractScopes(s)).flat().join(\" \");\n return extractScopes(allScope).join(\" \");\n}\nimport.meta.vitest?.test(\"mergeScopeStrings\", ({ expect }) => {\n // Test with empty input\n expect(mergeScopeStrings()).toBe(\"\");\n\n // Test with single scope string\n expect(mergeScopeStrings(\"read write\")).toBe(\"read write\");\n\n // Test with multiple scope strings\n expect(mergeScopeStrings(\"read\", \"write\")).toBe(\"read write\");\n\n // Test with overlapping scopes\n expect(mergeScopeStrings(\"read write\", \"write delete\")).toBe(\"read write delete\");\n\n // Test with extra whitespace\n expect(mergeScopeStrings(\" read write \", \" delete \")).toBe(\"read write delete\");\n\n // Test with duplicates across strings\n expect(mergeScopeStrings(\"read write\", \"write delete\", \"read\")).toBe(\"read write delete\");\n\n // Test with empty strings\n expect(mergeScopeStrings(\"read write\", \"\", \"delete\")).toBe(\"read write delete\");\n});\n\nexport function escapeTemplateLiteral(s: string): string {\n return s.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"`\", \"\\\\`\").replaceAll(\"${\", \"\\\\${\");\n}\nimport.meta.vitest?.test(\"escapeTemplateLiteral\", ({ expect }) => {\n // Test with empty string\n expect(escapeTemplateLiteral(\"\")).toBe(\"\");\n\n // Test with normal string (no special characters)\n expect(escapeTemplateLiteral(\"hello world\")).toBe(\"hello world\");\n\n // Test with backtick\n const input1 = \"hello `world`\";\n const output1 = escapeTemplateLiteral(input1);\n // Verify backticks are escaped\n expect(output1).toBe(\"hello \\\\`world\\\\`\");\n\n // Test with backslash\n const input2 = \"hello \\\\world\";\n const output2 = escapeTemplateLiteral(input2);\n // Verify backslashes are escaped\n expect(output2).toBe(\"hello \\\\\\\\world\");\n\n // Test with dollar sign\n const input3 = \"hello $world\";\n const output3 = escapeTemplateLiteral(input3);\n // Verify dollar signs are escaped\n expect(output3).toBe(\"hello $world\");\n\n // Test with dollar sign in interpolation\n const input4 = \"hello ${$world\";\n const output4 = escapeTemplateLiteral(input4);\n // Verify dollar signs are escaped\n expect(output4).toBe(\"hello \\\\${$world\");\n\n // Test with multiple special characters\n const input5 = \"`hello` ${world\\\\\";\n const output5 = escapeTemplateLiteral(input5);\n // Verify all special characters are escaped\n expect(output5).toBe(\"\\\\`hello\\\\` \\\\${world\\\\\\\\\");\n\n // Test with already escaped characters\n const input6 = \"\\\\`hello\\\\`\";\n const output6 = escapeTemplateLiteral(input6);\n expect(output6).toBe(\"\\\\\\\\\\\\`hello\\\\\\\\\\\\`\");\n});\n\n/**\n * Some classes have different constructor names in different environments (eg. `Headers` is sometimes called `_Headers`,\n * so we create an object of overrides to handle these cases.\n */\nconst nicifiableClassNameOverrides = new Map(Object.entries({\n Headers,\n} as Record<string, unknown>).map(([k, v]) => [v, k]));\nexport type Nicifiable = {\n getNicifiableKeys?(): PropertyKey[],\n getNicifiedObjectExtraLines?(): string[],\n};\nexport type NicifyOptions = {\n maxDepth: number,\n currentIndent: string,\n lineIndent: string,\n multiline: boolean,\n refs: Map<unknown, string>,\n path: string,\n parent: null | {\n options: NicifyOptions,\n value: unknown,\n },\n keyInParent: PropertyKey | null,\n hideFields: PropertyKey[],\n overrides: (...args: Parameters<typeof nicify>) => string | null,\n};\nexport function nicify(\n value: unknown,\n options: Partial<NicifyOptions> = {},\n): string {\n const fullOptions: NicifyOptions = {\n maxDepth: 5,\n currentIndent: \"\",\n lineIndent: \" \",\n multiline: true,\n refs: new Map(),\n path: \"value\",\n parent: null,\n overrides: () => null,\n keyInParent: null,\n hideFields: [],\n ...filterUndefined(options),\n };\n const {\n maxDepth,\n currentIndent,\n lineIndent,\n multiline,\n refs,\n path,\n overrides,\n hideFields,\n } = fullOptions;\n const nl = `\\n${currentIndent}`;\n\n const overrideResult = overrides(value, options);\n if (overrideResult !== null) return overrideResult;\n\n if ([\"function\", \"object\", \"symbol\"].includes(typeof value) && value !== null) {\n if (refs.has(value)) {\n return `Ref<${refs.get(value)}>`;\n }\n refs.set(value, path);\n }\n\n const newOptions: NicifyOptions = {\n maxDepth: maxDepth - 1,\n currentIndent,\n lineIndent,\n multiline,\n refs,\n path: path + \"->[unknown property]\",\n overrides,\n parent: { value, options: fullOptions },\n keyInParent: null,\n hideFields: [],\n };\n const nestedNicify = (newValue: unknown, newPath: string, keyInParent: PropertyKey | null, options: Partial<NicifyOptions> = {}) => {\n return nicify(newValue, {\n ...newOptions,\n path: newPath,\n currentIndent: currentIndent + lineIndent,\n keyInParent,\n ...options,\n });\n };\n\n switch (typeof value) {\n case \"boolean\": case \"number\": {\n return JSON.stringify(value);\n }\n case \"string\": {\n const isDeindentable = (v: string) => deindent(v) === v && v.includes(\"\\n\");\n const wrapInDeindent = (v: string) => deindent`\n deindent\\`\n ${currentIndent + lineIndent}${escapeTemplateLiteral(v).replaceAll(\"\\n\", nl + lineIndent)}\n ${currentIndent}\\`\n `;\n if (isDeindentable(value)) {\n return wrapInDeindent(value);\n } else if (value.endsWith(\"\\n\") && isDeindentable(value.slice(0, -1))) {\n return wrapInDeindent(value.slice(0, -1)) + ' + \"\\\\n\"';\n } else {\n return JSON.stringify(value);\n }\n }\n case \"undefined\": {\n return \"undefined\";\n }\n case \"symbol\": {\n return value.toString();\n }\n case \"bigint\": {\n return `${value}n`;\n }\n case \"function\": {\n if (value.name) return `function ${value.name}(...) { ... }`;\n return `(...) => { ... }`;\n }\n case \"object\": {\n if (value === null) return \"null\";\n if (Array.isArray(value)) {\n const extraLines = getNicifiedObjectExtraLines(value);\n const resValueLength = value.length + extraLines.length;\n if (resValueLength === 0) return \"[]\"; // early return in case maxDepth <= 0\n if (maxDepth <= 0) return `[...]`;\n const resValues = value.map((v, i) => nestedNicify(v, `${path}[${i}]`, i));\n resValues.push(...extraLines);\n if (resValues.length !== resValueLength) throw new HexclaveAssertionError(\"nicify of object: resValues.length !== resValueLength\", { value, resValues, resValueLength });\n const shouldIndent = resValues.length > 4 || resValues.some(x => (resValues.length > 1 && x.length > 4) || x.includes(\"\\n\"));\n if (shouldIndent) {\n return `[${nl}${resValues.map(x => `${lineIndent}${x},${nl}`).join(\"\")}]`;\n } else {\n return `[${resValues.join(\", \")}]`;\n }\n }\n if (value instanceof Date) {\n return `Date(${nestedNicify(value.toISOString(), `${path}.toISOString()`, null)})`;\n }\n if (value instanceof URL) {\n return `URL(${nestedNicify(value.toString(), `${path}.toString()`, null)})`;\n }\n if (ArrayBuffer.isView(value)) {\n return `${value.constructor.name}([${value.toString()}])`;\n }\n if (value instanceof ArrayBuffer) {\n return `ArrayBuffer [${new Uint8Array(value).toString()}]`;\n }\n if (value instanceof Error) {\n let stack = value.stack ?? \"\";\n const toString = value.toString();\n if (!stack.startsWith(toString)) stack = `${toString}\\n${stack}`; // some browsers don't include the error message in the stack, some do\n stack = stack.trimEnd();\n stack = stack.replace(/\\n\\s+/g, `\\n${lineIndent}${lineIndent}`);\n stack = stack.replace(\"\\n\", `\\n${lineIndent}Stack:\\n`);\n if (Object.keys(value).length > 0) {\n stack += `\\n${lineIndent}Extra properties: ${nestedNicify(Object.fromEntries(Object.entries(value)), path, null)}`;\n }\n if (value.cause) {\n stack += `\\n${lineIndent}Cause:\\n${lineIndent}${lineIndent}${nestedNicify(value.cause, path, null, { currentIndent: currentIndent + lineIndent + lineIndent })}`;\n }\n stack = stack.replaceAll(\"\\n\", `\\n${currentIndent}`);\n return stack;\n }\n\n const constructorName = [null, Object.prototype].includes(Object.getPrototypeOf(value)) ? null : (nicifiableClassNameOverrides.get(value.constructor) ?? value.constructor.name);\n const constructorString = constructorName ? `${constructorName} ` : \"\";\n\n const entries = getNicifiableEntries(value).filter(([k]) => !hideFields.includes(k));\n const extraLines = [\n ...getNicifiedObjectExtraLines(value),\n ...hideFields.length > 0 ? [`<some fields may have been hidden>`] : [],\n ];\n const resValueLength = entries.length + extraLines.length;\n if (resValueLength === 0) return `${constructorString}{}`;\n if (maxDepth <= 0) return `${constructorString}{ ... }`;\n const resValues = entries.map(([k, v], keyIndex) => {\n const keyNicified = nestedNicify(k, `Object.keys(${path})[${keyIndex}]`, null);\n const keyInObjectLiteral = typeof k === \"string\" ? nicifyPropertyString(k) : `[${keyNicified}]`;\n if (typeof v === \"function\" && v.name === k) {\n return `${keyInObjectLiteral}(...): { ... }`;\n } else {\n return `${keyInObjectLiteral}: ${nestedNicify(v, `${path}[${keyNicified}]`, k)}`;\n }\n });\n resValues.push(...extraLines);\n if (resValues.length !== resValueLength) throw new HexclaveAssertionError(\"nicify of object: resValues.length !== resValueLength\", { value, resValues, resValueLength });\n const shouldIndent = resValues.length > 1 || resValues.some(x => x.includes(\"\\n\"));\n\n if (resValues.length === 0) return `${constructorString}{}`;\n if (shouldIndent) {\n return `${constructorString}{${nl}${resValues.map(x => `${lineIndent}${x},${nl}`).join(\"\")}}`;\n } else {\n return `${constructorString}{ ${resValues.join(\", \")} }`;\n }\n }\n default: {\n return `${typeof value}<${value}>`;\n }\n }\n}\n\nexport function replaceAll(input: string, searchValue: string, replaceValue: string): string {\n if (searchValue === \"\") throw new HexclaveAssertionError(\"replaceAll: searchValue is empty\");\n return input.split(searchValue).join(replaceValue);\n}\nimport.meta.vitest?.test(\"replaceAll\", ({ expect }) => {\n expect(replaceAll(\"hello world\", \"o\", \"x\")).toBe(\"hellx wxrld\");\n expect(replaceAll(\"aaa\", \"a\", \"b\")).toBe(\"bbb\");\n expect(replaceAll(\"\", \"a\", \"b\")).toBe(\"\");\n expect(replaceAll(\"abc\", \"b\", \"\")).toBe(\"ac\");\n expect(replaceAll(\"test.test.test\", \".\", \"_\")).toBe(\"test_test_test\");\n expect(replaceAll(\"a.b*c\", \".\", \"x\")).toBe(\"axb*c\");\n expect(replaceAll(\"a*b*c\", \"*\", \"x\")).toBe(\"axbxc\");\n expect(replaceAll(\"hello hello\", \"hello\", \"hi\")).toBe(\"hi hi\");\n});\n\nfunction nicifyPropertyString(str: string) {\n return JSON.stringify(str);\n}\nimport.meta.vitest?.test(\"nicifyPropertyString\", ({ expect }) => {\n // Test valid identifiers\n expect(nicifyPropertyString(\"validName\")).toBe('\"validName\"');\n expect(nicifyPropertyString(\"_validName\")).toBe('\"_validName\"');\n expect(nicifyPropertyString(\"valid123Name\")).toBe('\"valid123Name\"');\n\n // Test invalid identifiers\n expect(nicifyPropertyString(\"123invalid\")).toBe('\"123invalid\"');\n expect(nicifyPropertyString(\"invalid-name\")).toBe('\"invalid-name\"');\n expect(nicifyPropertyString(\"invalid space\")).toBe('\"invalid space\"');\n expect(nicifyPropertyString(\"$invalid\")).toBe('\"$invalid\"');\n expect(nicifyPropertyString(\"\")).toBe('\"\"');\n\n // Test with special characters\n expect(nicifyPropertyString(\"property!\")).toBe('\"property!\"');\n expect(nicifyPropertyString(\"property.name\")).toBe('\"property.name\"');\n\n // Test with escaped characters\n expect(nicifyPropertyString(\"\\\\\")).toBe('\"\\\\\\\\\"');\n expect(nicifyPropertyString('\"')).toBe('\"\\\\\"\"');\n});\n\nfunction getNicifiableKeys(value: Nicifiable | object) {\n const overridden = (\"getNicifiableKeys\" in value ? value.getNicifiableKeys?.bind(value) : null)?.();\n if (overridden != null) return overridden;\n if (value instanceof Response) {\n return ['status', 'headers'];\n }\n const keys = Object.keys(value).sort();\n return unique(keys);\n}\nimport.meta.vitest?.test(\"getNicifiableKeys\", ({ expect }) => {\n // Test regular object\n expect(getNicifiableKeys({ b: 1, a: 2, c: 3 })).toEqual([\"a\", \"b\", \"c\"]);\n\n // Test empty object\n expect(getNicifiableKeys({})).toEqual([]);\n\n\n expect(getNicifiableKeys(new Response())).toEqual([\"status\", \"headers\"]);\n\n // Test object with custom getNicifiableKeys\n const customObject = {\n a: 1,\n b: 2,\n getNicifiableKeys() {\n return [\"customKey1\", \"customKey2\"];\n }\n };\n expect(getNicifiableKeys(customObject)).toEqual([\"customKey1\", \"customKey2\"]);\n});\n\nfunction getNicifiableEntries(value: Nicifiable | object): [PropertyKey, unknown][] {\n const recordLikes = [Headers];\n function isRecordLike(value: unknown): value is InstanceType<typeof recordLikes[number]> {\n return recordLikes.some(x => value instanceof x);\n }\n\n if (isRecordLike(value)) {\n return [...value.entries()].sort(([a], [b]) => stringCompare(`${a}`, `${b}`));\n }\n const keys = getNicifiableKeys(value);\n return keys.map((k) => [k, value[k as never]] as [PropertyKey, unknown]);\n}\n\nfunction getNicifiedObjectExtraLines(value: Nicifiable | object) {\n return (\"getNicifiedObjectExtraLines\" in value ? value.getNicifiedObjectExtraLines : null)?.() ?? [];\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
2
1
|
let vitest = require("vitest");
|
|
3
2
|
let __strings_js = require("./strings.js");
|
|
4
|
-
|
|
5
3
|
//#region src/utils/strings.nicify.test.ts
|
|
6
4
|
(0, vitest.describe)("nicify", () => {
|
|
7
5
|
(0, vitest.describe)("primitive values", () => {
|
|
@@ -238,6 +236,6 @@ let __strings_js = require("./strings.js");
|
|
|
238
236
|
});
|
|
239
237
|
});
|
|
240
238
|
});
|
|
241
|
-
|
|
242
239
|
//#endregion
|
|
240
|
+
|
|
243
241
|
//# sourceMappingURL=strings.nicify.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strings.nicify.test.js","names":[],"sources":["../../src/utils/strings.nicify.test.ts"],"sourcesContent":["import { describe, expect, test } from \"vitest\";\nimport { NicifyOptions, deindent, nicify } from \"./strings\";\n\ndescribe(\"nicify\", () => {\n describe(\"primitive values\", () => {\n test(\"numbers\", () => {\n expect(nicify(123)).toBe(\"123\");\n expect(nicify(123n)).toBe(\"123n\");\n });\n\n test(\"strings\", () => {\n expect(nicify(\"hello\")).toBe('\"hello\"');\n });\n\n test(\"booleans\", () => {\n expect(nicify(true)).toBe(\"true\");\n expect(nicify(false)).toBe(\"false\");\n });\n\n test(\"null and undefined\", () => {\n expect(nicify(null)).toBe(\"null\");\n expect(nicify(undefined)).toBe(\"undefined\");\n });\n\n test(\"symbols\", () => {\n expect(nicify(Symbol(\"test\"))).toBe(\"Symbol(test)\");\n });\n });\n\n describe(\"arrays\", () => {\n test(\"empty array\", () => {\n expect(nicify([])).toBe(\"[]\");\n });\n\n test(\"single-element array\", () => {\n expect(nicify([1])).toBe(\"[1]\");\n });\n\n test(\"single-element array with long content\", () => {\n expect(nicify([\"123123123123123\"])).toBe('[\"123123123123123\"]');\n });\n\n test(\"flat array\", () => {\n expect(nicify([1, 2, 3])).toBe(\"[1, 2, 3]\");\n });\n\n test(\"longer array\", () => {\n expect(nicify([10000, 2, 3])).toBe(deindent`\n [\n 10000,\n 2,\n 3,\n ]\n `);\n });\n\n test(\"nested array\", () => {\n expect(nicify([1, [2, 3]])).toBe(deindent`\n [\n 1,\n [2, 3],\n ]\n `);\n });\n });\n\n describe(\"objects\", () => {\n test(\"empty object\", () => {\n expect(nicify({})).toBe(\"{}\");\n });\n\n test(\"simple object\", () => {\n expect(nicify({ a: 1 })).toBe('{ \"a\": 1 }');\n });\n\n test(\"multiline object\", () => {\n expect(nicify({ a: 1, b: 2 })).toBe(deindent`\n {\n \"a\": 1,\n \"b\": 2,\n }\n `);\n });\n });\n\n describe(\"custom classes\", () => {\n test(\"class instance\", () => {\n class TestClass {\n constructor(public value: number) {}\n }\n expect(nicify(new TestClass(42))).toBe('TestClass { \"value\": 42 }');\n });\n });\n\n describe(\"built-in objects\", () => {\n test(\"URL\", () => {\n expect(nicify(new URL(\"https://example.com\"))).toBe('URL(\"https://example.com/\")');\n });\n\n test(\"TypedArrays\", () => {\n expect(nicify(new Uint8Array([1, 2, 3]))).toBe(\"Uint8Array([1,2,3])\");\n expect(nicify(new Int32Array([1, 2, 3]))).toBe(\"Int32Array([1,2,3])\");\n });\n\n test(\"Error objects\", () => {\n const error = new Error(\"test error\");\n const nicifiedError = nicify({ error });\n expect(nicifiedError).toMatch(new RegExp(deindent`\n ^\\{\n \"error\": Error: test error\n Stack:\n at (.|\\\\n)*\n \\}$\n `));\n });\n\n test(\"Error objects with cause and an extra property\", () => {\n const error = new Error(\"test error\", { cause: new Error(\"cause\") });\n (error as any).extra = \"something\";\n const nicifiedError = nicify(error, { lineIndent: \"--\" });\n expect(nicifiedError).toMatch(new RegExp(deindent`\n ^Error: test error\n --Stack:\n ----at (.|\\\\n)+\n --Extra properties: \\{ \"extra\": \"something\" \\}\n --Cause:\n ----Error: cause\n ------Stack:\n --------at (.|\\\\n)+$\n `));\n });\n\n test(\"Headers\", () => {\n const headers = new Headers();\n headers.append(\"Content-Type\", \"application/json\");\n headers.append(\"Accept\", \"text/plain\");\n expect(nicify(headers)).toBe(deindent`\n Headers {\n \"accept\": \"text/plain\",\n \"content-type\": \"application/json\",\n }`\n );\n });\n });\n\n describe(\"multiline strings\", () => {\n test(\"basic multiline\", () => {\n expect(nicify(\"line1\\nline2\")).toBe('deindent`\\n line1\\n line2\\n`');\n });\n\n test(\"multiline with trailing newline\", () => {\n expect(nicify(\"line1\\nline2\\n\")).toBe('deindent`\\n line1\\n line2\\n` + \"\\\\n\"');\n });\n\n test(\"multiline with dollar sign\", () => {\n expect(nicify(\"a\\n$b\\nc\")).toBe('deindent`\\n a\\n $b\\n c\\n`');\n });\n\n test(\"multiline with dollar sign interpolation\", () => {\n expect(nicify(\"a\\n${b\\nc\")).toBe('deindent`\\n a\\n \\\\${b\\n c\\n`');\n });\n });\n\n describe(\"circular references\", () => {\n test(\"object with self reference\", () => {\n const circular: any = { a: 1 };\n circular.self = circular;\n expect(nicify(circular)).toBe(deindent`\n {\n \"a\": 1,\n \"self\": Ref<value>,\n }`\n );\n });\n });\n\n describe(\"configuration options\", () => {\n test(\"maxDepth\", () => {\n const deep = { a: { b: { c: { d: { e: 1 } } } } };\n expect(nicify(deep, { maxDepth: 2 })).toBe('{ \"a\": { \"b\": { ... } } }');\n });\n\n test(\"lineIndent\", () => {\n expect(nicify({ a: 1, b: 2 }, { lineIndent: \" \" })).toBe(deindent`\n {\n \"a\": 1,\n \"b\": 2,\n }\n `);\n });\n\n test(\"hideFields\", () => {\n expect(nicify({ a: 1, b: 2, secret: \"hidden\" }, { hideFields: [\"secret\"] })).toBe(deindent`\n {\n \"a\": 1,\n \"b\": 2,\n <some fields may have been hidden>,\n }\n `);\n });\n });\n\n describe(\"custom overrides\", () => {\n test(\"override with custom type\", () => {\n expect(nicify({ type: \"special\" }, {\n overrides: ((value: unknown) => {\n if (typeof value === \"object\" && value && \"type\" in value && (value as any).type === \"special\") {\n return \"SPECIAL\";\n }\n return null;\n }) as NicifyOptions[\"overrides\"]\n })).toBe(\"SPECIAL\");\n });\n });\n\n describe(\"functions\", () => {\n test(\"named function\", () => {\n expect(nicify(function namedFunction() {})).toBe(\"function namedFunction(...) { ... }\");\n });\n\n test(\"arrow function\", () => {\n expect(nicify(() => {})).toBe(\"(...) => { ... }\");\n });\n });\n\n describe(\"Nicifiable interface\", () => {\n test(\"object implementing Nicifiable\", () => {\n const nicifiable = {\n value: 42,\n getNicifiableKeys() {\n return [\"value\"];\n },\n getNicifiedObjectExtraLines() {\n return [\"// custom comment\"];\n }\n };\n expect(nicify(nicifiable)).toBe(deindent`\n {\n \"value\": 42,\n // custom comment,\n }\n `);\n });\n });\n\n describe(\"unknown types\", () => {\n test(\"object without prototype\", () => {\n const unknownType = Object.create(null);\n unknownType.value = \"test\";\n expect(nicify(unknownType)).toBe('{ \"value\": \"test\" }');\n });\n });\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"strings.nicify.test.js","names":[],"sources":["../../src/utils/strings.nicify.test.ts"],"sourcesContent":["import { describe, expect, test } from \"vitest\";\nimport { NicifyOptions, deindent, nicify } from \"./strings\";\n\ndescribe(\"nicify\", () => {\n describe(\"primitive values\", () => {\n test(\"numbers\", () => {\n expect(nicify(123)).toBe(\"123\");\n expect(nicify(123n)).toBe(\"123n\");\n });\n\n test(\"strings\", () => {\n expect(nicify(\"hello\")).toBe('\"hello\"');\n });\n\n test(\"booleans\", () => {\n expect(nicify(true)).toBe(\"true\");\n expect(nicify(false)).toBe(\"false\");\n });\n\n test(\"null and undefined\", () => {\n expect(nicify(null)).toBe(\"null\");\n expect(nicify(undefined)).toBe(\"undefined\");\n });\n\n test(\"symbols\", () => {\n expect(nicify(Symbol(\"test\"))).toBe(\"Symbol(test)\");\n });\n });\n\n describe(\"arrays\", () => {\n test(\"empty array\", () => {\n expect(nicify([])).toBe(\"[]\");\n });\n\n test(\"single-element array\", () => {\n expect(nicify([1])).toBe(\"[1]\");\n });\n\n test(\"single-element array with long content\", () => {\n expect(nicify([\"123123123123123\"])).toBe('[\"123123123123123\"]');\n });\n\n test(\"flat array\", () => {\n expect(nicify([1, 2, 3])).toBe(\"[1, 2, 3]\");\n });\n\n test(\"longer array\", () => {\n expect(nicify([10000, 2, 3])).toBe(deindent`\n [\n 10000,\n 2,\n 3,\n ]\n `);\n });\n\n test(\"nested array\", () => {\n expect(nicify([1, [2, 3]])).toBe(deindent`\n [\n 1,\n [2, 3],\n ]\n `);\n });\n });\n\n describe(\"objects\", () => {\n test(\"empty object\", () => {\n expect(nicify({})).toBe(\"{}\");\n });\n\n test(\"simple object\", () => {\n expect(nicify({ a: 1 })).toBe('{ \"a\": 1 }');\n });\n\n test(\"multiline object\", () => {\n expect(nicify({ a: 1, b: 2 })).toBe(deindent`\n {\n \"a\": 1,\n \"b\": 2,\n }\n `);\n });\n });\n\n describe(\"custom classes\", () => {\n test(\"class instance\", () => {\n class TestClass {\n constructor(public value: number) {}\n }\n expect(nicify(new TestClass(42))).toBe('TestClass { \"value\": 42 }');\n });\n });\n\n describe(\"built-in objects\", () => {\n test(\"URL\", () => {\n expect(nicify(new URL(\"https://example.com\"))).toBe('URL(\"https://example.com/\")');\n });\n\n test(\"TypedArrays\", () => {\n expect(nicify(new Uint8Array([1, 2, 3]))).toBe(\"Uint8Array([1,2,3])\");\n expect(nicify(new Int32Array([1, 2, 3]))).toBe(\"Int32Array([1,2,3])\");\n });\n\n test(\"Error objects\", () => {\n const error = new Error(\"test error\");\n const nicifiedError = nicify({ error });\n expect(nicifiedError).toMatch(new RegExp(deindent`\n ^\\{\n \"error\": Error: test error\n Stack:\n at (.|\\\\n)*\n \\}$\n `));\n });\n\n test(\"Error objects with cause and an extra property\", () => {\n const error = new Error(\"test error\", { cause: new Error(\"cause\") });\n (error as any).extra = \"something\";\n const nicifiedError = nicify(error, { lineIndent: \"--\" });\n expect(nicifiedError).toMatch(new RegExp(deindent`\n ^Error: test error\n --Stack:\n ----at (.|\\\\n)+\n --Extra properties: \\{ \"extra\": \"something\" \\}\n --Cause:\n ----Error: cause\n ------Stack:\n --------at (.|\\\\n)+$\n `));\n });\n\n test(\"Headers\", () => {\n const headers = new Headers();\n headers.append(\"Content-Type\", \"application/json\");\n headers.append(\"Accept\", \"text/plain\");\n expect(nicify(headers)).toBe(deindent`\n Headers {\n \"accept\": \"text/plain\",\n \"content-type\": \"application/json\",\n }`\n );\n });\n });\n\n describe(\"multiline strings\", () => {\n test(\"basic multiline\", () => {\n expect(nicify(\"line1\\nline2\")).toBe('deindent`\\n line1\\n line2\\n`');\n });\n\n test(\"multiline with trailing newline\", () => {\n expect(nicify(\"line1\\nline2\\n\")).toBe('deindent`\\n line1\\n line2\\n` + \"\\\\n\"');\n });\n\n test(\"multiline with dollar sign\", () => {\n expect(nicify(\"a\\n$b\\nc\")).toBe('deindent`\\n a\\n $b\\n c\\n`');\n });\n\n test(\"multiline with dollar sign interpolation\", () => {\n expect(nicify(\"a\\n${b\\nc\")).toBe('deindent`\\n a\\n \\\\${b\\n c\\n`');\n });\n });\n\n describe(\"circular references\", () => {\n test(\"object with self reference\", () => {\n const circular: any = { a: 1 };\n circular.self = circular;\n expect(nicify(circular)).toBe(deindent`\n {\n \"a\": 1,\n \"self\": Ref<value>,\n }`\n );\n });\n });\n\n describe(\"configuration options\", () => {\n test(\"maxDepth\", () => {\n const deep = { a: { b: { c: { d: { e: 1 } } } } };\n expect(nicify(deep, { maxDepth: 2 })).toBe('{ \"a\": { \"b\": { ... } } }');\n });\n\n test(\"lineIndent\", () => {\n expect(nicify({ a: 1, b: 2 }, { lineIndent: \" \" })).toBe(deindent`\n {\n \"a\": 1,\n \"b\": 2,\n }\n `);\n });\n\n test(\"hideFields\", () => {\n expect(nicify({ a: 1, b: 2, secret: \"hidden\" }, { hideFields: [\"secret\"] })).toBe(deindent`\n {\n \"a\": 1,\n \"b\": 2,\n <some fields may have been hidden>,\n }\n `);\n });\n });\n\n describe(\"custom overrides\", () => {\n test(\"override with custom type\", () => {\n expect(nicify({ type: \"special\" }, {\n overrides: ((value: unknown) => {\n if (typeof value === \"object\" && value && \"type\" in value && (value as any).type === \"special\") {\n return \"SPECIAL\";\n }\n return null;\n }) as NicifyOptions[\"overrides\"]\n })).toBe(\"SPECIAL\");\n });\n });\n\n describe(\"functions\", () => {\n test(\"named function\", () => {\n expect(nicify(function namedFunction() {})).toBe(\"function namedFunction(...) { ... }\");\n });\n\n test(\"arrow function\", () => {\n expect(nicify(() => {})).toBe(\"(...) => { ... }\");\n });\n });\n\n describe(\"Nicifiable interface\", () => {\n test(\"object implementing Nicifiable\", () => {\n const nicifiable = {\n value: 42,\n getNicifiableKeys() {\n return [\"value\"];\n },\n getNicifiedObjectExtraLines() {\n return [\"// custom comment\"];\n }\n };\n expect(nicify(nicifiable)).toBe(deindent`\n {\n \"value\": 42,\n // custom comment,\n }\n `);\n });\n });\n\n describe(\"unknown types\", () => {\n test(\"object without prototype\", () => {\n const unknownType = Object.create(null);\n unknownType.value = \"test\";\n expect(nicify(unknownType)).toBe('{ \"value\": \"test\" }');\n });\n });\n});\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.d.ts","names":[],"sources":["../../src/utils/telemetry.tsx"],"mappings":";;;iBAMgB,aAAA,
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","names":[],"sources":["../../src/utils/telemetry.tsx"],"mappings":";;;iBAMgB,aAAA,qBAAkC,oBAAA;EAAiC,WAAA;EAAqB,UAAA,GAAa,MAAA,SAAe,cAAA;AAAA,GAAmB,EAAA,MAAQ,IAAA,EAAM,CAAA,KAAM,OAAA,CAAQ,CAAA,QAAS,IAAA,EAAM,CAAA,KAAM,OAAA,CAAQ,CAAA;AAAA,iBAM1L,SAAA,IAAa,oBAAA;EAAiC,WAAA;EAAqB,UAAA,GAAa,MAAA,SAAe,cAAA;AAAA,GAAmB,EAAA,GAAK,IAAA,EAAM,IAAA,KAAS,OAAA,CAAQ,CAAA,IAAK,OAAA,CAAQ,CAAA;AAAA,iBAgBjK,GAAA,CAAI,OAAA,UAAiB,UAAA,EAAY,UAAU"}
|
package/dist/utils/telemetry.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
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 __errors_js = require("./errors.js");
|
|
4
3
|
let __env_js = require("./env.js");
|
|
5
4
|
let _opentelemetry_api = require("@opentelemetry/api");
|
|
6
|
-
|
|
7
5
|
//#region src/utils/telemetry.tsx
|
|
8
6
|
const tracer = _opentelemetry_api.trace.getTracer("stack-tracer");
|
|
9
7
|
function withTraceSpan(optionsOrDescription, fn) {
|
|
@@ -27,9 +25,9 @@ function log(message, attributes) {
|
|
|
27
25
|
if (span) span.addEvent(message, attributes);
|
|
28
26
|
else if ((0, __env_js.getEnvVariable)("STACK_SEED_MODE", "false") !== "true") throw new __errors_js.HexclaveAssertionError("No active span found");
|
|
29
27
|
}
|
|
30
|
-
|
|
31
28
|
//#endregion
|
|
32
29
|
exports.log = log;
|
|
33
30
|
exports.traceSpan = traceSpan;
|
|
34
31
|
exports.withTraceSpan = withTraceSpan;
|
|
32
|
+
|
|
35
33
|
//# sourceMappingURL=telemetry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","names":["trace","HexclaveAssertionError"],"sources":["../../src/utils/telemetry.tsx"],"sourcesContent":["import { Attributes, AttributeValue, Span, trace } from \"@opentelemetry/api\";\nimport { getEnvVariable } from \"./env\";\nimport { HexclaveAssertionError } from \"./errors\";\n\nconst tracer = trace.getTracer('stack-tracer');\n\nexport function withTraceSpan<P extends any[], T>(optionsOrDescription: string | { description: string, attributes?: Record<string, AttributeValue> }, fn: (...args: P) => Promise<T>): (...args: P) => Promise<T> {\n return async (...args: P) => {\n return await traceSpan(optionsOrDescription, (span) => fn(...args));\n };\n}\n\nexport async function traceSpan<T>(optionsOrDescription: string | { description: string, attributes?: Record<string, AttributeValue> }, fn: (span: Span) => Promise<T>): Promise<T> {\n let options = typeof optionsOrDescription === 'string' ? { description: optionsOrDescription } : optionsOrDescription;\n return await tracer.startActiveSpan(`STACK: ${options.description}`, async (span) => {\n if (options.attributes) {\n for (const [key, value] of Object.entries(options.attributes)) {\n span.setAttribute(key, value);\n }\n }\n try {\n return await fn(span);\n } finally {\n span.end();\n }\n });\n}\n\nexport function log(message: string, attributes: Attributes) {\n const span = trace.getActiveSpan();\n if (span) {\n span.addEvent(message, attributes);\n // Telemetry is not initialized while seeding, so we don't want to throw an error\n } else if (getEnvVariable('STACK_SEED_MODE', 'false') !== 'true') {\n throw new HexclaveAssertionError('No active span found');\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"telemetry.js","names":["trace","HexclaveAssertionError"],"sources":["../../src/utils/telemetry.tsx"],"sourcesContent":["import { Attributes, AttributeValue, Span, trace } from \"@opentelemetry/api\";\nimport { getEnvVariable } from \"./env\";\nimport { HexclaveAssertionError } from \"./errors\";\n\nconst tracer = trace.getTracer('stack-tracer');\n\nexport function withTraceSpan<P extends any[], T>(optionsOrDescription: string | { description: string, attributes?: Record<string, AttributeValue> }, fn: (...args: P) => Promise<T>): (...args: P) => Promise<T> {\n return async (...args: P) => {\n return await traceSpan(optionsOrDescription, (span) => fn(...args));\n };\n}\n\nexport async function traceSpan<T>(optionsOrDescription: string | { description: string, attributes?: Record<string, AttributeValue> }, fn: (span: Span) => Promise<T>): Promise<T> {\n let options = typeof optionsOrDescription === 'string' ? { description: optionsOrDescription } : optionsOrDescription;\n return await tracer.startActiveSpan(`STACK: ${options.description}`, async (span) => {\n if (options.attributes) {\n for (const [key, value] of Object.entries(options.attributes)) {\n span.setAttribute(key, value);\n }\n }\n try {\n return await fn(span);\n } finally {\n span.end();\n }\n });\n}\n\nexport function log(message: string, attributes: Attributes) {\n const span = trace.getActiveSpan();\n if (span) {\n span.addEvent(message, attributes);\n // Telemetry is not initialized while seeding, so we don't want to throw an error\n } else if (getEnvVariable('STACK_SEED_MODE', 'false') !== 'true') {\n throw new HexclaveAssertionError('No active span found');\n }\n}\n"],"mappings":";;;;;AAIA,MAAM,SAASA,mBAAAA,MAAM,UAAU,cAAc;AAE7C,SAAgB,cAAkC,sBAAqG,IAA4D;CACjN,OAAO,OAAO,GAAG,SAAY;EAC3B,OAAO,MAAM,UAAU,uBAAuB,SAAS,GAAG,GAAG,IAAI,CAAC;CACpE;AACF;AAEA,eAAsB,UAAa,sBAAqG,IAA4C;CAClL,IAAI,UAAU,OAAO,yBAAyB,WAAW,EAAE,aAAa,qBAAqB,IAAI;CACjG,OAAO,MAAM,OAAO,gBAAgB,UAAU,QAAQ,eAAe,OAAO,SAAS;EACnF,IAAI,QAAQ,YACV,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,UAAU,GAC1D,KAAK,aAAa,KAAK,KAAK;EAGhC,IAAI;GACF,OAAO,MAAM,GAAG,IAAI;EACtB,UAAU;GACR,KAAK,IAAI;EACX;CACF,CAAC;AACH;AAEA,SAAgB,IAAI,SAAiB,YAAwB;CAC3D,MAAM,OAAOA,mBAAAA,MAAM,cAAc;CACjC,IAAI,MACF,KAAK,SAAS,SAAS,UAAU;MAE5B,KAAA,GAAA,SAAA,eAAA,CAAmB,mBAAmB,OAAO,MAAM,QACxD,MAAM,IAAIC,YAAAA,uBAAuB,sBAAsB;AAE3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turnstile-browser.d.ts","names":[],"sources":["../../src/utils/turnstile-browser.ts"],"mappings":";;;KAGY,iBAAA;AAAA,KACA,cAAA;AAAA,KACA,mBAAA;AAAA,KACA,kBAAA;AAAA,KACA,aAAA;AAAA,KAEA,eAAA;EACV,OAAA;EACA,MAAA,EAAQ,eAAA;EACR,KAAA,GAAQ,cAAA;EACR,UAAA,GAAa,mBAAA;EACb,SAAA,GAAY,kBAAA;EACZ,IAAA,GAAO,aAAA;EACP,QAAA,GAAW,KAAA;EACX,gBAAA,GAAmB,SAAA;EACnB,kBAAA;EACA,kBAAA;AAAA;AAAA,KAGU,YAAA;EACV,MAAA,GAAS,SAAA,EAAW,WAAA,EAAa,MAAA,EAAQ,eAAA,KAAoB,iBAAA;EAC7D,OAAA,IAAW,QAAA,EAAU,iBAAA;EACrB,MAAA,GAAS,QAAA,EAAU,iBAAA;EACnB,KAAA,IAAS,QAAA,EAAU,iBAAA;AAAA;AAAA,iBAML,cAAA,CAAe,KAAA,YAAiB,KAAA,IAAS,
|
|
1
|
+
{"version":3,"file":"turnstile-browser.d.ts","names":[],"sources":["../../src/utils/turnstile-browser.ts"],"mappings":";;;KAGY,iBAAA;AAAA,KACA,cAAA;AAAA,KACA,mBAAA;AAAA,KACA,kBAAA;AAAA,KACA,aAAA;AAAA,KAEA,eAAA;EACV,OAAA;EACA,MAAA,EAAQ,eAAA;EACR,KAAA,GAAQ,cAAA;EACR,UAAA,GAAa,mBAAA;EACb,SAAA,GAAY,kBAAA;EACZ,IAAA,GAAO,aAAA;EACP,QAAA,GAAW,KAAA;EACX,gBAAA,GAAmB,SAAA;EACnB,kBAAA;EACA,kBAAA;AAAA;AAAA,KAGU,YAAA;EACV,MAAA,GAAS,SAAA,EAAW,WAAA,EAAa,MAAA,EAAQ,eAAA,KAAoB,iBAAA;EAC7D,OAAA,IAAW,QAAA,EAAU,iBAAA;EACrB,MAAA,GAAS,QAAA,EAAU,iBAAA;EACnB,KAAA,IAAS,QAAA,EAAU,iBAAA;AAAA;AAAA,iBAML,cAAA,CAAe,KAAA,YAAiB,KAAA,IAAS,YAAY;AAAA,iBAOrD,eAAA,IAAmB,YAAY;AAAA,iBAW/B,mBAAA,IAAuB,OAAO"}
|
|
@@ -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 __errors_js = require("./errors.js");
|
|
4
|
-
|
|
5
3
|
//#region src/utils/turnstile-browser.ts
|
|
6
4
|
const TURNSTILE_SCRIPT_BASE_URL = "https://challenges.cloudflare.com/turnstile/v0/api.js";
|
|
7
5
|
const TURNSTILE_SCRIPT_LOAD_TIMEOUT_MS = 3e4;
|
|
@@ -57,9 +55,9 @@ function loadTurnstileScript() {
|
|
|
57
55
|
});
|
|
58
56
|
return turnstileScriptPromise;
|
|
59
57
|
}
|
|
60
|
-
|
|
61
58
|
//#endregion
|
|
62
59
|
exports.getTurnstileApi = getTurnstileApi;
|
|
63
60
|
exports.isTurnstileApi = isTurnstileApi;
|
|
64
61
|
exports.loadTurnstileScript = loadTurnstileScript;
|
|
62
|
+
|
|
65
63
|
//# sourceMappingURL=turnstile-browser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turnstile-browser.js","names":["HexclaveAssertionError"],"sources":["../../src/utils/turnstile-browser.ts"],"sourcesContent":["import { HexclaveAssertionError } from \"./errors\";\nimport { TurnstileAction } from \"./turnstile\";\n\nexport type TurnstileWidgetId = string;\nexport type TurnstileTheme = \"auto\" | \"light\" | \"dark\";\nexport type TurnstileAppearance = \"always\" | \"execute\" | \"interaction-only\";\nexport type TurnstileExecution = \"render\" | \"execute\";\nexport type TurnstileSize = \"invisible\" | \"flexible\" | \"normal\" | \"compact\";\n\nexport type TurnstileConfig = {\n sitekey: string,\n action: TurnstileAction,\n theme?: TurnstileTheme,\n appearance?: TurnstileAppearance,\n execution?: TurnstileExecution,\n size?: TurnstileSize,\n callback: (token: string) => void,\n \"error-callback\": (errorCode?: string) => void,\n \"expired-callback\": () => void,\n \"timeout-callback\"?: () => void,\n};\n\nexport type TurnstileApi = {\n render: (container: HTMLElement, config: TurnstileConfig) => TurnstileWidgetId,\n execute?: (widgetId: TurnstileWidgetId) => void,\n remove: (widgetId: TurnstileWidgetId) => void,\n reset?: (widgetId: TurnstileWidgetId) => void,\n};\n\nconst TURNSTILE_SCRIPT_BASE_URL = \"https://challenges.cloudflare.com/turnstile/v0/api.js\";\nconst TURNSTILE_SCRIPT_LOAD_TIMEOUT_MS = 30_000;\n\nexport function isTurnstileApi(value: unknown): value is TurnstileApi {\n return typeof value === \"object\"\n && value !== null\n && \"render\" in value\n && \"remove\" in value;\n}\n\nexport function getTurnstileApi(): TurnstileApi | undefined {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n const maybeTurnstile = Reflect.get(window, \"turnstile\");\n return isTurnstileApi(maybeTurnstile) ? maybeTurnstile : undefined;\n}\n\nlet turnstileScriptPromise: Promise<void> | null = null;\n\nexport function loadTurnstileScript(): Promise<void> {\n if (typeof window === \"undefined\") {\n return Promise.reject(new HexclaveAssertionError(\"Turnstile can only be loaded in the browser\"));\n }\n\n if (getTurnstileApi()) {\n return Promise.resolve();\n }\n\n turnstileScriptPromise ??= new Promise<void>((resolve, reject) => {\n const rejectAndReset = (err: Error) => {\n turnstileScriptPromise = null;\n reject(err);\n };\n\n const timeout = setTimeout(() => {\n rejectAndReset(new Error(\"Turnstile script load timed out\"));\n }, TURNSTILE_SCRIPT_LOAD_TIMEOUT_MS);\n\n const resolveAndClearTimeout = () => {\n clearTimeout(timeout);\n resolve();\n };\n\n const existingScript = document.querySelector<HTMLScriptElement>(`script[src^=\"${TURNSTILE_SCRIPT_BASE_URL}\"]`);\n if (existingScript) {\n // If the Turnstile API is already available (script loaded before our loader ran),\n // resolve immediately — the load event may have already fired.\n if (getTurnstileApi()) {\n resolveAndClearTimeout();\n return;\n }\n existingScript.addEventListener(\"load\", () => resolveAndClearTimeout(), { once: true });\n existingScript.addEventListener(\"error\", () => {\n existingScript.remove();\n clearTimeout(timeout);\n rejectAndReset(new Error(\"Failed to load Turnstile\"));\n }, { once: true });\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = `${TURNSTILE_SCRIPT_BASE_URL}?render=explicit`;\n script.async = true;\n script.defer = true;\n script.onload = () => resolveAndClearTimeout();\n script.onerror = () => {\n script.remove();\n clearTimeout(timeout);\n rejectAndReset(new Error(\"Failed to load Turnstile\"));\n };\n document.head.append(script);\n });\n\n return turnstileScriptPromise;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"turnstile-browser.js","names":["HexclaveAssertionError"],"sources":["../../src/utils/turnstile-browser.ts"],"sourcesContent":["import { HexclaveAssertionError } from \"./errors\";\nimport { TurnstileAction } from \"./turnstile\";\n\nexport type TurnstileWidgetId = string;\nexport type TurnstileTheme = \"auto\" | \"light\" | \"dark\";\nexport type TurnstileAppearance = \"always\" | \"execute\" | \"interaction-only\";\nexport type TurnstileExecution = \"render\" | \"execute\";\nexport type TurnstileSize = \"invisible\" | \"flexible\" | \"normal\" | \"compact\";\n\nexport type TurnstileConfig = {\n sitekey: string,\n action: TurnstileAction,\n theme?: TurnstileTheme,\n appearance?: TurnstileAppearance,\n execution?: TurnstileExecution,\n size?: TurnstileSize,\n callback: (token: string) => void,\n \"error-callback\": (errorCode?: string) => void,\n \"expired-callback\": () => void,\n \"timeout-callback\"?: () => void,\n};\n\nexport type TurnstileApi = {\n render: (container: HTMLElement, config: TurnstileConfig) => TurnstileWidgetId,\n execute?: (widgetId: TurnstileWidgetId) => void,\n remove: (widgetId: TurnstileWidgetId) => void,\n reset?: (widgetId: TurnstileWidgetId) => void,\n};\n\nconst TURNSTILE_SCRIPT_BASE_URL = \"https://challenges.cloudflare.com/turnstile/v0/api.js\";\nconst TURNSTILE_SCRIPT_LOAD_TIMEOUT_MS = 30_000;\n\nexport function isTurnstileApi(value: unknown): value is TurnstileApi {\n return typeof value === \"object\"\n && value !== null\n && \"render\" in value\n && \"remove\" in value;\n}\n\nexport function getTurnstileApi(): TurnstileApi | undefined {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n const maybeTurnstile = Reflect.get(window, \"turnstile\");\n return isTurnstileApi(maybeTurnstile) ? maybeTurnstile : undefined;\n}\n\nlet turnstileScriptPromise: Promise<void> | null = null;\n\nexport function loadTurnstileScript(): Promise<void> {\n if (typeof window === \"undefined\") {\n return Promise.reject(new HexclaveAssertionError(\"Turnstile can only be loaded in the browser\"));\n }\n\n if (getTurnstileApi()) {\n return Promise.resolve();\n }\n\n turnstileScriptPromise ??= new Promise<void>((resolve, reject) => {\n const rejectAndReset = (err: Error) => {\n turnstileScriptPromise = null;\n reject(err);\n };\n\n const timeout = setTimeout(() => {\n rejectAndReset(new Error(\"Turnstile script load timed out\"));\n }, TURNSTILE_SCRIPT_LOAD_TIMEOUT_MS);\n\n const resolveAndClearTimeout = () => {\n clearTimeout(timeout);\n resolve();\n };\n\n const existingScript = document.querySelector<HTMLScriptElement>(`script[src^=\"${TURNSTILE_SCRIPT_BASE_URL}\"]`);\n if (existingScript) {\n // If the Turnstile API is already available (script loaded before our loader ran),\n // resolve immediately — the load event may have already fired.\n if (getTurnstileApi()) {\n resolveAndClearTimeout();\n return;\n }\n existingScript.addEventListener(\"load\", () => resolveAndClearTimeout(), { once: true });\n existingScript.addEventListener(\"error\", () => {\n existingScript.remove();\n clearTimeout(timeout);\n rejectAndReset(new Error(\"Failed to load Turnstile\"));\n }, { once: true });\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = `${TURNSTILE_SCRIPT_BASE_URL}?render=explicit`;\n script.async = true;\n script.defer = true;\n script.onload = () => resolveAndClearTimeout();\n script.onerror = () => {\n script.remove();\n clearTimeout(timeout);\n rejectAndReset(new Error(\"Failed to load Turnstile\"));\n };\n document.head.append(script);\n });\n\n return turnstileScriptPromise;\n}\n"],"mappings":";;;AA6BA,MAAM,4BAA4B;AAClC,MAAM,mCAAmC;AAEzC,SAAgB,eAAe,OAAuC;CACpE,OAAO,OAAO,UAAU,YACnB,UAAU,QACV,YAAY,SACZ,YAAY;AACnB;AAEA,SAAgB,kBAA4C;CAC1D,IAAI,OAAO,WAAW,aACpB;CAGF,MAAM,iBAAiB,QAAQ,IAAI,QAAQ,WAAW;CACtD,OAAO,eAAe,cAAc,IAAI,iBAAiB,KAAA;AAC3D;AAEA,IAAI,yBAA+C;AAEnD,SAAgB,sBAAqC;CACnD,IAAI,OAAO,WAAW,aACpB,OAAO,QAAQ,OAAO,IAAIA,YAAAA,uBAAuB,6CAA6C,CAAC;CAGjG,IAAI,gBAAgB,GAClB,OAAO,QAAQ,QAAQ;CAGzB,2BAA2B,IAAI,SAAe,SAAS,WAAW;EAChE,MAAM,kBAAkB,QAAe;GACrC,yBAAyB;GACzB,OAAO,GAAG;EACZ;EAEA,MAAM,UAAU,iBAAiB;GAC/B,+BAAe,IAAI,MAAM,iCAAiC,CAAC;EAC7D,GAAG,gCAAgC;EAEnC,MAAM,+BAA+B;GACnC,aAAa,OAAO;GACpB,QAAQ;EACV;EAEA,MAAM,iBAAiB,SAAS,cAAiC,gBAAgB,0BAA0B,GAAG;EAC9G,IAAI,gBAAgB;GAGlB,IAAI,gBAAgB,GAAG;IACrB,uBAAuB;IACvB;GACF;GACA,eAAe,iBAAiB,cAAc,uBAAuB,GAAG,EAAE,MAAM,KAAK,CAAC;GACtF,eAAe,iBAAiB,eAAe;IAC7C,eAAe,OAAO;IACtB,aAAa,OAAO;IACpB,+BAAe,IAAI,MAAM,0BAA0B,CAAC;GACtD,GAAG,EAAE,MAAM,KAAK,CAAC;GACjB;EACF;EAEA,MAAM,SAAS,SAAS,cAAc,QAAQ;EAC9C,OAAO,MAAM,GAAG,0BAA0B;EAC1C,OAAO,QAAQ;EACf,OAAO,QAAQ;EACf,OAAO,eAAe,uBAAuB;EAC7C,OAAO,gBAAgB;GACrB,OAAO,OAAO;GACd,aAAa,OAAO;GACpB,+BAAe,IAAI,MAAM,0BAA0B,CAAC;EACtD;EACA,SAAS,KAAK,OAAO,MAAM;CAC7B,CAAC;CAED,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turnstile-flow.d.ts","names":[],"sources":["../../src/utils/turnstile-flow.ts"],"mappings":";;;cAIa,8BAAA,SAAuC,
|
|
1
|
+
{"version":3,"file":"turnstile-flow.d.ts","names":[],"sources":["../../src/utils/turnstile-flow.ts"],"mappings":";;;cAIa,8BAAA,SAAuC,KAAK;EAAL,WAAA;AAAA;AAAA,cAOvC,gCAAA,SAAyC,KAAK;cAC7C,OAAA,WAAkD,OAAA;IAAY,KAAA;EAAA;AAAA;AAAA,iBAWtD,yBAAA,CAA0B,OAAA,UAAiB,MAAA,EAAQ,eAAA,GAAkB,OAAO;AAAA,iBA0ElF,6BAAA,CAA8B,OAAA,UAAiB,MAAA,EAAQ,eAAA,GAAkB,OAAO;AAAA,KAqGpF,yBAAA;EACV,KAAA;EACA,KAAA;EACA,WAAA;AAAA;AAAA,KAGU,2BAAA;EACV,cAAA;EACA,gBAAA;EACA,MAAA,EAAQ,eAAA;EACR,OAAA,GAAU,SAAA,EAAW,yBAAA,KAA8B,OAAA,CAAQ,CAAA;EAC3D,mBAAA,GAAsB,MAAA,EAAQ,CAAA;AAAA;AAAA,iBASV,oBAAA,IAAwB,OAAA,EAAS,2BAAA,CAA4B,CAAA,IAAK,OAAA,CAAQ,CAAA"}
|
|
@@ -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 __errors_js = require("./errors.js");
|
|
4
3
|
let __turnstile_browser_js = require("./turnstile-browser.js");
|
|
5
|
-
|
|
6
4
|
//#region src/utils/turnstile-flow.ts
|
|
7
5
|
var BotChallengeUserCancelledError = class extends Error {
|
|
8
6
|
constructor() {
|
|
@@ -215,11 +213,11 @@ async function withBotChallengeFlow(options) {
|
|
|
215
213
|
phase: "visible"
|
|
216
214
|
});
|
|
217
215
|
}
|
|
218
|
-
|
|
219
216
|
//#endregion
|
|
220
217
|
exports.BotChallengeExecutionFailedError = BotChallengeExecutionFailedError;
|
|
221
218
|
exports.BotChallengeUserCancelledError = BotChallengeUserCancelledError;
|
|
222
219
|
exports.executeTurnstileInvisible = executeTurnstileInvisible;
|
|
223
220
|
exports.showTurnstileVisibleChallenge = showTurnstileVisibleChallenge;
|
|
224
221
|
exports.withBotChallengeFlow = withBotChallengeFlow;
|
|
222
|
+
|
|
225
223
|
//# sourceMappingURL=turnstile-flow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turnstile-flow.js","names":["HexclaveAssertionError"],"sources":["../../src/utils/turnstile-flow.ts"],"sourcesContent":["import { HexclaveAssertionError, captureError } from \"./errors\";\nimport { loadTurnstileScript, getTurnstileApi } from \"./turnstile-browser\";\nimport type { TurnstileAction } from \"./turnstile\";\n\nexport class BotChallengeUserCancelledError extends Error {\n constructor() {\n super(\"User cancelled the bot challenge\");\n this.name = \"BotChallengeUserCancelledError\";\n }\n}\n\nexport class BotChallengeExecutionFailedError extends Error {\n constructor(message = \"Bot challenge could not be completed\", options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"BotChallengeExecutionFailedError\";\n }\n}\n\n\n// ── Invisible challenge ────────────────────────────────────────────────\n\nconst INVISIBLE_TIMEOUT_MS = 30_000;\n\nexport async function executeTurnstileInvisible(siteKey: string, action: TurnstileAction): Promise<string> {\n await loadTurnstileScript();\n const api = getTurnstileApi();\n if (!api) throw new HexclaveAssertionError(\"Turnstile API not available after loadTurnstileScript() resolved\");\n\n const container = document.createElement(\"div\");\n Object.assign(container.style, { position: \"fixed\", left: \"-9999px\", top: \"-9999px\" });\n document.body.appendChild(container);\n\n let widgetId: string | undefined;\n try {\n return await new Promise<string>((resolve, reject) => {\n const timeout = setTimeout(\n () => reject(new Error(\"Turnstile invisible challenge timed out\")),\n INVISIBLE_TIMEOUT_MS,\n );\n const settle = (fn: () => void) => {\n clearTimeout(timeout);\n fn();\n };\n\n widgetId = api.render(container, {\n sitekey: siteKey,\n action,\n size: \"invisible\",\n execution: \"execute\",\n appearance: \"execute\",\n callback: (t) => settle(() => resolve(t)),\n \"error-callback\": () => settle(() => reject(new Error(\"Turnstile invisible verification failed\"))),\n \"expired-callback\": () => settle(() => reject(new Error(\"Turnstile token expired\"))),\n \"timeout-callback\": () => settle(() => reject(new Error(\"Turnstile challenge timed out\"))),\n });\n\n api.execute?.(widgetId);\n });\n } finally {\n if (widgetId != null) {\n try {\n api.remove(widgetId);\n } catch (e) {\n captureError(\"turnstile-widget-remove\", e instanceof Error ? e : new HexclaveAssertionError(\"Non-Error thrown during Turnstile widget removal\", { cause: e }));\n }\n }\n container.remove();\n }\n}\n\n\n// ── Visible challenge overlay ──────────────────────────────────────────\n\nconst VISIBLE_TIMEOUT_MS = 120_000;\nconst OVERLAY_Z_INDEX = \"999999\";\n\n// Module-level singleton: only one visible overlay can be active at a time.\n// If a second challenge is requested while one is showing (e.g. user clicks another\n// auth flow), the previous overlay is cancelled with BotChallengeUserCancelledError\n// and cleaned up before the new one renders.\nlet activeOverlay: { cleanup: () => void, reject: (err: Error) => void } | null = null;\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n style: Partial<CSSStyleDeclaration>,\n props?: Record<string, string>,\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tag);\n Object.assign(element.style, style);\n if (props) {\n for (const [k, v] of Object.entries(props)) {\n element.setAttribute(k, v);\n }\n }\n return element;\n}\n\nexport function showTurnstileVisibleChallenge(siteKey: string, action: TurnstileAction): Promise<string> {\n if (activeOverlay) {\n activeOverlay.reject(new BotChallengeUserCancelledError());\n activeOverlay.cleanup();\n activeOverlay = null;\n }\n\n return new Promise<string>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error(\"Visible Turnstile challenge timed out\"));\n }, VISIBLE_TIMEOUT_MS);\n\n const overlay = el(\"div\", {\n position: \"fixed\", inset: \"0\", zIndex: OVERLAY_Z_INDEX,\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n background: \"rgba(0,0,0,0.5)\", backdropFilter: \"blur(2px)\",\n }, { \"data-stack-turnstile-overlay\": \"true\" });\n\n const card = el(\"div\", {\n background: \"white\", borderRadius: \"12px\", padding: \"24px\",\n maxWidth: \"400px\", width: \"90%\", textAlign: \"center\",\n boxShadow: \"0 4px 24px rgba(0,0,0,0.18)\",\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n });\n\n const title = el(\"p\", { margin: \"0 0 16px\", fontSize: \"16px\", fontWeight: \"600\", color: \"#333\" });\n title.textContent = \"Please complete the security check\";\n\n const widgetContainer = el(\"div\", { display: \"flex\", justifyContent: \"center\", minHeight: \"65px\" });\n\n const errorText = el(\"p\", { margin: \"8px 0 0\", fontSize: \"14px\", color: \"#dc2626\", display: \"none\" });\n\n const cancelBtn = el(\"button\", {\n marginTop: \"16px\", padding: \"8px 20px\", border: \"1px solid #ddd\",\n borderRadius: \"6px\", background: \"transparent\", cursor: \"pointer\",\n fontSize: \"14px\", color: \"#666\",\n });\n cancelBtn.textContent = \"Cancel\";\n cancelBtn.onmouseover = () => {\n cancelBtn.style.background = \"#f5f5f5\";\n };\n cancelBtn.onmouseout = () => {\n cancelBtn.style.background = \"transparent\";\n };\n\n card.append(title, widgetContainer, errorText, cancelBtn);\n overlay.appendChild(card);\n document.body.appendChild(overlay);\n\n function cleanup() {\n clearTimeout(timeout);\n overlay.remove();\n if (activeOverlay?.cleanup === cleanup) {\n activeOverlay = null;\n }\n }\n\n activeOverlay = { cleanup, reject };\n cancelBtn.onclick = () => {\n cleanup();\n reject(new BotChallengeUserCancelledError());\n };\n\n loadTurnstileScript().then(() => {\n const api = getTurnstileApi();\n if (!api) {\n cleanup();\n reject(new HexclaveAssertionError(\"Turnstile API not available after loadTurnstileScript() resolved\"));\n return;\n }\n\n api.render(widgetContainer, {\n sitekey: siteKey,\n action,\n appearance: \"always\",\n execution: \"render\",\n size: \"flexible\",\n callback: (token) => {\n cleanup();\n resolve(token);\n },\n \"error-callback\": (errorCode) => {\n errorText.textContent = errorCode ? `Verification error: ${errorCode}` : \"Verification failed. Please try again.\";\n errorText.style.display = \"block\";\n },\n \"expired-callback\": () => {\n errorText.textContent = \"Challenge expired. Please solve it again.\";\n errorText.style.display = \"block\";\n },\n });\n }).catch((err) => {\n cleanup();\n reject(err);\n });\n });\n}\n\n\n// ── Flow orchestrator ──────────────────────────────────────────────────\n\nexport type BotChallengeExecuteParams = {\n token?: string,\n phase?: \"invisible\" | \"visible\",\n unavailable?: true,\n};\n\nexport type WithBotChallengeFlowOptions<T> = {\n visibleSiteKey: string,\n invisibleSiteKey: string,\n action: TurnstileAction,\n execute: (challenge: BotChallengeExecuteParams) => Promise<T>,\n isChallengeRequired: (result: T) => boolean,\n};\n\n// We use separate invisible + visible flows (rather than Turnstile's \"managed\" mode) because:\n// 1. Managed mode auto-decides visibility, but we need deterministic server-side logic:\n// invisible-fail → require visible challenge → fail = block.\n// 2. Invisible + visible use different site keys so the server can tell which phase passed.\n// 3. Managed mode doesn't expose an API to programmatically trigger a retry with a\n// different widget type, which our two-phase challenge escalation requires.\nexport async function withBotChallengeFlow<T>(options: WithBotChallengeFlowOptions<T>): Promise<T> {\n // Server safe: no Turnstile in SSR — just call execute with no turnstile params\n if (typeof window === \"undefined\") {\n return await options.execute({});\n }\n\n // Phase 1: invisible token\n let invisibleToken: string | undefined;\n let usedVisibleFallback = false;\n try {\n invisibleToken = await executeTurnstileInvisible(options.invisibleSiteKey, options.action);\n } catch {\n try {\n invisibleToken = await showTurnstileVisibleChallenge(options.visibleSiteKey, options.action);\n usedVisibleFallback = true;\n } catch (e) {\n if (e instanceof BotChallengeUserCancelledError) throw e;\n // Both challenges failed (for example Cloudflare is unreachable) — tell the\n // server explicitly so it can distinguish challenge infra outages from a\n // user submitting an invalid visible challenge.\n captureError(\"turnstile-flow-all-challenges-failed\", e instanceof Error ? e : new HexclaveAssertionError(\"Non-Error thrown during Turnstile challenge\", { cause: e }));\n return await options.execute({ unavailable: true });\n }\n }\n\n const firstResult = await options.execute({\n token: invisibleToken,\n phase: invisibleToken ? (usedVisibleFallback ? \"visible\" : \"invisible\") : undefined,\n });\n\n if (!options.isChallengeRequired(firstResult)) {\n return firstResult;\n }\n\n // Phase 2: visible challenge (single retry)\n let visibleToken: string | undefined;\n try {\n visibleToken = await showTurnstileVisibleChallenge(options.visibleSiteKey, options.action);\n } catch (e) {\n if (e instanceof BotChallengeUserCancelledError) throw e;\n captureError(\"turnstile-flow-visible-challenge-failed\", e instanceof Error ? e : new HexclaveAssertionError(\"Non-Error thrown during visible Turnstile challenge\", { cause: e }));\n throw new BotChallengeExecutionFailedError(\"Visible bot challenge could not be completed\", {\n cause: e,\n });\n }\n\n return await options.execute({ token: visibleToken, phase: \"visible\" });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"turnstile-flow.js","names":["HexclaveAssertionError"],"sources":["../../src/utils/turnstile-flow.ts"],"sourcesContent":["import { HexclaveAssertionError, captureError } from \"./errors\";\nimport { loadTurnstileScript, getTurnstileApi } from \"./turnstile-browser\";\nimport type { TurnstileAction } from \"./turnstile\";\n\nexport class BotChallengeUserCancelledError extends Error {\n constructor() {\n super(\"User cancelled the bot challenge\");\n this.name = \"BotChallengeUserCancelledError\";\n }\n}\n\nexport class BotChallengeExecutionFailedError extends Error {\n constructor(message = \"Bot challenge could not be completed\", options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"BotChallengeExecutionFailedError\";\n }\n}\n\n\n// ── Invisible challenge ────────────────────────────────────────────────\n\nconst INVISIBLE_TIMEOUT_MS = 30_000;\n\nexport async function executeTurnstileInvisible(siteKey: string, action: TurnstileAction): Promise<string> {\n await loadTurnstileScript();\n const api = getTurnstileApi();\n if (!api) throw new HexclaveAssertionError(\"Turnstile API not available after loadTurnstileScript() resolved\");\n\n const container = document.createElement(\"div\");\n Object.assign(container.style, { position: \"fixed\", left: \"-9999px\", top: \"-9999px\" });\n document.body.appendChild(container);\n\n let widgetId: string | undefined;\n try {\n return await new Promise<string>((resolve, reject) => {\n const timeout = setTimeout(\n () => reject(new Error(\"Turnstile invisible challenge timed out\")),\n INVISIBLE_TIMEOUT_MS,\n );\n const settle = (fn: () => void) => {\n clearTimeout(timeout);\n fn();\n };\n\n widgetId = api.render(container, {\n sitekey: siteKey,\n action,\n size: \"invisible\",\n execution: \"execute\",\n appearance: \"execute\",\n callback: (t) => settle(() => resolve(t)),\n \"error-callback\": () => settle(() => reject(new Error(\"Turnstile invisible verification failed\"))),\n \"expired-callback\": () => settle(() => reject(new Error(\"Turnstile token expired\"))),\n \"timeout-callback\": () => settle(() => reject(new Error(\"Turnstile challenge timed out\"))),\n });\n\n api.execute?.(widgetId);\n });\n } finally {\n if (widgetId != null) {\n try {\n api.remove(widgetId);\n } catch (e) {\n captureError(\"turnstile-widget-remove\", e instanceof Error ? e : new HexclaveAssertionError(\"Non-Error thrown during Turnstile widget removal\", { cause: e }));\n }\n }\n container.remove();\n }\n}\n\n\n// ── Visible challenge overlay ──────────────────────────────────────────\n\nconst VISIBLE_TIMEOUT_MS = 120_000;\nconst OVERLAY_Z_INDEX = \"999999\";\n\n// Module-level singleton: only one visible overlay can be active at a time.\n// If a second challenge is requested while one is showing (e.g. user clicks another\n// auth flow), the previous overlay is cancelled with BotChallengeUserCancelledError\n// and cleaned up before the new one renders.\nlet activeOverlay: { cleanup: () => void, reject: (err: Error) => void } | null = null;\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n style: Partial<CSSStyleDeclaration>,\n props?: Record<string, string>,\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tag);\n Object.assign(element.style, style);\n if (props) {\n for (const [k, v] of Object.entries(props)) {\n element.setAttribute(k, v);\n }\n }\n return element;\n}\n\nexport function showTurnstileVisibleChallenge(siteKey: string, action: TurnstileAction): Promise<string> {\n if (activeOverlay) {\n activeOverlay.reject(new BotChallengeUserCancelledError());\n activeOverlay.cleanup();\n activeOverlay = null;\n }\n\n return new Promise<string>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error(\"Visible Turnstile challenge timed out\"));\n }, VISIBLE_TIMEOUT_MS);\n\n const overlay = el(\"div\", {\n position: \"fixed\", inset: \"0\", zIndex: OVERLAY_Z_INDEX,\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n background: \"rgba(0,0,0,0.5)\", backdropFilter: \"blur(2px)\",\n }, { \"data-stack-turnstile-overlay\": \"true\" });\n\n const card = el(\"div\", {\n background: \"white\", borderRadius: \"12px\", padding: \"24px\",\n maxWidth: \"400px\", width: \"90%\", textAlign: \"center\",\n boxShadow: \"0 4px 24px rgba(0,0,0,0.18)\",\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n });\n\n const title = el(\"p\", { margin: \"0 0 16px\", fontSize: \"16px\", fontWeight: \"600\", color: \"#333\" });\n title.textContent = \"Please complete the security check\";\n\n const widgetContainer = el(\"div\", { display: \"flex\", justifyContent: \"center\", minHeight: \"65px\" });\n\n const errorText = el(\"p\", { margin: \"8px 0 0\", fontSize: \"14px\", color: \"#dc2626\", display: \"none\" });\n\n const cancelBtn = el(\"button\", {\n marginTop: \"16px\", padding: \"8px 20px\", border: \"1px solid #ddd\",\n borderRadius: \"6px\", background: \"transparent\", cursor: \"pointer\",\n fontSize: \"14px\", color: \"#666\",\n });\n cancelBtn.textContent = \"Cancel\";\n cancelBtn.onmouseover = () => {\n cancelBtn.style.background = \"#f5f5f5\";\n };\n cancelBtn.onmouseout = () => {\n cancelBtn.style.background = \"transparent\";\n };\n\n card.append(title, widgetContainer, errorText, cancelBtn);\n overlay.appendChild(card);\n document.body.appendChild(overlay);\n\n function cleanup() {\n clearTimeout(timeout);\n overlay.remove();\n if (activeOverlay?.cleanup === cleanup) {\n activeOverlay = null;\n }\n }\n\n activeOverlay = { cleanup, reject };\n cancelBtn.onclick = () => {\n cleanup();\n reject(new BotChallengeUserCancelledError());\n };\n\n loadTurnstileScript().then(() => {\n const api = getTurnstileApi();\n if (!api) {\n cleanup();\n reject(new HexclaveAssertionError(\"Turnstile API not available after loadTurnstileScript() resolved\"));\n return;\n }\n\n api.render(widgetContainer, {\n sitekey: siteKey,\n action,\n appearance: \"always\",\n execution: \"render\",\n size: \"flexible\",\n callback: (token) => {\n cleanup();\n resolve(token);\n },\n \"error-callback\": (errorCode) => {\n errorText.textContent = errorCode ? `Verification error: ${errorCode}` : \"Verification failed. Please try again.\";\n errorText.style.display = \"block\";\n },\n \"expired-callback\": () => {\n errorText.textContent = \"Challenge expired. Please solve it again.\";\n errorText.style.display = \"block\";\n },\n });\n }).catch((err) => {\n cleanup();\n reject(err);\n });\n });\n}\n\n\n// ── Flow orchestrator ──────────────────────────────────────────────────\n\nexport type BotChallengeExecuteParams = {\n token?: string,\n phase?: \"invisible\" | \"visible\",\n unavailable?: true,\n};\n\nexport type WithBotChallengeFlowOptions<T> = {\n visibleSiteKey: string,\n invisibleSiteKey: string,\n action: TurnstileAction,\n execute: (challenge: BotChallengeExecuteParams) => Promise<T>,\n isChallengeRequired: (result: T) => boolean,\n};\n\n// We use separate invisible + visible flows (rather than Turnstile's \"managed\" mode) because:\n// 1. Managed mode auto-decides visibility, but we need deterministic server-side logic:\n// invisible-fail → require visible challenge → fail = block.\n// 2. Invisible + visible use different site keys so the server can tell which phase passed.\n// 3. Managed mode doesn't expose an API to programmatically trigger a retry with a\n// different widget type, which our two-phase challenge escalation requires.\nexport async function withBotChallengeFlow<T>(options: WithBotChallengeFlowOptions<T>): Promise<T> {\n // Server safe: no Turnstile in SSR — just call execute with no turnstile params\n if (typeof window === \"undefined\") {\n return await options.execute({});\n }\n\n // Phase 1: invisible token\n let invisibleToken: string | undefined;\n let usedVisibleFallback = false;\n try {\n invisibleToken = await executeTurnstileInvisible(options.invisibleSiteKey, options.action);\n } catch {\n try {\n invisibleToken = await showTurnstileVisibleChallenge(options.visibleSiteKey, options.action);\n usedVisibleFallback = true;\n } catch (e) {\n if (e instanceof BotChallengeUserCancelledError) throw e;\n // Both challenges failed (for example Cloudflare is unreachable) — tell the\n // server explicitly so it can distinguish challenge infra outages from a\n // user submitting an invalid visible challenge.\n captureError(\"turnstile-flow-all-challenges-failed\", e instanceof Error ? e : new HexclaveAssertionError(\"Non-Error thrown during Turnstile challenge\", { cause: e }));\n return await options.execute({ unavailable: true });\n }\n }\n\n const firstResult = await options.execute({\n token: invisibleToken,\n phase: invisibleToken ? (usedVisibleFallback ? \"visible\" : \"invisible\") : undefined,\n });\n\n if (!options.isChallengeRequired(firstResult)) {\n return firstResult;\n }\n\n // Phase 2: visible challenge (single retry)\n let visibleToken: string | undefined;\n try {\n visibleToken = await showTurnstileVisibleChallenge(options.visibleSiteKey, options.action);\n } catch (e) {\n if (e instanceof BotChallengeUserCancelledError) throw e;\n captureError(\"turnstile-flow-visible-challenge-failed\", e instanceof Error ? e : new HexclaveAssertionError(\"Non-Error thrown during visible Turnstile challenge\", { cause: e }));\n throw new BotChallengeExecutionFailedError(\"Visible bot challenge could not be completed\", {\n cause: e,\n });\n }\n\n return await options.execute({ token: visibleToken, phase: \"visible\" });\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
2
1
|
let vitest = require("vitest");
|
|
3
|
-
|
|
4
2
|
//#region src/utils/turnstile-flow.test.ts
|
|
5
3
|
// @vitest-environment jsdom
|
|
6
4
|
const loadTurnstileScriptMock = vitest.vi.fn(() => Promise.resolve());
|
|
@@ -70,6 +68,6 @@ vitest.vi.mock("./errors", async () => {
|
|
|
70
68
|
(0, vitest.expect)(captureErrorMock).toHaveBeenCalledWith("turnstile-flow-all-challenges-failed", vitest.expect.any(Error));
|
|
71
69
|
});
|
|
72
70
|
});
|
|
73
|
-
|
|
74
71
|
//#endregion
|
|
72
|
+
|
|
75
73
|
//# sourceMappingURL=turnstile-flow.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turnstile-flow.test.js","names":["vi","expect"],"sources":["../../src/utils/turnstile-flow.test.ts"],"sourcesContent":["// @vitest-environment jsdom\n\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst loadTurnstileScriptMock = vi.fn(() => Promise.resolve());\nconst renderMock = vi.fn();\nconst executeMock = vi.fn();\nconst removeMock = vi.fn();\nconst captureErrorMock = vi.fn();\n\nvi.mock(\"./turnstile-browser\", () => ({\n loadTurnstileScript: loadTurnstileScriptMock,\n getTurnstileApi: () => ({\n render: renderMock,\n execute: executeMock,\n remove: removeMock,\n }),\n}));\n\nvi.mock(\"./errors\", async () => {\n const actual = await vi.importActual<typeof import(\"./errors\")>(\"./errors\");\n return {\n ...actual,\n captureError: captureErrorMock,\n };\n});\n\ndescribe(\"withBotChallengeFlow\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n loadTurnstileScriptMock.mockResolvedValue(undefined);\n renderMock.mockImplementation((_container, config: {\n callback: (token: string) => void,\n }) => {\n config.callback(\"invisible-token\");\n return \"widget-id\";\n });\n executeMock.mockImplementation(() => {});\n removeMock.mockImplementation(() => {});\n });\n\n it(\"throws a bot challenge execution error when the phase-2 visible challenge fails\", async () => {\n const { BotChallengeExecutionFailedError, withBotChallengeFlow } = await import(\"./turnstile-flow\");\n\n loadTurnstileScriptMock\n .mockResolvedValueOnce(undefined)\n .mockRejectedValueOnce(new Error(\"cloudflare unavailable\"));\n\n const execute = vi.fn(async ({ token, phase }: { token?: string, phase?: \"invisible\" | \"visible\" }) => {\n if (token === \"invisible-token\" && phase === \"invisible\") {\n return { requiresChallenge: true };\n }\n return { requiresChallenge: false };\n });\n\n await expect(withBotChallengeFlow({\n visibleSiteKey: \"visible-site-key\",\n invisibleSiteKey: \"invisible-site-key\",\n action: \"sign_up_with_credential\",\n execute,\n isChallengeRequired: (result) => result.requiresChallenge,\n })).rejects.toBeInstanceOf(BotChallengeExecutionFailedError);\n\n expect(execute).toHaveBeenCalledTimes(1);\n expect(execute).toHaveBeenCalledWith({\n token: \"invisible-token\",\n phase: \"invisible\",\n });\n expect(captureErrorMock).toHaveBeenCalledWith(\n \"turnstile-flow-visible-challenge-failed\",\n expect.any(Error),\n );\n });\n\n it(\"marks the challenge as unavailable when both phase-1 challenge attempts fail\", async () => {\n const { withBotChallengeFlow } = await import(\"./turnstile-flow\");\n\n loadTurnstileScriptMock\n .mockRejectedValueOnce(new Error(\"invisible unavailable\"))\n .mockRejectedValueOnce(new Error(\"visible unavailable\"));\n\n const execute = vi.fn(async ({ unavailable }: { unavailable?: true }) => ({\n unavailable,\n }));\n\n await expect(withBotChallengeFlow({\n visibleSiteKey: \"visible-site-key\",\n invisibleSiteKey: \"invisible-site-key\",\n action: \"sign_up_with_credential\",\n execute,\n isChallengeRequired: () => false,\n })).resolves.toEqual({ unavailable: true });\n\n expect(execute).toHaveBeenCalledTimes(1);\n expect(execute).toHaveBeenCalledWith({ unavailable: true });\n expect(captureErrorMock).toHaveBeenCalledWith(\n \"turnstile-flow-all-challenges-failed\",\n expect.any(Error),\n );\n });\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"turnstile-flow.test.js","names":["vi","expect"],"sources":["../../src/utils/turnstile-flow.test.ts"],"sourcesContent":["// @vitest-environment jsdom\n\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst loadTurnstileScriptMock = vi.fn(() => Promise.resolve());\nconst renderMock = vi.fn();\nconst executeMock = vi.fn();\nconst removeMock = vi.fn();\nconst captureErrorMock = vi.fn();\n\nvi.mock(\"./turnstile-browser\", () => ({\n loadTurnstileScript: loadTurnstileScriptMock,\n getTurnstileApi: () => ({\n render: renderMock,\n execute: executeMock,\n remove: removeMock,\n }),\n}));\n\nvi.mock(\"./errors\", async () => {\n const actual = await vi.importActual<typeof import(\"./errors\")>(\"./errors\");\n return {\n ...actual,\n captureError: captureErrorMock,\n };\n});\n\ndescribe(\"withBotChallengeFlow\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n loadTurnstileScriptMock.mockResolvedValue(undefined);\n renderMock.mockImplementation((_container, config: {\n callback: (token: string) => void,\n }) => {\n config.callback(\"invisible-token\");\n return \"widget-id\";\n });\n executeMock.mockImplementation(() => {});\n removeMock.mockImplementation(() => {});\n });\n\n it(\"throws a bot challenge execution error when the phase-2 visible challenge fails\", async () => {\n const { BotChallengeExecutionFailedError, withBotChallengeFlow } = await import(\"./turnstile-flow\");\n\n loadTurnstileScriptMock\n .mockResolvedValueOnce(undefined)\n .mockRejectedValueOnce(new Error(\"cloudflare unavailable\"));\n\n const execute = vi.fn(async ({ token, phase }: { token?: string, phase?: \"invisible\" | \"visible\" }) => {\n if (token === \"invisible-token\" && phase === \"invisible\") {\n return { requiresChallenge: true };\n }\n return { requiresChallenge: false };\n });\n\n await expect(withBotChallengeFlow({\n visibleSiteKey: \"visible-site-key\",\n invisibleSiteKey: \"invisible-site-key\",\n action: \"sign_up_with_credential\",\n execute,\n isChallengeRequired: (result) => result.requiresChallenge,\n })).rejects.toBeInstanceOf(BotChallengeExecutionFailedError);\n\n expect(execute).toHaveBeenCalledTimes(1);\n expect(execute).toHaveBeenCalledWith({\n token: \"invisible-token\",\n phase: \"invisible\",\n });\n expect(captureErrorMock).toHaveBeenCalledWith(\n \"turnstile-flow-visible-challenge-failed\",\n expect.any(Error),\n );\n });\n\n it(\"marks the challenge as unavailable when both phase-1 challenge attempts fail\", async () => {\n const { withBotChallengeFlow } = await import(\"./turnstile-flow\");\n\n loadTurnstileScriptMock\n .mockRejectedValueOnce(new Error(\"invisible unavailable\"))\n .mockRejectedValueOnce(new Error(\"visible unavailable\"));\n\n const execute = vi.fn(async ({ unavailable }: { unavailable?: true }) => ({\n unavailable,\n }));\n\n await expect(withBotChallengeFlow({\n visibleSiteKey: \"visible-site-key\",\n invisibleSiteKey: \"invisible-site-key\",\n action: \"sign_up_with_credential\",\n execute,\n isChallengeRequired: () => false,\n })).resolves.toEqual({ unavailable: true });\n\n expect(execute).toHaveBeenCalledTimes(1);\n expect(execute).toHaveBeenCalledWith({ unavailable: true });\n expect(captureErrorMock).toHaveBeenCalledWith(\n \"turnstile-flow-all-challenges-failed\",\n expect.any(Error),\n );\n });\n});\n"],"mappings":";;;AAIA,MAAM,0BAA0BA,OAAAA,GAAG,SAAS,QAAQ,QAAQ,CAAC;AAC7D,MAAM,aAAaA,OAAAA,GAAG,GAAG;AACzB,MAAM,cAAcA,OAAAA,GAAG,GAAG;AAC1B,MAAM,aAAaA,OAAAA,GAAG,GAAG;AACzB,MAAM,mBAAmBA,OAAAA,GAAG,GAAG;AAE/BA,OAAAA,GAAG,KAAK,8BAA8B;CACpC,qBAAqB;CACrB,wBAAwB;EACtB,QAAQ;EACR,SAAS;EACT,QAAQ;CACV;AACF,EAAE;AAEFA,OAAAA,GAAG,KAAK,YAAY,YAAY;CAE9B,OAAO;EACL,GAAG,MAFgBA,OAAAA,GAAG,aAAwC,UAAU;EAGxE,cAAc;CAChB;AACF,CAAC;qBAEQ,8BAA8B;CACrC,CAAA,GAAA,OAAA,WAAA,OAAiB;EACf,OAAA,GAAG,cAAc;EACjB,wBAAwB,kBAAkB,KAAA,CAAS;EACnD,WAAW,oBAAoB,YAAY,WAErC;GACJ,OAAO,SAAS,iBAAiB;GACjC,OAAO;EACT,CAAC;EACD,YAAY,yBAAyB,CAAC,CAAC;EACvC,WAAW,yBAAyB,CAAC,CAAC;CACxC,CAAC;CAED,CAAA,GAAA,OAAA,GAAA,CAAG,mFAAmF,YAAY;EAChG,MAAM,EAAE,kCAAkC,yBAAyB,MAAM,OAAO;EAEhF,wBACG,sBAAsB,KAAA,CAAS,CAAC,CAChC,sCAAsB,IAAI,MAAM,wBAAwB,CAAC;EAE5D,MAAM,UAAUA,OAAAA,GAAG,GAAG,OAAO,EAAE,OAAO,YAAiE;GACrG,IAAI,UAAU,qBAAqB,UAAU,aAC3C,OAAO,EAAE,mBAAmB,KAAK;GAEnC,OAAO,EAAE,mBAAmB,MAAM;EACpC,CAAC;EAED,OAAA,GAAA,OAAA,OAAA,CAAa,qBAAqB;GAChC,gBAAgB;GAChB,kBAAkB;GAClB,QAAQ;GACR;GACA,sBAAsB,WAAW,OAAO;EAC1C,CAAC,CAAC,CAAC,CAAC,QAAQ,eAAe,gCAAgC;EAE3D,CAAA,GAAA,OAAA,OAAA,CAAO,OAAO,CAAC,CAAC,sBAAsB,CAAC;EACvC,CAAA,GAAA,OAAA,OAAA,CAAO,OAAO,CAAC,CAAC,qBAAqB;GACnC,OAAO;GACP,OAAO;EACT,CAAC;EACD,CAAA,GAAA,OAAA,OAAA,CAAO,gBAAgB,CAAC,CAAC,qBACvB,2CACAC,OAAAA,OAAO,IAAI,KAAK,CAClB;CACF,CAAC;CAED,CAAA,GAAA,OAAA,GAAA,CAAG,gFAAgF,YAAY;EAC7F,MAAM,EAAE,yBAAyB,MAAM,OAAO;EAE9C,wBACG,sCAAsB,IAAI,MAAM,uBAAuB,CAAC,CAAC,CACzD,sCAAsB,IAAI,MAAM,qBAAqB,CAAC;EAEzD,MAAM,UAAUD,OAAAA,GAAG,GAAG,OAAO,EAAE,mBAA2C,EACxE,YACF,EAAE;EAEF,OAAA,GAAA,OAAA,OAAA,CAAa,qBAAqB;GAChC,gBAAgB;GAChB,kBAAkB;GAClB,QAAQ;GACR;GACA,2BAA2B;EAC7B,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,EAAE,aAAa,KAAK,CAAC;EAE1C,CAAA,GAAA,OAAA,OAAA,CAAO,OAAO,CAAC,CAAC,sBAAsB,CAAC;EACvC,CAAA,GAAA,OAAA,OAAA,CAAO,OAAO,CAAC,CAAC,qBAAqB,EAAE,aAAa,KAAK,CAAC;EAC1D,CAAA,GAAA,OAAA,OAAA,CAAO,gBAAgB,CAAC,CAAC,qBACvB,wCACAC,OAAAA,OAAO,IAAI,KAAK,CAClB;CACF,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turnstile.d.ts","names":[],"sources":["../../src/utils/turnstile.ts"],"mappings":";cAAa,qBAAA;AAAA,KAMD,eAAA,UAAyB,
|
|
1
|
+
{"version":3,"file":"turnstile.d.ts","names":[],"sources":["../../src/utils/turnstile.ts"],"mappings":";cAAa,qBAAA;AAAA,KAMD,eAAA,UAAyB,qBAAqB;AAAA,cAE7C,oBAAA;AAAA,KAKD,cAAA,UAAwB,oBAAoB;AAAA,cAE3C,qBAAA;AAAA,KAMD,eAAA,UAAyB,qBAAqB;AAAA,cAE7C,wBAAA;EAAA;;;;;iBAQG,iBAAA,CAAkB,KAAA,YAAiB,KAAA,IAAS,eAAe"}
|
package/dist/utils/turnstile.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value:
|
|
2
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
2
|
//#region src/utils/turnstile.ts
|
|
4
3
|
const turnstileActionValues = [
|
|
5
4
|
"sign_up_with_credential",
|
|
@@ -21,11 +20,11 @@ const turnstileDevelopmentKeys = {
|
|
|
21
20
|
function isTurnstileResult(value) {
|
|
22
21
|
return typeof value === "string" && turnstileResultValues.some((status) => status === value);
|
|
23
22
|
}
|
|
24
|
-
|
|
25
23
|
//#endregion
|
|
26
24
|
exports.isTurnstileResult = isTurnstileResult;
|
|
27
25
|
exports.turnstileActionValues = turnstileActionValues;
|
|
28
26
|
exports.turnstileDevelopmentKeys = turnstileDevelopmentKeys;
|
|
29
27
|
exports.turnstilePhaseValues = turnstilePhaseValues;
|
|
30
28
|
exports.turnstileResultValues = turnstileResultValues;
|
|
29
|
+
|
|
31
30
|
//# sourceMappingURL=turnstile.js.map
|