@hexclave/shared 1.0.40 → 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 +3 -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 +1 -2
- package/dist/esm/ai/unified-prompts/reminders.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +26 -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 +81 -82
- 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 +2 -2
- 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 +11 -11
- 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 +11 -13
- 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 +10 -12
- 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 +16 -17
- 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 +3 -4
- 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 +28 -30
- 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 +14 -16
- 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 +12 -14
- 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 +5 -6
- 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.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 +3 -3
- 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 +1 -1
- 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 +11 -11
- 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/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.ts +1 -0
- 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":"http.js","names":[],"sources":["../../../src/utils/http.tsx"],"sourcesContent":["import { decodeBase64, encodeBase64, isBase64 } from \"./bytes\";\n\nexport const HTTP_METHODS = {\n \"GET\": {\n safe: true,\n idempotent: true,\n },\n \"POST\": {\n safe: false,\n idempotent: false,\n },\n \"PUT\": {\n safe: false,\n idempotent: true,\n },\n \"DELETE\": {\n safe: false,\n idempotent: true,\n },\n \"PATCH\": {\n safe: false,\n idempotent: false,\n },\n \"OPTIONS\": {\n safe: true,\n idempotent: true,\n },\n \"HEAD\": {\n safe: true,\n idempotent: true,\n },\n \"TRACE\": {\n safe: true,\n idempotent: true,\n },\n \"CONNECT\": {\n safe: false,\n idempotent: false,\n },\n} as const;\nexport type HttpMethod = keyof typeof HTTP_METHODS;\n\nexport function decodeBasicAuthorizationHeader(value: string): [string, string] | null {\n const [type, encoded, ...rest] = value.split(' ');\n if (rest.length > 0) return null;\n if (!encoded) return null;\n if (type !== 'Basic') return null;\n if (!isBase64(encoded)) return null;\n const decoded = new TextDecoder().decode(decodeBase64(encoded));\n const split = decoded.split(':');\n return [split[0], split.slice(1).join(':')];\n}\nimport.meta.vitest?.test(\"decodeBasicAuthorizationHeader\", ({ expect }) => {\n // Test with valid Basic Authorization header\n const username = \"user\";\n const password = \"pass\";\n const encoded = encodeBasicAuthorizationHeader(username, password);\n expect(decodeBasicAuthorizationHeader(encoded)).toEqual([username, password]);\n\n // Test with password containing colons\n const complexPassword = \"pass:with:colons\";\n const encodedComplex = encodeBasicAuthorizationHeader(username, complexPassword);\n expect(decodeBasicAuthorizationHeader(encodedComplex)).toEqual([username, complexPassword]);\n\n // Test with invalid headers\n expect(decodeBasicAuthorizationHeader(\"NotBasic dXNlcjpwYXNz\")).toBe(null); // Wrong type\n expect(decodeBasicAuthorizationHeader(\"Basic\")).toBe(null); // Missing encoded part\n expect(decodeBasicAuthorizationHeader(\"Basic not-base64\")).toBe(null); // Not base64\n expect(decodeBasicAuthorizationHeader(\"Basic dXNlcjpwYXNz extra\")).toBe(null); // Extra parts\n});\n\nexport function encodeBasicAuthorizationHeader(id: string, password: string): string {\n if (id.includes(':')) throw new Error(\"Basic authorization header id cannot contain ':'\");\n return `Basic ${encodeBase64(new TextEncoder().encode(`${id}:${password}`))}`;\n}\nimport.meta.vitest?.test(\"encodeBasicAuthorizationHeader\", ({ expect }) => {\n // Test with simple username and password\n const encoded = encodeBasicAuthorizationHeader(\"user\", \"pass\");\n expect(encoded).toMatch(/^Basic [A-Za-z0-9+/=]+$/); // Should start with \"Basic \" followed by base64\n\n // Test with empty password\n const encodedEmptyPass = encodeBasicAuthorizationHeader(\"user\", \"\");\n expect(encodedEmptyPass).toMatch(/^Basic [A-Za-z0-9+/=]+$/);\n\n // Test with password containing special characters\n const encodedSpecialChars = encodeBasicAuthorizationHeader(\"user\", \"p@ss!w0rd\");\n expect(encodedSpecialChars).toMatch(/^Basic [A-Za-z0-9+/=]+$/);\n\n // Test with username containing colon should throw\n expect(() => encodeBasicAuthorizationHeader(\"user:name\", \"pass\")).toThrow();\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"http.js","names":[],"sources":["../../../src/utils/http.tsx"],"sourcesContent":["import { decodeBase64, encodeBase64, isBase64 } from \"./bytes\";\n\nexport const HTTP_METHODS = {\n \"GET\": {\n safe: true,\n idempotent: true,\n },\n \"POST\": {\n safe: false,\n idempotent: false,\n },\n \"PUT\": {\n safe: false,\n idempotent: true,\n },\n \"DELETE\": {\n safe: false,\n idempotent: true,\n },\n \"PATCH\": {\n safe: false,\n idempotent: false,\n },\n \"OPTIONS\": {\n safe: true,\n idempotent: true,\n },\n \"HEAD\": {\n safe: true,\n idempotent: true,\n },\n \"TRACE\": {\n safe: true,\n idempotent: true,\n },\n \"CONNECT\": {\n safe: false,\n idempotent: false,\n },\n} as const;\nexport type HttpMethod = keyof typeof HTTP_METHODS;\n\nexport function decodeBasicAuthorizationHeader(value: string): [string, string] | null {\n const [type, encoded, ...rest] = value.split(' ');\n if (rest.length > 0) return null;\n if (!encoded) return null;\n if (type !== 'Basic') return null;\n if (!isBase64(encoded)) return null;\n const decoded = new TextDecoder().decode(decodeBase64(encoded));\n const split = decoded.split(':');\n return [split[0], split.slice(1).join(':')];\n}\nimport.meta.vitest?.test(\"decodeBasicAuthorizationHeader\", ({ expect }) => {\n // Test with valid Basic Authorization header\n const username = \"user\";\n const password = \"pass\";\n const encoded = encodeBasicAuthorizationHeader(username, password);\n expect(decodeBasicAuthorizationHeader(encoded)).toEqual([username, password]);\n\n // Test with password containing colons\n const complexPassword = \"pass:with:colons\";\n const encodedComplex = encodeBasicAuthorizationHeader(username, complexPassword);\n expect(decodeBasicAuthorizationHeader(encodedComplex)).toEqual([username, complexPassword]);\n\n // Test with invalid headers\n expect(decodeBasicAuthorizationHeader(\"NotBasic dXNlcjpwYXNz\")).toBe(null); // Wrong type\n expect(decodeBasicAuthorizationHeader(\"Basic\")).toBe(null); // Missing encoded part\n expect(decodeBasicAuthorizationHeader(\"Basic not-base64\")).toBe(null); // Not base64\n expect(decodeBasicAuthorizationHeader(\"Basic dXNlcjpwYXNz extra\")).toBe(null); // Extra parts\n});\n\nexport function encodeBasicAuthorizationHeader(id: string, password: string): string {\n if (id.includes(':')) throw new Error(\"Basic authorization header id cannot contain ':'\");\n return `Basic ${encodeBase64(new TextEncoder().encode(`${id}:${password}`))}`;\n}\nimport.meta.vitest?.test(\"encodeBasicAuthorizationHeader\", ({ expect }) => {\n // Test with simple username and password\n const encoded = encodeBasicAuthorizationHeader(\"user\", \"pass\");\n expect(encoded).toMatch(/^Basic [A-Za-z0-9+/=]+$/); // Should start with \"Basic \" followed by base64\n\n // Test with empty password\n const encodedEmptyPass = encodeBasicAuthorizationHeader(\"user\", \"\");\n expect(encodedEmptyPass).toMatch(/^Basic [A-Za-z0-9+/=]+$/);\n\n // Test with password containing special characters\n const encodedSpecialChars = encodeBasicAuthorizationHeader(\"user\", \"p@ss!w0rd\");\n expect(encodedSpecialChars).toMatch(/^Basic [A-Za-z0-9+/=]+$/);\n\n // Test with username containing colon should throw\n expect(() => encodeBasicAuthorizationHeader(\"user:name\", \"pass\")).toThrow();\n});\n"],"mappings":";;AAEA,MAAa,eAAe;CAC1B,OAAO;EACL,MAAM;EACN,YAAY;CACd;CACA,QAAQ;EACN,MAAM;EACN,YAAY;CACd;CACA,OAAO;EACL,MAAM;EACN,YAAY;CACd;CACA,UAAU;EACR,MAAM;EACN,YAAY;CACd;CACA,SAAS;EACP,MAAM;EACN,YAAY;CACd;CACA,WAAW;EACT,MAAM;EACN,YAAY;CACd;CACA,QAAQ;EACN,MAAM;EACN,YAAY;CACd;CACA,SAAS;EACP,MAAM;EACN,YAAY;CACd;CACA,WAAW;EACT,MAAM;EACN,YAAY;CACd;AACF;AAGA,SAAgB,+BAA+B,OAAwC;CACrF,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,MAAM,MAAM,GAAG;CAChD,IAAI,KAAK,SAAS,GAAG,OAAO;CAC5B,IAAI,CAAC,SAAS,OAAO;CACrB,IAAI,SAAS,SAAS,OAAO;CAC7B,IAAI,CAAC,SAAS,OAAO,GAAG,OAAO;CAE/B,MAAM,QADU,IAAI,YAAY,CAAC,CAAC,OAAO,aAAa,OAAO,CACzC,CAAC,CAAC,MAAM,GAAG;CAC/B,OAAO,CAAC,MAAM,IAAI,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;AAC5C;AAoBA,SAAgB,+BAA+B,IAAY,UAA0B;CACnF,IAAI,GAAG,SAAS,GAAG,GAAG,MAAM,IAAI,MAAM,kDAAkD;CACxF,OAAO,SAAS,aAAa,IAAI,YAAY,CAAC,CAAC,OAAO,GAAG,GAAG,GAAG,UAAU,CAAC;AAC5E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ips.d.ts","names":[],"sources":["../../../src/utils/ips.tsx"],"mappings":";KAEY,WAAA;AAAA,KACA,WAAA;AAAA,iBAEI,WAAA,CAAY,
|
|
1
|
+
{"version":3,"file":"ips.d.ts","names":[],"sources":["../../../src/utils/ips.tsx"],"mappings":";KAEY,WAAA;AAAA,KACA,WAAA;AAAA,iBAEI,WAAA,CAAY,EAAU;AAAA,iBAwBtB,eAAA,CAAgB,EAAA,mBAAqB,EAAA,IAAM,WAAA,GAAc,WAAW"}
|
package/dist/esm/utils/ips.js
CHANGED
|
@@ -1,36 +1,12 @@
|
|
|
1
1
|
import ipRegex from "ip-regex";
|
|
2
|
-
|
|
3
2
|
//#region src/utils/ips.tsx
|
|
4
3
|
function isIpAddress(ip) {
|
|
5
4
|
return ipRegex({ exact: true }).test(ip);
|
|
6
5
|
}
|
|
7
|
-
(void 0)?.test("isIpAddress", ({ expect }) => {
|
|
8
|
-
expect(isIpAddress("192.168.1.1")).toBe(true);
|
|
9
|
-
expect(isIpAddress("127.0.0.1")).toBe(true);
|
|
10
|
-
expect(isIpAddress("0.0.0.0")).toBe(true);
|
|
11
|
-
expect(isIpAddress("255.255.255.255")).toBe(true);
|
|
12
|
-
expect(isIpAddress("::1")).toBe(true);
|
|
13
|
-
expect(isIpAddress("2001:db8::")).toBe(true);
|
|
14
|
-
expect(isIpAddress("2001:db8:85a3:8d3:1319:8a2e:370:7348")).toBe(true);
|
|
15
|
-
expect(isIpAddress("")).toBe(false);
|
|
16
|
-
expect(isIpAddress("not an ip")).toBe(false);
|
|
17
|
-
expect(isIpAddress("256.256.256.256")).toBe(false);
|
|
18
|
-
expect(isIpAddress("192.168.1")).toBe(false);
|
|
19
|
-
expect(isIpAddress("192.168.1.1.1")).toBe(false);
|
|
20
|
-
expect(isIpAddress("2001:db8::xyz")).toBe(false);
|
|
21
|
-
});
|
|
22
6
|
function assertIpAddress(ip) {
|
|
23
7
|
if (!isIpAddress(ip)) throw new Error(`Invalid IP address: ${ip}`);
|
|
24
8
|
}
|
|
25
|
-
(void 0)?.test("assertIpAddress", ({ expect }) => {
|
|
26
|
-
expect(() => assertIpAddress("192.168.1.1")).not.toThrow();
|
|
27
|
-
expect(() => assertIpAddress("::1")).not.toThrow();
|
|
28
|
-
expect(() => assertIpAddress("")).toThrow("Invalid IP address: ");
|
|
29
|
-
expect(() => assertIpAddress("not an ip")).toThrow("Invalid IP address: not an ip");
|
|
30
|
-
expect(() => assertIpAddress("256.256.256.256")).toThrow("Invalid IP address: 256.256.256.256");
|
|
31
|
-
expect(() => assertIpAddress("192.168.1")).toThrow("Invalid IP address: 192.168.1");
|
|
32
|
-
});
|
|
33
|
-
|
|
34
9
|
//#endregion
|
|
35
10
|
export { assertIpAddress, isIpAddress };
|
|
11
|
+
|
|
36
12
|
//# sourceMappingURL=ips.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ips.js","names":[],"sources":["../../../src/utils/ips.tsx"],"sourcesContent":["import ipRegex from \"ip-regex\";\n\nexport type Ipv4Address = `${number}.${number}.${number}.${number}`;\nexport type Ipv6Address = string;\n\nexport function isIpAddress(ip: string) {\n return ipRegex({ exact: true }).test(ip);\n}\nimport.meta.vitest?.test(\"isIpAddress\", ({ expect }) => {\n // Test valid IPv4 addresses\n expect(isIpAddress(\"192.168.1.1\")).toBe(true);\n expect(isIpAddress(\"127.0.0.1\")).toBe(true);\n expect(isIpAddress(\"0.0.0.0\")).toBe(true);\n expect(isIpAddress(\"255.255.255.255\")).toBe(true);\n\n // Test valid IPv6 addresses\n expect(isIpAddress(\"::1\")).toBe(true);\n expect(isIpAddress(\"2001:db8::\")).toBe(true);\n expect(isIpAddress(\"2001:db8:85a3:8d3:1319:8a2e:370:7348\")).toBe(true);\n\n // Test invalid IP addresses\n expect(isIpAddress(\"\")).toBe(false);\n expect(isIpAddress(\"not an ip\")).toBe(false);\n expect(isIpAddress(\"256.256.256.256\")).toBe(false);\n expect(isIpAddress(\"192.168.1\")).toBe(false);\n expect(isIpAddress(\"192.168.1.1.1\")).toBe(false);\n expect(isIpAddress(\"2001:db8::xyz\")).toBe(false);\n});\n\nexport function assertIpAddress(ip: string): asserts ip is Ipv4Address | Ipv6Address {\n if (!isIpAddress(ip)) {\n throw new Error(`Invalid IP address: ${ip}`);\n }\n}\nimport.meta.vitest?.test(\"assertIpAddress\", ({ expect }) => {\n // Test with valid IPv4 address\n expect(() => assertIpAddress(\"192.168.1.1\")).not.toThrow();\n\n // Test with valid IPv6 address\n expect(() => assertIpAddress(\"::1\")).not.toThrow();\n\n // Test with invalid IP addresses\n expect(() => assertIpAddress(\"\")).toThrow(\"Invalid IP address: \");\n expect(() => assertIpAddress(\"not an ip\")).toThrow(\"Invalid IP address: not an ip\");\n expect(() => assertIpAddress(\"256.256.256.256\")).toThrow(\"Invalid IP address: 256.256.256.256\");\n expect(() => assertIpAddress(\"192.168.1\")).toThrow(\"Invalid IP address: 192.168.1\");\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ips.js","names":[],"sources":["../../../src/utils/ips.tsx"],"sourcesContent":["import ipRegex from \"ip-regex\";\n\nexport type Ipv4Address = `${number}.${number}.${number}.${number}`;\nexport type Ipv6Address = string;\n\nexport function isIpAddress(ip: string) {\n return ipRegex({ exact: true }).test(ip);\n}\nimport.meta.vitest?.test(\"isIpAddress\", ({ expect }) => {\n // Test valid IPv4 addresses\n expect(isIpAddress(\"192.168.1.1\")).toBe(true);\n expect(isIpAddress(\"127.0.0.1\")).toBe(true);\n expect(isIpAddress(\"0.0.0.0\")).toBe(true);\n expect(isIpAddress(\"255.255.255.255\")).toBe(true);\n\n // Test valid IPv6 addresses\n expect(isIpAddress(\"::1\")).toBe(true);\n expect(isIpAddress(\"2001:db8::\")).toBe(true);\n expect(isIpAddress(\"2001:db8:85a3:8d3:1319:8a2e:370:7348\")).toBe(true);\n\n // Test invalid IP addresses\n expect(isIpAddress(\"\")).toBe(false);\n expect(isIpAddress(\"not an ip\")).toBe(false);\n expect(isIpAddress(\"256.256.256.256\")).toBe(false);\n expect(isIpAddress(\"192.168.1\")).toBe(false);\n expect(isIpAddress(\"192.168.1.1.1\")).toBe(false);\n expect(isIpAddress(\"2001:db8::xyz\")).toBe(false);\n});\n\nexport function assertIpAddress(ip: string): asserts ip is Ipv4Address | Ipv6Address {\n if (!isIpAddress(ip)) {\n throw new Error(`Invalid IP address: ${ip}`);\n }\n}\nimport.meta.vitest?.test(\"assertIpAddress\", ({ expect }) => {\n // Test with valid IPv4 address\n expect(() => assertIpAddress(\"192.168.1.1\")).not.toThrow();\n\n // Test with valid IPv6 address\n expect(() => assertIpAddress(\"::1\")).not.toThrow();\n\n // Test with invalid IP addresses\n expect(() => assertIpAddress(\"\")).toThrow(\"Invalid IP address: \");\n expect(() => assertIpAddress(\"not an ip\")).toThrow(\"Invalid IP address: not an ip\");\n expect(() => assertIpAddress(\"256.256.256.256\")).toThrow(\"Invalid IP address: 256.256.256.256\");\n expect(() => assertIpAddress(\"192.168.1\")).toThrow(\"Invalid IP address: 192.168.1\");\n});\n"],"mappings":";;AAKA,SAAgB,YAAY,IAAY;CACtC,OAAO,QAAQ,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;AACzC;AAsBA,SAAgB,gBAAgB,IAAqD;CACnF,IAAI,CAAC,YAAY,EAAE,GACjB,MAAM,IAAI,MAAM,uBAAuB,IAAI;AAE/C"}
|
package/dist/esm/utils/json.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.ts","names":[],"sources":["../../../src/utils/json.tsx"],"mappings":";;;KAEY,IAAA,sCAKR,IAAA;EAAA,CACG,GAAA,WAAc,
|
|
1
|
+
{"version":3,"file":"json.d.ts","names":[],"sources":["../../../src/utils/json.tsx"],"mappings":";;;KAEY,IAAA,sCAKR,IAAA;EAAA,CACG,GAAA,WAAc,IAAI;AAAA;AAAA,KAEb,YAAA,+CAKC,YAAA;EAAA,UACG,GAAA,WAAc,YAAY;AAAA;AAAA,iBAE1B,kBAAA,CAAmB,KAAA,YAAiB,KAAA,IAAS,IAAI;AAAA,iBAqDjD,SAAA,CAAU,IAAA,WAAe,MAAM,CAAC,IAAA;AAAA,iBA6DhC,aAAA,CAAc,IAAA,EAAM,IAAA,GAAO,MAAM"}
|
package/dist/esm/utils/json.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Result } from "./results.js";
|
|
2
|
-
|
|
3
2
|
//#region src/utils/json.tsx
|
|
4
3
|
function isJsonSerializable(value) {
|
|
5
4
|
switch (typeof value) {
|
|
@@ -13,166 +12,13 @@ function isJsonSerializable(value) {
|
|
|
13
12
|
default: return false;
|
|
14
13
|
}
|
|
15
14
|
}
|
|
16
|
-
(void 0)?.test("isJsonSerializable", ({ expect }) => {
|
|
17
|
-
expect(isJsonSerializable(null)).toBe(true);
|
|
18
|
-
expect(isJsonSerializable(true)).toBe(true);
|
|
19
|
-
expect(isJsonSerializable(false)).toBe(true);
|
|
20
|
-
expect(isJsonSerializable(123)).toBe(true);
|
|
21
|
-
expect(isJsonSerializable("string")).toBe(true);
|
|
22
|
-
expect(isJsonSerializable([])).toBe(true);
|
|
23
|
-
expect(isJsonSerializable([
|
|
24
|
-
1,
|
|
25
|
-
2,
|
|
26
|
-
3
|
|
27
|
-
])).toBe(true);
|
|
28
|
-
expect(isJsonSerializable([
|
|
29
|
-
"a",
|
|
30
|
-
"b",
|
|
31
|
-
"c"
|
|
32
|
-
])).toBe(true);
|
|
33
|
-
expect(isJsonSerializable([
|
|
34
|
-
1,
|
|
35
|
-
"a",
|
|
36
|
-
true,
|
|
37
|
-
null
|
|
38
|
-
])).toBe(true);
|
|
39
|
-
expect(isJsonSerializable([
|
|
40
|
-
1,
|
|
41
|
-
[2, 3],
|
|
42
|
-
{ a: "b" }
|
|
43
|
-
])).toBe(true);
|
|
44
|
-
expect(isJsonSerializable({})).toBe(true);
|
|
45
|
-
expect(isJsonSerializable({
|
|
46
|
-
a: 1,
|
|
47
|
-
b: 2
|
|
48
|
-
})).toBe(true);
|
|
49
|
-
expect(isJsonSerializable({
|
|
50
|
-
a: "string",
|
|
51
|
-
b: true,
|
|
52
|
-
c: null
|
|
53
|
-
})).toBe(true);
|
|
54
|
-
expect(isJsonSerializable({
|
|
55
|
-
a: [
|
|
56
|
-
1,
|
|
57
|
-
2,
|
|
58
|
-
3
|
|
59
|
-
],
|
|
60
|
-
b: { c: "d" }
|
|
61
|
-
})).toBe(true);
|
|
62
|
-
expect(isJsonSerializable(void 0)).toBe(false);
|
|
63
|
-
expect(isJsonSerializable(() => {})).toBe(false);
|
|
64
|
-
expect(isJsonSerializable(Symbol())).toBe(false);
|
|
65
|
-
expect(isJsonSerializable(BigInt(123))).toBe(false);
|
|
66
|
-
expect(isJsonSerializable([
|
|
67
|
-
1,
|
|
68
|
-
void 0,
|
|
69
|
-
3
|
|
70
|
-
])).toBe(false);
|
|
71
|
-
expect(isJsonSerializable([
|
|
72
|
-
1,
|
|
73
|
-
() => {},
|
|
74
|
-
3
|
|
75
|
-
])).toBe(false);
|
|
76
|
-
expect(isJsonSerializable({
|
|
77
|
-
a: 1,
|
|
78
|
-
b: void 0
|
|
79
|
-
})).toBe(false);
|
|
80
|
-
expect(isJsonSerializable({
|
|
81
|
-
a: 1,
|
|
82
|
-
b: () => {}
|
|
83
|
-
})).toBe(false);
|
|
84
|
-
});
|
|
85
15
|
function parseJson(json) {
|
|
86
16
|
return Result.fromThrowing(() => JSON.parse(json));
|
|
87
17
|
}
|
|
88
|
-
(void 0)?.test("parseJson", ({ expect }) => {
|
|
89
|
-
const nullResult = parseJson("null");
|
|
90
|
-
expect(nullResult.status).toBe("ok");
|
|
91
|
-
if (nullResult.status === "ok") expect(nullResult.data).toBe(null);
|
|
92
|
-
const trueResult = parseJson("true");
|
|
93
|
-
expect(trueResult.status).toBe("ok");
|
|
94
|
-
if (trueResult.status === "ok") expect(trueResult.data).toBe(true);
|
|
95
|
-
const numberResult = parseJson("123");
|
|
96
|
-
expect(numberResult.status).toBe("ok");
|
|
97
|
-
if (numberResult.status === "ok") expect(numberResult.data).toBe(123);
|
|
98
|
-
const stringResult = parseJson("\"string\"");
|
|
99
|
-
expect(stringResult.status).toBe("ok");
|
|
100
|
-
if (stringResult.status === "ok") expect(stringResult.data).toBe("string");
|
|
101
|
-
const emptyArrayResult = parseJson("[]");
|
|
102
|
-
expect(emptyArrayResult.status).toBe("ok");
|
|
103
|
-
if (emptyArrayResult.status === "ok") expect(emptyArrayResult.data).toEqual([]);
|
|
104
|
-
const arrayResult = parseJson("[1,2,3]");
|
|
105
|
-
expect(arrayResult.status).toBe("ok");
|
|
106
|
-
if (arrayResult.status === "ok") expect(arrayResult.data).toEqual([
|
|
107
|
-
1,
|
|
108
|
-
2,
|
|
109
|
-
3
|
|
110
|
-
]);
|
|
111
|
-
const emptyObjectResult = parseJson("{}");
|
|
112
|
-
expect(emptyObjectResult.status).toBe("ok");
|
|
113
|
-
if (emptyObjectResult.status === "ok") expect(emptyObjectResult.data).toEqual({});
|
|
114
|
-
const objectResult = parseJson("{\"a\":1,\"b\":\"string\"}");
|
|
115
|
-
expect(objectResult.status).toBe("ok");
|
|
116
|
-
if (objectResult.status === "ok") expect(objectResult.data).toEqual({
|
|
117
|
-
a: 1,
|
|
118
|
-
b: "string"
|
|
119
|
-
});
|
|
120
|
-
expect(parseJson("").status).toBe("error");
|
|
121
|
-
expect(parseJson("undefined").status).toBe("error");
|
|
122
|
-
expect(parseJson("{").status).toBe("error");
|
|
123
|
-
expect(parseJson("{\"a\":1,}").status).toBe("error");
|
|
124
|
-
expect(parseJson("function(){}").status).toBe("error");
|
|
125
|
-
});
|
|
126
18
|
function stringifyJson(json) {
|
|
127
19
|
return Result.fromThrowing(() => JSON.stringify(json));
|
|
128
20
|
}
|
|
129
|
-
(void 0)?.test("stringifyJson", ({ expect }) => {
|
|
130
|
-
const nullResult = stringifyJson(null);
|
|
131
|
-
expect(nullResult.status).toBe("ok");
|
|
132
|
-
if (nullResult.status === "ok") expect(nullResult.data).toBe("null");
|
|
133
|
-
const trueResult = stringifyJson(true);
|
|
134
|
-
expect(trueResult.status).toBe("ok");
|
|
135
|
-
if (trueResult.status === "ok") expect(trueResult.data).toBe("true");
|
|
136
|
-
const numberResult = stringifyJson(123);
|
|
137
|
-
expect(numberResult.status).toBe("ok");
|
|
138
|
-
if (numberResult.status === "ok") expect(numberResult.data).toBe("123");
|
|
139
|
-
const stringResult = stringifyJson("string");
|
|
140
|
-
expect(stringResult.status).toBe("ok");
|
|
141
|
-
if (stringResult.status === "ok") expect(stringResult.data).toBe("\"string\"");
|
|
142
|
-
const emptyArrayResult = stringifyJson([]);
|
|
143
|
-
expect(emptyArrayResult.status).toBe("ok");
|
|
144
|
-
if (emptyArrayResult.status === "ok") expect(emptyArrayResult.data).toBe("[]");
|
|
145
|
-
const arrayResult = stringifyJson([
|
|
146
|
-
1,
|
|
147
|
-
2,
|
|
148
|
-
3
|
|
149
|
-
]);
|
|
150
|
-
expect(arrayResult.status).toBe("ok");
|
|
151
|
-
if (arrayResult.status === "ok") expect(arrayResult.data).toBe("[1,2,3]");
|
|
152
|
-
const emptyObjectResult = stringifyJson({});
|
|
153
|
-
expect(emptyObjectResult.status).toBe("ok");
|
|
154
|
-
if (emptyObjectResult.status === "ok") expect(emptyObjectResult.data).toBe("{}");
|
|
155
|
-
const objectResult = stringifyJson({
|
|
156
|
-
a: 1,
|
|
157
|
-
b: "string"
|
|
158
|
-
});
|
|
159
|
-
expect(objectResult.status).toBe("ok");
|
|
160
|
-
if (objectResult.status === "ok") expect(objectResult.data).toBe("{\"a\":1,\"b\":\"string\"}");
|
|
161
|
-
const nestedResult = stringifyJson({
|
|
162
|
-
a: [
|
|
163
|
-
1,
|
|
164
|
-
2,
|
|
165
|
-
3
|
|
166
|
-
],
|
|
167
|
-
b: { c: "d" }
|
|
168
|
-
});
|
|
169
|
-
expect(nestedResult.status).toBe("ok");
|
|
170
|
-
if (nestedResult.status === "ok") expect(nestedResult.data).toBe("{\"a\":[1,2,3],\"b\":{\"c\":\"d\"}}");
|
|
171
|
-
const circular = { a: 1 };
|
|
172
|
-
circular.self = circular;
|
|
173
|
-
expect(stringifyJson(circular).status).toBe("error");
|
|
174
|
-
});
|
|
175
|
-
|
|
176
21
|
//#endregion
|
|
177
22
|
export { isJsonSerializable, parseJson, stringifyJson };
|
|
23
|
+
|
|
178
24
|
//# sourceMappingURL=json.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","names":[],"sources":["../../../src/utils/json.tsx"],"sourcesContent":["import { Result } from \"./results\";\n\nexport type Json =\n | null\n | boolean\n | number\n | string\n | Json[]\n | { [key: string]: Json };\n\nexport type ReadonlyJson =\n | null\n | boolean\n | number\n | string\n | readonly ReadonlyJson[]\n | { readonly [key: string]: ReadonlyJson };\n\nexport function isJsonSerializable(value: unknown): value is Json {\n switch (typeof value) {\n case \"object\": {\n if (value === null) return true;\n if (Array.isArray(value)) return value.every(isJsonSerializable);\n return Object.keys(value).every(k => typeof k === \"string\") && Object.values(value).every(isJsonSerializable);\n }\n case \"string\":\n case \"number\":\n case \"boolean\": {\n return true;\n }\n default: {\n return false;\n }\n }\n}\nimport.meta.vitest?.test(\"isJsonSerializable\", ({ expect }) => {\n // Test primitive values\n expect(isJsonSerializable(null)).toBe(true);\n expect(isJsonSerializable(true)).toBe(true);\n expect(isJsonSerializable(false)).toBe(true);\n expect(isJsonSerializable(123)).toBe(true);\n expect(isJsonSerializable(\"string\")).toBe(true);\n\n // Test arrays\n expect(isJsonSerializable([])).toBe(true);\n expect(isJsonSerializable([1, 2, 3])).toBe(true);\n expect(isJsonSerializable([\"a\", \"b\", \"c\"])).toBe(true);\n expect(isJsonSerializable([1, \"a\", true, null])).toBe(true);\n expect(isJsonSerializable([1, [2, 3], { a: \"b\" }])).toBe(true);\n\n // Test objects\n expect(isJsonSerializable({})).toBe(true);\n expect(isJsonSerializable({ a: 1, b: 2 })).toBe(true);\n expect(isJsonSerializable({ a: \"string\", b: true, c: null })).toBe(true);\n expect(isJsonSerializable({ a: [1, 2, 3], b: { c: \"d\" } })).toBe(true);\n\n // Test invalid JSON values\n expect(isJsonSerializable(undefined)).toBe(false);\n expect(isJsonSerializable(() => {})).toBe(false);\n expect(isJsonSerializable(Symbol())).toBe(false);\n expect(isJsonSerializable(BigInt(123))).toBe(false);\n\n // Test arrays with invalid JSON values\n expect(isJsonSerializable([1, undefined, 3])).toBe(false);\n expect(isJsonSerializable([1, () => {}, 3])).toBe(false);\n\n // Test objects with invalid JSON values\n expect(isJsonSerializable({ a: 1, b: undefined })).toBe(false);\n expect(isJsonSerializable({ a: 1, b: () => {} })).toBe(false);\n});\n\nexport function parseJson(json: string): Result<Json> {\n return Result.fromThrowing(() => JSON.parse(json));\n}\nimport.meta.vitest?.test(\"parseJson\", ({ expect }) => {\n // Test valid JSON strings\n const nullResult = parseJson(\"null\");\n expect(nullResult.status).toBe(\"ok\");\n if (nullResult.status === \"ok\") {\n expect(nullResult.data).toBe(null);\n }\n\n const trueResult = parseJson(\"true\");\n expect(trueResult.status).toBe(\"ok\");\n if (trueResult.status === \"ok\") {\n expect(trueResult.data).toBe(true);\n }\n\n const numberResult = parseJson(\"123\");\n expect(numberResult.status).toBe(\"ok\");\n if (numberResult.status === \"ok\") {\n expect(numberResult.data).toBe(123);\n }\n\n const stringResult = parseJson('\"string\"');\n expect(stringResult.status).toBe(\"ok\");\n if (stringResult.status === \"ok\") {\n expect(stringResult.data).toBe(\"string\");\n }\n\n const emptyArrayResult = parseJson(\"[]\");\n expect(emptyArrayResult.status).toBe(\"ok\");\n if (emptyArrayResult.status === \"ok\") {\n expect(emptyArrayResult.data).toEqual([]);\n }\n\n const arrayResult = parseJson(\"[1,2,3]\");\n expect(arrayResult.status).toBe(\"ok\");\n if (arrayResult.status === \"ok\") {\n expect(arrayResult.data).toEqual([1, 2, 3]);\n }\n\n const emptyObjectResult = parseJson(\"{}\");\n expect(emptyObjectResult.status).toBe(\"ok\");\n if (emptyObjectResult.status === \"ok\") {\n expect(emptyObjectResult.data).toEqual({});\n }\n\n const objectResult = parseJson('{\"a\":1,\"b\":\"string\"}');\n expect(objectResult.status).toBe(\"ok\");\n if (objectResult.status === \"ok\") {\n expect(objectResult.data).toEqual({ a: 1, b: \"string\" });\n }\n\n // Test invalid JSON strings\n expect(parseJson(\"\").status).toBe(\"error\");\n expect(parseJson(\"undefined\").status).toBe(\"error\");\n expect(parseJson(\"{\").status).toBe(\"error\");\n expect(parseJson('{\"a\":1,}').status).toBe(\"error\");\n expect(parseJson(\"function(){}\").status).toBe(\"error\");\n});\n\nexport function stringifyJson(json: Json): Result<string> {\n return Result.fromThrowing(() => JSON.stringify(json));\n}\nimport.meta.vitest?.test(\"stringifyJson\", ({ expect }) => {\n // Test primitive values\n const nullResult = stringifyJson(null);\n expect(nullResult.status).toBe(\"ok\");\n if (nullResult.status === \"ok\") {\n expect(nullResult.data).toBe(\"null\");\n }\n\n const trueResult = stringifyJson(true);\n expect(trueResult.status).toBe(\"ok\");\n if (trueResult.status === \"ok\") {\n expect(trueResult.data).toBe(\"true\");\n }\n\n const numberResult = stringifyJson(123);\n expect(numberResult.status).toBe(\"ok\");\n if (numberResult.status === \"ok\") {\n expect(numberResult.data).toBe(\"123\");\n }\n\n const stringResult = stringifyJson(\"string\");\n expect(stringResult.status).toBe(\"ok\");\n if (stringResult.status === \"ok\") {\n expect(stringResult.data).toBe('\"string\"');\n }\n\n // Test arrays\n const emptyArrayResult = stringifyJson([]);\n expect(emptyArrayResult.status).toBe(\"ok\");\n if (emptyArrayResult.status === \"ok\") {\n expect(emptyArrayResult.data).toBe(\"[]\");\n }\n\n const arrayResult = stringifyJson([1, 2, 3]);\n expect(arrayResult.status).toBe(\"ok\");\n if (arrayResult.status === \"ok\") {\n expect(arrayResult.data).toBe(\"[1,2,3]\");\n }\n\n // Test objects\n const emptyObjectResult = stringifyJson({});\n expect(emptyObjectResult.status).toBe(\"ok\");\n if (emptyObjectResult.status === \"ok\") {\n expect(emptyObjectResult.data).toBe(\"{}\");\n }\n\n const objectResult = stringifyJson({ a: 1, b: \"string\" });\n expect(objectResult.status).toBe(\"ok\");\n if (objectResult.status === \"ok\") {\n expect(objectResult.data).toBe('{\"a\":1,\"b\":\"string\"}');\n }\n\n // Test nested structures\n const nested = { a: [1, 2, 3], b: { c: \"d\" } };\n const nestedResult = stringifyJson(nested);\n expect(nestedResult.status).toBe(\"ok\");\n if (nestedResult.status === \"ok\") {\n expect(nestedResult.data).toBe('{\"a\":[1,2,3],\"b\":{\"c\":\"d\"}}');\n }\n\n // Test circular references (should error)\n const circular: any = { a: 1 };\n circular.self = circular;\n expect(stringifyJson(circular).status).toBe(\"error\");\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"json.js","names":[],"sources":["../../../src/utils/json.tsx"],"sourcesContent":["import { Result } from \"./results\";\n\nexport type Json =\n | null\n | boolean\n | number\n | string\n | Json[]\n | { [key: string]: Json };\n\nexport type ReadonlyJson =\n | null\n | boolean\n | number\n | string\n | readonly ReadonlyJson[]\n | { readonly [key: string]: ReadonlyJson };\n\nexport function isJsonSerializable(value: unknown): value is Json {\n switch (typeof value) {\n case \"object\": {\n if (value === null) return true;\n if (Array.isArray(value)) return value.every(isJsonSerializable);\n return Object.keys(value).every(k => typeof k === \"string\") && Object.values(value).every(isJsonSerializable);\n }\n case \"string\":\n case \"number\":\n case \"boolean\": {\n return true;\n }\n default: {\n return false;\n }\n }\n}\nimport.meta.vitest?.test(\"isJsonSerializable\", ({ expect }) => {\n // Test primitive values\n expect(isJsonSerializable(null)).toBe(true);\n expect(isJsonSerializable(true)).toBe(true);\n expect(isJsonSerializable(false)).toBe(true);\n expect(isJsonSerializable(123)).toBe(true);\n expect(isJsonSerializable(\"string\")).toBe(true);\n\n // Test arrays\n expect(isJsonSerializable([])).toBe(true);\n expect(isJsonSerializable([1, 2, 3])).toBe(true);\n expect(isJsonSerializable([\"a\", \"b\", \"c\"])).toBe(true);\n expect(isJsonSerializable([1, \"a\", true, null])).toBe(true);\n expect(isJsonSerializable([1, [2, 3], { a: \"b\" }])).toBe(true);\n\n // Test objects\n expect(isJsonSerializable({})).toBe(true);\n expect(isJsonSerializable({ a: 1, b: 2 })).toBe(true);\n expect(isJsonSerializable({ a: \"string\", b: true, c: null })).toBe(true);\n expect(isJsonSerializable({ a: [1, 2, 3], b: { c: \"d\" } })).toBe(true);\n\n // Test invalid JSON values\n expect(isJsonSerializable(undefined)).toBe(false);\n expect(isJsonSerializable(() => {})).toBe(false);\n expect(isJsonSerializable(Symbol())).toBe(false);\n expect(isJsonSerializable(BigInt(123))).toBe(false);\n\n // Test arrays with invalid JSON values\n expect(isJsonSerializable([1, undefined, 3])).toBe(false);\n expect(isJsonSerializable([1, () => {}, 3])).toBe(false);\n\n // Test objects with invalid JSON values\n expect(isJsonSerializable({ a: 1, b: undefined })).toBe(false);\n expect(isJsonSerializable({ a: 1, b: () => {} })).toBe(false);\n});\n\nexport function parseJson(json: string): Result<Json> {\n return Result.fromThrowing(() => JSON.parse(json));\n}\nimport.meta.vitest?.test(\"parseJson\", ({ expect }) => {\n // Test valid JSON strings\n const nullResult = parseJson(\"null\");\n expect(nullResult.status).toBe(\"ok\");\n if (nullResult.status === \"ok\") {\n expect(nullResult.data).toBe(null);\n }\n\n const trueResult = parseJson(\"true\");\n expect(trueResult.status).toBe(\"ok\");\n if (trueResult.status === \"ok\") {\n expect(trueResult.data).toBe(true);\n }\n\n const numberResult = parseJson(\"123\");\n expect(numberResult.status).toBe(\"ok\");\n if (numberResult.status === \"ok\") {\n expect(numberResult.data).toBe(123);\n }\n\n const stringResult = parseJson('\"string\"');\n expect(stringResult.status).toBe(\"ok\");\n if (stringResult.status === \"ok\") {\n expect(stringResult.data).toBe(\"string\");\n }\n\n const emptyArrayResult = parseJson(\"[]\");\n expect(emptyArrayResult.status).toBe(\"ok\");\n if (emptyArrayResult.status === \"ok\") {\n expect(emptyArrayResult.data).toEqual([]);\n }\n\n const arrayResult = parseJson(\"[1,2,3]\");\n expect(arrayResult.status).toBe(\"ok\");\n if (arrayResult.status === \"ok\") {\n expect(arrayResult.data).toEqual([1, 2, 3]);\n }\n\n const emptyObjectResult = parseJson(\"{}\");\n expect(emptyObjectResult.status).toBe(\"ok\");\n if (emptyObjectResult.status === \"ok\") {\n expect(emptyObjectResult.data).toEqual({});\n }\n\n const objectResult = parseJson('{\"a\":1,\"b\":\"string\"}');\n expect(objectResult.status).toBe(\"ok\");\n if (objectResult.status === \"ok\") {\n expect(objectResult.data).toEqual({ a: 1, b: \"string\" });\n }\n\n // Test invalid JSON strings\n expect(parseJson(\"\").status).toBe(\"error\");\n expect(parseJson(\"undefined\").status).toBe(\"error\");\n expect(parseJson(\"{\").status).toBe(\"error\");\n expect(parseJson('{\"a\":1,}').status).toBe(\"error\");\n expect(parseJson(\"function(){}\").status).toBe(\"error\");\n});\n\nexport function stringifyJson(json: Json): Result<string> {\n return Result.fromThrowing(() => JSON.stringify(json));\n}\nimport.meta.vitest?.test(\"stringifyJson\", ({ expect }) => {\n // Test primitive values\n const nullResult = stringifyJson(null);\n expect(nullResult.status).toBe(\"ok\");\n if (nullResult.status === \"ok\") {\n expect(nullResult.data).toBe(\"null\");\n }\n\n const trueResult = stringifyJson(true);\n expect(trueResult.status).toBe(\"ok\");\n if (trueResult.status === \"ok\") {\n expect(trueResult.data).toBe(\"true\");\n }\n\n const numberResult = stringifyJson(123);\n expect(numberResult.status).toBe(\"ok\");\n if (numberResult.status === \"ok\") {\n expect(numberResult.data).toBe(\"123\");\n }\n\n const stringResult = stringifyJson(\"string\");\n expect(stringResult.status).toBe(\"ok\");\n if (stringResult.status === \"ok\") {\n expect(stringResult.data).toBe('\"string\"');\n }\n\n // Test arrays\n const emptyArrayResult = stringifyJson([]);\n expect(emptyArrayResult.status).toBe(\"ok\");\n if (emptyArrayResult.status === \"ok\") {\n expect(emptyArrayResult.data).toBe(\"[]\");\n }\n\n const arrayResult = stringifyJson([1, 2, 3]);\n expect(arrayResult.status).toBe(\"ok\");\n if (arrayResult.status === \"ok\") {\n expect(arrayResult.data).toBe(\"[1,2,3]\");\n }\n\n // Test objects\n const emptyObjectResult = stringifyJson({});\n expect(emptyObjectResult.status).toBe(\"ok\");\n if (emptyObjectResult.status === \"ok\") {\n expect(emptyObjectResult.data).toBe(\"{}\");\n }\n\n const objectResult = stringifyJson({ a: 1, b: \"string\" });\n expect(objectResult.status).toBe(\"ok\");\n if (objectResult.status === \"ok\") {\n expect(objectResult.data).toBe('{\"a\":1,\"b\":\"string\"}');\n }\n\n // Test nested structures\n const nested = { a: [1, 2, 3], b: { c: \"d\" } };\n const nestedResult = stringifyJson(nested);\n expect(nestedResult.status).toBe(\"ok\");\n if (nestedResult.status === \"ok\") {\n expect(nestedResult.data).toBe('{\"a\":[1,2,3],\"b\":{\"c\":\"d\"}}');\n }\n\n // Test circular references (should error)\n const circular: any = { a: 1 };\n circular.self = circular;\n expect(stringifyJson(circular).status).toBe(\"error\");\n});\n"],"mappings":";;AAkBA,SAAgB,mBAAmB,OAA+B;CAChE,QAAQ,OAAO,OAAf;EACE,KAAK;GACH,IAAI,UAAU,MAAM,OAAO;GAC3B,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,MAAM,kBAAkB;GAC/D,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,OAAM,MAAK,OAAO,MAAM,QAAQ,KAAK,OAAO,OAAO,KAAK,CAAC,CAAC,MAAM,kBAAkB;EAE9G,KAAK;EACL,KAAK;EACL,KAAK,WACH,OAAO;EAET,SACE,OAAO;CAEX;AACF;AAqCA,SAAgB,UAAU,MAA4B;CACpD,OAAO,OAAO,mBAAmB,KAAK,MAAM,IAAI,CAAC;AACnD;AA2DA,SAAgB,cAAc,MAA4B;CACxD,OAAO,OAAO,mBAAmB,KAAK,UAAU,IAAI,CAAC;AACvD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-editable-transpiler.d.ts","names":[],"sources":["../../../src/utils/jsx-editable-transpiler.tsx"],"mappings":";;AAUA;;;KAAY,gBAAA;EAEV,iDAAA,EAAA,UAIE;EADF,GAAA;IACE,KAAA;IACA,GAAA;IACA,IAAA;IACA,MAAA;EAAA,GAaF;EATA,YAAA,UAWE;EARF,QAAA,UAYA;EATA,OAAA,YAWE;EARF,aAAA;IACE,OAAA;IACA,KAAA,EAAO,
|
|
1
|
+
{"version":3,"file":"jsx-editable-transpiler.d.ts","names":[],"sources":["../../../src/utils/jsx-editable-transpiler.tsx"],"mappings":";;AAUA;;;KAAY,gBAAA;EAEV,iDAAA,EAAA,UAIE;EADF,GAAA;IACE,KAAA;IACA,GAAA;IACA,IAAA;IACA,MAAA;EAAA,GAaF;EATA,YAAA,UAWE;EARF,QAAA,UAYA;EATA,OAAA,YAWE;EARF,aAAA;IACE,OAAA;IACA,KAAA,EAAO,MAAM;EAAA,GAmBL;EAfV,aAAA;IACE,MAAA;IACA,KAAA;EAAA,GAuBqB;EAnBvB,YAAA,UAmBA;EAhBA,eAAA,UAgBgC;EAbhC,eAAA,UAagD;EAVhD,UAAA;AAAA;;;;KAMU,eAAA;EAsDV,2DApDA,IAAA,UAuDgB;EArDhB,eAAA,EAAiB,MAAM,SAAS,gBAAA;AAAA;;;;AA2U0B;;;;;;;;;;;;;iBA3R5C,sBAAA,CACd,MAAA,UACA,OAAA;EACE,UAAA;AAAA,IAED,eAAe;;;;;;;;;;iBAsRF,+BAAA,CAAgC,IAAY"}
|
|
@@ -3,7 +3,6 @@ import * as parser from "@babel/parser";
|
|
|
3
3
|
import traverse from "@babel/traverse";
|
|
4
4
|
import * as t from "@babel/types";
|
|
5
5
|
import { createHash } from "crypto";
|
|
6
|
-
|
|
7
6
|
//#region src/utils/jsx-editable-transpiler.tsx
|
|
8
7
|
/**
|
|
9
8
|
* The __Editable component definition that gets injected into transformed source.
|
|
@@ -210,7 +209,7 @@ function transpileJsxForEditing(source, options) {
|
|
|
210
209
|
function convertSentinelTokensToComments(html) {
|
|
211
210
|
return html.replace(/⟦STACK_EDITABLE_START:([^⟧]+)⟧/g, "<!-- STACK_EDITABLE_START $1 -->").replace(/⟦STACK_EDITABLE_END:([^⟧]+)⟧/g, "<!-- STACK_EDITABLE_END $1 -->").replace(/⟦STACK_EXPR_START:([^⟧]+)⟧/g, "<!-- STACK_EXPR_START $1 -->").replace(/⟦STACK_EXPR_END⟧/g, "<!-- STACK_EXPR_END -->");
|
|
212
211
|
}
|
|
213
|
-
|
|
214
212
|
//#endregion
|
|
215
213
|
export { convertSentinelTokensToComments, transpileJsxForEditing };
|
|
214
|
+
|
|
216
215
|
//# sourceMappingURL=jsx-editable-transpiler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-editable-transpiler.js","names":[],"sources":["../../../src/utils/jsx-editable-transpiler.tsx"],"sourcesContent":["import generate from '@babel/generator';\nimport * as parser from '@babel/parser';\nimport traverse, { NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { createHash } from 'crypto';\n\n/**\n * Metadata for an editable text region in JSX source code.\n * This information is used by the AI to accurately locate and update text.\n */\nexport type EditableMetadata = {\n /** Unique identifier for this editable region */\n id: string,\n\n /** Exact source code location */\n loc: {\n start: number,\n end: number,\n line: number,\n column: number,\n },\n\n /** The original text content */\n originalText: string,\n\n /** Hash of original text for quick mismatch detection */\n textHash: string,\n\n /** JSX ancestry path from component root to this text node */\n jsxPath: string[],\n\n /** The immediate parent JSX element */\n parentElement: {\n tagName: string,\n props: Record<string, string>,\n },\n\n /** Surrounding source context for disambiguation */\n sourceContext: {\n before: string,\n after: string,\n },\n\n /** Index among sibling text nodes in the same parent */\n siblingIndex: number,\n\n /** Total count of this exact text in the source */\n occurrenceCount: number,\n\n /** Which occurrence this is (1-indexed) */\n occurrenceIndex: number,\n\n /** Which file this text is in */\n sourceFile: \"template\" | \"theme\",\n};\n\n/**\n * Result of transpiling JSX source to include editable markers.\n */\nexport type TranspileResult = {\n /** The transformed source code with __Editable wrappers */\n code: string,\n /** Map of editable region IDs to their metadata */\n editableRegions: Record<string, EditableMetadata>,\n};\n\n/**\n * The __Editable component definition that gets injected into transformed source.\n * It renders sentinel tokens around text that will be converted to HTML comments.\n */\nconst EDITABLE_COMPONENT_CODE = `\nfunction __Editable({ __id, children }) {\n return (\n <>\n {\\`⟦STACK_EDITABLE_START:\\${__id}⟧\\`}\n {children}\n {\\`⟦STACK_EDITABLE_END:\\${__id}⟧\\`}\n </>\n );\n}\nfunction __ExpressionTooltip({ __expr, children }) {\n // Only render markers if children is a primitive (string/number), not a React element\n if (typeof children === 'object' && children !== null) {\n return children;\n }\n return (\n <>\n {\\`⟦STACK_EXPR_START:\\${__expr}⟧\\`}\n {children}\n {\\`⟦STACK_EXPR_END⟧\\`}\n </>\n );\n}\n`;\n\n/**\n * Transpiles TSX source code to wrap all static JSX text nodes with __Editable components.\n *\n * For example:\n * ```tsx\n * <Text>Hi, {name}! Welcome.</Text>\n * ```\n * becomes:\n * ```tsx\n * <Text>\n * <__Editable __id=\"e1\">Hi, </__Editable>\n * {name}\n * <__Editable __id=\"e2\">! Welcome.</__Editable>\n * </Text>\n * ```\n */\nexport function transpileJsxForEditing(\n source: string,\n options: {\n sourceFile: \"template\" | \"theme\",\n }\n): TranspileResult {\n const editableRegions: Record<string, EditableMetadata> = {};\n let idCounter = 0;\n\n // Count occurrences of each text for the occurrenceCount/occurrenceIndex fields\n const textOccurrences = new Map<string, number>();\n\n // First pass: count all text occurrences\n const astForCounting = parser.parse(source, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n traverse(astForCounting, {\n JSXText(path) {\n const text = path.node.value;\n // Skip whitespace-only text nodes\n if (text.trim() === '') return;\n textOccurrences.set(text, (textOccurrences.get(text) ?? 0) + 1);\n },\n });\n\n // Track current occurrence index for each text\n const textCurrentIndex = new Map<string, number>();\n\n // Parse the source again for transformation\n const ast = parser.parse(source, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n // Helper to get JSX ancestry path\n function getJsxPath(path: NodePath<t.JSXText>): string[] {\n const jsxPath: string[] = [];\n let current: NodePath | null = path.parentPath;\n\n while (current) {\n if (t.isJSXElement(current.node)) {\n const openingElement = current.node.openingElement;\n if (t.isJSXIdentifier(openingElement.name)) {\n jsxPath.unshift(openingElement.name.name);\n } else if (t.isJSXMemberExpression(openingElement.name)) {\n jsxPath.unshift(generate(openingElement.name).code);\n }\n } else if (t.isFunctionDeclaration(current.node) && current.node.id) {\n jsxPath.unshift(current.node.id.name);\n break;\n } else if (t.isVariableDeclarator(current.node) && t.isIdentifier(current.node.id)) {\n jsxPath.unshift(current.node.id.name);\n break;\n }\n current = current.parentPath;\n }\n\n return jsxPath;\n }\n\n // Helper to get parent element info\n function getParentElement(path: NodePath<t.JSXText>): { tagName: string, props: Record<string, string> } {\n let current: NodePath | null = path.parentPath;\n\n while (current) {\n if (t.isJSXElement(current.node)) {\n const openingElement = current.node.openingElement;\n let tagName = '';\n\n if (t.isJSXIdentifier(openingElement.name)) {\n tagName = openingElement.name.name;\n } else if (t.isJSXMemberExpression(openingElement.name)) {\n tagName = generate(openingElement.name).code;\n }\n\n const props: Record<string, string> = {};\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n if (t.isStringLiteral(attr.value)) {\n props[propName] = attr.value.value;\n } else if (t.isJSXExpressionContainer(attr.value) && !t.isJSXEmptyExpression(attr.value.expression)) {\n // For expressions, just note that it's dynamic\n props[propName] = `{${generate(attr.value.expression).code}}`;\n }\n }\n }\n\n return { tagName, props };\n }\n current = current.parentPath;\n }\n\n return { tagName: 'unknown', props: {} };\n }\n\n // Helper to get sibling index among text nodes\n function getSiblingIndex(path: NodePath<t.JSXText>): number {\n const parent = path.parentPath;\n if (!t.isJSXElement(parent.node) && !t.isJSXFragment(parent.node)) {\n return 0;\n }\n\n const children = parent.node.children;\n let textIndex = 0;\n\n for (const child of children) {\n if (child === path.node) {\n return textIndex;\n }\n if (t.isJSXText(child) && child.value.trim() !== '') {\n textIndex++;\n }\n }\n\n return textIndex;\n }\n\n // Helper to get source context (lines before/after)\n function getSourceContext(loc: { start: number, end: number }): { before: string, after: string } {\n const lines = source.split('\\n');\n let currentPos = 0;\n let startLine = 0;\n\n // Find line number for start position\n for (let i = 0; i < lines.length; i++) {\n if (currentPos + lines[i].length >= loc.start) {\n startLine = i;\n break;\n }\n currentPos += lines[i].length + 1; // +1 for newline\n }\n\n const beforeLines = lines.slice(Math.max(0, startLine - 3), startLine).join('\\n');\n const afterLines = lines.slice(startLine + 1, startLine + 4).join('\\n');\n\n return { before: beforeLines, after: afterLines };\n }\n\n // Transform JSXText nodes\n traverse(ast, {\n JSXText(path) {\n const decodedText = path.node.value;\n\n // Skip whitespace-only text nodes\n if (decodedText.trim() === '') return;\n\n // Skip if node doesn't have location info\n // Use explicit null checks since start/end can validly be 0\n if (!path.node.loc || path.node.start == null || path.node.end == null) return;\n\n // IMPORTANT: Use the RAW source text, not the decoded path.node.value\n // Babel's parser decodes HTML entities (e.g., < -> <) in JSX text,\n // but we need to preserve the original source to avoid XSS vulnerabilities\n const rawText = source.slice(path.node.start, path.node.end);\n\n // Use source file prefix to ensure unique IDs across template and theme\n const prefix = options.sourceFile === 'template' ? 't' : 'h'; // t for template, h for theme (header)\n const id = `${prefix}${idCounter++}`;\n const occurrenceCount = textOccurrences.get(decodedText) ?? 1;\n const currentIndex = (textCurrentIndex.get(decodedText) ?? 0) + 1;\n textCurrentIndex.set(decodedText, currentIndex);\n\n const metadata: EditableMetadata = {\n id,\n loc: {\n start: path.node.start,\n end: path.node.end,\n line: path.node.loc.start.line,\n column: path.node.loc.start.column,\n },\n originalText: rawText,\n textHash: createHash('sha256').update(rawText).digest('hex').slice(0, 16),\n jsxPath: getJsxPath(path),\n parentElement: getParentElement(path),\n sourceContext: getSourceContext({ start: path.node.start, end: path.node.end }),\n siblingIndex: getSiblingIndex(path),\n occurrenceCount,\n occurrenceIndex: currentIndex,\n sourceFile: options.sourceFile,\n };\n\n editableRegions[id] = metadata;\n\n // Create the __Editable wrapper\n // <__Editable __id=\"...\">text</__Editable>\n // Use rawText to preserve HTML entities from the original source\n const editableElement = t.jsxElement(\n t.jsxOpeningElement(\n t.jsxIdentifier('__Editable'),\n [\n t.jsxAttribute(\n t.jsxIdentifier('__id'),\n t.stringLiteral(id)\n ),\n ],\n false\n ),\n t.jsxClosingElement(t.jsxIdentifier('__Editable')),\n [t.jsxText(rawText)],\n false\n );\n\n path.replaceWith(editableElement);\n },\n JSXExpressionContainer(path) {\n const expression = path.node.expression;\n\n // Skip empty expressions\n if (t.isJSXEmptyExpression(expression)) return;\n\n // Skip if parent is not a JSXElement (e.g., it's an attribute value)\n if (!t.isJSXElement(path.parent) && !t.isJSXFragment(path.parent)) return;\n\n // Skip JSX elements - we only want to show tooltips for text-rendering expressions\n if (t.isJSXElement(expression) || t.isJSXFragment(expression)) return;\n\n // Skip if no location info\n if (path.node.start == null || path.node.end == null) return;\n\n // Get the exact source code of the expression (including the ${} or just the expression)\n const exprSource = source.slice(path.node.start, path.node.end);\n\n // Base64 encode the expression to safely pass it through the marker\n const encodedExpr = Buffer.from(exprSource).toString('base64');\n\n // Create wrapper: <__ExpressionTooltip __expr=\"...\">{expression}</__ExpressionTooltip>\n const tooltipElement = t.jsxElement(\n t.jsxOpeningElement(\n t.jsxIdentifier('__ExpressionTooltip'),\n [\n t.jsxAttribute(\n t.jsxIdentifier('__expr'),\n t.stringLiteral(encodedExpr)\n ),\n ],\n false\n ),\n t.jsxClosingElement(t.jsxIdentifier('__ExpressionTooltip')),\n [t.jsxExpressionContainer(expression)],\n false\n );\n\n path.replaceWith(t.jsxExpressionContainer(tooltipElement));\n },\n });\n\n // Generate the transformed code\n const output = generate(ast, {\n retainLines: true,\n compact: false,\n });\n\n // Inject the __Editable component at the top of the file (after imports)\n let code = output.code;\n\n // Find the position after all imports\n const importEndMatch = code.match(/^(import\\s+[\\s\\S]*?from\\s+['\"][^'\"]+['\"];?\\s*)+/m);\n if (importEndMatch) {\n const insertPos = (importEndMatch.index ?? 0) + importEndMatch[0].length;\n code = code.slice(0, insertPos) + '\\n' + EDITABLE_COMPONENT_CODE + '\\n' + code.slice(insertPos);\n } else {\n // No imports found, add at the beginning\n code = EDITABLE_COMPONENT_CODE + '\\n' + code;\n }\n\n return {\n code,\n editableRegions,\n };\n}\n\n/**\n * Post-processes rendered HTML to convert sentinel tokens to HTML comments.\n *\n * Converts:\n * - `⟦STACK_EDITABLE_START:<id>⟧` → `<!-- STACK_EDITABLE_START <id> -->`\n * - `⟦STACK_EDITABLE_END:<id>⟧` → `<!-- STACK_EDITABLE_END <id> -->`\n * - `⟦STACK_EXPR_START:<base64-encoded-expr>⟧` → `<!-- STACK_EXPR_START <base64> -->`\n * - `⟦STACK_EXPR_END⟧` → `<!-- STACK_EXPR_END -->`\n */\nexport function convertSentinelTokensToComments(html: string): string {\n return html\n .replace(/⟦STACK_EDITABLE_START:([^⟧]+)⟧/g, '<!-- STACK_EDITABLE_START $1 -->')\n .replace(/⟦STACK_EDITABLE_END:([^⟧]+)⟧/g, '<!-- STACK_EDITABLE_END $1 -->')\n .replace(/⟦STACK_EXPR_START:([^⟧]+)⟧/g, '<!-- STACK_EXPR_START $1 -->')\n .replace(/⟦STACK_EXPR_END⟧/g, '<!-- STACK_EXPR_END -->');\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jsx-editable-transpiler.js","names":[],"sources":["../../../src/utils/jsx-editable-transpiler.tsx"],"sourcesContent":["import generate from '@babel/generator';\nimport * as parser from '@babel/parser';\nimport traverse, { NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { createHash } from 'crypto';\n\n/**\n * Metadata for an editable text region in JSX source code.\n * This information is used by the AI to accurately locate and update text.\n */\nexport type EditableMetadata = {\n /** Unique identifier for this editable region */\n id: string,\n\n /** Exact source code location */\n loc: {\n start: number,\n end: number,\n line: number,\n column: number,\n },\n\n /** The original text content */\n originalText: string,\n\n /** Hash of original text for quick mismatch detection */\n textHash: string,\n\n /** JSX ancestry path from component root to this text node */\n jsxPath: string[],\n\n /** The immediate parent JSX element */\n parentElement: {\n tagName: string,\n props: Record<string, string>,\n },\n\n /** Surrounding source context for disambiguation */\n sourceContext: {\n before: string,\n after: string,\n },\n\n /** Index among sibling text nodes in the same parent */\n siblingIndex: number,\n\n /** Total count of this exact text in the source */\n occurrenceCount: number,\n\n /** Which occurrence this is (1-indexed) */\n occurrenceIndex: number,\n\n /** Which file this text is in */\n sourceFile: \"template\" | \"theme\",\n};\n\n/**\n * Result of transpiling JSX source to include editable markers.\n */\nexport type TranspileResult = {\n /** The transformed source code with __Editable wrappers */\n code: string,\n /** Map of editable region IDs to their metadata */\n editableRegions: Record<string, EditableMetadata>,\n};\n\n/**\n * The __Editable component definition that gets injected into transformed source.\n * It renders sentinel tokens around text that will be converted to HTML comments.\n */\nconst EDITABLE_COMPONENT_CODE = `\nfunction __Editable({ __id, children }) {\n return (\n <>\n {\\`⟦STACK_EDITABLE_START:\\${__id}⟧\\`}\n {children}\n {\\`⟦STACK_EDITABLE_END:\\${__id}⟧\\`}\n </>\n );\n}\nfunction __ExpressionTooltip({ __expr, children }) {\n // Only render markers if children is a primitive (string/number), not a React element\n if (typeof children === 'object' && children !== null) {\n return children;\n }\n return (\n <>\n {\\`⟦STACK_EXPR_START:\\${__expr}⟧\\`}\n {children}\n {\\`⟦STACK_EXPR_END⟧\\`}\n </>\n );\n}\n`;\n\n/**\n * Transpiles TSX source code to wrap all static JSX text nodes with __Editable components.\n *\n * For example:\n * ```tsx\n * <Text>Hi, {name}! Welcome.</Text>\n * ```\n * becomes:\n * ```tsx\n * <Text>\n * <__Editable __id=\"e1\">Hi, </__Editable>\n * {name}\n * <__Editable __id=\"e2\">! Welcome.</__Editable>\n * </Text>\n * ```\n */\nexport function transpileJsxForEditing(\n source: string,\n options: {\n sourceFile: \"template\" | \"theme\",\n }\n): TranspileResult {\n const editableRegions: Record<string, EditableMetadata> = {};\n let idCounter = 0;\n\n // Count occurrences of each text for the occurrenceCount/occurrenceIndex fields\n const textOccurrences = new Map<string, number>();\n\n // First pass: count all text occurrences\n const astForCounting = parser.parse(source, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n traverse(astForCounting, {\n JSXText(path) {\n const text = path.node.value;\n // Skip whitespace-only text nodes\n if (text.trim() === '') return;\n textOccurrences.set(text, (textOccurrences.get(text) ?? 0) + 1);\n },\n });\n\n // Track current occurrence index for each text\n const textCurrentIndex = new Map<string, number>();\n\n // Parse the source again for transformation\n const ast = parser.parse(source, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n // Helper to get JSX ancestry path\n function getJsxPath(path: NodePath<t.JSXText>): string[] {\n const jsxPath: string[] = [];\n let current: NodePath | null = path.parentPath;\n\n while (current) {\n if (t.isJSXElement(current.node)) {\n const openingElement = current.node.openingElement;\n if (t.isJSXIdentifier(openingElement.name)) {\n jsxPath.unshift(openingElement.name.name);\n } else if (t.isJSXMemberExpression(openingElement.name)) {\n jsxPath.unshift(generate(openingElement.name).code);\n }\n } else if (t.isFunctionDeclaration(current.node) && current.node.id) {\n jsxPath.unshift(current.node.id.name);\n break;\n } else if (t.isVariableDeclarator(current.node) && t.isIdentifier(current.node.id)) {\n jsxPath.unshift(current.node.id.name);\n break;\n }\n current = current.parentPath;\n }\n\n return jsxPath;\n }\n\n // Helper to get parent element info\n function getParentElement(path: NodePath<t.JSXText>): { tagName: string, props: Record<string, string> } {\n let current: NodePath | null = path.parentPath;\n\n while (current) {\n if (t.isJSXElement(current.node)) {\n const openingElement = current.node.openingElement;\n let tagName = '';\n\n if (t.isJSXIdentifier(openingElement.name)) {\n tagName = openingElement.name.name;\n } else if (t.isJSXMemberExpression(openingElement.name)) {\n tagName = generate(openingElement.name).code;\n }\n\n const props: Record<string, string> = {};\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n if (t.isStringLiteral(attr.value)) {\n props[propName] = attr.value.value;\n } else if (t.isJSXExpressionContainer(attr.value) && !t.isJSXEmptyExpression(attr.value.expression)) {\n // For expressions, just note that it's dynamic\n props[propName] = `{${generate(attr.value.expression).code}}`;\n }\n }\n }\n\n return { tagName, props };\n }\n current = current.parentPath;\n }\n\n return { tagName: 'unknown', props: {} };\n }\n\n // Helper to get sibling index among text nodes\n function getSiblingIndex(path: NodePath<t.JSXText>): number {\n const parent = path.parentPath;\n if (!t.isJSXElement(parent.node) && !t.isJSXFragment(parent.node)) {\n return 0;\n }\n\n const children = parent.node.children;\n let textIndex = 0;\n\n for (const child of children) {\n if (child === path.node) {\n return textIndex;\n }\n if (t.isJSXText(child) && child.value.trim() !== '') {\n textIndex++;\n }\n }\n\n return textIndex;\n }\n\n // Helper to get source context (lines before/after)\n function getSourceContext(loc: { start: number, end: number }): { before: string, after: string } {\n const lines = source.split('\\n');\n let currentPos = 0;\n let startLine = 0;\n\n // Find line number for start position\n for (let i = 0; i < lines.length; i++) {\n if (currentPos + lines[i].length >= loc.start) {\n startLine = i;\n break;\n }\n currentPos += lines[i].length + 1; // +1 for newline\n }\n\n const beforeLines = lines.slice(Math.max(0, startLine - 3), startLine).join('\\n');\n const afterLines = lines.slice(startLine + 1, startLine + 4).join('\\n');\n\n return { before: beforeLines, after: afterLines };\n }\n\n // Transform JSXText nodes\n traverse(ast, {\n JSXText(path) {\n const decodedText = path.node.value;\n\n // Skip whitespace-only text nodes\n if (decodedText.trim() === '') return;\n\n // Skip if node doesn't have location info\n // Use explicit null checks since start/end can validly be 0\n if (!path.node.loc || path.node.start == null || path.node.end == null) return;\n\n // IMPORTANT: Use the RAW source text, not the decoded path.node.value\n // Babel's parser decodes HTML entities (e.g., < -> <) in JSX text,\n // but we need to preserve the original source to avoid XSS vulnerabilities\n const rawText = source.slice(path.node.start, path.node.end);\n\n // Use source file prefix to ensure unique IDs across template and theme\n const prefix = options.sourceFile === 'template' ? 't' : 'h'; // t for template, h for theme (header)\n const id = `${prefix}${idCounter++}`;\n const occurrenceCount = textOccurrences.get(decodedText) ?? 1;\n const currentIndex = (textCurrentIndex.get(decodedText) ?? 0) + 1;\n textCurrentIndex.set(decodedText, currentIndex);\n\n const metadata: EditableMetadata = {\n id,\n loc: {\n start: path.node.start,\n end: path.node.end,\n line: path.node.loc.start.line,\n column: path.node.loc.start.column,\n },\n originalText: rawText,\n textHash: createHash('sha256').update(rawText).digest('hex').slice(0, 16),\n jsxPath: getJsxPath(path),\n parentElement: getParentElement(path),\n sourceContext: getSourceContext({ start: path.node.start, end: path.node.end }),\n siblingIndex: getSiblingIndex(path),\n occurrenceCount,\n occurrenceIndex: currentIndex,\n sourceFile: options.sourceFile,\n };\n\n editableRegions[id] = metadata;\n\n // Create the __Editable wrapper\n // <__Editable __id=\"...\">text</__Editable>\n // Use rawText to preserve HTML entities from the original source\n const editableElement = t.jsxElement(\n t.jsxOpeningElement(\n t.jsxIdentifier('__Editable'),\n [\n t.jsxAttribute(\n t.jsxIdentifier('__id'),\n t.stringLiteral(id)\n ),\n ],\n false\n ),\n t.jsxClosingElement(t.jsxIdentifier('__Editable')),\n [t.jsxText(rawText)],\n false\n );\n\n path.replaceWith(editableElement);\n },\n JSXExpressionContainer(path) {\n const expression = path.node.expression;\n\n // Skip empty expressions\n if (t.isJSXEmptyExpression(expression)) return;\n\n // Skip if parent is not a JSXElement (e.g., it's an attribute value)\n if (!t.isJSXElement(path.parent) && !t.isJSXFragment(path.parent)) return;\n\n // Skip JSX elements - we only want to show tooltips for text-rendering expressions\n if (t.isJSXElement(expression) || t.isJSXFragment(expression)) return;\n\n // Skip if no location info\n if (path.node.start == null || path.node.end == null) return;\n\n // Get the exact source code of the expression (including the ${} or just the expression)\n const exprSource = source.slice(path.node.start, path.node.end);\n\n // Base64 encode the expression to safely pass it through the marker\n const encodedExpr = Buffer.from(exprSource).toString('base64');\n\n // Create wrapper: <__ExpressionTooltip __expr=\"...\">{expression}</__ExpressionTooltip>\n const tooltipElement = t.jsxElement(\n t.jsxOpeningElement(\n t.jsxIdentifier('__ExpressionTooltip'),\n [\n t.jsxAttribute(\n t.jsxIdentifier('__expr'),\n t.stringLiteral(encodedExpr)\n ),\n ],\n false\n ),\n t.jsxClosingElement(t.jsxIdentifier('__ExpressionTooltip')),\n [t.jsxExpressionContainer(expression)],\n false\n );\n\n path.replaceWith(t.jsxExpressionContainer(tooltipElement));\n },\n });\n\n // Generate the transformed code\n const output = generate(ast, {\n retainLines: true,\n compact: false,\n });\n\n // Inject the __Editable component at the top of the file (after imports)\n let code = output.code;\n\n // Find the position after all imports\n const importEndMatch = code.match(/^(import\\s+[\\s\\S]*?from\\s+['\"][^'\"]+['\"];?\\s*)+/m);\n if (importEndMatch) {\n const insertPos = (importEndMatch.index ?? 0) + importEndMatch[0].length;\n code = code.slice(0, insertPos) + '\\n' + EDITABLE_COMPONENT_CODE + '\\n' + code.slice(insertPos);\n } else {\n // No imports found, add at the beginning\n code = EDITABLE_COMPONENT_CODE + '\\n' + code;\n }\n\n return {\n code,\n editableRegions,\n };\n}\n\n/**\n * Post-processes rendered HTML to convert sentinel tokens to HTML comments.\n *\n * Converts:\n * - `⟦STACK_EDITABLE_START:<id>⟧` → `<!-- STACK_EDITABLE_START <id> -->`\n * - `⟦STACK_EDITABLE_END:<id>⟧` → `<!-- STACK_EDITABLE_END <id> -->`\n * - `⟦STACK_EXPR_START:<base64-encoded-expr>⟧` → `<!-- STACK_EXPR_START <base64> -->`\n * - `⟦STACK_EXPR_END⟧` → `<!-- STACK_EXPR_END -->`\n */\nexport function convertSentinelTokensToComments(html: string): string {\n return html\n .replace(/⟦STACK_EDITABLE_START:([^⟧]+)⟧/g, '<!-- STACK_EDITABLE_START $1 -->')\n .replace(/⟦STACK_EDITABLE_END:([^⟧]+)⟧/g, '<!-- STACK_EDITABLE_END $1 -->')\n .replace(/⟦STACK_EXPR_START:([^⟧]+)⟧/g, '<!-- STACK_EXPR_START $1 -->')\n .replace(/⟦STACK_EXPR_END⟧/g, '<!-- STACK_EXPR_END -->');\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import { convertSentinelTokensToComments, transpileJsxForEditing } from "./jsx-editable-transpiler.js";
|
|
3
|
-
|
|
4
3
|
//#region src/utils/jsx-editable-transpiler.test.ts
|
|
5
4
|
describe("transpileJsxForEditing", () => {
|
|
6
5
|
it("should wrap simple JSX text nodes with __Editable", () => {
|
|
@@ -116,7 +115,7 @@ describe("convertSentinelTokensToComments", () => {
|
|
|
116
115
|
expect(convertSentinelTokensToComments(html)).toBe(html);
|
|
117
116
|
});
|
|
118
117
|
});
|
|
119
|
-
|
|
120
118
|
//#endregion
|
|
121
|
-
export {
|
|
119
|
+
export {};
|
|
120
|
+
|
|
122
121
|
//# sourceMappingURL=jsx-editable-transpiler.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-editable-transpiler.test.js","names":[],"sources":["../../../src/utils/jsx-editable-transpiler.test.ts"],"sourcesContent":["import { describe, it, expect } from 'vitest';\nimport { transpileJsxForEditing, convertSentinelTokensToComments } from './jsx-editable-transpiler';\n\ndescribe('transpileJsxForEditing', () => {\n it('should wrap simple JSX text nodes with __Editable', () => {\n const source = `\nexport function EmailTemplate() {\n return <div>Hello World!</div>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n expect(result.code).toContain('__Editable');\n expect(result.code).toContain('Hello World!');\n expect(Object.keys(result.editableRegions).length).toBeGreaterThan(0);\n\n // Check that the editable region has the expected metadata\n const region = Object.values(result.editableRegions)[0];\n expect(region.originalText).toBe('Hello World!');\n expect(region.sourceFile).toBe('template');\n expect(region.parentElement.tagName).toBe('div');\n });\n\n it('should handle multiple text nodes in the same element', () => {\n const source = `\nexport function EmailTemplate({ name }) {\n return <div>Hello, {name}! Welcome to our platform.</div>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n // Should have 2 editable regions (text before and after the expression)\n const regions = Object.values(result.editableRegions);\n expect(regions.length).toBe(2);\n\n const texts = regions.map(r => r.originalText);\n expect(texts).toContain('Hello, ');\n expect(texts).toContain('! Welcome to our platform.');\n });\n\n it('should skip whitespace-only text nodes', () => {\n const source = `\nexport function EmailTemplate() {\n return (\n <div>\n <span>Text</span>\n </div>\n );\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n // Should only have 1 editable region (the \"Text\" in span)\n const regions = Object.values(result.editableRegions);\n expect(regions.length).toBe(1);\n expect(regions[0].originalText).toBe('Text');\n });\n\n it('should track occurrence count for duplicate text', () => {\n const source = `\nexport function EmailTemplate() {\n return (\n <div>\n <p>Click here</p>\n <p>Click here</p>\n </div>\n );\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n const regions = Object.values(result.editableRegions);\n expect(regions.length).toBe(2);\n\n // Both should have occurrenceCount of 2\n expect(regions[0].occurrenceCount).toBe(2);\n expect(regions[1].occurrenceCount).toBe(2);\n\n // They should have different occurrence indices\n expect(regions[0].occurrenceIndex).toBe(1);\n expect(regions[1].occurrenceIndex).toBe(2);\n });\n\n it('should capture JSX path correctly', () => {\n const source = `\nexport function EmailTemplate() {\n return (\n <Container>\n <Section>\n <Text>Hello</Text>\n </Section>\n </Container>\n );\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n const region = Object.values(result.editableRegions)[0];\n expect(region.jsxPath).toContain('EmailTemplate');\n expect(region.jsxPath).toContain('Container');\n expect(region.jsxPath).toContain('Section');\n expect(region.jsxPath).toContain('Text');\n });\n\n it('should capture parent element props', () => {\n const source = `\nexport function EmailTemplate() {\n return <Text className=\"heading\" style={{ color: 'red' }}>Title</Text>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n const region = Object.values(result.editableRegions)[0];\n expect(region.parentElement.tagName).toBe('Text');\n expect(region.parentElement.props.className).toBe('heading');\n });\n\n it('should inject __Editable component definition', () => {\n const source = `\nexport function EmailTemplate() {\n return <div>Test</div>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n expect(result.code).toContain('function __Editable');\n expect(result.code).toContain('STACK_EDITABLE_START');\n expect(result.code).toContain('STACK_EDITABLE_END');\n });\n});\n\ndescribe('convertSentinelTokensToComments', () => {\n it('should convert start tokens to HTML comments', () => {\n const html = '<div>⟦STACK_EDITABLE_START:e0⟧Hello⟦STACK_EDITABLE_END:e0⟧</div>';\n const result = convertSentinelTokensToComments(html);\n\n expect(result).toBe('<div><!-- STACK_EDITABLE_START e0 -->Hello<!-- STACK_EDITABLE_END e0 --></div>');\n });\n\n it('should handle multiple editable regions', () => {\n const html = '<div>⟦STACK_EDITABLE_START:e0⟧Hello⟦STACK_EDITABLE_END:e0⟧ ⟦STACK_EDITABLE_START:e1⟧World⟦STACK_EDITABLE_END:e1⟧</div>';\n const result = convertSentinelTokensToComments(html);\n\n expect(result).toContain('<!-- STACK_EDITABLE_START e0 -->');\n expect(result).toContain('<!-- STACK_EDITABLE_END e0 -->');\n expect(result).toContain('<!-- STACK_EDITABLE_START e1 -->');\n expect(result).toContain('<!-- STACK_EDITABLE_END e1 -->');\n });\n\n it('should leave regular HTML unchanged', () => {\n const html = '<div><p>Hello World</p></div>';\n const result = convertSentinelTokensToComments(html);\n\n expect(result).toBe(html);\n });\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"jsx-editable-transpiler.test.js","names":[],"sources":["../../../src/utils/jsx-editable-transpiler.test.ts"],"sourcesContent":["import { describe, it, expect } from 'vitest';\nimport { transpileJsxForEditing, convertSentinelTokensToComments } from './jsx-editable-transpiler';\n\ndescribe('transpileJsxForEditing', () => {\n it('should wrap simple JSX text nodes with __Editable', () => {\n const source = `\nexport function EmailTemplate() {\n return <div>Hello World!</div>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n expect(result.code).toContain('__Editable');\n expect(result.code).toContain('Hello World!');\n expect(Object.keys(result.editableRegions).length).toBeGreaterThan(0);\n\n // Check that the editable region has the expected metadata\n const region = Object.values(result.editableRegions)[0];\n expect(region.originalText).toBe('Hello World!');\n expect(region.sourceFile).toBe('template');\n expect(region.parentElement.tagName).toBe('div');\n });\n\n it('should handle multiple text nodes in the same element', () => {\n const source = `\nexport function EmailTemplate({ name }) {\n return <div>Hello, {name}! Welcome to our platform.</div>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n // Should have 2 editable regions (text before and after the expression)\n const regions = Object.values(result.editableRegions);\n expect(regions.length).toBe(2);\n\n const texts = regions.map(r => r.originalText);\n expect(texts).toContain('Hello, ');\n expect(texts).toContain('! Welcome to our platform.');\n });\n\n it('should skip whitespace-only text nodes', () => {\n const source = `\nexport function EmailTemplate() {\n return (\n <div>\n <span>Text</span>\n </div>\n );\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n // Should only have 1 editable region (the \"Text\" in span)\n const regions = Object.values(result.editableRegions);\n expect(regions.length).toBe(1);\n expect(regions[0].originalText).toBe('Text');\n });\n\n it('should track occurrence count for duplicate text', () => {\n const source = `\nexport function EmailTemplate() {\n return (\n <div>\n <p>Click here</p>\n <p>Click here</p>\n </div>\n );\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n const regions = Object.values(result.editableRegions);\n expect(regions.length).toBe(2);\n\n // Both should have occurrenceCount of 2\n expect(regions[0].occurrenceCount).toBe(2);\n expect(regions[1].occurrenceCount).toBe(2);\n\n // They should have different occurrence indices\n expect(regions[0].occurrenceIndex).toBe(1);\n expect(regions[1].occurrenceIndex).toBe(2);\n });\n\n it('should capture JSX path correctly', () => {\n const source = `\nexport function EmailTemplate() {\n return (\n <Container>\n <Section>\n <Text>Hello</Text>\n </Section>\n </Container>\n );\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n const region = Object.values(result.editableRegions)[0];\n expect(region.jsxPath).toContain('EmailTemplate');\n expect(region.jsxPath).toContain('Container');\n expect(region.jsxPath).toContain('Section');\n expect(region.jsxPath).toContain('Text');\n });\n\n it('should capture parent element props', () => {\n const source = `\nexport function EmailTemplate() {\n return <Text className=\"heading\" style={{ color: 'red' }}>Title</Text>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n const region = Object.values(result.editableRegions)[0];\n expect(region.parentElement.tagName).toBe('Text');\n expect(region.parentElement.props.className).toBe('heading');\n });\n\n it('should inject __Editable component definition', () => {\n const source = `\nexport function EmailTemplate() {\n return <div>Test</div>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n expect(result.code).toContain('function __Editable');\n expect(result.code).toContain('STACK_EDITABLE_START');\n expect(result.code).toContain('STACK_EDITABLE_END');\n });\n});\n\ndescribe('convertSentinelTokensToComments', () => {\n it('should convert start tokens to HTML comments', () => {\n const html = '<div>⟦STACK_EDITABLE_START:e0⟧Hello⟦STACK_EDITABLE_END:e0⟧</div>';\n const result = convertSentinelTokensToComments(html);\n\n expect(result).toBe('<div><!-- STACK_EDITABLE_START e0 -->Hello<!-- STACK_EDITABLE_END e0 --></div>');\n });\n\n it('should handle multiple editable regions', () => {\n const html = '<div>⟦STACK_EDITABLE_START:e0⟧Hello⟦STACK_EDITABLE_END:e0⟧ ⟦STACK_EDITABLE_START:e1⟧World⟦STACK_EDITABLE_END:e1⟧</div>';\n const result = convertSentinelTokensToComments(html);\n\n expect(result).toContain('<!-- STACK_EDITABLE_START e0 -->');\n expect(result).toContain('<!-- STACK_EDITABLE_END e0 -->');\n expect(result).toContain('<!-- STACK_EDITABLE_START e1 -->');\n expect(result).toContain('<!-- STACK_EDITABLE_END e1 -->');\n });\n\n it('should leave regular HTML unchanged', () => {\n const html = '<div><p>Hello World</p></div>';\n const result = convertSentinelTokensToComments(html);\n\n expect(result).toBe(html);\n });\n});\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.d.ts","names":[],"sources":["../../../src/utils/jwt.tsx"],"mappings":";;;iBAsBsB,UAAA,CAAW,OAAA;EAC/B,GAAA;AAAA,IACD,OAAA;;;;;;;;;;;;;;;;;;;aAF+B,IAAA,CAAA,UAAA;EAAA;AAAA;;;;;;;;;;iBAeV,OAAA,CAAQ,OAAA;EAC5B,MAAA;EACA,QAAA;EACA,OAAA;EACA,cAAA;AAAA,IACD,OAAA;AAAA,iBAaqB,SAAA,CAAU,OAAA;EAC9B,cAAA;EACA,GAAA;AAAA,IACD,OAAA,CAAA,IAAA,CAAA,UAAA;AAAA,KAYW,UAAA;EACV,GAAA;EACA,GAAA;EACA,GAAA;EACA,GAAA;EACA,CAAA;EACA,CAAA;EACA,CAAA;AAAA
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","names":[],"sources":["../../../src/utils/jwt.tsx"],"mappings":";;;iBAsBsB,UAAA,CAAW,OAAA;EAC/B,GAAA;AAAA,IACD,OAAA;;;;;;;;;;;;;;;;;;;aAF+B,IAAA,CAAA,UAAA;EAAA;AAAA;;;;;;;;;;iBAeV,OAAA,CAAQ,OAAA;EAC5B,MAAA;EACA,QAAA;EACA,OAAA;EACA,cAAA;AAAA,IACD,OAAA;AAAA,iBAaqB,SAAA,CAAU,OAAA;EAC9B,cAAA;EACA,GAAA;AAAA,IACD,OAAA,CAAA,IAAA,CAAA,UAAA;AAAA,KAYW,UAAA;EACV,GAAA;EACA,GAAA;EACA,GAAA;EACA,GAAA;EACA,CAAA;EACA,CAAA;EACA,CAAA;AAAA;;;AAnBD;AAYD;iBAgCsB,cAAA,CAAe,OAAA;EACnC,QAAA;AAAA,IACE,OAAO,CAAC,UAAA;AAAA,KA0BA,SAAA;EACV,GAAA;EACA,GAAA;EACA,GAAA;EACA,GAAA;EACA,CAAA;EACA,CAAA;AAAA;AAAA,iBAEoB,eAAA,CAAgB,WAAA,EAAa,UAAA,KAAe,OAAA;EAAU,IAAA,EAAM,SAAA;AAAA;AAAA,iBAsBlE,SAAA,CAAU,OAEzB;EADC,MAAA;AAAA"}
|
package/dist/esm/utils/jwt.js
CHANGED
|
@@ -9,7 +9,6 @@ import { nicify } from "./strings.js";
|
|
|
9
9
|
import crypto from "crypto";
|
|
10
10
|
import elliptic from "elliptic";
|
|
11
11
|
import { JOSEError } from "jose/errors";
|
|
12
|
-
|
|
13
12
|
//#region src/utils/jwt.tsx
|
|
14
13
|
function getHexclaveServerSecret() {
|
|
15
14
|
const STACK_SERVER_SECRET = getEnvVariable("STACK_SERVER_SECRET");
|
|
@@ -96,7 +95,7 @@ function oldGetPerAudienceSecret(options) {
|
|
|
96
95
|
function oldGetKid(options) {
|
|
97
96
|
return jose.base64url.encode(crypto.createHash("sha256").update(JSON.stringify([options.secret, "kid"])).digest()).slice(0, 12);
|
|
98
97
|
}
|
|
99
|
-
|
|
100
98
|
//#endregion
|
|
101
99
|
export { getJwtInfo, getPrivateJwks, getPublicJwkSet, oldGetKid, signJWT, verifyJWT };
|
|
100
|
+
|
|
102
101
|
//# sourceMappingURL=jwt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.js","names":[],"sources":["../../../src/utils/jwt.tsx"],"sourcesContent":["import crypto from \"crypto\";\nimport elliptic from \"elliptic\";\nimport * as jose from \"jose\";\nimport { JOSEError } from \"jose/errors\";\nimport { encodeBase64Url } from \"./bytes\";\nimport { getEnvVariable } from \"./env\";\nimport { HexclaveAssertionError, errorToNiceString } from \"./errors\";\nimport { globalVar } from \"./globals\";\nimport { pick } from \"./objects\";\nimport { Result } from \"./results\";\nimport { nicify } from \"./strings\";\n\nfunction getHexclaveServerSecret() {\n const STACK_SERVER_SECRET = getEnvVariable(\"STACK_SERVER_SECRET\");\n try {\n jose.base64url.decode(STACK_SERVER_SECRET);\n } catch (e) {\n throw new HexclaveAssertionError(\"STACK_SERVER_SECRET is not valid. Please use the generateKeys script to generate a new secret.\", { cause: e });\n }\n return STACK_SERVER_SECRET;\n}\n\nexport async function getJwtInfo(options: {\n jwt: string,\n}) {\n try {\n if (typeof options.jwt !== \"string\") return Result.error({ error: \"JWT input is not a string!\", stringifiedInput: nicify(options.jwt) });\n if (!options.jwt.startsWith(\"ey\")) return Result.error({ error: \"Input is a string, but not a JWT!\", input: options.jwt });\n const decodedJwt = jose.decodeJwt(options.jwt);\n return Result.ok({ payload: decodedJwt });\n } catch (e) {\n return Result.error({\n exception: errorToNiceString(e),\n });\n }\n}\n\nexport async function signJWT(options: {\n issuer: string,\n audience: string,\n payload: any,\n expirationTime?: string,\n}) {\n const privateJwks = await getPrivateJwks({ audience: options.audience });\n const privateKey = await jose.importJWK(privateJwks[0]);\n\n return await new jose.SignJWT(options.payload)\n .setProtectedHeader({ alg: \"ES256\", kid: privateJwks[0].kid })\n .setIssuer(options.issuer)\n .setIssuedAt()\n .setAudience(options.audience)\n .setExpirationTime(options.expirationTime || \"5m\")\n .sign(privateKey);\n}\n\nexport async function verifyJWT(options: {\n allowedIssuers: string[],\n jwt: string,\n}) {\n const decodedJwt = jose.decodeJwt(options.jwt);\n const audience = decodedJwt.aud;\n if (!audience || typeof audience !== \"string\") {\n throw new JOSEError(\"Invalid JWT audience\");\n }\n\n const jwkSet = jose.createLocalJWKSet(await getPublicJwkSet(await getPrivateJwks({ audience })));\n const verified = await jose.jwtVerify(options.jwt, jwkSet, { issuer: options.allowedIssuers });\n return verified.payload;\n}\n\nexport type PrivateJwk = {\n kty: \"EC\",\n alg: \"ES256\",\n crv: \"P-256\",\n kid: string,\n d: string,\n x: string,\n y: string,\n};\nasync function getPrivateJwkFromDerivedSecret(derivedSecret: string, kid: string): Promise<PrivateJwk> {\n const secretHash = await globalVar.crypto.subtle.digest(\"SHA-256\", jose.base64url.decode(derivedSecret));\n const priv = new Uint8Array(secretHash);\n\n const ec = new elliptic.ec('p256');\n const key = ec.keyFromPrivate(priv);\n const publicKey = key.getPublic();\n\n return {\n kty: 'EC',\n crv: 'P-256',\n alg: 'ES256',\n kid: kid,\n d: encodeBase64Url(priv),\n x: encodeBase64Url(publicKey.getX().toBuffer()),\n y: encodeBase64Url(publicKey.getY().toBuffer()),\n };\n}\n\n/**\n * Returns a list of valid private JWKs for the given audience, with the first one taking precedence when signing new\n * JWTs.\n */\nexport async function getPrivateJwks(options: {\n audience: string,\n}): Promise<PrivateJwk[]> {\n const getHashOfJwkInfo = (type: string) => jose.base64url.encode(\n crypto\n .createHash('sha256')\n .update(JSON.stringify([type, getHexclaveServerSecret(), {\n audience: options.audience,\n }]))\n .digest()\n );\n // NOTE (Hexclave rebrand): do NOT rename these \"stack-*\" literals. They are hashed into the\n // per-audience JWT signing secret and key id (kid); renaming them would rotate every project's\n // JWKS and invalidate all already-issued access tokens. Internal constants, never user-visible.\n const perAudienceSecret = getHashOfJwkInfo(\"stack-jwk-audience-secret\");\n const perAudienceKid = getHashOfJwkInfo(\"stack-jwk-kid\").slice(0, 12);\n\n const oldPerAudienceSecret = oldGetPerAudienceSecret({ audience: options.audience });\n const oldPerAudienceKid = oldGetKid({ secret: oldPerAudienceSecret });\n\n return [\n // TODO next-release: make this not take precedence; then, in the release after that, remove it entirely\n await getPrivateJwkFromDerivedSecret(oldPerAudienceSecret, oldPerAudienceKid),\n\n await getPrivateJwkFromDerivedSecret(perAudienceSecret, perAudienceKid),\n ];\n}\n\nexport type PublicJwk = {\n kty: \"EC\",\n alg: \"ES256\",\n crv: \"P-256\",\n kid: string,\n x: string,\n y: string,\n};\nexport async function getPublicJwkSet(privateJwks: PrivateJwk[]): Promise<{ keys: PublicJwk[] }> {\n return {\n keys: privateJwks.map(jwk => pick(jwk, [\"kty\", \"alg\", \"crv\", \"x\", \"y\", \"kid\"])),\n };\n}\n\nfunction oldGetPerAudienceSecret(options: {\n audience: string,\n}) {\n if (options.audience === \"kid\") {\n throw new HexclaveAssertionError(\"You cannot use the 'kid' audience for a per-audience secret, see comment below in jwt.tsx\");\n }\n return jose.base64url.encode(\n crypto\n .createHash('sha256')\n // TODO we should prefix a string like \"stack-audience-secret\" before we hash so you can't use `getKid(...)` to get the secret for eg. the \"kid\" audience if the same secret value is used\n // Sadly doing this modification is a bit annoying as we need to leave the old keys to be valid for a little longer\n .update(JSON.stringify([getHexclaveServerSecret(), options.audience]))\n .digest()\n );\n};\n\nexport function oldGetKid(options: {\n secret: string,\n}) {\n return jose.base64url.encode(\n crypto\n .createHash('sha256')\n .update(JSON.stringify([options.secret, \"kid\"])) // TODO see above in getPerAudienceSecret\n .digest()\n ).slice(0, 12);\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"jwt.js","names":[],"sources":["../../../src/utils/jwt.tsx"],"sourcesContent":["import crypto from \"crypto\";\nimport elliptic from \"elliptic\";\nimport * as jose from \"jose\";\nimport { JOSEError } from \"jose/errors\";\nimport { encodeBase64Url } from \"./bytes\";\nimport { getEnvVariable } from \"./env\";\nimport { HexclaveAssertionError, errorToNiceString } from \"./errors\";\nimport { globalVar } from \"./globals\";\nimport { pick } from \"./objects\";\nimport { Result } from \"./results\";\nimport { nicify } from \"./strings\";\n\nfunction getHexclaveServerSecret() {\n const STACK_SERVER_SECRET = getEnvVariable(\"STACK_SERVER_SECRET\");\n try {\n jose.base64url.decode(STACK_SERVER_SECRET);\n } catch (e) {\n throw new HexclaveAssertionError(\"STACK_SERVER_SECRET is not valid. Please use the generateKeys script to generate a new secret.\", { cause: e });\n }\n return STACK_SERVER_SECRET;\n}\n\nexport async function getJwtInfo(options: {\n jwt: string,\n}) {\n try {\n if (typeof options.jwt !== \"string\") return Result.error({ error: \"JWT input is not a string!\", stringifiedInput: nicify(options.jwt) });\n if (!options.jwt.startsWith(\"ey\")) return Result.error({ error: \"Input is a string, but not a JWT!\", input: options.jwt });\n const decodedJwt = jose.decodeJwt(options.jwt);\n return Result.ok({ payload: decodedJwt });\n } catch (e) {\n return Result.error({\n exception: errorToNiceString(e),\n });\n }\n}\n\nexport async function signJWT(options: {\n issuer: string,\n audience: string,\n payload: any,\n expirationTime?: string,\n}) {\n const privateJwks = await getPrivateJwks({ audience: options.audience });\n const privateKey = await jose.importJWK(privateJwks[0]);\n\n return await new jose.SignJWT(options.payload)\n .setProtectedHeader({ alg: \"ES256\", kid: privateJwks[0].kid })\n .setIssuer(options.issuer)\n .setIssuedAt()\n .setAudience(options.audience)\n .setExpirationTime(options.expirationTime || \"5m\")\n .sign(privateKey);\n}\n\nexport async function verifyJWT(options: {\n allowedIssuers: string[],\n jwt: string,\n}) {\n const decodedJwt = jose.decodeJwt(options.jwt);\n const audience = decodedJwt.aud;\n if (!audience || typeof audience !== \"string\") {\n throw new JOSEError(\"Invalid JWT audience\");\n }\n\n const jwkSet = jose.createLocalJWKSet(await getPublicJwkSet(await getPrivateJwks({ audience })));\n const verified = await jose.jwtVerify(options.jwt, jwkSet, { issuer: options.allowedIssuers });\n return verified.payload;\n}\n\nexport type PrivateJwk = {\n kty: \"EC\",\n alg: \"ES256\",\n crv: \"P-256\",\n kid: string,\n d: string,\n x: string,\n y: string,\n};\nasync function getPrivateJwkFromDerivedSecret(derivedSecret: string, kid: string): Promise<PrivateJwk> {\n const secretHash = await globalVar.crypto.subtle.digest(\"SHA-256\", jose.base64url.decode(derivedSecret));\n const priv = new Uint8Array(secretHash);\n\n const ec = new elliptic.ec('p256');\n const key = ec.keyFromPrivate(priv);\n const publicKey = key.getPublic();\n\n return {\n kty: 'EC',\n crv: 'P-256',\n alg: 'ES256',\n kid: kid,\n d: encodeBase64Url(priv),\n x: encodeBase64Url(publicKey.getX().toBuffer()),\n y: encodeBase64Url(publicKey.getY().toBuffer()),\n };\n}\n\n/**\n * Returns a list of valid private JWKs for the given audience, with the first one taking precedence when signing new\n * JWTs.\n */\nexport async function getPrivateJwks(options: {\n audience: string,\n}): Promise<PrivateJwk[]> {\n const getHashOfJwkInfo = (type: string) => jose.base64url.encode(\n crypto\n .createHash('sha256')\n .update(JSON.stringify([type, getHexclaveServerSecret(), {\n audience: options.audience,\n }]))\n .digest()\n );\n // NOTE (Hexclave rebrand): do NOT rename these \"stack-*\" literals. They are hashed into the\n // per-audience JWT signing secret and key id (kid); renaming them would rotate every project's\n // JWKS and invalidate all already-issued access tokens. Internal constants, never user-visible.\n const perAudienceSecret = getHashOfJwkInfo(\"stack-jwk-audience-secret\");\n const perAudienceKid = getHashOfJwkInfo(\"stack-jwk-kid\").slice(0, 12);\n\n const oldPerAudienceSecret = oldGetPerAudienceSecret({ audience: options.audience });\n const oldPerAudienceKid = oldGetKid({ secret: oldPerAudienceSecret });\n\n return [\n // TODO next-release: make this not take precedence; then, in the release after that, remove it entirely\n await getPrivateJwkFromDerivedSecret(oldPerAudienceSecret, oldPerAudienceKid),\n\n await getPrivateJwkFromDerivedSecret(perAudienceSecret, perAudienceKid),\n ];\n}\n\nexport type PublicJwk = {\n kty: \"EC\",\n alg: \"ES256\",\n crv: \"P-256\",\n kid: string,\n x: string,\n y: string,\n};\nexport async function getPublicJwkSet(privateJwks: PrivateJwk[]): Promise<{ keys: PublicJwk[] }> {\n return {\n keys: privateJwks.map(jwk => pick(jwk, [\"kty\", \"alg\", \"crv\", \"x\", \"y\", \"kid\"])),\n };\n}\n\nfunction oldGetPerAudienceSecret(options: {\n audience: string,\n}) {\n if (options.audience === \"kid\") {\n throw new HexclaveAssertionError(\"You cannot use the 'kid' audience for a per-audience secret, see comment below in jwt.tsx\");\n }\n return jose.base64url.encode(\n crypto\n .createHash('sha256')\n // TODO we should prefix a string like \"stack-audience-secret\" before we hash so you can't use `getKid(...)` to get the secret for eg. the \"kid\" audience if the same secret value is used\n // Sadly doing this modification is a bit annoying as we need to leave the old keys to be valid for a little longer\n .update(JSON.stringify([getHexclaveServerSecret(), options.audience]))\n .digest()\n );\n};\n\nexport function oldGetKid(options: {\n secret: string,\n}) {\n return jose.base64url.encode(\n crypto\n .createHash('sha256')\n .update(JSON.stringify([options.secret, \"kid\"])) // TODO see above in getPerAudienceSecret\n .digest()\n ).slice(0, 12);\n}\n"],"mappings":";;;;;;;;;;;;AAYA,SAAS,0BAA0B;CACjC,MAAM,sBAAsB,eAAe,qBAAqB;CAChE,IAAI;EACF,KAAK,UAAU,OAAO,mBAAmB;CAC3C,SAAS,GAAG;EACV,MAAM,IAAI,uBAAuB,kGAAkG,EAAE,OAAO,EAAE,CAAC;CACjJ;CACA,OAAO;AACT;AAEA,eAAsB,WAAW,SAE9B;CACD,IAAI;EACF,IAAI,OAAO,QAAQ,QAAQ,UAAU,OAAO,OAAO,MAAM;GAAE,OAAO;GAA8B,kBAAkB,OAAO,QAAQ,GAAG;EAAE,CAAC;EACvI,IAAI,CAAC,QAAQ,IAAI,WAAW,IAAI,GAAG,OAAO,OAAO,MAAM;GAAE,OAAO;GAAqC,OAAO,QAAQ;EAAI,CAAC;EACzH,MAAM,aAAa,KAAK,UAAU,QAAQ,GAAG;EAC7C,OAAO,OAAO,GAAG,EAAE,SAAS,WAAW,CAAC;CAC1C,SAAS,GAAG;EACV,OAAO,OAAO,MAAM,EAClB,WAAW,kBAAkB,CAAC,EAChC,CAAC;CACH;AACF;AAEA,eAAsB,QAAQ,SAK3B;CACD,MAAM,cAAc,MAAM,eAAe,EAAE,UAAU,QAAQ,SAAS,CAAC;CACvE,MAAM,aAAa,MAAM,KAAK,UAAU,YAAY,EAAE;CAEtD,OAAO,MAAM,IAAI,KAAK,QAAQ,QAAQ,OAAO,CAAC,CAC3C,mBAAmB;EAAE,KAAK;EAAS,KAAK,YAAY,EAAE,CAAC;CAAI,CAAC,CAAC,CAC7D,UAAU,QAAQ,MAAM,CAAC,CACzB,YAAY,CAAC,CACb,YAAY,QAAQ,QAAQ,CAAC,CAC7B,kBAAkB,QAAQ,kBAAkB,IAAI,CAAC,CACjD,KAAK,UAAU;AACpB;AAEA,eAAsB,UAAU,SAG7B;CAED,MAAM,WADa,KAAK,UAAU,QAAQ,GAChB,CAAC,CAAC;CAC5B,IAAI,CAAC,YAAY,OAAO,aAAa,UACnC,MAAM,IAAI,UAAU,sBAAsB;CAG5C,MAAM,SAAS,KAAK,kBAAkB,MAAM,gBAAgB,MAAM,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC;CAE/F,QAAO,MADgB,KAAK,UAAU,QAAQ,KAAK,QAAQ,EAAE,QAAQ,QAAQ,eAAe,CAAC,EAAA,CAC7E;AAClB;AAWA,eAAe,+BAA+B,eAAuB,KAAkC;CACrG,MAAM,aAAa,MAAM,UAAU,OAAO,OAAO,OAAO,WAAW,KAAK,UAAU,OAAO,aAAa,CAAC;CACvG,MAAM,OAAO,IAAI,WAAW,UAAU;CAItC,MAAM,YADM,IADG,SAAS,GAAG,MACd,CAAC,CAAC,eAAe,IACV,CAAC,CAAC,UAAU;CAEhC,OAAO;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACA;EACL,GAAG,gBAAgB,IAAI;EACvB,GAAG,gBAAgB,UAAU,KAAK,CAAC,CAAC,SAAS,CAAC;EAC9C,GAAG,gBAAgB,UAAU,KAAK,CAAC,CAAC,SAAS,CAAC;CAChD;AACF;;;;;AAMA,eAAsB,eAAe,SAEX;CACxB,MAAM,oBAAoB,SAAiB,KAAK,UAAU,OACxD,OACG,WAAW,QAAQ,CAAC,CACpB,OAAO,KAAK,UAAU;EAAC;EAAM,wBAAwB;EAAG,EACvD,UAAU,QAAQ,SACpB;CAAC,CAAC,CAAC,CAAC,CACH,OAAO,CACZ;CAIA,MAAM,oBAAoB,iBAAiB,2BAA2B;CACtE,MAAM,iBAAiB,iBAAiB,eAAe,CAAC,CAAC,MAAM,GAAG,EAAE;CAEpE,MAAM,uBAAuB,wBAAwB,EAAE,UAAU,QAAQ,SAAS,CAAC;CAGnF,OAAO,CAEL,MAAM,+BAA+B,sBAJb,UAAU,EAAE,QAAQ,qBAAqB,CAIU,CAAC,GAE5E,MAAM,+BAA+B,mBAAmB,cAAc,CACxE;AACF;AAUA,eAAsB,gBAAgB,aAA2D;CAC/F,OAAO,EACL,MAAM,YAAY,KAAI,QAAO,KAAK,KAAK;EAAC;EAAO;EAAO;EAAO;EAAK;EAAK;CAAK,CAAC,CAAC,EAChF;AACF;AAEA,SAAS,wBAAwB,SAE9B;CACD,IAAI,QAAQ,aAAa,OACvB,MAAM,IAAI,uBAAuB,2FAA2F;CAE9H,OAAO,KAAK,UAAU,OACpB,OACG,WAAW,QAAQ,CAAC,CAGpB,OAAO,KAAK,UAAU,CAAC,wBAAwB,GAAG,QAAQ,QAAQ,CAAC,CAAC,CAAC,CACrE,OAAO,CACZ;AACF;AAEA,SAAgB,UAAU,SAEvB;CACD,OAAO,KAAK,UAAU,OACpB,OACG,WAAW,QAAQ,CAAC,CACpB,OAAO,KAAK,UAAU,CAAC,QAAQ,QAAQ,KAAK,CAAC,CAAC,CAAC,CAC/C,OAAO,CACZ,CAAC,CAAC,MAAM,GAAG,EAAE;AACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locks.d.ts","names":[],"sources":["../../../src/utils/locks.tsx"],"mappings":";KAEK,YAAA,YAAwB,
|
|
1
|
+
{"version":3,"file":"locks.d.ts","names":[],"sources":["../../../src/utils/locks.tsx"],"mappings":";KAEK,YAAA,YAAwB,OAAO,CAAC,CAAA;AAAA,cAExB,aAAA;EAAA,QACH,SAAA;EAAA,QACA,OAAA;EAAA,QACA,YAAA;;EAQF,YAAA,IAAgB,QAAA,EAAU,YAAA,CAAa,CAAA,IAAK,OAAA,CAAQ,CAAA;EASpD,aAAA,IAAiB,QAAA,EAAU,YAAA,CAAa,CAAA,IAAK,OAAA,CAAQ,CAAA;EAAA,QAS7C,gBAAA;EAAA,QAcA,gBAAA;EAAA,QAcA,iBAAA;EAAA,QAKA,iBAAA;AAAA"}
|
package/dist/esm/utils/locks.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Semaphore } from "async-mutex";
|
|
2
|
-
|
|
3
2
|
//#region src/utils/locks.tsx
|
|
4
3
|
var ReadWriteLock = class {
|
|
5
4
|
constructor() {
|
|
@@ -48,7 +47,7 @@ var ReadWriteLock = class {
|
|
|
48
47
|
this.semaphore.release();
|
|
49
48
|
}
|
|
50
49
|
};
|
|
51
|
-
|
|
52
50
|
//#endregion
|
|
53
51
|
export { ReadWriteLock };
|
|
52
|
+
|
|
54
53
|
//# sourceMappingURL=locks.js.map
|