@hexclave/shared 1.0.41 → 1.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin-interface-Bv8rBJo-.d.ts +379 -0
- package/dist/admin-interface-Bv8rBJo-.d.ts.map +1 -0
- package/dist/admin-metrics-DyW8_G82.d.ts +807 -0
- package/dist/admin-metrics-DyW8_G82.d.ts.map +1 -0
- package/dist/ai/image-limits.d.ts.map +1 -1
- package/dist/ai/image-limits.js +6 -7
- package/dist/ai/image-limits.js.map +1 -1
- package/dist/ai/llms/llms.d.ts.map +1 -1
- package/dist/ai/llms/llms.js +2 -4
- package/dist/ai/llms/llms.js.map +1 -1
- package/dist/ai/unified-prompts/reminders.js +2 -4
- package/dist/ai/unified-prompts/reminders.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +2 -5
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/brain.js +3 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/brain.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/cli-help.js +3 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/cli-help.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/config-docs.js +3 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/config-docs.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js +3 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js +3 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +5 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +1 -2
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +3 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js +3 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt.js +2 -4
- package/dist/ai/unified-prompts/skill-site-prompt.js.map +1 -1
- package/dist/analytics-IjkAsefy.d.ts +14 -0
- package/dist/analytics-IjkAsefy.d.ts.map +1 -0
- package/dist/apps/apps-config.d.ts.map +1 -1
- package/dist/apps/apps-config.js +2 -3
- package/dist/apps/apps-config.js.map +1 -1
- package/dist/apps/apps-ui.d.ts +1 -2
- package/dist/apps/apps-ui.d.ts.map +1 -1
- package/dist/apps/apps-ui.js +4 -5
- package/dist/apps/apps-ui.js.map +1 -1
- package/dist/client-interface-CGrvUtX0.d.ts +447 -0
- package/dist/client-interface-CGrvUtX0.d.ts.map +1 -0
- package/dist/config/db-sync-mappings.js +2 -3
- package/dist/config/db-sync-mappings.js.map +1 -1
- package/dist/config/format.d.ts +2 -61
- package/dist/config/format.js +2 -192
- package/dist/config/format.js.map +1 -1
- package/dist/config/migrate-catalogs-to-product-lines.d.ts.map +1 -1
- package/dist/config/migrate-catalogs-to-product-lines.js +2 -196
- package/dist/config/migrate-catalogs-to-product-lines.js.map +1 -1
- package/dist/config/schema-fuzzer.test.js +18 -172
- package/dist/config/schema-fuzzer.test.js.map +1 -1
- package/dist/config/schema.d.ts +2 -2328
- package/dist/config/schema.js +6 -351
- package/dist/config/schema.js.map +1 -1
- package/dist/config-authoring.d.ts +1 -1
- package/dist/config-authoring.d.ts.map +1 -1
- package/dist/config-authoring.js +2 -3
- package/dist/config-authoring.js.map +1 -1
- package/dist/config-authoring.test.js +1 -3
- package/dist/config-authoring.test.js.map +1 -1
- package/dist/config-eval.d.ts.map +1 -1
- package/dist/config-eval.js +4 -46
- package/dist/config-eval.js.map +1 -1
- package/dist/config-rendering.d.ts.map +1 -1
- package/dist/config-rendering.js +2 -48
- package/dist/config-rendering.js.map +1 -1
- package/dist/connected-accounts-D5CKe50A.d.ts +67 -0
- package/dist/connected-accounts-D5CKe50A.d.ts.map +1 -0
- package/dist/contact-channels-DW8yQxlc.d.ts +180 -0
- package/dist/contact-channels-DW8yQxlc.d.ts.map +1 -0
- package/dist/country-codes-CRWDroBE.d.ts +11 -0
- package/dist/country-codes-CRWDroBE.d.ts.map +1 -0
- package/dist/crud-CqmEW9s6.d.ts +98 -0
- package/dist/crud-CqmEW9s6.d.ts.map +1 -0
- package/dist/crud.d.ts +2 -98
- package/dist/crud.js +3 -71
- package/dist/crud.js.map +1 -1
- package/dist/currency-constants-Cq_q8twn.d.ts +45 -0
- package/dist/currency-constants-Cq_q8twn.d.ts.map +1 -0
- package/dist/current-user-Dvf8Ttjo.d.ts +284 -0
- package/dist/current-user-Dvf8Ttjo.d.ts.map +1 -0
- package/dist/dates-B6ne9iOR.d.ts +23 -0
- package/dist/dates-B6ne9iOR.d.ts.map +1 -0
- package/dist/email-outbox-BVqBaXpn.d.ts +1464 -0
- package/dist/{interface/crud/email-outbox.d.ts.map → email-outbox-BVqBaXpn.d.ts.map} +1 -1
- package/dist/emails-Ba4yEaCS.d.ts +40 -0
- package/dist/emails-Ba4yEaCS.d.ts.map +1 -0
- package/dist/errors-Cl-RUyed.d.ts +238 -0
- package/dist/errors-Cl-RUyed.d.ts.map +1 -0
- package/dist/esm/ai/image-limits.d.ts.map +1 -1
- package/dist/esm/ai/image-limits.js +5 -5
- package/dist/esm/ai/image-limits.js.map +1 -1
- package/dist/esm/ai/llms/llms.d.ts +1 -1
- package/dist/esm/ai/llms/llms.d.ts.map +1 -1
- package/dist/esm/ai/llms/llms.js +1 -2
- package/dist/esm/ai/llms/llms.js.map +1 -1
- package/dist/esm/ai/unified-prompts/reminders.js +1 -2
- package/dist/esm/ai/unified-prompts/reminders.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +25 -28
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/brain.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/brain.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/cli-help.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/cli-help.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/config-docs.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/config-docs.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +2 -3
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt.js +1 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt.js.map +1 -1
- package/dist/esm/apps/apps-config.d.ts.map +1 -1
- package/dist/esm/apps/apps-config.js +1 -1
- package/dist/esm/apps/apps-config.js.map +1 -1
- package/dist/esm/apps/apps-ui.d.ts +2 -3
- package/dist/esm/apps/apps-ui.d.ts.map +1 -1
- package/dist/esm/apps/apps-ui.js +2 -3
- package/dist/esm/apps/apps-ui.js.map +1 -1
- package/dist/esm/config/db-sync-mappings.js +1 -1
- package/dist/esm/config/db-sync-mappings.js.map +1 -1
- package/dist/esm/config/format.d.ts +1 -1
- package/dist/esm/config/format.d.ts.map +1 -1
- package/dist/esm/config/format.js +1 -190
- package/dist/esm/config/format.js.map +1 -1
- package/dist/esm/config/migrate-catalogs-to-product-lines.d.ts.map +1 -1
- package/dist/esm/config/migrate-catalogs-to-product-lines.js +1 -194
- package/dist/esm/config/migrate-catalogs-to-product-lines.js.map +1 -1
- package/dist/esm/config/schema-fuzzer.test.js +20 -173
- package/dist/esm/config/schema-fuzzer.test.js.map +1 -1
- package/dist/esm/config/schema.d.ts +249 -250
- package/dist/esm/config/schema.d.ts.map +1 -1
- package/dist/esm/config/schema.js +2 -347
- package/dist/esm/config/schema.js.map +1 -1
- package/dist/esm/config-authoring.d.ts +1 -1
- package/dist/esm/config-authoring.d.ts.map +1 -1
- package/dist/esm/config-authoring.js +1 -1
- package/dist/esm/config-authoring.js.map +1 -1
- package/dist/esm/config-authoring.test.js +2 -3
- package/dist/esm/config-authoring.test.js.map +1 -1
- package/dist/esm/config-eval.d.ts +1 -1
- package/dist/esm/config-eval.d.ts.map +1 -1
- package/dist/esm/config-eval.js +1 -43
- package/dist/esm/config-eval.js.map +1 -1
- package/dist/esm/config-rendering.d.ts.map +1 -1
- package/dist/esm/config-rendering.js +1 -46
- package/dist/esm/config-rendering.js.map +1 -1
- package/dist/esm/crud.d.ts +1 -1
- package/dist/esm/crud.d.ts.map +1 -1
- package/dist/esm/crud.js +2 -69
- package/dist/esm/crud.js.map +1 -1
- package/dist/esm/helpers/emails.js +1 -2
- package/dist/esm/helpers/emails.js.map +1 -1
- package/dist/esm/helpers/init-prompt.d.ts.map +1 -1
- package/dist/esm/helpers/init-prompt.js +1 -2
- package/dist/esm/helpers/init-prompt.js.map +1 -1
- package/dist/esm/helpers/password.d.ts +1 -1
- package/dist/esm/helpers/password.d.ts.map +1 -1
- package/dist/esm/helpers/password.js +1 -2
- package/dist/esm/helpers/password.js.map +1 -1
- package/dist/esm/helpers/production-mode.d.ts +1 -1
- package/dist/esm/helpers/production-mode.d.ts.map +1 -1
- package/dist/esm/helpers/production-mode.js +1 -2
- package/dist/esm/helpers/production-mode.js.map +1 -1
- package/dist/esm/helpers/support-sla.d.ts.map +1 -1
- package/dist/esm/helpers/support-sla.js +1 -1
- package/dist/esm/helpers/support-sla.js.map +1 -1
- package/dist/esm/helpers/support-sla.test.js +2 -3
- package/dist/esm/helpers/support-sla.test.js.map +1 -1
- package/dist/esm/helpers/vault/client-side.d.ts.map +1 -1
- package/dist/esm/helpers/vault/client-side.js +1 -20
- package/dist/esm/helpers/vault/client-side.js.map +1 -1
- package/dist/esm/helpers/vault/server-side.js +1 -2
- package/dist/esm/helpers/vault/server-side.js.map +1 -1
- package/dist/esm/hooks/use-async-callback.d.ts.map +1 -1
- package/dist/esm/hooks/use-async-callback.js +1 -2
- package/dist/esm/hooks/use-async-callback.js.map +1 -1
- package/dist/esm/hooks/use-async-external-store.d.ts +1 -1
- package/dist/esm/hooks/use-async-external-store.d.ts.map +1 -1
- package/dist/esm/hooks/use-async-external-store.js +1 -2
- package/dist/esm/hooks/use-async-external-store.js.map +1 -1
- package/dist/esm/hooks/use-hash.js +1 -2
- package/dist/esm/hooks/use-hash.js.map +1 -1
- package/dist/esm/hooks/use-hover.d.ts.map +1 -1
- package/dist/esm/hooks/use-hover.js +1 -2
- package/dist/esm/hooks/use-hover.js.map +1 -1
- package/dist/esm/hooks/use-strict-memo.d.ts.map +1 -1
- package/dist/esm/hooks/use-strict-memo.js +1 -70
- package/dist/esm/hooks/use-strict-memo.js.map +1 -1
- package/dist/esm/index.d.ts +4 -4
- package/dist/esm/index.js +1 -2
- package/dist/esm/interface/admin-interface.d.ts +19 -19
- package/dist/esm/interface/admin-interface.d.ts.map +1 -1
- package/dist/esm/interface/admin-interface.js +1 -2
- package/dist/esm/interface/admin-interface.js.map +1 -1
- package/dist/esm/interface/admin-metrics.d.ts +11 -11
- package/dist/esm/interface/admin-metrics.d.ts.map +1 -1
- package/dist/esm/interface/admin-metrics.js +1 -2
- package/dist/esm/interface/admin-metrics.js.map +1 -1
- package/dist/esm/interface/client-interface.d.ts +22 -22
- package/dist/esm/interface/client-interface.d.ts.map +1 -1
- package/dist/esm/interface/client-interface.js +31 -15
- package/dist/esm/interface/client-interface.js.map +1 -1
- package/dist/esm/interface/client-interface.test.js +84 -13
- package/dist/esm/interface/client-interface.test.js.map +1 -1
- package/dist/esm/interface/conversations.d.ts +33 -33
- package/dist/esm/interface/conversations.d.ts.map +1 -1
- package/dist/esm/interface/conversations.js +1 -2
- package/dist/esm/interface/conversations.js.map +1 -1
- package/dist/esm/interface/crud/analytics.d.ts.map +1 -1
- package/dist/esm/interface/crud/analytics.js +1 -1
- package/dist/esm/interface/crud/connected-accounts.d.ts +15 -17
- package/dist/esm/interface/crud/connected-accounts.d.ts.map +1 -1
- package/dist/esm/interface/crud/connected-accounts.js +1 -2
- package/dist/esm/interface/crud/connected-accounts.js.map +1 -1
- package/dist/esm/interface/crud/contact-channels.d.ts +24 -26
- package/dist/esm/interface/crud/contact-channels.d.ts.map +1 -1
- package/dist/esm/interface/crud/contact-channels.js +1 -2
- package/dist/esm/interface/crud/contact-channels.js.map +1 -1
- package/dist/esm/interface/crud/current-user.d.ts +20 -22
- package/dist/esm/interface/crud/current-user.d.ts.map +1 -1
- package/dist/esm/interface/crud/current-user.js +25 -29
- package/dist/esm/interface/crud/current-user.js.map +1 -1
- package/dist/esm/interface/crud/email-outbox.d.ts +32 -34
- package/dist/esm/interface/crud/email-outbox.d.ts.map +1 -1
- package/dist/esm/interface/crud/email-outbox.js +1 -2
- package/dist/esm/interface/crud/email-outbox.js.map +1 -1
- package/dist/esm/interface/crud/email-templates.d.ts +16 -18
- package/dist/esm/interface/crud/email-templates.d.ts.map +1 -1
- package/dist/esm/interface/crud/email-templates.js +1 -2
- package/dist/esm/interface/crud/email-templates.js.map +1 -1
- package/dist/esm/interface/crud/emails.d.ts +6 -8
- package/dist/esm/interface/crud/emails.d.ts.map +1 -1
- package/dist/esm/interface/crud/emails.js +1 -2
- package/dist/esm/interface/crud/emails.js.map +1 -1
- package/dist/esm/interface/crud/internal-api-keys.d.ts +16 -18
- package/dist/esm/interface/crud/internal-api-keys.d.ts.map +1 -1
- package/dist/esm/interface/crud/internal-api-keys.js +1 -2
- package/dist/esm/interface/crud/internal-api-keys.js.map +1 -1
- package/dist/esm/interface/crud/invoices.d.ts +2 -2
- package/dist/esm/interface/crud/invoices.d.ts.map +1 -1
- package/dist/esm/interface/crud/invoices.js +1 -2
- package/dist/esm/interface/crud/invoices.js.map +1 -1
- package/dist/esm/interface/crud/items.d.ts +6 -8
- package/dist/esm/interface/crud/items.d.ts.map +1 -1
- package/dist/esm/interface/crud/items.js +12 -16
- package/dist/esm/interface/crud/items.js.map +1 -1
- package/dist/esm/interface/crud/notification-preferences.d.ts +6 -8
- package/dist/esm/interface/crud/notification-preferences.d.ts.map +1 -1
- package/dist/esm/interface/crud/notification-preferences.js +8 -12
- package/dist/esm/interface/crud/notification-preferences.js.map +1 -1
- package/dist/esm/interface/crud/oauth-providers.d.ts +24 -26
- package/dist/esm/interface/crud/oauth-providers.d.ts.map +1 -1
- package/dist/esm/interface/crud/oauth-providers.js +1 -2
- package/dist/esm/interface/crud/oauth-providers.js.map +1 -1
- package/dist/esm/interface/crud/products.d.ts +21 -22
- package/dist/esm/interface/crud/products.d.ts.map +1 -1
- package/dist/esm/interface/crud/products.js +3 -2
- package/dist/esm/interface/crud/products.js.map +1 -1
- package/dist/esm/interface/crud/project-api-keys.d.ts +5 -6
- package/dist/esm/interface/crud/project-api-keys.d.ts.map +1 -1
- package/dist/esm/interface/crud/project-api-keys.js +1 -2
- package/dist/esm/interface/crud/project-api-keys.js.map +1 -1
- package/dist/esm/interface/crud/project-permissions.d.ts +29 -31
- package/dist/esm/interface/crud/project-permissions.d.ts.map +1 -1
- package/dist/esm/interface/crud/project-permissions.js +1 -2
- package/dist/esm/interface/crud/project-permissions.js.map +1 -1
- package/dist/esm/interface/crud/projects.d.ts +71 -73
- package/dist/esm/interface/crud/projects.d.ts.map +1 -1
- package/dist/esm/interface/crud/projects.js +3 -2
- package/dist/esm/interface/crud/projects.js.map +1 -1
- package/dist/esm/interface/crud/session-replays.d.ts.map +1 -1
- package/dist/esm/interface/crud/session-replays.js +1 -1
- package/dist/esm/interface/crud/sessions.d.ts +15 -17
- package/dist/esm/interface/crud/sessions.d.ts.map +1 -1
- package/dist/esm/interface/crud/sessions.js +1 -2
- package/dist/esm/interface/crud/sessions.js.map +1 -1
- package/dist/esm/interface/crud/sign-up-rules.d.ts.map +1 -1
- package/dist/esm/interface/crud/sign-up-rules.js +1 -1
- package/dist/esm/interface/crud/svix-token.d.ts +8 -10
- package/dist/esm/interface/crud/svix-token.d.ts.map +1 -1
- package/dist/esm/interface/crud/svix-token.js +1 -2
- package/dist/esm/interface/crud/svix-token.js.map +1 -1
- package/dist/esm/interface/crud/team-invitation-details.d.ts +6 -8
- package/dist/esm/interface/crud/team-invitation-details.d.ts.map +1 -1
- package/dist/esm/interface/crud/team-invitation-details.js +1 -2
- package/dist/esm/interface/crud/team-invitation-details.js.map +1 -1
- package/dist/esm/interface/crud/team-invitation.d.ts +7 -9
- package/dist/esm/interface/crud/team-invitation.d.ts.map +1 -1
- package/dist/esm/interface/crud/team-invitation.js +1 -2
- package/dist/esm/interface/crud/team-invitation.js.map +1 -1
- package/dist/esm/interface/crud/team-member-profiles.d.ts +26 -28
- package/dist/esm/interface/crud/team-member-profiles.d.ts.map +1 -1
- package/dist/esm/interface/crud/team-member-profiles.js +1 -2
- package/dist/esm/interface/crud/team-member-profiles.js.map +1 -1
- package/dist/esm/interface/crud/team-memberships.d.ts +14 -16
- package/dist/esm/interface/crud/team-memberships.d.ts.map +1 -1
- package/dist/esm/interface/crud/team-memberships.js +1 -2
- package/dist/esm/interface/crud/team-memberships.js.map +1 -1
- package/dist/esm/interface/crud/team-permissions.d.ts +29 -31
- package/dist/esm/interface/crud/team-permissions.d.ts.map +1 -1
- package/dist/esm/interface/crud/team-permissions.js +1 -2
- package/dist/esm/interface/crud/team-permissions.js.map +1 -1
- package/dist/esm/interface/crud/teams.d.ts +36 -38
- package/dist/esm/interface/crud/teams.d.ts.map +1 -1
- package/dist/esm/interface/crud/teams.js +2 -4
- package/dist/esm/interface/crud/teams.js.map +1 -1
- package/dist/esm/interface/crud/transactions.d.ts +14 -16
- package/dist/esm/interface/crud/transactions.d.ts.map +1 -1
- package/dist/esm/interface/crud/transactions.js +7 -13
- package/dist/esm/interface/crud/transactions.js.map +1 -1
- package/dist/esm/interface/crud/users.d.ts +11 -12
- package/dist/esm/interface/crud/users.d.ts.map +1 -1
- package/dist/esm/interface/crud/users.js +9 -5
- package/dist/esm/interface/crud/users.js.map +1 -1
- package/dist/esm/interface/handler-urls.d.ts +1 -1
- package/dist/esm/interface/handler-urls.d.ts.map +1 -1
- package/dist/esm/interface/handler-urls.js +1 -2
- package/dist/esm/interface/page-component-versions.d.ts +1 -1
- package/dist/esm/interface/page-component-versions.d.ts.map +1 -1
- package/dist/esm/interface/page-component-versions.js +1 -2
- package/dist/esm/interface/page-component-versions.js.map +1 -1
- package/dist/esm/interface/plan-usage.d.ts +1 -1
- package/dist/esm/interface/plan-usage.d.ts.map +1 -1
- package/dist/esm/interface/plan-usage.js +1 -2
- package/dist/esm/interface/plan-usage.js.map +1 -1
- package/dist/esm/interface/server-interface.d.ts +19 -19
- package/dist/esm/interface/server-interface.d.ts.map +1 -1
- package/dist/esm/interface/server-interface.js +1 -2
- package/dist/esm/interface/server-interface.js.map +1 -1
- package/dist/esm/interface/webhooks.d.ts +2 -2
- package/dist/esm/interface/webhooks.d.ts.map +1 -1
- package/dist/esm/interface/webhooks.js +1 -2
- package/dist/esm/interface/webhooks.js.map +1 -1
- package/dist/esm/known-errors.d.ts +2 -2
- package/dist/esm/known-errors.d.ts.map +1 -1
- package/dist/esm/known-errors.js +10 -21
- package/dist/esm/known-errors.js.map +1 -1
- package/dist/esm/payments/payment-methods.d.ts.map +1 -1
- package/dist/esm/payments/payment-methods.js +1 -1
- package/dist/esm/payments/payment-methods.js.map +1 -1
- package/dist/esm/payments/stripe-limits.d.ts.map +1 -1
- package/dist/esm/payments/stripe-limits.js +1 -1
- package/dist/esm/payments/stripe-limits.js.map +1 -1
- package/dist/esm/plans.d.ts.map +1 -1
- package/dist/esm/plans.js +1 -1
- package/dist/esm/plans.js.map +1 -1
- package/dist/esm/schema-fields.d.ts +14 -14
- package/dist/esm/schema-fields.d.ts.map +1 -1
- package/dist/esm/schema-fields.js +3 -64
- package/dist/esm/schema-fields.js.map +1 -1
- package/dist/esm/sessions.d.ts +6 -6
- package/dist/esm/sessions.d.ts.map +1 -1
- package/dist/esm/sessions.js +1 -2
- package/dist/esm/sessions.js.map +1 -1
- package/dist/esm/sessions.test.js +2 -3
- package/dist/esm/sessions.test.js.map +1 -1
- package/dist/esm/utils/analytics-clickmap-overlay.d.ts.map +1 -1
- package/dist/esm/utils/analytics-clickmap-overlay.js +1 -1
- package/dist/esm/utils/api-keys.d.ts.map +1 -1
- package/dist/esm/utils/api-keys.js +1 -2
- package/dist/esm/utils/api-keys.js.map +1 -1
- package/dist/esm/utils/arrays.d.ts.map +1 -1
- package/dist/esm/utils/arrays.js +1 -470
- package/dist/esm/utils/arrays.js.map +1 -1
- package/dist/esm/utils/auth-methods.d.ts.map +1 -1
- package/dist/esm/utils/auth-methods.js +1 -1
- package/dist/esm/utils/auth-methods.js.map +1 -1
- package/dist/esm/utils/base64.d.ts.map +1 -1
- package/dist/esm/utils/base64.js +1 -10
- package/dist/esm/utils/base64.js.map +1 -1
- package/dist/esm/utils/booleans.d.ts.map +1 -1
- package/dist/esm/utils/booleans.js +1 -25
- package/dist/esm/utils/booleans.js.map +1 -1
- package/dist/esm/utils/browser-compat.d.ts.map +1 -1
- package/dist/esm/utils/browser-compat.js +1 -1
- package/dist/esm/utils/browser-compat.js.map +1 -1
- package/dist/esm/utils/bytes.d.ts.map +1 -1
- package/dist/esm/utils/bytes.js +3 -198
- package/dist/esm/utils/bytes.js.map +1 -1
- package/dist/esm/utils/caches.d.ts +1 -1
- package/dist/esm/utils/caches.d.ts.map +1 -1
- package/dist/esm/utils/caches.js +1 -27
- package/dist/esm/utils/caches.js.map +1 -1
- package/dist/esm/utils/cel-fields.d.ts.map +1 -1
- package/dist/esm/utils/cel-fields.js +1 -2
- package/dist/esm/utils/cel-fields.js.map +1 -1
- package/dist/esm/utils/cloud-hosts.d.ts.map +1 -1
- package/dist/esm/utils/cloud-hosts.js +1 -27
- package/dist/esm/utils/cloud-hosts.js.map +1 -1
- package/dist/esm/utils/compile-time.d.ts.map +1 -1
- package/dist/esm/utils/compile-time.js +1 -1
- package/dist/esm/utils/compile-time.js.map +1 -1
- package/dist/esm/utils/country-codes.d.ts.map +1 -1
- package/dist/esm/utils/country-codes.js +1 -16
- package/dist/esm/utils/country-codes.js.map +1 -1
- package/dist/esm/utils/crypto.d.ts.map +1 -1
- package/dist/esm/utils/crypto.js +3 -113
- package/dist/esm/utils/crypto.js.map +1 -1
- package/dist/esm/utils/currencies.d.ts +1 -1
- package/dist/esm/utils/currencies.d.ts.map +1 -1
- package/dist/esm/utils/currencies.js +2 -37
- package/dist/esm/utils/currencies.js.map +1 -1
- package/dist/esm/utils/currency-constants.d.ts.map +1 -1
- package/dist/esm/utils/currency-constants.js +1 -1
- package/dist/esm/utils/currency-constants.js.map +1 -1
- package/dist/esm/utils/dates.d.ts.map +1 -1
- package/dist/esm/utils/dates.js +1 -44
- package/dist/esm/utils/dates.js.map +1 -1
- package/dist/esm/utils/dev-env-state-path.d.ts.map +1 -1
- package/dist/esm/utils/dev-env-state-path.js +1 -2
- package/dist/esm/utils/dev-env-state-path.js.map +1 -1
- package/dist/esm/utils/dev-tool.d.ts.map +1 -1
- package/dist/esm/utils/dev-tool.js +1 -1
- package/dist/esm/utils/dom.d.ts.map +1 -1
- package/dist/esm/utils/dom.js +1 -1
- package/dist/esm/utils/dom.js.map +1 -1
- package/dist/esm/utils/elements-chain.d.ts.map +1 -1
- package/dist/esm/utils/elements-chain.js +5 -50
- package/dist/esm/utils/elements-chain.js.map +1 -1
- package/dist/esm/utils/env.d.ts.map +1 -1
- package/dist/esm/utils/env.js +1 -2
- package/dist/esm/utils/env.js.map +1 -1
- package/dist/esm/utils/env.test.js +2 -3
- package/dist/esm/utils/env.test.js.map +1 -1
- package/dist/esm/utils/errors.d.ts +1 -1
- package/dist/esm/utils/errors.d.ts.map +1 -1
- package/dist/esm/utils/errors.js +1 -2
- package/dist/esm/utils/errors.js.map +1 -1
- package/dist/esm/utils/esbuild.d.ts +1 -1
- package/dist/esm/utils/esbuild.d.ts.map +1 -1
- package/dist/esm/utils/esbuild.js +2 -3
- package/dist/esm/utils/esbuild.js.map +1 -1
- package/dist/esm/utils/featurebase.d.ts.map +1 -1
- package/dist/esm/utils/featurebase.js +1 -2
- package/dist/esm/utils/featurebase.js.map +1 -1
- package/dist/esm/utils/fs.d.ts.map +1 -1
- package/dist/esm/utils/fs.js +1 -2
- package/dist/esm/utils/fs.js.map +1 -1
- package/dist/esm/utils/functions.d.ts.map +1 -1
- package/dist/esm/utils/functions.js +1 -24
- package/dist/esm/utils/functions.js.map +1 -1
- package/dist/esm/utils/geo.d.ts.map +1 -1
- package/dist/esm/utils/geo.js +1 -2
- package/dist/esm/utils/geo.js.map +1 -1
- package/dist/esm/utils/globals.d.ts.map +1 -1
- package/dist/esm/utils/globals.js +1 -1
- package/dist/esm/utils/globals.js.map +1 -1
- package/dist/esm/utils/hashes.d.ts.map +1 -1
- package/dist/esm/utils/hashes.js +1 -2
- package/dist/esm/utils/hashes.js.map +1 -1
- package/dist/esm/utils/html.d.ts.map +1 -1
- package/dist/esm/utils/html.js +1 -19
- package/dist/esm/utils/html.js.map +1 -1
- package/dist/esm/utils/http.d.ts.map +1 -1
- package/dist/esm/utils/http.js +1 -19
- package/dist/esm/utils/http.js.map +1 -1
- package/dist/esm/utils/ips.d.ts.map +1 -1
- package/dist/esm/utils/ips.js +1 -25
- package/dist/esm/utils/ips.js.map +1 -1
- package/dist/esm/utils/json.d.ts +1 -1
- package/dist/esm/utils/json.d.ts.map +1 -1
- package/dist/esm/utils/json.js +1 -155
- package/dist/esm/utils/json.js.map +1 -1
- package/dist/esm/utils/jsx-editable-transpiler.d.ts.map +1 -1
- package/dist/esm/utils/jsx-editable-transpiler.js +1 -2
- package/dist/esm/utils/jsx-editable-transpiler.js.map +1 -1
- package/dist/esm/utils/jsx-editable-transpiler.test.js +2 -3
- package/dist/esm/utils/jsx-editable-transpiler.test.js.map +1 -1
- package/dist/esm/utils/jwt.d.ts.map +1 -1
- package/dist/esm/utils/jwt.js +1 -2
- package/dist/esm/utils/jwt.js.map +1 -1
- package/dist/esm/utils/locks.d.ts.map +1 -1
- package/dist/esm/utils/locks.js +1 -2
- package/dist/esm/utils/locks.js.map +1 -1
- package/dist/esm/utils/maps.d.ts.map +1 -1
- package/dist/esm/utils/maps.js +1 -111
- package/dist/esm/utils/maps.js.map +1 -1
- package/dist/esm/utils/math.d.ts.map +1 -1
- package/dist/esm/utils/math.js +1 -11
- package/dist/esm/utils/math.js.map +1 -1
- package/dist/esm/utils/monkey-patch.d.ts.map +1 -1
- package/dist/esm/utils/monkey-patch.js +2 -3
- package/dist/esm/utils/monkey-patch.js.map +1 -1
- package/dist/esm/utils/node-http.js +1 -2
- package/dist/esm/utils/node-http.js.map +1 -1
- package/dist/esm/utils/numbers.d.ts.map +1 -1
- package/dist/esm/utils/numbers.js +1 -45
- package/dist/esm/utils/numbers.js.map +1 -1
- package/dist/esm/utils/oauth.d.ts.map +1 -1
- package/dist/esm/utils/oauth.js +1 -1
- package/dist/esm/utils/oauth.js.map +1 -1
- package/dist/esm/utils/objects.d.ts.map +1 -1
- package/dist/esm/utils/objects.js +1 -622
- package/dist/esm/utils/objects.js.map +1 -1
- package/dist/esm/utils/paginated-lists.d.ts.map +1 -1
- package/dist/esm/utils/paginated-lists.js +1 -2
- package/dist/esm/utils/paginated-lists.js.map +1 -1
- package/dist/esm/utils/paginated-lists.test.js +2 -3
- package/dist/esm/utils/paginated-lists.test.js.map +1 -1
- package/dist/esm/utils/passkey.d.ts +1 -1
- package/dist/esm/utils/passkey.js +1 -1
- package/dist/esm/utils/promises.d.ts +1 -1
- package/dist/esm/utils/promises.d.ts.map +1 -1
- package/dist/esm/utils/promises.js +1 -160
- package/dist/esm/utils/promises.js.map +1 -1
- package/dist/esm/utils/proxies.d.ts.map +1 -1
- package/dist/esm/utils/proxies.js +1 -37
- package/dist/esm/utils/proxies.js.map +1 -1
- package/dist/esm/utils/react.d.ts.map +1 -1
- package/dist/esm/utils/react.js +1 -41
- package/dist/esm/utils/react.js.map +1 -1
- package/dist/esm/utils/redirect-urls.d.ts.map +1 -1
- package/dist/esm/utils/redirect-urls.js +2 -92
- package/dist/esm/utils/redirect-urls.js.map +1 -1
- package/dist/esm/utils/regex.js +1 -1
- package/dist/esm/utils/regex.js.map +1 -1
- package/dist/esm/utils/results.d.ts.map +1 -1
- package/dist/esm/utils/results.js +1 -213
- package/dist/esm/utils/results.js.map +1 -1
- package/dist/esm/utils/sentry.js +1 -1
- package/dist/esm/utils/sentry.js.map +1 -1
- package/dist/esm/utils/stores.d.ts +3 -3
- package/dist/esm/utils/stores.d.ts.map +1 -1
- package/dist/esm/utils/stores.js +1 -2
- package/dist/esm/utils/stores.js.map +1 -1
- package/dist/esm/utils/strings.d.ts.map +1 -1
- package/dist/esm/utils/strings.js +1 -251
- package/dist/esm/utils/strings.js.map +1 -1
- package/dist/esm/utils/strings.nicify.test.js +2 -3
- package/dist/esm/utils/strings.nicify.test.js.map +1 -1
- package/dist/esm/utils/telemetry.d.ts.map +1 -1
- package/dist/esm/utils/telemetry.js +1 -2
- package/dist/esm/utils/telemetry.js.map +1 -1
- package/dist/esm/utils/turnstile-browser.d.ts +1 -1
- package/dist/esm/utils/turnstile-browser.d.ts.map +1 -1
- package/dist/esm/utils/turnstile-browser.js +1 -2
- package/dist/esm/utils/turnstile-browser.js.map +1 -1
- package/dist/esm/utils/turnstile-flow.d.ts +1 -1
- package/dist/esm/utils/turnstile-flow.d.ts.map +1 -1
- package/dist/esm/utils/turnstile-flow.js +1 -2
- package/dist/esm/utils/turnstile-flow.js.map +1 -1
- package/dist/esm/utils/turnstile-flow.test.js +2 -3
- package/dist/esm/utils/turnstile-flow.test.js.map +1 -1
- package/dist/esm/utils/turnstile.d.ts.map +1 -1
- package/dist/esm/utils/turnstile.js +1 -1
- package/dist/esm/utils/turnstile.js.map +1 -1
- package/dist/esm/utils/typed-arrays.js +1 -2
- package/dist/esm/utils/typed-arrays.js.map +1 -1
- package/dist/esm/utils/types.d.ts +1 -1
- package/dist/esm/utils/types.d.ts.map +1 -1
- package/dist/esm/utils/types.js +1 -1
- package/dist/esm/utils/types.js.map +1 -1
- package/dist/esm/utils/unicode.d.ts.map +1 -1
- package/dist/esm/utils/unicode.js +1 -13
- package/dist/esm/utils/unicode.js.map +1 -1
- package/dist/esm/utils/urls.d.ts.map +1 -1
- package/dist/esm/utils/urls.js +1 -151
- package/dist/esm/utils/urls.js.map +1 -1
- package/dist/esm/utils/uuids.d.ts.map +1 -1
- package/dist/esm/utils/uuids.js +2 -26
- package/dist/esm/utils/uuids.js.map +1 -1
- package/dist/format-4JG1MGv5.d.ts +61 -0
- package/dist/format-4JG1MGv5.d.ts.map +1 -0
- package/dist/handler-urls-BHt3v8Ai.d.ts +70 -0
- package/dist/handler-urls-BHt3v8Ai.d.ts.map +1 -0
- package/dist/helpers/emails.js +2 -4
- package/dist/helpers/emails.js.map +1 -1
- package/dist/helpers/init-prompt.d.ts.map +1 -1
- package/dist/helpers/init-prompt.js +2 -4
- package/dist/helpers/init-prompt.js.map +1 -1
- package/dist/helpers/password.d.ts +1 -1
- package/dist/helpers/password.d.ts.map +1 -1
- package/dist/helpers/password.js +2 -4
- package/dist/helpers/password.js.map +1 -1
- package/dist/helpers/production-mode.d.ts +1 -1
- package/dist/helpers/production-mode.d.ts.map +1 -1
- package/dist/helpers/production-mode.js +2 -4
- package/dist/helpers/production-mode.js.map +1 -1
- package/dist/helpers/support-sla.d.ts.map +1 -1
- package/dist/helpers/support-sla.js +2 -3
- package/dist/helpers/support-sla.js.map +1 -1
- package/dist/helpers/support-sla.test.js +1 -3
- package/dist/helpers/support-sla.test.js.map +1 -1
- package/dist/helpers/vault/client-side.d.ts.map +1 -1
- package/dist/helpers/vault/client-side.js +2 -22
- package/dist/helpers/vault/client-side.js.map +1 -1
- package/dist/helpers/vault/server-side.js +2 -4
- package/dist/helpers/vault/server-side.js.map +1 -1
- package/dist/hooks/use-async-callback.d.ts.map +1 -1
- package/dist/hooks/use-async-callback.js +4 -5
- package/dist/hooks/use-async-callback.js.map +1 -1
- package/dist/hooks/use-async-external-store.d.ts +1 -1
- package/dist/hooks/use-async-external-store.d.ts.map +1 -1
- package/dist/hooks/use-async-external-store.js +2 -4
- package/dist/hooks/use-async-external-store.js.map +1 -1
- package/dist/hooks/use-hash.js +2 -4
- package/dist/hooks/use-hash.js.map +1 -1
- package/dist/hooks/use-hover.d.ts.map +1 -1
- package/dist/hooks/use-hover.js +2 -4
- package/dist/hooks/use-hover.js.map +1 -1
- package/dist/hooks/use-strict-memo.d.ts.map +1 -1
- package/dist/hooks/use-strict-memo.js +2 -72
- package/dist/hooks/use-strict-memo.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +27 -29
- package/dist/interface/admin-interface.d.ts +3 -379
- package/dist/interface/admin-interface.js +2 -4
- package/dist/interface/admin-interface.js.map +1 -1
- package/dist/interface/admin-metrics.d.ts +2 -807
- package/dist/interface/admin-metrics.js +2 -4
- package/dist/interface/admin-metrics.js.map +1 -1
- package/dist/interface/client-interface.d.ts +2 -447
- package/dist/interface/client-interface.js +32 -17
- package/dist/interface/client-interface.js.map +1 -1
- package/dist/interface/client-interface.test.js +83 -13
- package/dist/interface/client-interface.test.js.map +1 -1
- package/dist/interface/conversations.d.ts +33 -33
- package/dist/interface/conversations.d.ts.map +1 -1
- package/dist/interface/conversations.js +2 -4
- package/dist/interface/conversations.js.map +1 -1
- package/dist/interface/crud/analytics.d.ts +2 -14
- package/dist/interface/crud/connected-accounts.d.ts +2 -68
- package/dist/interface/crud/connected-accounts.js +2 -4
- package/dist/interface/crud/connected-accounts.js.map +1 -1
- package/dist/interface/crud/contact-channels.d.ts +2 -181
- package/dist/interface/crud/contact-channels.js +2 -4
- package/dist/interface/crud/contact-channels.js.map +1 -1
- package/dist/interface/crud/current-user.d.ts +2 -285
- package/dist/interface/crud/current-user.js +2 -4
- package/dist/interface/crud/current-user.js.map +1 -1
- package/dist/interface/crud/email-outbox.d.ts +2 -1465
- package/dist/interface/crud/email-outbox.js +4 -5
- package/dist/interface/crud/email-outbox.js.map +1 -1
- package/dist/interface/crud/email-templates.d.ts +15 -16
- package/dist/interface/crud/email-templates.d.ts.map +1 -1
- package/dist/interface/crud/email-templates.js +2 -4
- package/dist/interface/crud/email-templates.js.map +1 -1
- package/dist/interface/crud/emails.d.ts +2 -41
- package/dist/interface/crud/emails.js +4 -5
- package/dist/interface/crud/emails.js.map +1 -1
- package/dist/interface/crud/internal-api-keys.d.ts +2 -140
- package/dist/interface/crud/internal-api-keys.js +2 -4
- package/dist/interface/crud/internal-api-keys.js.map +1 -1
- package/dist/interface/crud/invoices.d.ts +2 -43
- package/dist/interface/crud/invoices.js +2 -4
- package/dist/interface/crud/invoices.js.map +1 -1
- package/dist/interface/crud/items.d.ts +2 -30
- package/dist/interface/crud/items.js +2 -4
- package/dist/interface/crud/items.js.map +1 -1
- package/dist/interface/crud/notification-preferences.d.ts +2 -38
- package/dist/interface/crud/notification-preferences.js +2 -4
- package/dist/interface/crud/notification-preferences.js.map +1 -1
- package/dist/interface/crud/oauth-providers.d.ts +2 -186
- package/dist/interface/crud/oauth-providers.js +2 -4
- package/dist/interface/crud/oauth-providers.js.map +1 -1
- package/dist/interface/crud/products.d.ts +2 -182
- package/dist/interface/crud/products.js +4 -4
- package/dist/interface/crud/products.js.map +1 -1
- package/dist/interface/crud/project-api-keys.d.ts +2 -203
- package/dist/interface/crud/project-api-keys.js +2 -4
- package/dist/interface/crud/project-api-keys.js.map +1 -1
- package/dist/interface/crud/project-permissions.d.ts +2 -161
- package/dist/interface/crud/project-permissions.js +4 -5
- package/dist/interface/crud/project-permissions.js.map +1 -1
- package/dist/interface/crud/projects.d.ts +2 -901
- package/dist/interface/crud/projects.js +6 -5
- package/dist/interface/crud/projects.js.map +1 -1
- package/dist/interface/crud/session-replays.d.ts +2 -83
- package/dist/interface/crud/sessions.d.ts +2 -150
- package/dist/interface/crud/sessions.js +2 -4
- package/dist/interface/crud/sessions.js.map +1 -1
- package/dist/interface/crud/sign-up-rules.d.ts.map +1 -1
- package/dist/interface/crud/svix-token.d.ts +2 -31
- package/dist/interface/crud/svix-token.js +2 -4
- package/dist/interface/crud/svix-token.js.map +1 -1
- package/dist/interface/crud/team-invitation-details.d.ts +5 -6
- package/dist/interface/crud/team-invitation-details.d.ts.map +1 -1
- package/dist/interface/crud/team-invitation-details.js +4 -5
- package/dist/interface/crud/team-invitation-details.js.map +1 -1
- package/dist/interface/crud/team-invitation.d.ts +2 -54
- package/dist/interface/crud/team-invitation.js +4 -5
- package/dist/interface/crud/team-invitation.js.map +1 -1
- package/dist/interface/crud/team-member-profiles.d.ts +2 -286
- package/dist/interface/crud/team-member-profiles.js +4 -5
- package/dist/interface/crud/team-member-profiles.js.map +1 -1
- package/dist/interface/crud/team-memberships.d.ts +2 -75
- package/dist/interface/crud/team-memberships.js +2 -4
- package/dist/interface/crud/team-memberships.js.map +1 -1
- package/dist/interface/crud/team-permissions.d.ts +2 -169
- package/dist/interface/crud/team-permissions.js +4 -5
- package/dist/interface/crud/team-permissions.js.map +1 -1
- package/dist/interface/crud/teams.d.ts +2 -299
- package/dist/interface/crud/teams.js +5 -7
- package/dist/interface/crud/teams.js.map +1 -1
- package/dist/interface/crud/transactions.d.ts +2 -183
- package/dist/interface/crud/transactions.js +2 -4
- package/dist/interface/crud/transactions.js.map +1 -1
- package/dist/interface/crud/users.d.ts +2 -653
- package/dist/interface/crud/users.js +12 -8
- package/dist/interface/crud/users.js.map +1 -1
- package/dist/interface/handler-urls.d.ts +2 -51
- package/dist/interface/handler-urls.js +12 -14
- package/dist/interface/page-component-versions.d.ts +2 -25
- package/dist/interface/page-component-versions.js +2 -4
- package/dist/interface/page-component-versions.js.map +1 -1
- package/dist/interface/plan-usage.d.ts +2 -57
- package/dist/interface/plan-usage.js +2 -4
- package/dist/interface/plan-usage.js.map +1 -1
- package/dist/interface/server-interface.d.ts +2 -257
- package/dist/interface/server-interface.js +2 -4
- package/dist/interface/server-interface.js.map +1 -1
- package/dist/interface/webhooks.d.ts +2 -326
- package/dist/interface/webhooks.js +2 -4
- package/dist/interface/webhooks.js.map +1 -1
- package/dist/internal-api-keys-D8IYDodH.d.ts +139 -0
- package/dist/internal-api-keys-D8IYDodH.d.ts.map +1 -0
- package/dist/invoices-U65KzAZX.d.ts +43 -0
- package/dist/invoices-U65KzAZX.d.ts.map +1 -0
- package/dist/items-DlLSlVUD.d.ts +29 -0
- package/dist/items-DlLSlVUD.d.ts.map +1 -0
- package/dist/json-a1QIXu5z.d.ts +15 -0
- package/dist/json-a1QIXu5z.d.ts.map +1 -0
- package/dist/known-errors-Bm4a61wL.d.ts +575 -0
- package/dist/known-errors-Bm4a61wL.d.ts.map +1 -0
- package/dist/known-errors.d.ts +2 -575
- package/dist/known-errors.js +11 -23
- package/dist/known-errors.js.map +1 -1
- package/dist/notification-preferences-Bmzr_EOY.d.ts +37 -0
- package/dist/notification-preferences-Bmzr_EOY.d.ts.map +1 -0
- package/dist/oauth-providers-BMkKSSlA.d.ts +185 -0
- package/dist/oauth-providers-BMkKSSlA.d.ts.map +1 -0
- package/dist/objects-DkCkeBWE.d.ts +59 -0
- package/dist/objects-DkCkeBWE.d.ts.map +1 -0
- package/dist/passkey-CKg87UH-.d.ts +2 -0
- package/dist/payments/payment-methods.d.ts.map +1 -1
- package/dist/payments/payment-methods.js +2 -3
- package/dist/payments/payment-methods.js.map +1 -1
- package/dist/payments/stripe-limits.d.ts.map +1 -1
- package/dist/payments/stripe-limits.js +2 -3
- package/dist/payments/stripe-limits.js.map +1 -1
- package/dist/plan-usage-DfDoj5K4.d.ts +57 -0
- package/dist/plan-usage-DfDoj5K4.d.ts.map +1 -0
- package/dist/plans.d.ts.map +1 -1
- package/dist/plans.js +2 -3
- package/dist/plans.js.map +1 -1
- package/dist/products-Bs74ld-v.d.ts +182 -0
- package/dist/products-Bs74ld-v.d.ts.map +1 -0
- package/dist/project-api-keys--7V5X_UW.d.ts +203 -0
- package/dist/project-api-keys--7V5X_UW.d.ts.map +1 -0
- package/dist/project-permissions-kdi675F-.d.ts +160 -0
- package/dist/project-permissions-kdi675F-.d.ts.map +1 -0
- package/dist/projects-CgFGB3nO.d.ts +900 -0
- package/dist/projects-CgFGB3nO.d.ts.map +1 -0
- package/dist/results-DP3BzoL6.d.ts +70 -0
- package/dist/results-DP3BzoL6.d.ts.map +1 -0
- package/dist/{chunk-BE-pF4vm.js → rolldown-runtime-D6vf50IK.js} +12 -18
- package/dist/schema-01nWxmb4.d.ts +2328 -0
- package/dist/schema-01nWxmb4.d.ts.map +1 -0
- package/dist/schema-fields-DqGQ4kF7.d.ts +517 -0
- package/dist/schema-fields-DqGQ4kF7.d.ts.map +1 -0
- package/dist/schema-fields.d.ts +3 -518
- package/dist/schema-fields.js +21 -82
- package/dist/schema-fields.js.map +1 -1
- package/dist/server-interface-BUPG1kor.d.ts +257 -0
- package/dist/server-interface-BUPG1kor.d.ts.map +1 -0
- package/dist/session-replays-CXqhDpZq.d.ts +83 -0
- package/dist/session-replays-CXqhDpZq.d.ts.map +1 -0
- package/dist/sessions-B7Ko2Ldr.d.ts +149 -0
- package/dist/sessions-B7Ko2Ldr.d.ts.map +1 -0
- package/dist/sessions-d8qtvBUB.d.ts +175 -0
- package/dist/sessions-d8qtvBUB.d.ts.map +1 -0
- package/dist/sessions.d.ts +2 -175
- package/dist/sessions.js +4 -5
- package/dist/sessions.js.map +1 -1
- package/dist/sessions.test.js +1 -3
- package/dist/sessions.test.js.map +1 -1
- package/dist/strings-DWgkUybS.d.ts +76 -0
- package/dist/strings-DWgkUybS.d.ts.map +1 -0
- package/dist/svix-token-BsMrLGvy.d.ts +30 -0
- package/dist/svix-token-BsMrLGvy.d.ts.map +1 -0
- package/dist/team-invitation-Cyqt9oWw.d.ts +53 -0
- package/dist/team-invitation-Cyqt9oWw.d.ts.map +1 -0
- package/dist/team-member-profiles-uTluO8XI.d.ts +285 -0
- package/dist/team-member-profiles-uTluO8XI.d.ts.map +1 -0
- package/dist/team-memberships-DZHk2A5b.d.ts +74 -0
- package/dist/team-memberships-DZHk2A5b.d.ts.map +1 -0
- package/dist/team-permissions-DqOpaOWh.d.ts +168 -0
- package/dist/team-permissions-DqOpaOWh.d.ts.map +1 -0
- package/dist/teams-CQMcBnjM.d.ts +298 -0
- package/dist/teams-CQMcBnjM.d.ts.map +1 -0
- package/dist/transactions-DhnbvGH5.d.ts +182 -0
- package/dist/transactions-DhnbvGH5.d.ts.map +1 -0
- package/dist/types-DfTcxNtM.d.ts +77 -0
- package/dist/types-DfTcxNtM.d.ts.map +1 -0
- package/dist/users-CmBBuF00.d.ts +653 -0
- package/dist/users-CmBBuF00.d.ts.map +1 -0
- package/dist/utils/analytics-clickmap-overlay.d.ts.map +1 -1
- package/dist/utils/analytics-clickmap-overlay.js +2 -3
- package/dist/utils/analytics-clickmap-overlay.js.map +1 -1
- package/dist/utils/api-keys.d.ts.map +1 -1
- package/dist/utils/api-keys.js +4 -5
- package/dist/utils/api-keys.js.map +1 -1
- package/dist/utils/arrays.d.ts.map +1 -1
- package/dist/utils/arrays.js +2 -472
- package/dist/utils/arrays.js.map +1 -1
- package/dist/utils/auth-methods.d.ts.map +1 -1
- package/dist/utils/auth-methods.js +2 -3
- package/dist/utils/auth-methods.js.map +1 -1
- package/dist/utils/base64.d.ts.map +1 -1
- package/dist/utils/base64.js +2 -12
- package/dist/utils/base64.js.map +1 -1
- package/dist/utils/booleans.d.ts.map +1 -1
- package/dist/utils/booleans.js +2 -27
- package/dist/utils/booleans.js.map +1 -1
- package/dist/utils/browser-compat.d.ts.map +1 -1
- package/dist/utils/browser-compat.js +2 -3
- package/dist/utils/browser-compat.js.map +1 -1
- package/dist/utils/bytes.d.ts.map +1 -1
- package/dist/utils/bytes.js +4 -200
- package/dist/utils/bytes.js.map +1 -1
- package/dist/utils/caches.d.ts.map +1 -1
- package/dist/utils/caches.js +2 -29
- package/dist/utils/caches.js.map +1 -1
- package/dist/utils/cel-fields.d.ts.map +1 -1
- package/dist/utils/cel-fields.js +2 -4
- package/dist/utils/cel-fields.js.map +1 -1
- package/dist/utils/cloud-hosts.d.ts.map +1 -1
- package/dist/utils/cloud-hosts.js +2 -29
- package/dist/utils/cloud-hosts.js.map +1 -1
- package/dist/utils/compile-time.d.ts.map +1 -1
- package/dist/utils/compile-time.js +2 -3
- package/dist/utils/compile-time.js.map +1 -1
- package/dist/utils/country-codes.d.ts +2 -11
- package/dist/utils/country-codes.js +2 -18
- package/dist/utils/country-codes.js.map +1 -1
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +4 -115
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/currencies.d.ts +1 -1
- package/dist/utils/currencies.d.ts.map +1 -1
- package/dist/utils/currencies.js +3 -39
- package/dist/utils/currencies.js.map +1 -1
- package/dist/utils/currency-constants.d.ts +2 -45
- package/dist/utils/currency-constants.js +2 -3
- package/dist/utils/currency-constants.js.map +1 -1
- package/dist/utils/dates.d.ts +2 -23
- package/dist/utils/dates.js +2 -46
- package/dist/utils/dates.js.map +1 -1
- package/dist/utils/dev-env-state-path.d.ts.map +1 -1
- package/dist/utils/dev-env-state-path.js +2 -4
- package/dist/utils/dev-env-state-path.js.map +1 -1
- package/dist/utils/dev-tool.d.ts.map +1 -1
- package/dist/utils/dev-tool.js +2 -3
- package/dist/utils/dev-tool.js.map +1 -1
- package/dist/utils/dom.d.ts.map +1 -1
- package/dist/utils/dom.js +2 -3
- package/dist/utils/dom.js.map +1 -1
- package/dist/utils/elements-chain.d.ts.map +1 -1
- package/dist/utils/elements-chain.js +6 -52
- package/dist/utils/elements-chain.js.map +1 -1
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/env.js +2 -4
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/env.test.js +1 -3
- package/dist/utils/env.test.js.map +1 -1
- package/dist/utils/errors.d.ts +2 -238
- package/dist/utils/errors.js +2 -4
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/esbuild.d.ts +1 -1
- package/dist/utils/esbuild.d.ts.map +1 -1
- package/dist/utils/esbuild.js +5 -6
- package/dist/utils/esbuild.js.map +1 -1
- package/dist/utils/featurebase.d.ts.map +1 -1
- package/dist/utils/featurebase.js +2 -4
- package/dist/utils/featurebase.js.map +1 -1
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +5 -6
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/functions.d.ts.map +1 -1
- package/dist/utils/functions.js +2 -26
- package/dist/utils/functions.js.map +1 -1
- package/dist/utils/geo.d.ts.map +1 -1
- package/dist/utils/geo.js +2 -4
- package/dist/utils/geo.js.map +1 -1
- package/dist/utils/globals.d.ts.map +1 -1
- package/dist/utils/globals.js +2 -3
- package/dist/utils/globals.js.map +1 -1
- package/dist/utils/hashes.d.ts.map +1 -1
- package/dist/utils/hashes.js +4 -5
- package/dist/utils/hashes.js.map +1 -1
- package/dist/utils/html.d.ts.map +1 -1
- package/dist/utils/html.js +2 -21
- package/dist/utils/html.js.map +1 -1
- package/dist/utils/http.d.ts.map +1 -1
- package/dist/utils/http.js +2 -21
- package/dist/utils/http.js.map +1 -1
- package/dist/utils/ips.d.ts.map +1 -1
- package/dist/utils/ips.js +4 -28
- package/dist/utils/ips.js.map +1 -1
- package/dist/utils/json.d.ts +2 -15
- package/dist/utils/json.js +2 -157
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/jsx-editable-transpiler.d.ts.map +1 -1
- package/dist/utils/jsx-editable-transpiler.js +7 -8
- package/dist/utils/jsx-editable-transpiler.js.map +1 -1
- package/dist/utils/jsx-editable-transpiler.test.js +1 -3
- package/dist/utils/jsx-editable-transpiler.test.js.map +1 -1
- package/dist/utils/jwt.d.ts.map +1 -1
- package/dist/utils/jwt.js +6 -7
- package/dist/utils/jwt.js.map +1 -1
- package/dist/utils/locks.d.ts.map +1 -1
- package/dist/utils/locks.js +2 -4
- package/dist/utils/locks.js.map +1 -1
- package/dist/utils/maps.d.ts.map +1 -1
- package/dist/utils/maps.js +2 -113
- package/dist/utils/maps.js.map +1 -1
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +2 -13
- package/dist/utils/math.js.map +1 -1
- package/dist/utils/monkey-patch.d.ts.map +1 -1
- package/dist/utils/monkey-patch.js +3 -5
- package/dist/utils/monkey-patch.js.map +1 -1
- package/dist/utils/node-http.js +2 -4
- package/dist/utils/node-http.js.map +1 -1
- package/dist/utils/numbers.d.ts.map +1 -1
- package/dist/utils/numbers.js +2 -47
- package/dist/utils/numbers.js.map +1 -1
- package/dist/utils/oauth.d.ts.map +1 -1
- package/dist/utils/oauth.js +2 -3
- package/dist/utils/oauth.js.map +1 -1
- package/dist/utils/objects.d.ts +2 -59
- package/dist/utils/objects.js +2 -624
- package/dist/utils/objects.js.map +1 -1
- package/dist/utils/paginated-lists.d.ts.map +1 -1
- package/dist/utils/paginated-lists.js +2 -4
- package/dist/utils/paginated-lists.js.map +1 -1
- package/dist/utils/paginated-lists.test.js +1 -3
- package/dist/utils/paginated-lists.test.js.map +1 -1
- package/dist/utils/passkey.d.ts +2 -2
- package/dist/utils/promises.d.ts +1 -1
- package/dist/utils/promises.d.ts.map +1 -1
- package/dist/utils/promises.js +2 -162
- package/dist/utils/promises.js.map +1 -1
- package/dist/utils/proxies.d.ts.map +1 -1
- package/dist/utils/proxies.js +2 -39
- package/dist/utils/proxies.js.map +1 -1
- package/dist/utils/react.d.ts.map +1 -1
- package/dist/utils/react.js +4 -44
- package/dist/utils/react.js.map +1 -1
- package/dist/utils/redirect-urls.d.ts.map +1 -1
- package/dist/utils/redirect-urls.js +3 -94
- package/dist/utils/redirect-urls.js.map +1 -1
- package/dist/utils/regex.js +2 -3
- package/dist/utils/regex.js.map +1 -1
- package/dist/utils/results.d.ts +2 -70
- package/dist/utils/results.js +2 -215
- package/dist/utils/results.js.map +1 -1
- package/dist/utils/sentry.js +2 -3
- package/dist/utils/sentry.js.map +1 -1
- package/dist/utils/stores.d.ts +1 -1
- package/dist/utils/stores.d.ts.map +1 -1
- package/dist/utils/stores.js +2 -4
- package/dist/utils/stores.js.map +1 -1
- package/dist/utils/strings.d.ts +2 -76
- package/dist/utils/strings.js +2 -253
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/strings.nicify.test.js +1 -3
- package/dist/utils/strings.nicify.test.js.map +1 -1
- package/dist/utils/telemetry.d.ts.map +1 -1
- package/dist/utils/telemetry.js +2 -4
- package/dist/utils/telemetry.js.map +1 -1
- package/dist/utils/turnstile-browser.d.ts.map +1 -1
- package/dist/utils/turnstile-browser.js +2 -4
- package/dist/utils/turnstile-browser.js.map +1 -1
- package/dist/utils/turnstile-flow.d.ts.map +1 -1
- package/dist/utils/turnstile-flow.js +2 -4
- package/dist/utils/turnstile-flow.js.map +1 -1
- package/dist/utils/turnstile-flow.test.js +1 -3
- package/dist/utils/turnstile-flow.test.js.map +1 -1
- package/dist/utils/turnstile.d.ts.map +1 -1
- package/dist/utils/turnstile.js +2 -3
- package/dist/utils/turnstile.js.map +1 -1
- package/dist/utils/typed-arrays.js +2 -4
- package/dist/utils/typed-arrays.js.map +1 -1
- package/dist/utils/types.d.ts +2 -77
- package/dist/utils/types.js +2 -3
- package/dist/utils/types.js.map +1 -1
- package/dist/utils/unicode.d.ts.map +1 -1
- package/dist/utils/unicode.js +2 -15
- package/dist/utils/unicode.js.map +1 -1
- package/dist/utils/urls.d.ts.map +1 -1
- package/dist/utils/urls.js +2 -153
- package/dist/utils/urls.js.map +1 -1
- package/dist/utils/uuids.d.ts.map +1 -1
- package/dist/utils/uuids.js +3 -28
- package/dist/utils/uuids.js.map +1 -1
- package/dist/webhooks-ByXrdSOx.d.ts +326 -0
- package/dist/webhooks-ByXrdSOx.d.ts.map +1 -0
- package/package.json +2 -8
- package/src/interface/client-interface.test.ts +77 -12
- package/src/interface/client-interface.ts +9 -9
- package/dist/config/format.d.ts.map +0 -1
- package/dist/config/schema.d.ts.map +0 -1
- package/dist/crud.d.ts.map +0 -1
- package/dist/interface/admin-interface.d.ts.map +0 -1
- package/dist/interface/admin-metrics.d.ts.map +0 -1
- package/dist/interface/client-interface.d.ts.map +0 -1
- package/dist/interface/crud/analytics.d.ts.map +0 -1
- package/dist/interface/crud/connected-accounts.d.ts.map +0 -1
- package/dist/interface/crud/contact-channels.d.ts.map +0 -1
- package/dist/interface/crud/current-user.d.ts.map +0 -1
- package/dist/interface/crud/emails.d.ts.map +0 -1
- package/dist/interface/crud/internal-api-keys.d.ts.map +0 -1
- package/dist/interface/crud/invoices.d.ts.map +0 -1
- package/dist/interface/crud/items.d.ts.map +0 -1
- package/dist/interface/crud/notification-preferences.d.ts.map +0 -1
- package/dist/interface/crud/oauth-providers.d.ts.map +0 -1
- package/dist/interface/crud/products.d.ts.map +0 -1
- package/dist/interface/crud/project-api-keys.d.ts.map +0 -1
- package/dist/interface/crud/project-permissions.d.ts.map +0 -1
- package/dist/interface/crud/projects.d.ts.map +0 -1
- package/dist/interface/crud/session-replays.d.ts.map +0 -1
- package/dist/interface/crud/sessions.d.ts.map +0 -1
- package/dist/interface/crud/svix-token.d.ts.map +0 -1
- package/dist/interface/crud/team-invitation.d.ts.map +0 -1
- package/dist/interface/crud/team-member-profiles.d.ts.map +0 -1
- package/dist/interface/crud/team-memberships.d.ts.map +0 -1
- package/dist/interface/crud/team-permissions.d.ts.map +0 -1
- package/dist/interface/crud/teams.d.ts.map +0 -1
- package/dist/interface/crud/transactions.d.ts.map +0 -1
- package/dist/interface/crud/users.d.ts.map +0 -1
- package/dist/interface/handler-urls.d.ts.map +0 -1
- package/dist/interface/page-component-versions.d.ts.map +0 -1
- package/dist/interface/plan-usage.d.ts.map +0 -1
- package/dist/interface/server-interface.d.ts.map +0 -1
- package/dist/interface/webhooks.d.ts.map +0 -1
- package/dist/known-errors.d.ts.map +0 -1
- package/dist/schema-fields.d.ts.map +0 -1
- package/dist/sessions.d.ts.map +0 -1
- package/dist/utils/country-codes.d.ts.map +0 -1
- package/dist/utils/currency-constants.d.ts.map +0 -1
- package/dist/utils/dates.d.ts.map +0 -1
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/json.d.ts.map +0 -1
- package/dist/utils/objects.d.ts.map +0 -1
- package/dist/utils/results.d.ts.map +0 -1
- package/dist/utils/strings.d.ts.map +0 -1
- package/dist/utils/types.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-catalogs-to-product-lines.js","names":[],"sources":["../../src/config/migrate-catalogs-to-product-lines.ts"],"sourcesContent":["import { HexclaveAssertionError } from \"../utils/errors\";\nimport { isObjectLike, set, typedEntries } from \"../utils/objects\";\n\n/**\n * Renames properties in an object based on a path condition.\n * This is a local copy to avoid circular dependencies with schema.ts.\n */\nfunction renameProperty(obj: Record<string, any>, oldPath: string | ((path: string[]) => boolean), newName: string | ((path: string[]) => string)): any {\n const pathCond = typeof oldPath === \"function\" ? oldPath : (p: string[]) => p.join(\".\") === oldPath;\n const pathMapper = typeof newName === \"function\" ? newName : (p: string[]) => (newName as string);\n\n const res: Record<string, any> = Array.isArray(obj) ? [] : {};\n for (const [key, originalValue] of typedEntries(obj)) {\n const path = key.split(\".\");\n\n for (let i = 0; i < path.length; i++) {\n const pathPrefix = path.slice(0, i + 1);\n if (pathCond(pathPrefix)) {\n const name = pathMapper(pathPrefix);\n if (name.includes(\".\")) throw new HexclaveAssertionError(`newName must not contain a dot. Provided: ${name}`);\n path[i] = name;\n }\n }\n\n const value = isObjectLike(originalValue) ? renameProperty(originalValue, p => pathCond([...path, ...p]), p => pathMapper([...path, ...p])) : originalValue;\n set(res, path.join(\".\"), value);\n }\n\n return res;\n}\n\n/**\n * Migrates the old \"catalogs\" format to \"productLines\", including:\n * 1. Inferring customerType for each catalog from its products (since old catalogs didn't have customerType)\n * 2. Removing empty catalogs (those with no products) since they can't have customerType inferred\n * 3. Renaming payments.catalogs -> payments.productLines\n * 4. Renaming payments.products.*.catalogId -> payments.products.*.productLineId\n *\n * This handles all config formats (nested objects, flat dot-notation, or mixed).\n */\nexport function migrateCatalogsToProductLines(obj: Record<string, any>): Record<string, any> {\n // Step 1: Collect catalogId -> customerType mappings from products\n const catalogCustomerTypes = new Map<string, string>();\n collectCatalogCustomerTypes(obj, [], catalogCustomerTypes);\n\n // Step 2: Find all catalog IDs that exist\n const allCatalogIds = new Set<string>();\n findAllCatalogIds(obj, [], allCatalogIds);\n\n // Step 3: Add customerType keys for catalogs that need them\n let res = { ...obj };\n for (const catalogId of allCatalogIds) {\n const customerType = catalogCustomerTypes.get(catalogId);\n if (customerType) {\n // Find the format used for this catalog and add customerType in the same format\n res = addCustomerTypeToCatalog(res, catalogId, customerType);\n } else {\n // Empty catalog (no products) - remove it since we can't infer customerType\n res = removeCatalog(res, catalogId);\n }\n }\n\n // Step 4: Rename catalogs -> productLines\n res = renameProperty(res, \"payments.catalogs\", \"productLines\");\n\n // Step 5: Rename catalogId -> productLineId in products\n res = renameProperty(res, (p) => p.length === 4 && p[0] === \"payments\" && p[1] === \"products\" && p[3] === \"catalogId\", () => \"productLineId\");\n\n return res;\n}\n\n/**\n * Recursively collects catalogId -> customerType mappings from products.\n * Handles both nested and flat config formats.\n */\nfunction collectCatalogCustomerTypes(\n obj: Record<string, any>,\n basePath: string[],\n result: Map<string, string>\n): void {\n for (const [key, value] of typedEntries(obj)) {\n const keyParts = key.split(\".\");\n const fullPath = [...basePath, ...keyParts];\n\n // Check for flat format at ROOT level only: payments.products.<productId>.catalogId\n // We check basePath.length === 0 to ensure we're at root and key contains the full path\n if (basePath.length === 0 && fullPath.length === 4 && fullPath[0] === \"payments\" && fullPath[1] === \"products\" && fullPath[3] === \"catalogId\") {\n if (typeof value === \"string\") {\n const productId = fullPath[2];\n // Look for customerType in the same flat format\n const customerTypeKey = `payments.products.${productId}.customerType`;\n if (customerTypeKey in obj && typeof obj[customerTypeKey] === \"string\") {\n result.set(value, obj[customerTypeKey]);\n }\n }\n }\n\n // Check for nested format: payments.products.<productId> with object value\n if (fullPath.length === 3 && fullPath[0] === \"payments\" && fullPath[1] === \"products\" && isObjectLike(value)) {\n const catalogId = findPropertyValue(value, \"catalogId\") ?? findPropertyValue(value, \"productLineId\");\n const customerType = findPropertyValue(value, \"customerType\");\n if (catalogId && typeof catalogId === \"string\" && customerType && typeof customerType === \"string\") {\n result.set(catalogId, customerType);\n }\n }\n\n if (isObjectLike(value)) {\n collectCatalogCustomerTypes(value, fullPath, result);\n }\n }\n}\n\n/**\n * Finds a property value in an object, handling both direct properties and dot-notation keys.\n */\nfunction findPropertyValue(obj: Record<string, any>, propertyName: string): any {\n // Direct property\n if (propertyName in obj) {\n return obj[propertyName];\n }\n // Check for dot-notation keys that end with the property name\n for (const key of Object.keys(obj)) {\n const parts = key.split(\".\");\n if (parts[parts.length - 1] === propertyName) {\n return obj[key];\n }\n }\n return undefined;\n}\n\n/**\n * Finds all catalog IDs that exist in the config.\n */\nfunction findAllCatalogIds(\n obj: Record<string, any>,\n basePath: string[],\n result: Set<string>\n): void {\n for (const [key, value] of typedEntries(obj)) {\n const keyParts = key.split(\".\");\n const fullPath = [...basePath, ...keyParts];\n\n // Check for catalog entry at payments.catalogs.<catalogId>\n if (fullPath.length >= 3 && fullPath[0] === \"payments\" && fullPath[1] === \"catalogs\") {\n const catalogId = fullPath[2];\n result.add(catalogId);\n }\n\n if (isObjectLike(value)) {\n findAllCatalogIds(value, fullPath, result);\n }\n }\n}\n\n/**\n * Removes a catalog from the config in any format (nested or flat).\n */\nfunction removeCatalog(obj: Record<string, any>, catalogId: string): Record<string, any> {\n // Don't process arrays - they should be copied as-is\n if (Array.isArray(obj)) {\n return obj;\n }\n\n const res: Record<string, any> = {};\n\n for (const [key, value] of typedEntries(obj)) {\n const keyParts = key.split(\".\");\n\n // Check if this key is for the catalog we want to remove\n // Format 4: \"payments.catalogs.<catalogId>.displayName\" or similar flat keys\n if (keyParts.length >= 3 && keyParts[0] === \"payments\" && keyParts[1] === \"catalogs\" && keyParts[2] === catalogId) {\n // Skip this key - don't copy it\n continue;\n }\n\n // Format 3: \"payments.catalogs.<catalogId>\" as a single key\n if (key === `payments.catalogs.${catalogId}`) {\n continue;\n }\n\n if (Array.isArray(value)) {\n res[key] = value;\n } else if (isObjectLike(value)) {\n const processed = removeCatalog(value, catalogId);\n // Check if we need to remove the catalog from nested structures\n if (key === \"payments\" && isObjectLike(processed) && \"catalogs\" in processed) {\n const catalogs = processed.catalogs;\n if (isObjectLike(catalogs) && catalogId in catalogs) {\n const { [catalogId]: _, ...rest } = catalogs as Record<string, any>;\n res[key] = { ...processed, catalogs: rest };\n continue;\n }\n }\n // Format 2: \"payments.catalogs\" as a key with nested catalog\n if (key === \"payments.catalogs\" && isObjectLike(processed) && catalogId in processed) {\n const { [catalogId]: _, ...rest } = processed as Record<string, any>;\n res[key] = rest;\n continue;\n }\n res[key] = processed;\n } else {\n res[key] = value;\n }\n }\n\n return res;\n}\n\n/**\n * Adds customerType to a catalog in the appropriate format.\n */\nfunction addCustomerTypeToCatalog(obj: Record<string, any>, catalogId: string, customerType: string): Record<string, any> {\n // Don't process arrays - they should be copied as-is\n if (Array.isArray(obj)) {\n return obj;\n }\n\n const res: Record<string, any> = {};\n\n // First, copy all existing properties\n for (const [key, value] of typedEntries(obj)) {\n if (Array.isArray(value)) {\n // Copy arrays directly without processing\n res[key] = value;\n } else if (isObjectLike(value)) {\n res[key] = addCustomerTypeToCatalog(value, catalogId, customerType);\n } else {\n res[key] = value;\n }\n }\n\n // Check what format the catalog uses\n // Format 1: { payments: { catalogs: { [catalogId]: { ... } } } }\n const payments = res.payments;\n if (payments && isObjectLike(payments) && !Array.isArray(payments) && typeof payments !== \"function\") {\n const paymentsObj = payments as Record<string, any>;\n const catalogs = paymentsObj.catalogs;\n if (catalogs && isObjectLike(catalogs) && !Array.isArray(catalogs) && typeof catalogs !== \"function\") {\n const catalogsObj = catalogs as Record<string, any>;\n const catalog = catalogsObj[catalogId];\n if (catalog && isObjectLike(catalog)) {\n if (!(\"customerType\" in catalog)) {\n catalogsObj[catalogId] = { ...catalog, customerType };\n }\n return res;\n }\n }\n }\n\n // Format 2: { \"payments.catalogs\": { [catalogId]: { ... } } }\n const paymentsCatalogs = res[\"payments.catalogs\"];\n if (paymentsCatalogs && isObjectLike(paymentsCatalogs) && !Array.isArray(paymentsCatalogs) && typeof paymentsCatalogs !== \"function\") {\n const catalogs = paymentsCatalogs as Record<string, any>;\n if (catalogId in catalogs && isObjectLike(catalogs[catalogId])) {\n if (!(\"customerType\" in catalogs[catalogId])) {\n catalogs[catalogId] = { ...catalogs[catalogId], customerType };\n }\n return res;\n }\n }\n\n // Format 3: { \"payments.catalogs.[catalogId]\": { ... } }\n const catalogKey = `payments.catalogs.${catalogId}`;\n if (catalogKey in res && isObjectLike(res[catalogKey])) {\n if (!(\"customerType\" in res[catalogKey])) {\n res[catalogKey] = { ...res[catalogKey], customerType };\n }\n return res;\n }\n\n // Format 4: { \"payments.catalogs.[catalogId].displayName\": \"...\" }\n // Need to add a new key for customerType\n const customerTypeKey = `payments.catalogs.${catalogId}.customerType`;\n for (const key of Object.keys(res)) {\n if (key.startsWith(`payments.catalogs.${catalogId}.`) && key !== customerTypeKey) {\n // Found a flat key for this catalog, add customerType in same format\n res[customerTypeKey] = customerType;\n return res;\n }\n }\n\n return res;\n}\n\n// Tests\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - basic migrations\", ({ expect }) => {\n // Basic nested format\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n myCatalog: { displayName: \"My Catalog\" }\n },\n products: {\n myProduct: { catalogId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n myCatalog: { displayName: \"My Catalog\", customerType: \"user\" }\n },\n products: {\n myProduct: { productLineId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n });\n\n // Flat format\n expect(migrateCatalogsToProductLines({\n \"payments.catalogs.myCatalog\": { displayName: \"My Catalog\" },\n \"payments.products.myProduct.catalogId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n })).toEqual({\n \"payments.productLines.myCatalog\": { displayName: \"My Catalog\", customerType: \"user\" },\n \"payments.products.myProduct.productLineId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n });\n\n // Mixed format\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: { myCatalog: { displayName: \"My Catalog\" } }\n },\n \"payments.products.myProduct\": { catalogId: \"myCatalog\", customerType: \"user\" }\n })).toEqual({\n payments: {\n productLines: { myCatalog: { displayName: \"My Catalog\", customerType: \"user\" } }\n },\n \"payments.products.myProduct\": { productLineId: \"myCatalog\", customerType: \"user\" }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - does not overwrite existing customerType\", ({ expect }) => {\n // If catalog already has customerType, don't overwrite it\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n myCatalog: { displayName: \"My Catalog\", customerType: \"team\" }\n },\n products: {\n myProduct: { catalogId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n myCatalog: { displayName: \"My Catalog\", customerType: \"team\" }\n },\n products: {\n myProduct: { productLineId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - multiple catalogs and products\", ({ expect }) => {\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n userPlans: { displayName: \"User Plans\" },\n teamPlans: { displayName: \"Team Plans\" }\n },\n products: {\n userBasic: { catalogId: \"userPlans\", customerType: \"user\", prices: {} },\n userPro: { catalogId: \"userPlans\", customerType: \"user\", prices: {} },\n teamBasic: { catalogId: \"teamPlans\", customerType: \"team\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n userPlans: { displayName: \"User Plans\", customerType: \"user\" },\n teamPlans: { displayName: \"Team Plans\", customerType: \"team\" }\n },\n products: {\n userBasic: { productLineId: \"userPlans\", customerType: \"user\", prices: {} },\n userPro: { productLineId: \"userPlans\", customerType: \"user\", prices: {} },\n teamBasic: { productLineId: \"teamPlans\", customerType: \"team\", prices: {} }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - catalog without products is removed\", ({ expect }) => {\n // Catalog without any products should be removed since we can't infer customerType\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n emptyCatalog: { displayName: \"Empty\" }\n },\n products: {}\n }\n })).toEqual({\n payments: {\n productLines: {},\n products: {}\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - products without catalogId\", ({ expect }) => {\n // Catalogs without any products referencing them should be removed\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n myCatalog: { displayName: \"My Catalog\" }\n },\n products: {\n standalone: { customerType: \"user\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {},\n products: {\n standalone: { customerType: \"user\", prices: {} }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - deeply nested flat format\", ({ expect }) => {\n expect(migrateCatalogsToProductLines({\n \"payments.catalogs.myCatalog.displayName\": \"My Catalog\",\n \"payments.products.myProduct.catalogId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n \"payments.products.myProduct.prices\": {},\n })).toEqual({\n \"payments.productLines.myCatalog.displayName\": \"My Catalog\",\n \"payments.productLines.myCatalog.customerType\": \"user\",\n \"payments.products.myProduct.productLineId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n \"payments.products.myProduct.prices\": {},\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - no catalogs\", ({ expect }) => {\n // Config without catalogs should pass through unchanged (except productLineId rename)\n expect(migrateCatalogsToProductLines({\n payments: {\n products: {\n myProduct: { catalogId: \"someCatalog\", customerType: \"user\" }\n }\n }\n })).toEqual({\n payments: {\n products: {\n myProduct: { productLineId: \"someCatalog\", customerType: \"user\" }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - already migrated (productLines)\", ({ expect }) => {\n // Already has productLines, should not change customerType\n expect(migrateCatalogsToProductLines({\n payments: {\n productLines: {\n myLine: { displayName: \"My Line\", customerType: \"team\" }\n },\n products: {\n myProduct: { productLineId: \"myLine\", customerType: \"team\" }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n myLine: { displayName: \"My Line\", customerType: \"team\" }\n },\n products: {\n myProduct: { productLineId: \"myLine\", customerType: \"team\" }\n }\n }\n });\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"migrate-catalogs-to-product-lines.js","names":["HexclaveAssertionError","paymentsObj"],"sources":["../../src/config/migrate-catalogs-to-product-lines.ts"],"sourcesContent":["import { HexclaveAssertionError } from \"../utils/errors\";\nimport { isObjectLike, set, typedEntries } from \"../utils/objects\";\n\n/**\n * Renames properties in an object based on a path condition.\n * This is a local copy to avoid circular dependencies with schema.ts.\n */\nfunction renameProperty(obj: Record<string, any>, oldPath: string | ((path: string[]) => boolean), newName: string | ((path: string[]) => string)): any {\n const pathCond = typeof oldPath === \"function\" ? oldPath : (p: string[]) => p.join(\".\") === oldPath;\n const pathMapper = typeof newName === \"function\" ? newName : (p: string[]) => (newName as string);\n\n const res: Record<string, any> = Array.isArray(obj) ? [] : {};\n for (const [key, originalValue] of typedEntries(obj)) {\n const path = key.split(\".\");\n\n for (let i = 0; i < path.length; i++) {\n const pathPrefix = path.slice(0, i + 1);\n if (pathCond(pathPrefix)) {\n const name = pathMapper(pathPrefix);\n if (name.includes(\".\")) throw new HexclaveAssertionError(`newName must not contain a dot. Provided: ${name}`);\n path[i] = name;\n }\n }\n\n const value = isObjectLike(originalValue) ? renameProperty(originalValue, p => pathCond([...path, ...p]), p => pathMapper([...path, ...p])) : originalValue;\n set(res, path.join(\".\"), value);\n }\n\n return res;\n}\n\n/**\n * Migrates the old \"catalogs\" format to \"productLines\", including:\n * 1. Inferring customerType for each catalog from its products (since old catalogs didn't have customerType)\n * 2. Removing empty catalogs (those with no products) since they can't have customerType inferred\n * 3. Renaming payments.catalogs -> payments.productLines\n * 4. Renaming payments.products.*.catalogId -> payments.products.*.productLineId\n *\n * This handles all config formats (nested objects, flat dot-notation, or mixed).\n */\nexport function migrateCatalogsToProductLines(obj: Record<string, any>): Record<string, any> {\n // Step 1: Collect catalogId -> customerType mappings from products\n const catalogCustomerTypes = new Map<string, string>();\n collectCatalogCustomerTypes(obj, [], catalogCustomerTypes);\n\n // Step 2: Find all catalog IDs that exist\n const allCatalogIds = new Set<string>();\n findAllCatalogIds(obj, [], allCatalogIds);\n\n // Step 3: Add customerType keys for catalogs that need them\n let res = { ...obj };\n for (const catalogId of allCatalogIds) {\n const customerType = catalogCustomerTypes.get(catalogId);\n if (customerType) {\n // Find the format used for this catalog and add customerType in the same format\n res = addCustomerTypeToCatalog(res, catalogId, customerType);\n } else {\n // Empty catalog (no products) - remove it since we can't infer customerType\n res = removeCatalog(res, catalogId);\n }\n }\n\n // Step 4: Rename catalogs -> productLines\n res = renameProperty(res, \"payments.catalogs\", \"productLines\");\n\n // Step 5: Rename catalogId -> productLineId in products\n res = renameProperty(res, (p) => p.length === 4 && p[0] === \"payments\" && p[1] === \"products\" && p[3] === \"catalogId\", () => \"productLineId\");\n\n return res;\n}\n\n/**\n * Recursively collects catalogId -> customerType mappings from products.\n * Handles both nested and flat config formats.\n */\nfunction collectCatalogCustomerTypes(\n obj: Record<string, any>,\n basePath: string[],\n result: Map<string, string>\n): void {\n for (const [key, value] of typedEntries(obj)) {\n const keyParts = key.split(\".\");\n const fullPath = [...basePath, ...keyParts];\n\n // Check for flat format at ROOT level only: payments.products.<productId>.catalogId\n // We check basePath.length === 0 to ensure we're at root and key contains the full path\n if (basePath.length === 0 && fullPath.length === 4 && fullPath[0] === \"payments\" && fullPath[1] === \"products\" && fullPath[3] === \"catalogId\") {\n if (typeof value === \"string\") {\n const productId = fullPath[2];\n // Look for customerType in the same flat format\n const customerTypeKey = `payments.products.${productId}.customerType`;\n if (customerTypeKey in obj && typeof obj[customerTypeKey] === \"string\") {\n result.set(value, obj[customerTypeKey]);\n }\n }\n }\n\n // Check for nested format: payments.products.<productId> with object value\n if (fullPath.length === 3 && fullPath[0] === \"payments\" && fullPath[1] === \"products\" && isObjectLike(value)) {\n const catalogId = findPropertyValue(value, \"catalogId\") ?? findPropertyValue(value, \"productLineId\");\n const customerType = findPropertyValue(value, \"customerType\");\n if (catalogId && typeof catalogId === \"string\" && customerType && typeof customerType === \"string\") {\n result.set(catalogId, customerType);\n }\n }\n\n if (isObjectLike(value)) {\n collectCatalogCustomerTypes(value, fullPath, result);\n }\n }\n}\n\n/**\n * Finds a property value in an object, handling both direct properties and dot-notation keys.\n */\nfunction findPropertyValue(obj: Record<string, any>, propertyName: string): any {\n // Direct property\n if (propertyName in obj) {\n return obj[propertyName];\n }\n // Check for dot-notation keys that end with the property name\n for (const key of Object.keys(obj)) {\n const parts = key.split(\".\");\n if (parts[parts.length - 1] === propertyName) {\n return obj[key];\n }\n }\n return undefined;\n}\n\n/**\n * Finds all catalog IDs that exist in the config.\n */\nfunction findAllCatalogIds(\n obj: Record<string, any>,\n basePath: string[],\n result: Set<string>\n): void {\n for (const [key, value] of typedEntries(obj)) {\n const keyParts = key.split(\".\");\n const fullPath = [...basePath, ...keyParts];\n\n // Check for catalog entry at payments.catalogs.<catalogId>\n if (fullPath.length >= 3 && fullPath[0] === \"payments\" && fullPath[1] === \"catalogs\") {\n const catalogId = fullPath[2];\n result.add(catalogId);\n }\n\n if (isObjectLike(value)) {\n findAllCatalogIds(value, fullPath, result);\n }\n }\n}\n\n/**\n * Removes a catalog from the config in any format (nested or flat).\n */\nfunction removeCatalog(obj: Record<string, any>, catalogId: string): Record<string, any> {\n // Don't process arrays - they should be copied as-is\n if (Array.isArray(obj)) {\n return obj;\n }\n\n const res: Record<string, any> = {};\n\n for (const [key, value] of typedEntries(obj)) {\n const keyParts = key.split(\".\");\n\n // Check if this key is for the catalog we want to remove\n // Format 4: \"payments.catalogs.<catalogId>.displayName\" or similar flat keys\n if (keyParts.length >= 3 && keyParts[0] === \"payments\" && keyParts[1] === \"catalogs\" && keyParts[2] === catalogId) {\n // Skip this key - don't copy it\n continue;\n }\n\n // Format 3: \"payments.catalogs.<catalogId>\" as a single key\n if (key === `payments.catalogs.${catalogId}`) {\n continue;\n }\n\n if (Array.isArray(value)) {\n res[key] = value;\n } else if (isObjectLike(value)) {\n const processed = removeCatalog(value, catalogId);\n // Check if we need to remove the catalog from nested structures\n if (key === \"payments\" && isObjectLike(processed) && \"catalogs\" in processed) {\n const catalogs = processed.catalogs;\n if (isObjectLike(catalogs) && catalogId in catalogs) {\n const { [catalogId]: _, ...rest } = catalogs as Record<string, any>;\n res[key] = { ...processed, catalogs: rest };\n continue;\n }\n }\n // Format 2: \"payments.catalogs\" as a key with nested catalog\n if (key === \"payments.catalogs\" && isObjectLike(processed) && catalogId in processed) {\n const { [catalogId]: _, ...rest } = processed as Record<string, any>;\n res[key] = rest;\n continue;\n }\n res[key] = processed;\n } else {\n res[key] = value;\n }\n }\n\n return res;\n}\n\n/**\n * Adds customerType to a catalog in the appropriate format.\n */\nfunction addCustomerTypeToCatalog(obj: Record<string, any>, catalogId: string, customerType: string): Record<string, any> {\n // Don't process arrays - they should be copied as-is\n if (Array.isArray(obj)) {\n return obj;\n }\n\n const res: Record<string, any> = {};\n\n // First, copy all existing properties\n for (const [key, value] of typedEntries(obj)) {\n if (Array.isArray(value)) {\n // Copy arrays directly without processing\n res[key] = value;\n } else if (isObjectLike(value)) {\n res[key] = addCustomerTypeToCatalog(value, catalogId, customerType);\n } else {\n res[key] = value;\n }\n }\n\n // Check what format the catalog uses\n // Format 1: { payments: { catalogs: { [catalogId]: { ... } } } }\n const payments = res.payments;\n if (payments && isObjectLike(payments) && !Array.isArray(payments) && typeof payments !== \"function\") {\n const paymentsObj = payments as Record<string, any>;\n const catalogs = paymentsObj.catalogs;\n if (catalogs && isObjectLike(catalogs) && !Array.isArray(catalogs) && typeof catalogs !== \"function\") {\n const catalogsObj = catalogs as Record<string, any>;\n const catalog = catalogsObj[catalogId];\n if (catalog && isObjectLike(catalog)) {\n if (!(\"customerType\" in catalog)) {\n catalogsObj[catalogId] = { ...catalog, customerType };\n }\n return res;\n }\n }\n }\n\n // Format 2: { \"payments.catalogs\": { [catalogId]: { ... } } }\n const paymentsCatalogs = res[\"payments.catalogs\"];\n if (paymentsCatalogs && isObjectLike(paymentsCatalogs) && !Array.isArray(paymentsCatalogs) && typeof paymentsCatalogs !== \"function\") {\n const catalogs = paymentsCatalogs as Record<string, any>;\n if (catalogId in catalogs && isObjectLike(catalogs[catalogId])) {\n if (!(\"customerType\" in catalogs[catalogId])) {\n catalogs[catalogId] = { ...catalogs[catalogId], customerType };\n }\n return res;\n }\n }\n\n // Format 3: { \"payments.catalogs.[catalogId]\": { ... } }\n const catalogKey = `payments.catalogs.${catalogId}`;\n if (catalogKey in res && isObjectLike(res[catalogKey])) {\n if (!(\"customerType\" in res[catalogKey])) {\n res[catalogKey] = { ...res[catalogKey], customerType };\n }\n return res;\n }\n\n // Format 4: { \"payments.catalogs.[catalogId].displayName\": \"...\" }\n // Need to add a new key for customerType\n const customerTypeKey = `payments.catalogs.${catalogId}.customerType`;\n for (const key of Object.keys(res)) {\n if (key.startsWith(`payments.catalogs.${catalogId}.`) && key !== customerTypeKey) {\n // Found a flat key for this catalog, add customerType in same format\n res[customerTypeKey] = customerType;\n return res;\n }\n }\n\n return res;\n}\n\n// Tests\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - basic migrations\", ({ expect }) => {\n // Basic nested format\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n myCatalog: { displayName: \"My Catalog\" }\n },\n products: {\n myProduct: { catalogId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n myCatalog: { displayName: \"My Catalog\", customerType: \"user\" }\n },\n products: {\n myProduct: { productLineId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n });\n\n // Flat format\n expect(migrateCatalogsToProductLines({\n \"payments.catalogs.myCatalog\": { displayName: \"My Catalog\" },\n \"payments.products.myProduct.catalogId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n })).toEqual({\n \"payments.productLines.myCatalog\": { displayName: \"My Catalog\", customerType: \"user\" },\n \"payments.products.myProduct.productLineId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n });\n\n // Mixed format\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: { myCatalog: { displayName: \"My Catalog\" } }\n },\n \"payments.products.myProduct\": { catalogId: \"myCatalog\", customerType: \"user\" }\n })).toEqual({\n payments: {\n productLines: { myCatalog: { displayName: \"My Catalog\", customerType: \"user\" } }\n },\n \"payments.products.myProduct\": { productLineId: \"myCatalog\", customerType: \"user\" }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - does not overwrite existing customerType\", ({ expect }) => {\n // If catalog already has customerType, don't overwrite it\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n myCatalog: { displayName: \"My Catalog\", customerType: \"team\" }\n },\n products: {\n myProduct: { catalogId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n myCatalog: { displayName: \"My Catalog\", customerType: \"team\" }\n },\n products: {\n myProduct: { productLineId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - multiple catalogs and products\", ({ expect }) => {\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n userPlans: { displayName: \"User Plans\" },\n teamPlans: { displayName: \"Team Plans\" }\n },\n products: {\n userBasic: { catalogId: \"userPlans\", customerType: \"user\", prices: {} },\n userPro: { catalogId: \"userPlans\", customerType: \"user\", prices: {} },\n teamBasic: { catalogId: \"teamPlans\", customerType: \"team\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n userPlans: { displayName: \"User Plans\", customerType: \"user\" },\n teamPlans: { displayName: \"Team Plans\", customerType: \"team\" }\n },\n products: {\n userBasic: { productLineId: \"userPlans\", customerType: \"user\", prices: {} },\n userPro: { productLineId: \"userPlans\", customerType: \"user\", prices: {} },\n teamBasic: { productLineId: \"teamPlans\", customerType: \"team\", prices: {} }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - catalog without products is removed\", ({ expect }) => {\n // Catalog without any products should be removed since we can't infer customerType\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n emptyCatalog: { displayName: \"Empty\" }\n },\n products: {}\n }\n })).toEqual({\n payments: {\n productLines: {},\n products: {}\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - products without catalogId\", ({ expect }) => {\n // Catalogs without any products referencing them should be removed\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n myCatalog: { displayName: \"My Catalog\" }\n },\n products: {\n standalone: { customerType: \"user\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {},\n products: {\n standalone: { customerType: \"user\", prices: {} }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - deeply nested flat format\", ({ expect }) => {\n expect(migrateCatalogsToProductLines({\n \"payments.catalogs.myCatalog.displayName\": \"My Catalog\",\n \"payments.products.myProduct.catalogId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n \"payments.products.myProduct.prices\": {},\n })).toEqual({\n \"payments.productLines.myCatalog.displayName\": \"My Catalog\",\n \"payments.productLines.myCatalog.customerType\": \"user\",\n \"payments.products.myProduct.productLineId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n \"payments.products.myProduct.prices\": {},\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - no catalogs\", ({ expect }) => {\n // Config without catalogs should pass through unchanged (except productLineId rename)\n expect(migrateCatalogsToProductLines({\n payments: {\n products: {\n myProduct: { catalogId: \"someCatalog\", customerType: \"user\" }\n }\n }\n })).toEqual({\n payments: {\n products: {\n myProduct: { productLineId: \"someCatalog\", customerType: \"user\" }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - already migrated (productLines)\", ({ expect }) => {\n // Already has productLines, should not change customerType\n expect(migrateCatalogsToProductLines({\n payments: {\n productLines: {\n myLine: { displayName: \"My Line\", customerType: \"team\" }\n },\n products: {\n myProduct: { productLineId: \"myLine\", customerType: \"team\" }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n myLine: { displayName: \"My Line\", customerType: \"team\" }\n },\n products: {\n myProduct: { productLineId: \"myLine\", customerType: \"team\" }\n }\n }\n });\n});\n"],"mappings":"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"}
|
|
@@ -1,17 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
let ___utils_errors_js = require("../utils/errors.js");
|
|
1
|
+
require("../utils/errors.js");
|
|
3
2
|
let ___utils_objects_js = require("../utils/objects.js");
|
|
4
3
|
let ___apps_apps_config_js = require("../apps/apps-config.js");
|
|
5
4
|
let ___utils_currency_constants_js = require("../utils/currency-constants.js");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
require("../utils/strings.js");
|
|
6
|
+
require("./format.js");
|
|
7
|
+
require("./schema.js");
|
|
10
8
|
//#region src/config/schema-fuzzer.test.ts
|
|
11
|
-
const projectSchemaFuzzerConfig = [{
|
|
12
|
-
sourceOfTruth: [{ type: ["hosted"] }],
|
|
13
|
-
project: [{ requirePublishableClientKey: [true, false] }]
|
|
14
|
-
}];
|
|
15
9
|
const branchSchemaFuzzerConfig = [{
|
|
16
10
|
apiKeys: [{ enabled: [{
|
|
17
11
|
team: [true, false],
|
|
@@ -239,167 +233,19 @@ const branchSchemaFuzzerConfig = [{
|
|
|
239
233
|
apps: [{ installed: [(0, ___utils_objects_js.typedFromEntries)((0, ___utils_objects_js.typedEntries)(___apps_apps_config_js.ALL_APPS).map(([key, value]) => [key, [{ enabled: [true, false] }]]))] }],
|
|
240
234
|
onboarding: [{ requireEmailVerification: [true, false] }]
|
|
241
235
|
}];
|
|
242
|
-
|
|
243
|
-
...
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
microsoftTenantId: ["some-microsoft-tenant-id"],
|
|
256
|
-
appleBundles: [{ "some-bundle-id": [{ bundleId: ["com.example.app"] }] }],
|
|
257
|
-
issuerUrl: [void 0, "https://accounts.google.com"],
|
|
258
|
-
scope: [void 0, "openid email profile"],
|
|
259
|
-
displayName: [void 0, "My OIDC Provider"]
|
|
260
|
-
}]]))]
|
|
261
|
-
}]
|
|
262
|
-
}],
|
|
263
|
-
domains: [{
|
|
264
|
-
allowLocalhost: [true, false],
|
|
265
|
-
trustedDomains: [{ "some-domain-id": [{
|
|
266
|
-
baseUrl: ["https://example.com/something-here"],
|
|
267
|
-
handlerPath: ["/something-here"]
|
|
268
|
-
}] }]
|
|
269
|
-
}],
|
|
270
|
-
emails: [{
|
|
271
|
-
...branchSchemaFuzzerConfig[0].emails[0],
|
|
272
|
-
server: [{
|
|
273
|
-
isShared: [true, false],
|
|
274
|
-
provider: [
|
|
275
|
-
"resend",
|
|
276
|
-
"smtp",
|
|
277
|
-
"managed"
|
|
278
|
-
],
|
|
279
|
-
host: ["example.com", "://super weird host that's not valid"],
|
|
280
|
-
port: [
|
|
281
|
-
1234,
|
|
282
|
-
.12543,
|
|
283
|
-
-100,
|
|
284
|
-
Infinity
|
|
285
|
-
],
|
|
286
|
-
username: ["some-username", "some username with a space"],
|
|
287
|
-
password: ["some-password", "some password with a space"],
|
|
288
|
-
senderName: ["Some Sender"],
|
|
289
|
-
senderEmail: ["some-sender@example.com", "some invalid email"],
|
|
290
|
-
managedSubdomain: ["mail.example.com", "invalid subdomain"],
|
|
291
|
-
managedSenderLocalPart: ["noreply", "some invalid local part"]
|
|
292
|
-
}]
|
|
293
|
-
}],
|
|
294
|
-
payments: [{
|
|
295
|
-
...branchSchemaFuzzerConfig[0].payments[0],
|
|
296
|
-
testMode: [false, true]
|
|
297
|
-
}],
|
|
298
|
-
analytics: [{ queryFolders: [{ "some-folder-id": [{
|
|
299
|
-
displayName: ["Some Folder", "Some Other Folder"],
|
|
300
|
-
sortOrder: [
|
|
301
|
-
0,
|
|
302
|
-
1,
|
|
303
|
-
10,
|
|
304
|
-
-5
|
|
305
|
-
],
|
|
306
|
-
queries: [{ "some-query-id": [{
|
|
307
|
-
displayName: ["Some Query", "Some Other Query"],
|
|
308
|
-
sqlQuery: [
|
|
309
|
-
"",
|
|
310
|
-
"SELECT * FROM events",
|
|
311
|
-
"SELECT * FROM users"
|
|
312
|
-
],
|
|
313
|
-
description: [
|
|
314
|
-
"",
|
|
315
|
-
"A query description",
|
|
316
|
-
"Another description"
|
|
317
|
-
]
|
|
318
|
-
}] }]
|
|
319
|
-
}] }] }],
|
|
320
|
-
customDashboards: [{ "12345678-1234-4234-9234-123456789012": [{
|
|
321
|
-
displayName: ["My Dashboard", "User Growth Dashboard"],
|
|
322
|
-
tsxSource: ["", "function Dashboard() { return <div>Hello</div>; }"]
|
|
323
|
-
}] }]
|
|
324
|
-
}];
|
|
325
|
-
const organizationSchemaFuzzerConfig = environmentSchemaFuzzerConfig;
|
|
326
|
-
function setDeep(obj, path, value) {
|
|
327
|
-
if (!(0, ___utils_objects_js.isObjectLike)(obj)) return obj;
|
|
328
|
-
if (path.length === 0) throw new Error("Path is empty");
|
|
329
|
-
else if (path.length === 1) (0, ___utils_objects_js.set)(obj, path[0], value);
|
|
330
|
-
else {
|
|
331
|
-
const [key, ...rest] = path;
|
|
332
|
-
setDeep((0, ___utils_objects_js.getOrUndefined)(obj, key), rest, value);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
function createFuzzerInput(config, progress) {
|
|
336
|
-
progress = Math.min(1, 2 * progress);
|
|
337
|
-
const createShouldRandom = (strength) => {
|
|
338
|
-
const chance = Math.random() * strength * 1.2 - .1;
|
|
339
|
-
return () => Math.random() < chance;
|
|
340
|
-
};
|
|
341
|
-
const createShouldObjectDependent = (strength) => {
|
|
342
|
-
const objectChance = Math.random() * strength * 1.2 - .1;
|
|
343
|
-
const primitiveChance = Math.random() * strength * 1.2 - .1;
|
|
344
|
-
return (v) => Math.random() * Math.random() < ((0, ___utils_objects_js.isObjectLike)(v) ? objectChance : primitiveChance);
|
|
345
|
-
};
|
|
346
|
-
const shouldKeep = createShouldObjectDependent(progress * 1);
|
|
347
|
-
const shouldMakeNested = createShouldObjectDependent(1.25);
|
|
348
|
-
const shouldNull = createShouldRandom(.25);
|
|
349
|
-
let res;
|
|
350
|
-
const recurse = (outputPath, config, forceNested, forceNonNull) => {
|
|
351
|
-
let subConfig = config[Math.floor(Math.random() * config.length)];
|
|
352
|
-
const originalValue = (0, ___utils_objects_js.isObjectLike)(subConfig) ? Array.isArray(subConfig) ? [] : {} : subConfig;
|
|
353
|
-
const newValue = forceNonNull || !shouldNull() ? originalValue : null;
|
|
354
|
-
const newOutputPath = forceNested || shouldMakeNested(originalValue) || outputPath.length === 0 ? outputPath : [outputPath.join(".")];
|
|
355
|
-
if (outputPath.length === 0) res = newValue;
|
|
356
|
-
else if (forceNested || shouldKeep(originalValue)) setDeep(res, newOutputPath, newValue);
|
|
357
|
-
if ((0, ___utils_objects_js.isObjectLike)(subConfig)) for (const [key, newValue] of (0, ___utils_objects_js.typedEntries)(subConfig)) recurse([...newOutputPath, key], newValue, Array.isArray(subConfig), Array.isArray(subConfig));
|
|
358
|
-
};
|
|
359
|
-
recurse([], config, false, true);
|
|
360
|
-
return res;
|
|
361
|
-
}
|
|
362
|
-
(void 0)?.test("fuzz schemas", async ({ expect }) => {
|
|
363
|
-
const totalIterations = process.env.CI ? 1e3 : 200;
|
|
364
|
-
for (let i = 0; i < totalIterations; i++) {
|
|
365
|
-
const projectInput = createFuzzerInput(projectSchemaFuzzerConfig, i / totalIterations);
|
|
366
|
-
const branchInput = createFuzzerInput(branchSchemaFuzzerConfig, i / totalIterations);
|
|
367
|
-
const environmentInput = createFuzzerInput(environmentSchemaFuzzerConfig, i / totalIterations);
|
|
368
|
-
const organizationInput = createFuzzerInput(organizationSchemaFuzzerConfig, i / totalIterations);
|
|
369
|
-
try {
|
|
370
|
-
const projectMigrated = (0, __schema_js.migrateConfigOverride)("project", projectInput);
|
|
371
|
-
await (0, __schema_js.assertNoConfigOverrideErrors)(__schema_js.projectConfigSchema, projectMigrated);
|
|
372
|
-
const projectOverridden = (0, __format_js.override)({}, projectMigrated);
|
|
373
|
-
await (0, __schema_js.sanitizeProjectConfig)((0, __format_js.normalize)((0, __schema_js.applyProjectDefaults)(projectOverridden), { onDotIntoNonObject: "ignore" }));
|
|
374
|
-
const branchMigrated = (0, __schema_js.migrateConfigOverride)("branch", branchInput);
|
|
375
|
-
await (0, __schema_js.assertNoConfigOverrideErrors)(__schema_js.branchConfigSchema, branchMigrated);
|
|
376
|
-
const branchOverridden = (0, __format_js.override)(projectOverridden, branchMigrated);
|
|
377
|
-
await (0, __schema_js.sanitizeBranchConfig)((0, __format_js.normalize)((0, __schema_js.applyBranchDefaults)(branchOverridden), { onDotIntoNonObject: "ignore" }));
|
|
378
|
-
const environmentMigrated = (0, __schema_js.migrateConfigOverride)("environment", environmentInput);
|
|
379
|
-
await (0, __schema_js.assertNoConfigOverrideErrors)(__schema_js.environmentConfigSchema, environmentMigrated);
|
|
380
|
-
const environmentOverridden = (0, __format_js.override)(branchOverridden, environmentMigrated);
|
|
381
|
-
await (0, __schema_js.sanitizeEnvironmentConfig)((0, __format_js.normalize)((0, __schema_js.applyEnvironmentDefaults)(environmentOverridden), { onDotIntoNonObject: "ignore" }));
|
|
382
|
-
const organizationMigrated = (0, __schema_js.migrateConfigOverride)("organization", organizationInput);
|
|
383
|
-
await (0, __schema_js.assertNoConfigOverrideErrors)(__schema_js.organizationConfigSchema, organizationMigrated);
|
|
384
|
-
await (0, __schema_js.sanitizeOrganizationConfig)((0, __format_js.normalize)((0, __schema_js.applyOrganizationDefaults)((0, __format_js.override)(environmentOverridden, organizationMigrated)), { onDotIntoNonObject: "ignore" }));
|
|
385
|
-
} catch (e) {
|
|
386
|
-
const data = {
|
|
387
|
-
cause: e,
|
|
388
|
-
inputs: {
|
|
389
|
-
projectInput,
|
|
390
|
-
branchInput,
|
|
391
|
-
environmentInput,
|
|
392
|
-
organizationInput
|
|
393
|
-
}
|
|
394
|
-
};
|
|
395
|
-
console.error("Failed to fuzz schema in iteration ${i}/${totalIterations}!", (0, ___utils_strings_js.nicify)(data));
|
|
396
|
-
throw new ___utils_errors_js.HexclaveAssertionError(`Error in iteration ${i}/${totalIterations} of schema fuzz: ${e}`, { cause: e });
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
});
|
|
400
|
-
(void 0)?.test("rejects include-by-default product prices in config overrides", async ({ expect }) => {
|
|
401
|
-
await expect((0, __schema_js.assertNoConfigOverrideErrors)(__schema_js.branchConfigSchema, { "payments.products.free.prices": "include-by-default" })).rejects.toThrow(/payments\.products\.free\.prices must not be one of the following values: include-by-default/);
|
|
402
|
-
});
|
|
403
|
-
|
|
236
|
+
({ ...branchSchemaFuzzerConfig[0] }), { ...branchSchemaFuzzerConfig[0].auth[0] }, { ...branchSchemaFuzzerConfig[0].auth[0].oauth[0] }, (0, ___utils_objects_js.typedFromEntries)((0, ___utils_objects_js.typedEntries)(branchSchemaFuzzerConfig[0].auth[0].oauth[0].providers[0]).map(([key, value]) => [key, [{
|
|
237
|
+
...value[0],
|
|
238
|
+
isShared: [true, false],
|
|
239
|
+
clientId: ["some-client-id"],
|
|
240
|
+
clientSecret: ["some-client-secret"],
|
|
241
|
+
customCallbackUrl: [void 0],
|
|
242
|
+
facebookConfigId: ["some-facebook-config-id"],
|
|
243
|
+
microsoftTenantId: ["some-microsoft-tenant-id"],
|
|
244
|
+
appleBundles: [{ "some-bundle-id": [{ bundleId: ["com.example.app"] }] }],
|
|
245
|
+
issuerUrl: [void 0, "https://accounts.google.com"],
|
|
246
|
+
scope: [void 0, "openid email profile"],
|
|
247
|
+
displayName: [void 0, "My OIDC Provider"]
|
|
248
|
+
}]])), { ...branchSchemaFuzzerConfig[0].emails[0] }, { ...branchSchemaFuzzerConfig[0].payments[0] };
|
|
404
249
|
//#endregion
|
|
250
|
+
|
|
405
251
|
//# sourceMappingURL=schema-fuzzer.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-fuzzer.test.js","names":[],"sources":["../../src/config/schema-fuzzer.test.ts"],"sourcesContent":["import { ALL_APPS } from \"../apps/apps-config\";\nimport { SUPPORTED_CURRENCIES } from \"../utils/currency-constants\";\nimport { HexclaveAssertionError } from \"../utils/errors\";\nimport { getOrUndefined, isObjectLike, set, typedEntries, typedFromEntries } from \"../utils/objects\";\nimport { nicify } from \"../utils/strings\";\nimport { normalize, override } from \"./format\";\nimport { BranchConfigNormalizedOverride, EnvironmentConfigNormalizedOverride, OrganizationConfigNormalizedOverride, ProjectConfigNormalizedOverride, applyBranchDefaults, applyEnvironmentDefaults, applyOrganizationDefaults, applyProjectDefaults, assertNoConfigOverrideErrors, branchConfigSchema, environmentConfigSchema, migrateConfigOverride, organizationConfigSchema, projectConfigSchema, sanitizeBranchConfig, sanitizeEnvironmentConfig, sanitizeOrganizationConfig, sanitizeProjectConfig } from \"./schema\";\n\ntype FuzzerConfig<T> = ReadonlyArray<T extends object ? ([T] extends [any[]] ? { readonly [K in keyof T]: FuzzerConfig<T[K]> } : Required<{\n [K in keyof T]: FuzzerConfig<T[K]>;\n}> & Record<string, FuzzerConfig<any>>) : T>;\n\nconst projectSchemaFuzzerConfig = [{\n sourceOfTruth: [{\n type: [\"hosted\"],\n }],\n project: [{\n requirePublishableClientKey: [true, false],\n }],\n}] satisfies FuzzerConfig<ProjectConfigNormalizedOverride>;\n\nconst branchSchemaFuzzerConfig = [{\n apiKeys: [{\n enabled: [{\n team: [true, false],\n user: [true, false],\n }],\n }],\n auth: [{\n allowSignUp: [true, false],\n password: [{\n allowSignIn: [true, false],\n }],\n otp: [{\n allowSignIn: [true, false],\n }],\n passkey: [{\n allowSignIn: [true, false],\n }],\n oauth: [{\n accountMergeStrategy: [\"link_method\", \"raise_error\", \"allow_duplicates\"],\n providers: [{\n \"google\": [{\n type: [\"google\", \"github\", \"x\"] as const,\n allowSignIn: [true, false],\n allowConnectedAccounts: [true, false],\n }],\n }],\n }],\n signUpRules: [{\n \"some-rule-id\": [{\n enabled: [true, false],\n displayName: [\"Block Test Emails\", \"Allow Only Company Domain\"],\n priority: [0, 1, 100],\n condition: ['email.endsWith(\"@test.com\")', 'emailDomain == \"company.com\"'],\n action: [{\n type: [\"allow\", \"reject\", \"restrict\", \"log\"] as const,\n message: [\"\", \"Sign up is not allowed for this email\"],\n }],\n }],\n }],\n signUpRulesDefaultAction: [\"allow\", \"reject\"],\n }],\n dbSync: [{\n externalDatabases: [{\n \"some-external-db-id\": [{\n type: [\"postgres\"] as const,\n connectionString: [\n \"postgres://user:password@host:port/database\",\n \"some-connection-string\",\n ],\n }],\n }],\n }],\n dataVault: [{\n stores: [{\n \"some-store-id\": [{\n displayName: [\"Some Store\", \"Some Other Store\"],\n }],\n \"some-other-store-id\": [{\n displayName: [\"Some Store\", \"Some Other Store\"],\n }],\n }],\n }],\n payments: [{\n blockNewPurchases: [false, true],\n autoPay: [{\n interval: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n }],\n productLines: [{\n \"some-product-line-id\": [{\n displayName: [\"Some Product Line\", \"Some Other Product Line\"],\n customerType: [\"user\", \"team\", \"custom\"] as const,\n }],\n }],\n catalogs: [{ // ensure migration works\n \"some-product-line-id\": [{\n displayName: [\"Some Product Line\", \"Some Other Product Line\"],\n }],\n }],\n groups: [{ // ensure migration works\n \"some-product-line-id\": [{\n displayName: [\"Some Product Line\", \"Some Other Product Line\"],\n }],\n }],\n items: [{\n \"some-item-id\": [{\n customerType: [\"user\", \"team\", \"custom\"] as const,\n displayName: [\"Some Item\", \"Some Other Item\"],\n }],\n }],\n products: [{\n \"some-product-id\": [{\n displayName: [\"Some Product\", \"Some Other Product\"],\n customerType: [\"user\", \"team\", \"custom\"] as const,\n freeTrial: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n serverOnly: [true, false],\n stackable: [true, false],\n productLineId: [\"some-product-line-id\", \"some-other-product-line-id\"],\n catalogId: [\"some-product-line-id\", \"some-other-product-line-id\"], // ensure migration works\n groupId: [\"some-product-line-id\", \"some-other-product-line-id\"], // ensure migration works\n isAddOnTo: [false, { \"some-product-id\": [true], \"some-other-product-id\": [true] }] as const,\n prices: [{\n \"some-price-id\": [{\n ...typedFromEntries(SUPPORTED_CURRENCIES.map(currency => [currency.code, [\"100_00\", \"not a number\", \"Infinity\", \"0\"]])),\n interval: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n serverOnly: [true, false],\n freeTrial: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n }],\n }],\n includedItems: [{\n \"some-item-id\": [{\n quantity: [0, 1, -3, 100, 0.333, Infinity],\n repeat: [\"never\", [[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n expires: [\"never\", \"when-purchase-expires\", \"when-repeated\"] as const,\n }],\n }],\n }],\n }],\n }],\n emails: [{\n themes: [{\n \"12345678-1234-4234-9234-123456789012\": [{\n displayName: [\"Some Theme\", \"Some Other Theme\"],\n tsxSource: [\"\", \"some typescript source code\"],\n }],\n }],\n selectedThemeId: [\"some-theme-id\", \"some-other-theme-id\"],\n templates: [{\n \"12345678-1234-4234-9234-123456789012\": [{\n themeId: [\"some-theme-id\", \"some-other-theme-id\"],\n displayName: [\"Some Template\", \"Some Other Template\"],\n tsxSource: [\"\", \"some typescript source code\"],\n }],\n }],\n }],\n teams: [{\n createPersonalTeamOnSignUp: [true, false],\n allowClientTeamCreation: [true, false],\n }],\n users: [{\n allowClientUserDeletion: [true, false],\n }],\n rbac: [{\n permissions: [{\n \"some_permission_id\": [{\n containedPermissionIds: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n description: [\"Some Permission\", \"Some Other Permission\"],\n scope: [\"team\", \"project\"] as const,\n }],\n }],\n defaultPermissions: [{\n teamCreator: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n teamMember: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n signUp: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n }],\n }],\n domains: [{}],\n apps: [{\n installed: [typedFromEntries(typedEntries(ALL_APPS).map(([key, value]) => [key, [{\n enabled: [true, false],\n }]]))],\n }],\n onboarding: [{\n requireEmailVerification: [true, false],\n }],\n}] satisfies FuzzerConfig<BranchConfigNormalizedOverride>;\n\nconst environmentSchemaFuzzerConfig = [{\n ...branchSchemaFuzzerConfig[0],\n auth: [{\n ...branchSchemaFuzzerConfig[0].auth[0],\n oauth: [{\n ...branchSchemaFuzzerConfig[0].auth[0].oauth[0],\n providers: [typedFromEntries(typedEntries(branchSchemaFuzzerConfig[0].auth[0].oauth[0].providers[0]).map(([key, value]) => [key, [{\n ...value[0],\n isShared: [true, false],\n clientId: [\"some-client-id\"],\n clientSecret: [\"some-client-secret\"],\n // Kept undefined: the schema forbids customCallbackUrl when isShared is\n // true, and the fuzzer randomizes each field independently so it cannot\n // honor that coupling. The accept path is covered by an e2e test.\n customCallbackUrl: [undefined] as (string | undefined)[],\n facebookConfigId: [\"some-facebook-config-id\"],\n microsoftTenantId: [\"some-microsoft-tenant-id\"],\n appleBundles: [{ \"some-bundle-id\": [{ bundleId: [\"com.example.app\"] }] }],\n issuerUrl: [undefined, \"https://accounts.google.com\"] as (string | undefined)[],\n scope: [undefined, \"openid email profile\"] as (string | undefined)[],\n displayName: [undefined, \"My OIDC Provider\"] as (string | undefined)[],\n }]]))] as const,\n }],\n }],\n domains: [{\n allowLocalhost: [true, false],\n trustedDomains: [{\n \"some-domain-id\": [{\n baseUrl: [\"https://example.com/something-here\"],\n handlerPath: [\"/something-here\"],\n }],\n }],\n }],\n emails: [{\n ...branchSchemaFuzzerConfig[0].emails[0],\n server: [{\n isShared: [true, false],\n provider: [\"resend\", \"smtp\", \"managed\"] as const,\n host: [\"example.com\", \"://super weird host that's not valid\"],\n port: [1234, 0.12543, -100, Infinity],\n username: [\"some-username\", \"some username with a space\"],\n password: [\"some-password\", \"some password with a space\"],\n senderName: [\"Some Sender\"],\n senderEmail: [\"some-sender@example.com\", \"some invalid email\"],\n managedSubdomain: [\"mail.example.com\", \"invalid subdomain\"],\n managedSenderLocalPart: [\"noreply\", \"some invalid local part\"],\n }],\n }],\n payments: [{\n ...branchSchemaFuzzerConfig[0].payments[0],\n testMode: [false, true],\n }],\n analytics: [{\n queryFolders: [{\n \"some-folder-id\": [{\n displayName: [\"Some Folder\", \"Some Other Folder\"],\n sortOrder: [0, 1, 10, -5],\n queries: [{\n \"some-query-id\": [{\n displayName: [\"Some Query\", \"Some Other Query\"],\n sqlQuery: [\"\", \"SELECT * FROM events\", \"SELECT * FROM users\"],\n description: [\"\", \"A query description\", \"Another description\"],\n }],\n }],\n }],\n }],\n }],\n customDashboards: [{\n \"12345678-1234-4234-9234-123456789012\": [{\n displayName: [\"My Dashboard\", \"User Growth Dashboard\"],\n tsxSource: [\"\", \"function Dashboard() { return <div>Hello</div>; }\"],\n }],\n }],\n}] satisfies FuzzerConfig<EnvironmentConfigNormalizedOverride>;\n\nconst organizationSchemaFuzzerConfig = environmentSchemaFuzzerConfig satisfies FuzzerConfig<OrganizationConfigNormalizedOverride>;\n\nfunction setDeep<T>(obj: T, path: string[], value: any) {\n if (!isObjectLike(obj)) return obj;\n\n if (path.length === 0) {\n throw new Error(\"Path is empty\");\n } else if (path.length === 1) {\n set(obj as any, path[0], value);\n } else {\n const [key, ...rest] = path;\n setDeep(getOrUndefined(obj as any, key), rest, value);\n }\n}\n\nfunction createFuzzerInput<T>(config: FuzzerConfig<T>, progress: number): T {\n progress = Math.min(1, 2 * progress);\n const createShouldRandom = (strength: number) => {\n const chance = Math.random() * strength * 1.2 - 0.1;\n return () => Math.random() < chance;\n };\n const createShouldObjectDependent = (strength: number) => {\n const objectChance = Math.random() * strength * 1.2 - 0.1;\n const primitiveChance = Math.random() * strength * 1.2 - 0.1;\n return (v: any) => Math.random() * Math.random() < (isObjectLike(v) ? objectChance : primitiveChance);\n };\n\n const shouldKeep = createShouldObjectDependent(progress * 1);\n const shouldMakeNested = createShouldObjectDependent(1.25);\n const shouldNull = createShouldRandom(0.25);\n\n let res: any;\n const recurse = <U>(outputPath: string[], config: FuzzerConfig<U>, forceNested: boolean, forceNonNull: boolean) => {\n let subConfig: any = config[Math.floor(Math.random() * config.length)];\n const originalValue = isObjectLike(subConfig) ? (Array.isArray(subConfig) ? [] : {}) : subConfig;\n\n const newValue = forceNonNull || !shouldNull() ? originalValue : null;\n const newOutputPath = forceNested || shouldMakeNested(originalValue) || outputPath.length === 0 ? outputPath : [outputPath.join(\".\")];\n if (outputPath.length === 0) {\n res = newValue;\n } else {\n if (forceNested || shouldKeep(originalValue)) {\n setDeep(res, newOutputPath, newValue);\n }\n }\n if (isObjectLike(subConfig)) {\n for (const [key, newValue] of typedEntries(subConfig)) {\n recurse([...newOutputPath, key], newValue, Array.isArray(subConfig), Array.isArray(subConfig));\n }\n }\n };\n recurse<T>([], config, false, true);\n return res;\n}\n\nimport.meta.vitest?.test(\"fuzz schemas\", async ({ expect }) => {\n const totalIterations = process.env.CI ? 1000 : 200;\n for (let i = 0; i < totalIterations; i++) {\n const projectInput = createFuzzerInput<ProjectConfigNormalizedOverride>(projectSchemaFuzzerConfig, i / totalIterations);\n const branchInput = createFuzzerInput<BranchConfigNormalizedOverride>(branchSchemaFuzzerConfig, i / totalIterations);\n const environmentInput = createFuzzerInput<EnvironmentConfigNormalizedOverride>(environmentSchemaFuzzerConfig, i / totalIterations);\n const organizationInput = createFuzzerInput<OrganizationConfigNormalizedOverride>(organizationSchemaFuzzerConfig, i / totalIterations);\n\n try {\n const projectMigrated = migrateConfigOverride(\"project\", projectInput);\n await assertNoConfigOverrideErrors(projectConfigSchema, projectMigrated);\n const projectOverridden = override({}, projectMigrated);\n await sanitizeProjectConfig(normalize(applyProjectDefaults(projectOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n const branchMigrated = migrateConfigOverride(\"branch\", branchInput);\n await assertNoConfigOverrideErrors(branchConfigSchema, branchMigrated);\n const branchOverridden = override(projectOverridden, branchMigrated);\n await sanitizeBranchConfig(normalize(applyBranchDefaults(branchOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n const environmentMigrated = migrateConfigOverride(\"environment\", environmentInput);\n await assertNoConfigOverrideErrors(environmentConfigSchema, environmentMigrated);\n const environmentOverridden = override(branchOverridden, environmentMigrated);\n await sanitizeEnvironmentConfig(normalize(applyEnvironmentDefaults(environmentOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n const organizationMigrated = migrateConfigOverride(\"organization\", organizationInput);\n await assertNoConfigOverrideErrors(organizationConfigSchema, organizationMigrated);\n const organizationOverridden = override(environmentOverridden, organizationMigrated);\n await sanitizeOrganizationConfig(normalize(applyOrganizationDefaults(organizationOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n } catch (e) {\n const data = {\n cause: e,\n inputs: {\n projectInput,\n branchInput,\n environmentInput,\n organizationInput,\n },\n } as const;\n console.error(\"Failed to fuzz schema in iteration ${i}/${totalIterations}!\", nicify(data));\n throw new HexclaveAssertionError(`Error in iteration ${i}/${totalIterations} of schema fuzz: ${e}`, { cause: e });\n }\n }\n});\n\nimport.meta.vitest?.test(\"rejects include-by-default product prices in config overrides\", async ({ expect }) => {\n await expect(assertNoConfigOverrideErrors(branchConfigSchema, {\n \"payments.products.free.prices\": \"include-by-default\",\n })).rejects.toThrow(/payments\\.products\\.free\\.prices must not be one of the following values: include-by-default/);\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema-fuzzer.test.js","names":["SUPPORTED_CURRENCIES","ALL_APPS"],"sources":["../../src/config/schema-fuzzer.test.ts"],"sourcesContent":["import { ALL_APPS } from \"../apps/apps-config\";\nimport { SUPPORTED_CURRENCIES } from \"../utils/currency-constants\";\nimport { HexclaveAssertionError } from \"../utils/errors\";\nimport { getOrUndefined, isObjectLike, set, typedEntries, typedFromEntries } from \"../utils/objects\";\nimport { nicify } from \"../utils/strings\";\nimport { normalize, override } from \"./format\";\nimport { BranchConfigNormalizedOverride, EnvironmentConfigNormalizedOverride, OrganizationConfigNormalizedOverride, ProjectConfigNormalizedOverride, applyBranchDefaults, applyEnvironmentDefaults, applyOrganizationDefaults, applyProjectDefaults, assertNoConfigOverrideErrors, branchConfigSchema, environmentConfigSchema, migrateConfigOverride, organizationConfigSchema, projectConfigSchema, sanitizeBranchConfig, sanitizeEnvironmentConfig, sanitizeOrganizationConfig, sanitizeProjectConfig } from \"./schema\";\n\ntype FuzzerConfig<T> = ReadonlyArray<T extends object ? ([T] extends [any[]] ? { readonly [K in keyof T]: FuzzerConfig<T[K]> } : Required<{\n [K in keyof T]: FuzzerConfig<T[K]>;\n}> & Record<string, FuzzerConfig<any>>) : T>;\n\nconst projectSchemaFuzzerConfig = [{\n sourceOfTruth: [{\n type: [\"hosted\"],\n }],\n project: [{\n requirePublishableClientKey: [true, false],\n }],\n}] satisfies FuzzerConfig<ProjectConfigNormalizedOverride>;\n\nconst branchSchemaFuzzerConfig = [{\n apiKeys: [{\n enabled: [{\n team: [true, false],\n user: [true, false],\n }],\n }],\n auth: [{\n allowSignUp: [true, false],\n password: [{\n allowSignIn: [true, false],\n }],\n otp: [{\n allowSignIn: [true, false],\n }],\n passkey: [{\n allowSignIn: [true, false],\n }],\n oauth: [{\n accountMergeStrategy: [\"link_method\", \"raise_error\", \"allow_duplicates\"],\n providers: [{\n \"google\": [{\n type: [\"google\", \"github\", \"x\"] as const,\n allowSignIn: [true, false],\n allowConnectedAccounts: [true, false],\n }],\n }],\n }],\n signUpRules: [{\n \"some-rule-id\": [{\n enabled: [true, false],\n displayName: [\"Block Test Emails\", \"Allow Only Company Domain\"],\n priority: [0, 1, 100],\n condition: ['email.endsWith(\"@test.com\")', 'emailDomain == \"company.com\"'],\n action: [{\n type: [\"allow\", \"reject\", \"restrict\", \"log\"] as const,\n message: [\"\", \"Sign up is not allowed for this email\"],\n }],\n }],\n }],\n signUpRulesDefaultAction: [\"allow\", \"reject\"],\n }],\n dbSync: [{\n externalDatabases: [{\n \"some-external-db-id\": [{\n type: [\"postgres\"] as const,\n connectionString: [\n \"postgres://user:password@host:port/database\",\n \"some-connection-string\",\n ],\n }],\n }],\n }],\n dataVault: [{\n stores: [{\n \"some-store-id\": [{\n displayName: [\"Some Store\", \"Some Other Store\"],\n }],\n \"some-other-store-id\": [{\n displayName: [\"Some Store\", \"Some Other Store\"],\n }],\n }],\n }],\n payments: [{\n blockNewPurchases: [false, true],\n autoPay: [{\n interval: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n }],\n productLines: [{\n \"some-product-line-id\": [{\n displayName: [\"Some Product Line\", \"Some Other Product Line\"],\n customerType: [\"user\", \"team\", \"custom\"] as const,\n }],\n }],\n catalogs: [{ // ensure migration works\n \"some-product-line-id\": [{\n displayName: [\"Some Product Line\", \"Some Other Product Line\"],\n }],\n }],\n groups: [{ // ensure migration works\n \"some-product-line-id\": [{\n displayName: [\"Some Product Line\", \"Some Other Product Line\"],\n }],\n }],\n items: [{\n \"some-item-id\": [{\n customerType: [\"user\", \"team\", \"custom\"] as const,\n displayName: [\"Some Item\", \"Some Other Item\"],\n }],\n }],\n products: [{\n \"some-product-id\": [{\n displayName: [\"Some Product\", \"Some Other Product\"],\n customerType: [\"user\", \"team\", \"custom\"] as const,\n freeTrial: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n serverOnly: [true, false],\n stackable: [true, false],\n productLineId: [\"some-product-line-id\", \"some-other-product-line-id\"],\n catalogId: [\"some-product-line-id\", \"some-other-product-line-id\"], // ensure migration works\n groupId: [\"some-product-line-id\", \"some-other-product-line-id\"], // ensure migration works\n isAddOnTo: [false, { \"some-product-id\": [true], \"some-other-product-id\": [true] }] as const,\n prices: [{\n \"some-price-id\": [{\n ...typedFromEntries(SUPPORTED_CURRENCIES.map(currency => [currency.code, [\"100_00\", \"not a number\", \"Infinity\", \"0\"]])),\n interval: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n serverOnly: [true, false],\n freeTrial: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n }],\n }],\n includedItems: [{\n \"some-item-id\": [{\n quantity: [0, 1, -3, 100, 0.333, Infinity],\n repeat: [\"never\", [[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n expires: [\"never\", \"when-purchase-expires\", \"when-repeated\"] as const,\n }],\n }],\n }],\n }],\n }],\n emails: [{\n themes: [{\n \"12345678-1234-4234-9234-123456789012\": [{\n displayName: [\"Some Theme\", \"Some Other Theme\"],\n tsxSource: [\"\", \"some typescript source code\"],\n }],\n }],\n selectedThemeId: [\"some-theme-id\", \"some-other-theme-id\"],\n templates: [{\n \"12345678-1234-4234-9234-123456789012\": [{\n themeId: [\"some-theme-id\", \"some-other-theme-id\"],\n displayName: [\"Some Template\", \"Some Other Template\"],\n tsxSource: [\"\", \"some typescript source code\"],\n }],\n }],\n }],\n teams: [{\n createPersonalTeamOnSignUp: [true, false],\n allowClientTeamCreation: [true, false],\n }],\n users: [{\n allowClientUserDeletion: [true, false],\n }],\n rbac: [{\n permissions: [{\n \"some_permission_id\": [{\n containedPermissionIds: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n description: [\"Some Permission\", \"Some Other Permission\"],\n scope: [\"team\", \"project\"] as const,\n }],\n }],\n defaultPermissions: [{\n teamCreator: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n teamMember: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n signUp: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n }],\n }],\n domains: [{}],\n apps: [{\n installed: [typedFromEntries(typedEntries(ALL_APPS).map(([key, value]) => [key, [{\n enabled: [true, false],\n }]]))],\n }],\n onboarding: [{\n requireEmailVerification: [true, false],\n }],\n}] satisfies FuzzerConfig<BranchConfigNormalizedOverride>;\n\nconst environmentSchemaFuzzerConfig = [{\n ...branchSchemaFuzzerConfig[0],\n auth: [{\n ...branchSchemaFuzzerConfig[0].auth[0],\n oauth: [{\n ...branchSchemaFuzzerConfig[0].auth[0].oauth[0],\n providers: [typedFromEntries(typedEntries(branchSchemaFuzzerConfig[0].auth[0].oauth[0].providers[0]).map(([key, value]) => [key, [{\n ...value[0],\n isShared: [true, false],\n clientId: [\"some-client-id\"],\n clientSecret: [\"some-client-secret\"],\n // Kept undefined: the schema forbids customCallbackUrl when isShared is\n // true, and the fuzzer randomizes each field independently so it cannot\n // honor that coupling. The accept path is covered by an e2e test.\n customCallbackUrl: [undefined] as (string | undefined)[],\n facebookConfigId: [\"some-facebook-config-id\"],\n microsoftTenantId: [\"some-microsoft-tenant-id\"],\n appleBundles: [{ \"some-bundle-id\": [{ bundleId: [\"com.example.app\"] }] }],\n issuerUrl: [undefined, \"https://accounts.google.com\"] as (string | undefined)[],\n scope: [undefined, \"openid email profile\"] as (string | undefined)[],\n displayName: [undefined, \"My OIDC Provider\"] as (string | undefined)[],\n }]]))] as const,\n }],\n }],\n domains: [{\n allowLocalhost: [true, false],\n trustedDomains: [{\n \"some-domain-id\": [{\n baseUrl: [\"https://example.com/something-here\"],\n handlerPath: [\"/something-here\"],\n }],\n }],\n }],\n emails: [{\n ...branchSchemaFuzzerConfig[0].emails[0],\n server: [{\n isShared: [true, false],\n provider: [\"resend\", \"smtp\", \"managed\"] as const,\n host: [\"example.com\", \"://super weird host that's not valid\"],\n port: [1234, 0.12543, -100, Infinity],\n username: [\"some-username\", \"some username with a space\"],\n password: [\"some-password\", \"some password with a space\"],\n senderName: [\"Some Sender\"],\n senderEmail: [\"some-sender@example.com\", \"some invalid email\"],\n managedSubdomain: [\"mail.example.com\", \"invalid subdomain\"],\n managedSenderLocalPart: [\"noreply\", \"some invalid local part\"],\n }],\n }],\n payments: [{\n ...branchSchemaFuzzerConfig[0].payments[0],\n testMode: [false, true],\n }],\n analytics: [{\n queryFolders: [{\n \"some-folder-id\": [{\n displayName: [\"Some Folder\", \"Some Other Folder\"],\n sortOrder: [0, 1, 10, -5],\n queries: [{\n \"some-query-id\": [{\n displayName: [\"Some Query\", \"Some Other Query\"],\n sqlQuery: [\"\", \"SELECT * FROM events\", \"SELECT * FROM users\"],\n description: [\"\", \"A query description\", \"Another description\"],\n }],\n }],\n }],\n }],\n }],\n customDashboards: [{\n \"12345678-1234-4234-9234-123456789012\": [{\n displayName: [\"My Dashboard\", \"User Growth Dashboard\"],\n tsxSource: [\"\", \"function Dashboard() { return <div>Hello</div>; }\"],\n }],\n }],\n}] satisfies FuzzerConfig<EnvironmentConfigNormalizedOverride>;\n\nconst organizationSchemaFuzzerConfig = environmentSchemaFuzzerConfig satisfies FuzzerConfig<OrganizationConfigNormalizedOverride>;\n\nfunction setDeep<T>(obj: T, path: string[], value: any) {\n if (!isObjectLike(obj)) return obj;\n\n if (path.length === 0) {\n throw new Error(\"Path is empty\");\n } else if (path.length === 1) {\n set(obj as any, path[0], value);\n } else {\n const [key, ...rest] = path;\n setDeep(getOrUndefined(obj as any, key), rest, value);\n }\n}\n\nfunction createFuzzerInput<T>(config: FuzzerConfig<T>, progress: number): T {\n progress = Math.min(1, 2 * progress);\n const createShouldRandom = (strength: number) => {\n const chance = Math.random() * strength * 1.2 - 0.1;\n return () => Math.random() < chance;\n };\n const createShouldObjectDependent = (strength: number) => {\n const objectChance = Math.random() * strength * 1.2 - 0.1;\n const primitiveChance = Math.random() * strength * 1.2 - 0.1;\n return (v: any) => Math.random() * Math.random() < (isObjectLike(v) ? objectChance : primitiveChance);\n };\n\n const shouldKeep = createShouldObjectDependent(progress * 1);\n const shouldMakeNested = createShouldObjectDependent(1.25);\n const shouldNull = createShouldRandom(0.25);\n\n let res: any;\n const recurse = <U>(outputPath: string[], config: FuzzerConfig<U>, forceNested: boolean, forceNonNull: boolean) => {\n let subConfig: any = config[Math.floor(Math.random() * config.length)];\n const originalValue = isObjectLike(subConfig) ? (Array.isArray(subConfig) ? [] : {}) : subConfig;\n\n const newValue = forceNonNull || !shouldNull() ? originalValue : null;\n const newOutputPath = forceNested || shouldMakeNested(originalValue) || outputPath.length === 0 ? outputPath : [outputPath.join(\".\")];\n if (outputPath.length === 0) {\n res = newValue;\n } else {\n if (forceNested || shouldKeep(originalValue)) {\n setDeep(res, newOutputPath, newValue);\n }\n }\n if (isObjectLike(subConfig)) {\n for (const [key, newValue] of typedEntries(subConfig)) {\n recurse([...newOutputPath, key], newValue, Array.isArray(subConfig), Array.isArray(subConfig));\n }\n }\n };\n recurse<T>([], config, false, true);\n return res;\n}\n\nimport.meta.vitest?.test(\"fuzz schemas\", async ({ expect }) => {\n const totalIterations = process.env.CI ? 1000 : 200;\n for (let i = 0; i < totalIterations; i++) {\n const projectInput = createFuzzerInput<ProjectConfigNormalizedOverride>(projectSchemaFuzzerConfig, i / totalIterations);\n const branchInput = createFuzzerInput<BranchConfigNormalizedOverride>(branchSchemaFuzzerConfig, i / totalIterations);\n const environmentInput = createFuzzerInput<EnvironmentConfigNormalizedOverride>(environmentSchemaFuzzerConfig, i / totalIterations);\n const organizationInput = createFuzzerInput<OrganizationConfigNormalizedOverride>(organizationSchemaFuzzerConfig, i / totalIterations);\n\n try {\n const projectMigrated = migrateConfigOverride(\"project\", projectInput);\n await assertNoConfigOverrideErrors(projectConfigSchema, projectMigrated);\n const projectOverridden = override({}, projectMigrated);\n await sanitizeProjectConfig(normalize(applyProjectDefaults(projectOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n const branchMigrated = migrateConfigOverride(\"branch\", branchInput);\n await assertNoConfigOverrideErrors(branchConfigSchema, branchMigrated);\n const branchOverridden = override(projectOverridden, branchMigrated);\n await sanitizeBranchConfig(normalize(applyBranchDefaults(branchOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n const environmentMigrated = migrateConfigOverride(\"environment\", environmentInput);\n await assertNoConfigOverrideErrors(environmentConfigSchema, environmentMigrated);\n const environmentOverridden = override(branchOverridden, environmentMigrated);\n await sanitizeEnvironmentConfig(normalize(applyEnvironmentDefaults(environmentOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n const organizationMigrated = migrateConfigOverride(\"organization\", organizationInput);\n await assertNoConfigOverrideErrors(organizationConfigSchema, organizationMigrated);\n const organizationOverridden = override(environmentOverridden, organizationMigrated);\n await sanitizeOrganizationConfig(normalize(applyOrganizationDefaults(organizationOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n } catch (e) {\n const data = {\n cause: e,\n inputs: {\n projectInput,\n branchInput,\n environmentInput,\n organizationInput,\n },\n } as const;\n console.error(\"Failed to fuzz schema in iteration ${i}/${totalIterations}!\", nicify(data));\n throw new HexclaveAssertionError(`Error in iteration ${i}/${totalIterations} of schema fuzz: ${e}`, { cause: e });\n }\n }\n});\n\nimport.meta.vitest?.test(\"rejects include-by-default product prices in config overrides\", async ({ expect }) => {\n await expect(assertNoConfigOverrideErrors(branchConfigSchema, {\n \"payments.products.free.prices\": \"include-by-default\",\n })).rejects.toThrow(/payments\\.products\\.free\\.prices must not be one of the following values: include-by-default/);\n});\n"],"mappings":"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"}
|