@actuate-media/cms-core 0.83.0 → 0.84.0
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/CHANGELOG.md +12 -0
- package/dist/content/structured-data.d.ts +1 -0
- package/dist/content/structured-data.d.ts.map +1 -1
- package/dist/content/structured-data.js +1 -1
- package/dist/content/structured-data.js.map +1 -1
- package/dist/next-site.d.ts +28 -0
- package/dist/next-site.d.ts.map +1 -0
- package/dist/next-site.js +58 -0
- package/dist/next-site.js.map +1 -0
- package/dist/sections/index.d.ts +2 -0
- package/dist/sections/index.d.ts.map +1 -1
- package/dist/sections/index.js +1 -0
- package/dist/sections/index.js.map +1 -1
- package/dist/sections/registry.d.ts.map +1 -1
- package/dist/sections/registry.js +86 -0
- package/dist/sections/registry.js.map +1 -1
- package/dist/sections/types.d.ts +1 -1
- package/dist/sections/types.d.ts.map +1 -1
- package/dist/sections/validate.d.ts.map +1 -1
- package/dist/sections/validate.js +23 -0
- package/dist/sections/validate.js.map +1 -1
- package/dist/sections/widget-embed.d.ts +45 -0
- package/dist/sections/widget-embed.d.ts.map +1 -0
- package/dist/sections/widget-embed.js +129 -0
- package/dist/sections/widget-embed.js.map +1 -0
- package/dist/seo/page-meta.d.ts.map +1 -1
- package/dist/seo/page-meta.js +11 -0
- package/dist/seo/page-meta.js.map +1 -1
- package/package.json +21 -1
- package/dist/__tests__/actions/document-crud.test.d.ts +0 -2
- package/dist/__tests__/actions/document-crud.test.d.ts.map +0 -1
- package/dist/__tests__/actions/document-crud.test.js +0 -442
- package/dist/__tests__/actions/document-crud.test.js.map +0 -1
- package/dist/__tests__/actions/seo-fields-update.test.d.ts +0 -2
- package/dist/__tests__/actions/seo-fields-update.test.d.ts.map +0 -1
- package/dist/__tests__/actions/seo-fields-update.test.js +0 -93
- package/dist/__tests__/actions/seo-fields-update.test.js.map +0 -1
- package/dist/__tests__/ai/ai.test.d.ts +0 -2
- package/dist/__tests__/ai/ai.test.d.ts.map +0 -1
- package/dist/__tests__/ai/ai.test.js +0 -266
- package/dist/__tests__/ai/ai.test.js.map +0 -1
- package/dist/__tests__/ai/brand-voice-alignment.test.d.ts +0 -2
- package/dist/__tests__/ai/brand-voice-alignment.test.d.ts.map +0 -1
- package/dist/__tests__/ai/brand-voice-alignment.test.js +0 -38
- package/dist/__tests__/ai/brand-voice-alignment.test.js.map +0 -1
- package/dist/__tests__/ai/brand-voice-analyze.test.d.ts +0 -2
- package/dist/__tests__/ai/brand-voice-analyze.test.d.ts.map +0 -1
- package/dist/__tests__/ai/brand-voice-analyze.test.js +0 -117
- package/dist/__tests__/ai/brand-voice-analyze.test.js.map +0 -1
- package/dist/__tests__/ai/brand-voice-document.test.d.ts +0 -2
- package/dist/__tests__/ai/brand-voice-document.test.d.ts.map +0 -1
- package/dist/__tests__/ai/brand-voice-document.test.js +0 -74
- package/dist/__tests__/ai/brand-voice-document.test.js.map +0 -1
- package/dist/__tests__/ai/brand-voice-fix.test.d.ts +0 -2
- package/dist/__tests__/ai/brand-voice-fix.test.d.ts.map +0 -1
- package/dist/__tests__/ai/brand-voice-fix.test.js +0 -34
- package/dist/__tests__/ai/brand-voice-fix.test.js.map +0 -1
- package/dist/__tests__/ai/brand-voice-sources.test.d.ts +0 -2
- package/dist/__tests__/ai/brand-voice-sources.test.d.ts.map +0 -1
- package/dist/__tests__/ai/brand-voice-sources.test.js +0 -14
- package/dist/__tests__/ai/brand-voice-sources.test.js.map +0 -1
- package/dist/__tests__/ai/brand-voice-structured.test.d.ts +0 -2
- package/dist/__tests__/ai/brand-voice-structured.test.d.ts.map +0 -1
- package/dist/__tests__/ai/brand-voice-structured.test.js +0 -49
- package/dist/__tests__/ai/brand-voice-structured.test.js.map +0 -1
- package/dist/__tests__/ai/brand-voice.test.d.ts +0 -2
- package/dist/__tests__/ai/brand-voice.test.d.ts.map +0 -1
- package/dist/__tests__/ai/brand-voice.test.js +0 -82
- package/dist/__tests__/ai/brand-voice.test.js.map +0 -1
- package/dist/__tests__/ai/content-writing-generate.test.d.ts +0 -2
- package/dist/__tests__/ai/content-writing-generate.test.d.ts.map +0 -1
- package/dist/__tests__/ai/content-writing-generate.test.js +0 -38
- package/dist/__tests__/ai/content-writing-generate.test.js.map +0 -1
- package/dist/__tests__/ai/resolve.test.d.ts +0 -2
- package/dist/__tests__/ai/resolve.test.d.ts.map +0 -1
- package/dist/__tests__/ai/resolve.test.js +0 -164
- package/dist/__tests__/ai/resolve.test.js.map +0 -1
- package/dist/__tests__/ai/runtime.test.d.ts +0 -2
- package/dist/__tests__/ai/runtime.test.d.ts.map +0 -1
- package/dist/__tests__/ai/runtime.test.js +0 -392
- package/dist/__tests__/ai/runtime.test.js.map +0 -1
- package/dist/__tests__/ai/sampling.test.d.ts +0 -2
- package/dist/__tests__/ai/sampling.test.d.ts.map +0 -1
- package/dist/__tests__/ai/sampling.test.js +0 -25
- package/dist/__tests__/ai/sampling.test.js.map +0 -1
- package/dist/__tests__/api/admin-contracts.test.d.ts +0 -2
- package/dist/__tests__/api/admin-contracts.test.d.ts.map +0 -1
- package/dist/__tests__/api/admin-contracts.test.js +0 -186
- package/dist/__tests__/api/admin-contracts.test.js.map +0 -1
- package/dist/__tests__/api/ai-crawlers.test.d.ts +0 -2
- package/dist/__tests__/api/ai-crawlers.test.d.ts.map +0 -1
- package/dist/__tests__/api/ai-crawlers.test.js +0 -194
- package/dist/__tests__/api/ai-crawlers.test.js.map +0 -1
- package/dist/__tests__/api/ai-quality.test.d.ts +0 -2
- package/dist/__tests__/api/ai-quality.test.d.ts.map +0 -1
- package/dist/__tests__/api/ai-quality.test.js +0 -721
- package/dist/__tests__/api/ai-quality.test.js.map +0 -1
- package/dist/__tests__/api/ai-status.test.d.ts +0 -2
- package/dist/__tests__/api/ai-status.test.d.ts.map +0 -1
- package/dist/__tests__/api/ai-status.test.js +0 -110
- package/dist/__tests__/api/ai-status.test.js.map +0 -1
- package/dist/__tests__/api/api-key-auth.test.d.ts +0 -2
- package/dist/__tests__/api/api-key-auth.test.d.ts.map +0 -1
- package/dist/__tests__/api/api-key-auth.test.js +0 -254
- package/dist/__tests__/api/api-key-auth.test.js.map +0 -1
- package/dist/__tests__/api/appearance-routes.test.d.ts +0 -2
- package/dist/__tests__/api/appearance-routes.test.d.ts.map +0 -1
- package/dist/__tests__/api/appearance-routes.test.js +0 -134
- package/dist/__tests__/api/appearance-routes.test.js.map +0 -1
- package/dist/__tests__/api/cache-headers.test.d.ts +0 -2
- package/dist/__tests__/api/cache-headers.test.d.ts.map +0 -1
- package/dist/__tests__/api/cache-headers.test.js +0 -135
- package/dist/__tests__/api/cache-headers.test.js.map +0 -1
- package/dist/__tests__/api/collection-introspection.test.d.ts +0 -2
- package/dist/__tests__/api/collection-introspection.test.d.ts.map +0 -1
- package/dist/__tests__/api/collection-introspection.test.js +0 -129
- package/dist/__tests__/api/collection-introspection.test.js.map +0 -1
- package/dist/__tests__/api/collection-read-access.test.d.ts +0 -2
- package/dist/__tests__/api/collection-read-access.test.d.ts.map +0 -1
- package/dist/__tests__/api/collection-read-access.test.js +0 -140
- package/dist/__tests__/api/collection-read-access.test.js.map +0 -1
- package/dist/__tests__/api/collections-ai-create.test.d.ts +0 -2
- package/dist/__tests__/api/collections-ai-create.test.d.ts.map +0 -1
- package/dist/__tests__/api/collections-ai-create.test.js +0 -313
- package/dist/__tests__/api/collections-ai-create.test.js.map +0 -1
- package/dist/__tests__/api/collections-discovery.test.d.ts +0 -2
- package/dist/__tests__/api/collections-discovery.test.d.ts.map +0 -1
- package/dist/__tests__/api/collections-discovery.test.js +0 -348
- package/dist/__tests__/api/collections-discovery.test.js.map +0 -1
- package/dist/__tests__/api/comments-routes.test.d.ts +0 -2
- package/dist/__tests__/api/comments-routes.test.d.ts.map +0 -1
- package/dist/__tests__/api/comments-routes.test.js +0 -266
- package/dist/__tests__/api/comments-routes.test.js.map +0 -1
- package/dist/__tests__/api/cron-routes.test.d.ts +0 -2
- package/dist/__tests__/api/cron-routes.test.d.ts.map +0 -1
- package/dist/__tests__/api/cron-routes.test.js +0 -67
- package/dist/__tests__/api/cron-routes.test.js.map +0 -1
- package/dist/__tests__/api/data-filters-routes.test.d.ts +0 -2
- package/dist/__tests__/api/data-filters-routes.test.d.ts.map +0 -1
- package/dist/__tests__/api/data-filters-routes.test.js +0 -131
- package/dist/__tests__/api/data-filters-routes.test.js.map +0 -1
- package/dist/__tests__/api/email-settings-routes.test.d.ts +0 -2
- package/dist/__tests__/api/email-settings-routes.test.d.ts.map +0 -1
- package/dist/__tests__/api/email-settings-routes.test.js +0 -240
- package/dist/__tests__/api/email-settings-routes.test.js.map +0 -1
- package/dist/__tests__/api/field-values-routes.test.d.ts +0 -2
- package/dist/__tests__/api/field-values-routes.test.d.ts.map +0 -1
- package/dist/__tests__/api/field-values-routes.test.js +0 -147
- package/dist/__tests__/api/field-values-routes.test.js.map +0 -1
- package/dist/__tests__/api/form-webhooks.test.d.ts +0 -2
- package/dist/__tests__/api/form-webhooks.test.d.ts.map +0 -1
- package/dist/__tests__/api/form-webhooks.test.js +0 -162
- package/dist/__tests__/api/form-webhooks.test.js.map +0 -1
- package/dist/__tests__/api/globals-routes.test.d.ts +0 -2
- package/dist/__tests__/api/globals-routes.test.d.ts.map +0 -1
- package/dist/__tests__/api/globals-routes.test.js +0 -100
- package/dist/__tests__/api/globals-routes.test.js.map +0 -1
- package/dist/__tests__/api/health.test.d.ts +0 -2
- package/dist/__tests__/api/health.test.d.ts.map +0 -1
- package/dist/__tests__/api/health.test.js +0 -144
- package/dist/__tests__/api/health.test.js.map +0 -1
- package/dist/__tests__/api/llms-txt.test.d.ts +0 -2
- package/dist/__tests__/api/llms-txt.test.d.ts.map +0 -1
- package/dist/__tests__/api/llms-txt.test.js +0 -423
- package/dist/__tests__/api/llms-txt.test.js.map +0 -1
- package/dist/__tests__/api/md-route.test.d.ts +0 -2
- package/dist/__tests__/api/md-route.test.d.ts.map +0 -1
- package/dist/__tests__/api/md-route.test.js +0 -106
- package/dist/__tests__/api/md-route.test.js.map +0 -1
- package/dist/__tests__/api/media-upload-storage.test.d.ts +0 -2
- package/dist/__tests__/api/media-upload-storage.test.d.ts.map +0 -1
- package/dist/__tests__/api/media-upload-storage.test.js +0 -171
- package/dist/__tests__/api/media-upload-storage.test.js.map +0 -1
- package/dist/__tests__/api/notifications-routes.test.d.ts +0 -2
- package/dist/__tests__/api/notifications-routes.test.d.ts.map +0 -1
- package/dist/__tests__/api/notifications-routes.test.js +0 -270
- package/dist/__tests__/api/notifications-routes.test.js.map +0 -1
- package/dist/__tests__/api/page-sections-routes.test.d.ts +0 -2
- package/dist/__tests__/api/page-sections-routes.test.d.ts.map +0 -1
- package/dist/__tests__/api/page-sections-routes.test.js +0 -501
- package/dist/__tests__/api/page-sections-routes.test.js.map +0 -1
- package/dist/__tests__/api/preview-and-scheduling.test.d.ts +0 -2
- package/dist/__tests__/api/preview-and-scheduling.test.d.ts.map +0 -1
- package/dist/__tests__/api/preview-and-scheduling.test.js +0 -479
- package/dist/__tests__/api/preview-and-scheduling.test.js.map +0 -1
- package/dist/__tests__/api/public-forms.test.d.ts +0 -2
- package/dist/__tests__/api/public-forms.test.d.ts.map +0 -1
- package/dist/__tests__/api/public-forms.test.js +0 -125
- package/dist/__tests__/api/public-forms.test.js.map +0 -1
- package/dist/__tests__/api/public-globals.test.d.ts +0 -2
- package/dist/__tests__/api/public-globals.test.d.ts.map +0 -1
- package/dist/__tests__/api/public-globals.test.js +0 -96
- package/dist/__tests__/api/public-globals.test.js.map +0 -1
- package/dist/__tests__/api/public-navigations.test.d.ts +0 -2
- package/dist/__tests__/api/public-navigations.test.d.ts.map +0 -1
- package/dist/__tests__/api/public-navigations.test.js +0 -77
- package/dist/__tests__/api/public-navigations.test.js.map +0 -1
- package/dist/__tests__/api/public-seo.test.d.ts +0 -2
- package/dist/__tests__/api/public-seo.test.d.ts.map +0 -1
- package/dist/__tests__/api/public-seo.test.js +0 -834
- package/dist/__tests__/api/public-seo.test.js.map +0 -1
- package/dist/__tests__/api/resolve-layout-bridge.test.d.ts +0 -2
- package/dist/__tests__/api/resolve-layout-bridge.test.d.ts.map +0 -1
- package/dist/__tests__/api/resolve-layout-bridge.test.js +0 -165
- package/dist/__tests__/api/resolve-layout-bridge.test.js.map +0 -1
- package/dist/__tests__/api/route-contracts.test.d.ts +0 -2
- package/dist/__tests__/api/route-contracts.test.d.ts.map +0 -1
- package/dist/__tests__/api/route-contracts.test.js +0 -466
- package/dist/__tests__/api/route-contracts.test.js.map +0 -1
- package/dist/__tests__/api/security-routes.test.d.ts +0 -2
- package/dist/__tests__/api/security-routes.test.d.ts.map +0 -1
- package/dist/__tests__/api/security-routes.test.js +0 -212
- package/dist/__tests__/api/security-routes.test.js.map +0 -1
- package/dist/__tests__/api/seo-read-access.test.d.ts +0 -2
- package/dist/__tests__/api/seo-read-access.test.d.ts.map +0 -1
- package/dist/__tests__/api/seo-read-access.test.js +0 -101
- package/dist/__tests__/api/seo-read-access.test.js.map +0 -1
- package/dist/__tests__/api/seo-summary-ssrf.test.d.ts +0 -2
- package/dist/__tests__/api/seo-summary-ssrf.test.d.ts.map +0 -1
- package/dist/__tests__/api/seo-summary-ssrf.test.js +0 -80
- package/dist/__tests__/api/seo-summary-ssrf.test.js.map +0 -1
- package/dist/__tests__/api/sitemap-pagination.test.d.ts +0 -2
- package/dist/__tests__/api/sitemap-pagination.test.d.ts.map +0 -1
- package/dist/__tests__/api/sitemap-pagination.test.js +0 -100
- package/dist/__tests__/api/sitemap-pagination.test.js.map +0 -1
- package/dist/__tests__/api/stats-collection-filter.test.d.ts +0 -2
- package/dist/__tests__/api/stats-collection-filter.test.d.ts.map +0 -1
- package/dist/__tests__/api/stats-collection-filter.test.js +0 -190
- package/dist/__tests__/api/stats-collection-filter.test.js.map +0 -1
- package/dist/__tests__/api/stats-routes.test.d.ts +0 -2
- package/dist/__tests__/api/stats-routes.test.d.ts.map +0 -1
- package/dist/__tests__/api/stats-routes.test.js +0 -251
- package/dist/__tests__/api/stats-routes.test.js.map +0 -1
- package/dist/__tests__/api/stats-seo-cache.test.d.ts +0 -2
- package/dist/__tests__/api/stats-seo-cache.test.d.ts.map +0 -1
- package/dist/__tests__/api/stats-seo-cache.test.js +0 -96
- package/dist/__tests__/api/stats-seo-cache.test.js.map +0 -1
- package/dist/__tests__/api/totp-login.test.d.ts +0 -2
- package/dist/__tests__/api/totp-login.test.d.ts.map +0 -1
- package/dist/__tests__/api/totp-login.test.js +0 -115
- package/dist/__tests__/api/totp-login.test.js.map +0 -1
- package/dist/__tests__/api/updates-routes.test.d.ts +0 -2
- package/dist/__tests__/api/updates-routes.test.d.ts.map +0 -1
- package/dist/__tests__/api/updates-routes.test.js +0 -248
- package/dist/__tests__/api/updates-routes.test.js.map +0 -1
- package/dist/__tests__/api/users-detail.test.d.ts +0 -2
- package/dist/__tests__/api/users-detail.test.d.ts.map +0 -1
- package/dist/__tests__/api/users-detail.test.js +0 -401
- package/dist/__tests__/api/users-detail.test.js.map +0 -1
- package/dist/__tests__/api/users-invite.test.d.ts +0 -2
- package/dist/__tests__/api/users-invite.test.d.ts.map +0 -1
- package/dist/__tests__/api/users-invite.test.js +0 -221
- package/dist/__tests__/api/users-invite.test.js.map +0 -1
- package/dist/__tests__/api/users-search.test.d.ts +0 -2
- package/dist/__tests__/api/users-search.test.d.ts.map +0 -1
- package/dist/__tests__/api/users-search.test.js +0 -182
- package/dist/__tests__/api/users-search.test.js.map +0 -1
- package/dist/__tests__/appearance/appearance.test.d.ts +0 -2
- package/dist/__tests__/appearance/appearance.test.d.ts.map +0 -1
- package/dist/__tests__/appearance/appearance.test.js +0 -287
- package/dist/__tests__/appearance/appearance.test.js.map +0 -1
- package/dist/__tests__/appearance/favicon-icon.test.d.ts +0 -2
- package/dist/__tests__/appearance/favicon-icon.test.d.ts.map +0 -1
- package/dist/__tests__/appearance/favicon-icon.test.js +0 -12
- package/dist/__tests__/appearance/favicon-icon.test.js.map +0 -1
- package/dist/__tests__/auth/invites.test.d.ts +0 -2
- package/dist/__tests__/auth/invites.test.d.ts.map +0 -1
- package/dist/__tests__/auth/invites.test.js +0 -181
- package/dist/__tests__/auth/invites.test.js.map +0 -1
- package/dist/__tests__/auth/oauth.test.d.ts +0 -2
- package/dist/__tests__/auth/oauth.test.d.ts.map +0 -1
- package/dist/__tests__/auth/oauth.test.js +0 -408
- package/dist/__tests__/auth/oauth.test.js.map +0 -1
- package/dist/__tests__/auth/password.test.d.ts +0 -2
- package/dist/__tests__/auth/password.test.d.ts.map +0 -1
- package/dist/__tests__/auth/password.test.js +0 -226
- package/dist/__tests__/auth/password.test.js.map +0 -1
- package/dist/__tests__/auth/reset.test.d.ts +0 -2
- package/dist/__tests__/auth/reset.test.d.ts.map +0 -1
- package/dist/__tests__/auth/reset.test.js +0 -355
- package/dist/__tests__/auth/reset.test.js.map +0 -1
- package/dist/__tests__/auth/roles.test.d.ts +0 -2
- package/dist/__tests__/auth/roles.test.d.ts.map +0 -1
- package/dist/__tests__/auth/roles.test.js +0 -60
- package/dist/__tests__/auth/roles.test.js.map +0 -1
- package/dist/__tests__/auth/session.test.d.ts +0 -2
- package/dist/__tests__/auth/session.test.d.ts.map +0 -1
- package/dist/__tests__/auth/session.test.js +0 -119
- package/dist/__tests__/auth/session.test.js.map +0 -1
- package/dist/__tests__/auth/team.test.d.ts +0 -2
- package/dist/__tests__/auth/team.test.d.ts.map +0 -1
- package/dist/__tests__/auth/team.test.js +0 -154
- package/dist/__tests__/auth/team.test.js.map +0 -1
- package/dist/__tests__/auth/totp.test.d.ts +0 -2
- package/dist/__tests__/auth/totp.test.d.ts.map +0 -1
- package/dist/__tests__/auth/totp.test.js +0 -52
- package/dist/__tests__/auth/totp.test.js.map +0 -1
- package/dist/__tests__/auth/user-admin.test.d.ts +0 -2
- package/dist/__tests__/auth/user-admin.test.d.ts.map +0 -1
- package/dist/__tests__/auth/user-admin.test.js +0 -200
- package/dist/__tests__/auth/user-admin.test.js.map +0 -1
- package/dist/__tests__/billing/stripe-meter.test.d.ts +0 -2
- package/dist/__tests__/billing/stripe-meter.test.d.ts.map +0 -1
- package/dist/__tests__/billing/stripe-meter.test.js +0 -86
- package/dist/__tests__/billing/stripe-meter.test.js.map +0 -1
- package/dist/__tests__/codegen/generate-types.test.d.ts +0 -2
- package/dist/__tests__/codegen/generate-types.test.d.ts.map +0 -1
- package/dist/__tests__/codegen/generate-types.test.js +0 -173
- package/dist/__tests__/codegen/generate-types.test.js.map +0 -1
- package/dist/__tests__/collections/presets.test.d.ts +0 -2
- package/dist/__tests__/collections/presets.test.d.ts.map +0 -1
- package/dist/__tests__/collections/presets.test.js +0 -184
- package/dist/__tests__/collections/presets.test.js.map +0 -1
- package/dist/__tests__/config/runtime.test.d.ts +0 -2
- package/dist/__tests__/config/runtime.test.d.ts.map +0 -1
- package/dist/__tests__/config/runtime.test.js +0 -65
- package/dist/__tests__/config/runtime.test.js.map +0 -1
- package/dist/__tests__/content/slug.test.d.ts +0 -2
- package/dist/__tests__/content/slug.test.d.ts.map +0 -1
- package/dist/__tests__/content/slug.test.js +0 -68
- package/dist/__tests__/content/slug.test.js.map +0 -1
- package/dist/__tests__/content-health/scanner.test.d.ts +0 -2
- package/dist/__tests__/content-health/scanner.test.d.ts.map +0 -1
- package/dist/__tests__/content-health/scanner.test.js +0 -151
- package/dist/__tests__/content-health/scanner.test.js.map +0 -1
- package/dist/__tests__/cron/cron.test.d.ts +0 -2
- package/dist/__tests__/cron/cron.test.d.ts.map +0 -1
- package/dist/__tests__/cron/cron.test.js +0 -340
- package/dist/__tests__/cron/cron.test.js.map +0 -1
- package/dist/__tests__/db/model-types-freshness.test.d.ts +0 -2
- package/dist/__tests__/db/model-types-freshness.test.d.ts.map +0 -1
- package/dist/__tests__/db/model-types-freshness.test.js +0 -46
- package/dist/__tests__/db/model-types-freshness.test.js.map +0 -1
- package/dist/__tests__/diagnostics/api-metrics.test.d.ts +0 -2
- package/dist/__tests__/diagnostics/api-metrics.test.d.ts.map +0 -1
- package/dist/__tests__/diagnostics/api-metrics.test.js +0 -153
- package/dist/__tests__/diagnostics/api-metrics.test.js.map +0 -1
- package/dist/__tests__/diagnostics/env.test.d.ts +0 -2
- package/dist/__tests__/diagnostics/env.test.d.ts.map +0 -1
- package/dist/__tests__/diagnostics/env.test.js +0 -247
- package/dist/__tests__/diagnostics/env.test.js.map +0 -1
- package/dist/__tests__/diagnostics/logger.test.d.ts +0 -2
- package/dist/__tests__/diagnostics/logger.test.d.ts.map +0 -1
- package/dist/__tests__/diagnostics/logger.test.js +0 -111
- package/dist/__tests__/diagnostics/logger.test.js.map +0 -1
- package/dist/__tests__/diagnostics/sentry.test.d.ts +0 -2
- package/dist/__tests__/diagnostics/sentry.test.d.ts.map +0 -1
- package/dist/__tests__/diagnostics/sentry.test.js +0 -60
- package/dist/__tests__/diagnostics/sentry.test.js.map +0 -1
- package/dist/__tests__/email/resolve.test.d.ts +0 -2
- package/dist/__tests__/email/resolve.test.d.ts.map +0 -1
- package/dist/__tests__/email/resolve.test.js +0 -90
- package/dist/__tests__/email/resolve.test.js.map +0 -1
- package/dist/__tests__/email/sender.test.d.ts +0 -2
- package/dist/__tests__/email/sender.test.d.ts.map +0 -1
- package/dist/__tests__/email/sender.test.js +0 -33
- package/dist/__tests__/email/sender.test.js.map +0 -1
- package/dist/__tests__/email/settings-store.test.d.ts +0 -2
- package/dist/__tests__/email/settings-store.test.d.ts.map +0 -1
- package/dist/__tests__/email/settings-store.test.js +0 -149
- package/dist/__tests__/email/settings-store.test.js.map +0 -1
- package/dist/__tests__/fields/component-block.test.d.ts +0 -2
- package/dist/__tests__/fields/component-block.test.d.ts.map +0 -1
- package/dist/__tests__/fields/component-block.test.js +0 -129
- package/dist/__tests__/fields/component-block.test.js.map +0 -1
- package/dist/__tests__/fields/presets.test.d.ts +0 -2
- package/dist/__tests__/fields/presets.test.d.ts.map +0 -1
- package/dist/__tests__/fields/presets.test.js +0 -99
- package/dist/__tests__/fields/presets.test.js.map +0 -1
- package/dist/__tests__/fields/relations.test.d.ts +0 -2
- package/dist/__tests__/fields/relations.test.d.ts.map +0 -1
- package/dist/__tests__/fields/relations.test.js +0 -297
- package/dist/__tests__/fields/relations.test.js.map +0 -1
- package/dist/__tests__/forms/client-validation.test.d.ts +0 -2
- package/dist/__tests__/forms/client-validation.test.d.ts.map +0 -1
- package/dist/__tests__/forms/client-validation.test.js +0 -98
- package/dist/__tests__/forms/client-validation.test.js.map +0 -1
- package/dist/__tests__/forms/encryption.test.d.ts +0 -2
- package/dist/__tests__/forms/encryption.test.d.ts.map +0 -1
- package/dist/__tests__/forms/encryption.test.js +0 -84
- package/dist/__tests__/forms/encryption.test.js.map +0 -1
- package/dist/__tests__/forms/entries-export.test.d.ts +0 -2
- package/dist/__tests__/forms/entries-export.test.d.ts.map +0 -1
- package/dist/__tests__/forms/entries-export.test.js +0 -69
- package/dist/__tests__/forms/entries-export.test.js.map +0 -1
- package/dist/__tests__/forms/forms-service.test.d.ts +0 -2
- package/dist/__tests__/forms/forms-service.test.d.ts.map +0 -1
- package/dist/__tests__/forms/forms-service.test.js +0 -193
- package/dist/__tests__/forms/forms-service.test.js.map +0 -1
- package/dist/__tests__/forms/notify.test.d.ts +0 -2
- package/dist/__tests__/forms/notify.test.d.ts.map +0 -1
- package/dist/__tests__/forms/notify.test.js +0 -114
- package/dist/__tests__/forms/notify.test.js.map +0 -1
- package/dist/__tests__/forms/spam.test.d.ts +0 -2
- package/dist/__tests__/forms/spam.test.d.ts.map +0 -1
- package/dist/__tests__/forms/spam.test.js +0 -115
- package/dist/__tests__/forms/spam.test.js.map +0 -1
- package/dist/__tests__/forms/submission-files.test.d.ts +0 -2
- package/dist/__tests__/forms/submission-files.test.d.ts.map +0 -1
- package/dist/__tests__/forms/submission-files.test.js +0 -65
- package/dist/__tests__/forms/submission-files.test.js.map +0 -1
- package/dist/__tests__/forms/submission-pipeline.test.d.ts +0 -2
- package/dist/__tests__/forms/submission-pipeline.test.d.ts.map +0 -1
- package/dist/__tests__/forms/submission-pipeline.test.js +0 -131
- package/dist/__tests__/forms/submission-pipeline.test.js.map +0 -1
- package/dist/__tests__/forms/submission-validation.test.d.ts +0 -2
- package/dist/__tests__/forms/submission-validation.test.d.ts.map +0 -1
- package/dist/__tests__/forms/submission-validation.test.js +0 -108
- package/dist/__tests__/forms/submission-validation.test.js.map +0 -1
- package/dist/__tests__/forms/webhooks.test.d.ts +0 -2
- package/dist/__tests__/forms/webhooks.test.d.ts.map +0 -1
- package/dist/__tests__/forms/webhooks.test.js +0 -203
- package/dist/__tests__/forms/webhooks.test.js.map +0 -1
- package/dist/__tests__/media/seo.test.d.ts +0 -2
- package/dist/__tests__/media/seo.test.d.ts.map +0 -1
- package/dist/__tests__/media/seo.test.js +0 -186
- package/dist/__tests__/media/seo.test.js.map +0 -1
- package/dist/__tests__/middleware.test.d.ts +0 -2
- package/dist/__tests__/middleware.test.d.ts.map +0 -1
- package/dist/__tests__/middleware.test.js +0 -127
- package/dist/__tests__/middleware.test.js.map +0 -1
- package/dist/__tests__/next.test.d.ts +0 -2
- package/dist/__tests__/next.test.d.ts.map +0 -1
- package/dist/__tests__/next.test.js +0 -118
- package/dist/__tests__/next.test.js.map +0 -1
- package/dist/__tests__/plan/features.test.d.ts +0 -2
- package/dist/__tests__/plan/features.test.d.ts.map +0 -1
- package/dist/__tests__/plan/features.test.js +0 -35
- package/dist/__tests__/plan/features.test.js.map +0 -1
- package/dist/__tests__/preview-event-bus.test.d.ts +0 -2
- package/dist/__tests__/preview-event-bus.test.d.ts.map +0 -1
- package/dist/__tests__/preview-event-bus.test.js +0 -89
- package/dist/__tests__/preview-event-bus.test.js.map +0 -1
- package/dist/__tests__/preview-sse-stream.test.d.ts +0 -2
- package/dist/__tests__/preview-sse-stream.test.d.ts.map +0 -1
- package/dist/__tests__/preview-sse-stream.test.js +0 -117
- package/dist/__tests__/preview-sse-stream.test.js.map +0 -1
- package/dist/__tests__/preview.test.d.ts +0 -2
- package/dist/__tests__/preview.test.d.ts.map +0 -1
- package/dist/__tests__/preview.test.js +0 -71
- package/dist/__tests__/preview.test.js.map +0 -1
- package/dist/__tests__/realtime/comments.test.d.ts +0 -2
- package/dist/__tests__/realtime/comments.test.d.ts.map +0 -1
- package/dist/__tests__/realtime/comments.test.js +0 -508
- package/dist/__tests__/realtime/comments.test.js.map +0 -1
- package/dist/__tests__/realtime/gateway-ws-integration.test.d.ts +0 -2
- package/dist/__tests__/realtime/gateway-ws-integration.test.d.ts.map +0 -1
- package/dist/__tests__/realtime/gateway-ws-integration.test.js +0 -170
- package/dist/__tests__/realtime/gateway-ws-integration.test.js.map +0 -1
- package/dist/__tests__/realtime/gateway.test.d.ts +0 -2
- package/dist/__tests__/realtime/gateway.test.d.ts.map +0 -1
- package/dist/__tests__/realtime/gateway.test.js +0 -402
- package/dist/__tests__/realtime/gateway.test.js.map +0 -1
- package/dist/__tests__/realtime/notification-bus.test.d.ts +0 -2
- package/dist/__tests__/realtime/notification-bus.test.d.ts.map +0 -1
- package/dist/__tests__/realtime/notification-bus.test.js +0 -79
- package/dist/__tests__/realtime/notification-bus.test.js.map +0 -1
- package/dist/__tests__/realtime/notification-stream.test.d.ts +0 -2
- package/dist/__tests__/realtime/notification-stream.test.d.ts.map +0 -1
- package/dist/__tests__/realtime/notification-stream.test.js +0 -157
- package/dist/__tests__/realtime/notification-stream.test.js.map +0 -1
- package/dist/__tests__/realtime/notifications.test.d.ts +0 -2
- package/dist/__tests__/realtime/notifications.test.d.ts.map +0 -1
- package/dist/__tests__/realtime/notifications.test.js +0 -330
- package/dist/__tests__/realtime/notifications.test.js.map +0 -1
- package/dist/__tests__/realtime/persistence.test.d.ts +0 -2
- package/dist/__tests__/realtime/persistence.test.d.ts.map +0 -1
- package/dist/__tests__/realtime/persistence.test.js +0 -124
- package/dist/__tests__/realtime/persistence.test.js.map +0 -1
- package/dist/__tests__/redirects/auto-301.test.d.ts +0 -2
- package/dist/__tests__/redirects/auto-301.test.d.ts.map +0 -1
- package/dist/__tests__/redirects/auto-301.test.js +0 -172
- package/dist/__tests__/redirects/auto-301.test.js.map +0 -1
- package/dist/__tests__/redirects/graph.test.d.ts +0 -2
- package/dist/__tests__/redirects/graph.test.d.ts.map +0 -1
- package/dist/__tests__/redirects/graph.test.js +0 -104
- package/dist/__tests__/redirects/graph.test.js.map +0 -1
- package/dist/__tests__/redirects/suggest.test.d.ts +0 -2
- package/dist/__tests__/redirects/suggest.test.d.ts.map +0 -1
- package/dist/__tests__/redirects/suggest.test.js +0 -28
- package/dist/__tests__/redirects/suggest.test.js.map +0 -1
- package/dist/__tests__/scheduling/scheduling.test.d.ts +0 -2
- package/dist/__tests__/scheduling/scheduling.test.d.ts.map +0 -1
- package/dist/__tests__/scheduling/scheduling.test.js +0 -110
- package/dist/__tests__/scheduling/scheduling.test.js.map +0 -1
- package/dist/__tests__/schema-preview-features.test.d.ts +0 -2
- package/dist/__tests__/schema-preview-features.test.d.ts.map +0 -1
- package/dist/__tests__/schema-preview-features.test.js +0 -42
- package/dist/__tests__/schema-preview-features.test.js.map +0 -1
- package/dist/__tests__/sections/sections-migrate.test.d.ts +0 -2
- package/dist/__tests__/sections/sections-migrate.test.d.ts.map +0 -1
- package/dist/__tests__/sections/sections-migrate.test.js +0 -145
- package/dist/__tests__/sections/sections-migrate.test.js.map +0 -1
- package/dist/__tests__/security/access.test.d.ts +0 -2
- package/dist/__tests__/security/access.test.d.ts.map +0 -1
- package/dist/__tests__/security/access.test.js +0 -181
- package/dist/__tests__/security/access.test.js.map +0 -1
- package/dist/__tests__/security/api-key-enhanced.test.d.ts +0 -2
- package/dist/__tests__/security/api-key-enhanced.test.d.ts.map +0 -1
- package/dist/__tests__/security/api-key-enhanced.test.js +0 -110
- package/dist/__tests__/security/api-key-enhanced.test.js.map +0 -1
- package/dist/__tests__/security/audit.test.d.ts +0 -2
- package/dist/__tests__/security/audit.test.d.ts.map +0 -1
- package/dist/__tests__/security/audit.test.js +0 -50
- package/dist/__tests__/security/audit.test.js.map +0 -1
- package/dist/__tests__/security/center.test.d.ts +0 -2
- package/dist/__tests__/security/center.test.d.ts.map +0 -1
- package/dist/__tests__/security/center.test.js +0 -226
- package/dist/__tests__/security/center.test.js.map +0 -1
- package/dist/__tests__/security/client-ip.test.d.ts +0 -2
- package/dist/__tests__/security/client-ip.test.d.ts.map +0 -1
- package/dist/__tests__/security/client-ip.test.js +0 -37
- package/dist/__tests__/security/client-ip.test.js.map +0 -1
- package/dist/__tests__/security/csrf.test.d.ts +0 -2
- package/dist/__tests__/security/csrf.test.d.ts.map +0 -1
- package/dist/__tests__/security/csrf.test.js +0 -40
- package/dist/__tests__/security/csrf.test.js.map +0 -1
- package/dist/__tests__/security/encrypted-fields.test.d.ts +0 -2
- package/dist/__tests__/security/encrypted-fields.test.d.ts.map +0 -1
- package/dist/__tests__/security/encrypted-fields.test.js +0 -60
- package/dist/__tests__/security/encrypted-fields.test.js.map +0 -1
- package/dist/__tests__/security/ip-allowlist.test.d.ts +0 -2
- package/dist/__tests__/security/ip-allowlist.test.d.ts.map +0 -1
- package/dist/__tests__/security/ip-allowlist.test.js +0 -40
- package/dist/__tests__/security/ip-allowlist.test.js.map +0 -1
- package/dist/__tests__/security/rate-limit.test.d.ts +0 -2
- package/dist/__tests__/security/rate-limit.test.d.ts.map +0 -1
- package/dist/__tests__/security/rate-limit.test.js +0 -199
- package/dist/__tests__/security/rate-limit.test.js.map +0 -1
- package/dist/__tests__/security/reauth.test.d.ts +0 -2
- package/dist/__tests__/security/reauth.test.d.ts.map +0 -1
- package/dist/__tests__/security/reauth.test.js +0 -30
- package/dist/__tests__/security/reauth.test.js.map +0 -1
- package/dist/__tests__/security/redact.test.d.ts +0 -2
- package/dist/__tests__/security/redact.test.d.ts.map +0 -1
- package/dist/__tests__/security/redact.test.js +0 -31
- package/dist/__tests__/security/redact.test.js.map +0 -1
- package/dist/__tests__/security/safe-fetch.test.d.ts +0 -2
- package/dist/__tests__/security/safe-fetch.test.d.ts.map +0 -1
- package/dist/__tests__/security/safe-fetch.test.js +0 -97
- package/dist/__tests__/security/safe-fetch.test.js.map +0 -1
- package/dist/__tests__/security/sanitize-document.test.d.ts +0 -2
- package/dist/__tests__/security/sanitize-document.test.d.ts.map +0 -1
- package/dist/__tests__/security/sanitize-document.test.js +0 -146
- package/dist/__tests__/security/sanitize-document.test.js.map +0 -1
- package/dist/__tests__/security/sanitize.test.d.ts +0 -2
- package/dist/__tests__/security/sanitize.test.d.ts.map +0 -1
- package/dist/__tests__/security/sanitize.test.js +0 -75
- package/dist/__tests__/security/sanitize.test.js.map +0 -1
- package/dist/__tests__/security/secret-storage.test.d.ts +0 -2
- package/dist/__tests__/security/secret-storage.test.d.ts.map +0 -1
- package/dist/__tests__/security/secret-storage.test.js +0 -42
- package/dist/__tests__/security/secret-storage.test.js.map +0 -1
- package/dist/__tests__/security/ssrf.test.d.ts +0 -2
- package/dist/__tests__/security/ssrf.test.d.ts.map +0 -1
- package/dist/__tests__/security/ssrf.test.js +0 -209
- package/dist/__tests__/security/ssrf.test.js.map +0 -1
- package/dist/__tests__/security/upload-magic.test.d.ts +0 -2
- package/dist/__tests__/security/upload-magic.test.d.ts.map +0 -1
- package/dist/__tests__/security/upload-magic.test.js +0 -55
- package/dist/__tests__/security/upload-magic.test.js.map +0 -1
- package/dist/__tests__/seo/ai-bots.test.d.ts +0 -2
- package/dist/__tests__/seo/ai-bots.test.d.ts.map +0 -1
- package/dist/__tests__/seo/ai-bots.test.js +0 -92
- package/dist/__tests__/seo/ai-bots.test.js.map +0 -1
- package/dist/__tests__/seo/alt-text.test.d.ts +0 -2
- package/dist/__tests__/seo/alt-text.test.d.ts.map +0 -1
- package/dist/__tests__/seo/alt-text.test.js +0 -47
- package/dist/__tests__/seo/alt-text.test.js.map +0 -1
- package/dist/__tests__/seo/analysis-markdown.test.d.ts +0 -2
- package/dist/__tests__/seo/analysis-markdown.test.d.ts.map +0 -1
- package/dist/__tests__/seo/analysis-markdown.test.js +0 -57
- package/dist/__tests__/seo/analysis-markdown.test.js.map +0 -1
- package/dist/__tests__/seo/audit-engine.test.d.ts +0 -2
- package/dist/__tests__/seo/audit-engine.test.d.ts.map +0 -1
- package/dist/__tests__/seo/audit-engine.test.js +0 -181
- package/dist/__tests__/seo/audit-engine.test.js.map +0 -1
- package/dist/__tests__/seo/audit-runner.test.d.ts +0 -2
- package/dist/__tests__/seo/audit-runner.test.d.ts.map +0 -1
- package/dist/__tests__/seo/audit-runner.test.js +0 -204
- package/dist/__tests__/seo/audit-runner.test.js.map +0 -1
- package/dist/__tests__/seo/audit-signals.test.d.ts +0 -2
- package/dist/__tests__/seo/audit-signals.test.d.ts.map +0 -1
- package/dist/__tests__/seo/audit-signals.test.js +0 -30
- package/dist/__tests__/seo/audit-signals.test.js.map +0 -1
- package/dist/__tests__/seo/config-store.test.d.ts +0 -2
- package/dist/__tests__/seo/config-store.test.d.ts.map +0 -1
- package/dist/__tests__/seo/config-store.test.js +0 -31
- package/dist/__tests__/seo/config-store.test.js.map +0 -1
- package/dist/__tests__/seo/content-markdown.test.d.ts +0 -2
- package/dist/__tests__/seo/content-markdown.test.d.ts.map +0 -1
- package/dist/__tests__/seo/content-markdown.test.js +0 -124
- package/dist/__tests__/seo/content-markdown.test.js.map +0 -1
- package/dist/__tests__/seo/effective-meta.test.d.ts +0 -2
- package/dist/__tests__/seo/effective-meta.test.d.ts.map +0 -1
- package/dist/__tests__/seo/effective-meta.test.js +0 -58
- package/dist/__tests__/seo/effective-meta.test.js.map +0 -1
- package/dist/__tests__/seo/feeds.test.d.ts +0 -2
- package/dist/__tests__/seo/feeds.test.d.ts.map +0 -1
- package/dist/__tests__/seo/feeds.test.js +0 -61
- package/dist/__tests__/seo/feeds.test.js.map +0 -1
- package/dist/__tests__/seo/fix-brief-export.test.d.ts +0 -2
- package/dist/__tests__/seo/fix-brief-export.test.d.ts.map +0 -1
- package/dist/__tests__/seo/fix-brief-export.test.js +0 -153
- package/dist/__tests__/seo/fix-brief-export.test.js.map +0 -1
- package/dist/__tests__/seo/freshness.test.d.ts +0 -2
- package/dist/__tests__/seo/freshness.test.d.ts.map +0 -1
- package/dist/__tests__/seo/freshness.test.js +0 -89
- package/dist/__tests__/seo/freshness.test.js.map +0 -1
- package/dist/__tests__/seo/index-status.test.d.ts +0 -2
- package/dist/__tests__/seo/index-status.test.d.ts.map +0 -1
- package/dist/__tests__/seo/index-status.test.js +0 -140
- package/dist/__tests__/seo/index-status.test.js.map +0 -1
- package/dist/__tests__/seo/internal-collections.test.d.ts +0 -2
- package/dist/__tests__/seo/internal-collections.test.d.ts.map +0 -1
- package/dist/__tests__/seo/internal-collections.test.js +0 -27
- package/dist/__tests__/seo/internal-collections.test.js.map +0 -1
- package/dist/__tests__/seo/issue-batch-briefs.test.d.ts +0 -2
- package/dist/__tests__/seo/issue-batch-briefs.test.d.ts.map +0 -1
- package/dist/__tests__/seo/issue-batch-briefs.test.js +0 -64
- package/dist/__tests__/seo/issue-batch-briefs.test.js.map +0 -1
- package/dist/__tests__/seo/issue-content-brief.test.d.ts +0 -2
- package/dist/__tests__/seo/issue-content-brief.test.d.ts.map +0 -1
- package/dist/__tests__/seo/issue-content-brief.test.js +0 -107
- package/dist/__tests__/seo/issue-content-brief.test.js.map +0 -1
- package/dist/__tests__/seo/issue-content-research.test.d.ts +0 -2
- package/dist/__tests__/seo/issue-content-research.test.d.ts.map +0 -1
- package/dist/__tests__/seo/issue-content-research.test.js +0 -114
- package/dist/__tests__/seo/issue-content-research.test.js.map +0 -1
- package/dist/__tests__/seo/issue-fix-ai.test.d.ts +0 -2
- package/dist/__tests__/seo/issue-fix-ai.test.d.ts.map +0 -1
- package/dist/__tests__/seo/issue-fix-ai.test.js +0 -96
- package/dist/__tests__/seo/issue-fix-ai.test.js.map +0 -1
- package/dist/__tests__/seo/issue-fix-orchestrator.test.d.ts +0 -2
- package/dist/__tests__/seo/issue-fix-orchestrator.test.d.ts.map +0 -1
- package/dist/__tests__/seo/issue-fix-orchestrator.test.js +0 -48
- package/dist/__tests__/seo/issue-fix-orchestrator.test.js.map +0 -1
- package/dist/__tests__/seo/issue-fix.test.d.ts +0 -2
- package/dist/__tests__/seo/issue-fix.test.d.ts.map +0 -1
- package/dist/__tests__/seo/issue-fix.test.js +0 -98
- package/dist/__tests__/seo/issue-fix.test.js.map +0 -1
- package/dist/__tests__/seo/llms-sanitize.test.d.ts +0 -2
- package/dist/__tests__/seo/llms-sanitize.test.d.ts.map +0 -1
- package/dist/__tests__/seo/llms-sanitize.test.js +0 -74
- package/dist/__tests__/seo/llms-sanitize.test.js.map +0 -1
- package/dist/__tests__/seo/meta-tags-alternates.test.d.ts +0 -2
- package/dist/__tests__/seo/meta-tags-alternates.test.d.ts.map +0 -1
- package/dist/__tests__/seo/meta-tags-alternates.test.js +0 -52
- package/dist/__tests__/seo/meta-tags-alternates.test.js.map +0 -1
- package/dist/__tests__/seo/migrate-meta.test.d.ts +0 -2
- package/dist/__tests__/seo/migrate-meta.test.d.ts.map +0 -1
- package/dist/__tests__/seo/migrate-meta.test.js +0 -75
- package/dist/__tests__/seo/migrate-meta.test.js.map +0 -1
- package/dist/__tests__/seo/migrate-schema.test.d.ts +0 -2
- package/dist/__tests__/seo/migrate-schema.test.d.ts.map +0 -1
- package/dist/__tests__/seo/migrate-schema.test.js +0 -97
- package/dist/__tests__/seo/migrate-schema.test.js.map +0 -1
- package/dist/__tests__/seo/page-meta.test.d.ts +0 -2
- package/dist/__tests__/seo/page-meta.test.d.ts.map +0 -1
- package/dist/__tests__/seo/page-meta.test.js +0 -452
- package/dist/__tests__/seo/page-meta.test.js.map +0 -1
- package/dist/__tests__/seo/resolve-path.test.d.ts +0 -2
- package/dist/__tests__/seo/resolve-path.test.d.ts.map +0 -1
- package/dist/__tests__/seo/resolve-path.test.js +0 -46
- package/dist/__tests__/seo/resolve-path.test.js.map +0 -1
- package/dist/__tests__/seo/robots.test.d.ts +0 -2
- package/dist/__tests__/seo/robots.test.d.ts.map +0 -1
- package/dist/__tests__/seo/robots.test.js +0 -72
- package/dist/__tests__/seo/robots.test.js.map +0 -1
- package/dist/__tests__/seo/schema-sync.test.d.ts +0 -2
- package/dist/__tests__/seo/schema-sync.test.d.ts.map +0 -1
- package/dist/__tests__/seo/schema-sync.test.js +0 -59
- package/dist/__tests__/seo/schema-sync.test.js.map +0 -1
- package/dist/__tests__/seo/score.test.d.ts +0 -2
- package/dist/__tests__/seo/score.test.d.ts.map +0 -1
- package/dist/__tests__/seo/score.test.js +0 -152
- package/dist/__tests__/seo/score.test.js.map +0 -1
- package/dist/__tests__/seo/settings-defaults.test.d.ts +0 -2
- package/dist/__tests__/seo/settings-defaults.test.d.ts.map +0 -1
- package/dist/__tests__/seo/settings-defaults.test.js +0 -189
- package/dist/__tests__/seo/settings-defaults.test.js.map +0 -1
- package/dist/__tests__/seo/sitemap-notify.test.d.ts +0 -2
- package/dist/__tests__/seo/sitemap-notify.test.d.ts.map +0 -1
- package/dist/__tests__/seo/sitemap-notify.test.js +0 -267
- package/dist/__tests__/seo/sitemap-notify.test.js.map +0 -1
- package/dist/__tests__/seo/sitemap-public.test.d.ts +0 -2
- package/dist/__tests__/seo/sitemap-public.test.d.ts.map +0 -1
- package/dist/__tests__/seo/sitemap-public.test.js +0 -52
- package/dist/__tests__/seo/sitemap-public.test.js.map +0 -1
- package/dist/__tests__/server-site.test.d.ts +0 -2
- package/dist/__tests__/server-site.test.d.ts.map +0 -1
- package/dist/__tests__/server-site.test.js +0 -173
- package/dist/__tests__/server-site.test.js.map +0 -1
- package/dist/__tests__/setup/index.test.d.ts +0 -2
- package/dist/__tests__/setup/index.test.d.ts.map +0 -1
- package/dist/__tests__/setup/index.test.js +0 -128
- package/dist/__tests__/setup/index.test.js.map +0 -1
- package/dist/__tests__/site.test.d.ts +0 -2
- package/dist/__tests__/site.test.d.ts.map +0 -1
- package/dist/__tests__/site.test.js +0 -81
- package/dist/__tests__/site.test.js.map +0 -1
- package/dist/__tests__/storage/auto-wire.test.d.ts +0 -2
- package/dist/__tests__/storage/auto-wire.test.d.ts.map +0 -1
- package/dist/__tests__/storage/auto-wire.test.js +0 -73
- package/dist/__tests__/storage/auto-wire.test.js.map +0 -1
- package/dist/__tests__/upgrade/version-check.test.d.ts +0 -2
- package/dist/__tests__/upgrade/version-check.test.d.ts.map +0 -1
- package/dist/__tests__/upgrade/version-check.test.js +0 -98
- package/dist/__tests__/upgrade/version-check.test.js.map +0 -1
- package/dist/__tests__/validation/publish.test.d.ts +0 -2
- package/dist/__tests__/validation/publish.test.d.ts.map +0 -1
- package/dist/__tests__/validation/publish.test.js +0 -164
- package/dist/__tests__/validation/publish.test.js.map +0 -1
- package/dist/__tests__/webhooks/webhooks.test.d.ts +0 -2
- package/dist/__tests__/webhooks/webhooks.test.d.ts.map +0 -1
- package/dist/__tests__/webhooks/webhooks.test.js +0 -96
- package/dist/__tests__/webhooks/webhooks.test.js.map +0 -1
- package/dist/cache/__tests__/http.test.d.ts +0 -2
- package/dist/cache/__tests__/http.test.d.ts.map +0 -1
- package/dist/cache/__tests__/http.test.js +0 -285
- package/dist/cache/__tests__/http.test.js.map +0 -1
- package/dist/db/__tests__/find-in-batches.test.d.ts +0 -2
- package/dist/db/__tests__/find-in-batches.test.d.ts.map +0 -1
- package/dist/db/__tests__/find-in-batches.test.js +0 -26
- package/dist/db/__tests__/find-in-batches.test.js.map +0 -1
- package/dist/fields/__tests__/presets.test.d.ts +0 -2
- package/dist/fields/__tests__/presets.test.d.ts.map +0 -1
- package/dist/fields/__tests__/presets.test.js +0 -29
- package/dist/fields/__tests__/presets.test.js.map +0 -1
- package/dist/page-builder/__tests__/a11y-fix.test.d.ts +0 -2
- package/dist/page-builder/__tests__/a11y-fix.test.d.ts.map +0 -1
- package/dist/page-builder/__tests__/a11y-fix.test.js +0 -242
- package/dist/page-builder/__tests__/a11y-fix.test.js.map +0 -1
- package/dist/page-builder/__tests__/blocks.test.d.ts +0 -2
- package/dist/page-builder/__tests__/blocks.test.d.ts.map +0 -1
- package/dist/page-builder/__tests__/blocks.test.js +0 -194
- package/dist/page-builder/__tests__/blocks.test.js.map +0 -1
- package/dist/page-builder/__tests__/design-scorer.test.d.ts +0 -2
- package/dist/page-builder/__tests__/design-scorer.test.d.ts.map +0 -1
- package/dist/page-builder/__tests__/design-scorer.test.js +0 -301
- package/dist/page-builder/__tests__/design-scorer.test.js.map +0 -1
- package/dist/page-builder/__tests__/schema.test.d.ts +0 -2
- package/dist/page-builder/__tests__/schema.test.d.ts.map +0 -1
- package/dist/page-builder/__tests__/schema.test.js +0 -191
- package/dist/page-builder/__tests__/schema.test.js.map +0 -1
- package/dist/page-builder/__tests__/seo-analyzer.test.d.ts +0 -2
- package/dist/page-builder/__tests__/seo-analyzer.test.d.ts.map +0 -1
- package/dist/page-builder/__tests__/seo-analyzer.test.js +0 -346
- package/dist/page-builder/__tests__/seo-analyzer.test.js.map +0 -1
- package/dist/page-builder/__tests__/tree.test.d.ts +0 -2
- package/dist/page-builder/__tests__/tree.test.d.ts.map +0 -1
- package/dist/page-builder/__tests__/tree.test.js +0 -257
- package/dist/page-builder/__tests__/tree.test.js.map +0 -1
- package/dist/posts/__tests__/query.test.d.ts +0 -2
- package/dist/posts/__tests__/query.test.d.ts.map +0 -1
- package/dist/posts/__tests__/query.test.js +0 -70
- package/dist/posts/__tests__/query.test.js.map +0 -1
- package/dist/sections/__tests__/bridge.test.d.ts +0 -2
- package/dist/sections/__tests__/bridge.test.d.ts.map +0 -1
- package/dist/sections/__tests__/bridge.test.js +0 -171
- package/dist/sections/__tests__/bridge.test.js.map +0 -1
- package/dist/sections/__tests__/define.test.d.ts +0 -2
- package/dist/sections/__tests__/define.test.d.ts.map +0 -1
- package/dist/sections/__tests__/define.test.js +0 -132
- package/dist/sections/__tests__/define.test.js.map +0 -1
- package/dist/sections/__tests__/embed.test.d.ts +0 -2
- package/dist/sections/__tests__/embed.test.d.ts.map +0 -1
- package/dist/sections/__tests__/embed.test.js +0 -54
- package/dist/sections/__tests__/embed.test.js.map +0 -1
- package/dist/sections/__tests__/media-enrich.test.d.ts +0 -2
- package/dist/sections/__tests__/media-enrich.test.d.ts.map +0 -1
- package/dist/sections/__tests__/media-enrich.test.js +0 -97
- package/dist/sections/__tests__/media-enrich.test.js.map +0 -1
- package/dist/sections/__tests__/sections.test.d.ts +0 -2
- package/dist/sections/__tests__/sections.test.d.ts.map +0 -1
- package/dist/sections/__tests__/sections.test.js +0 -453
- package/dist/sections/__tests__/sections.test.js.map +0 -1
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { hashPassword, verifyPassword, validatePasswordPolicy, needsRehash, compareToDummyHash, _waitForDummyHashReady, PBKDF2_ITERATIONS, } from '../../auth/password.js';
|
|
3
|
-
describe('hashPassword', () => {
|
|
4
|
-
it(`returns a string in format "pbkdf2:${PBKDF2_ITERATIONS}:salt:hash"`, async () => {
|
|
5
|
-
const hash = await hashPassword('MySecret123!');
|
|
6
|
-
const parts = hash.split(':');
|
|
7
|
-
expect(parts).toHaveLength(4);
|
|
8
|
-
expect(parts[0]).toBe('pbkdf2');
|
|
9
|
-
expect(parts[1]).toBe(String(PBKDF2_ITERATIONS));
|
|
10
|
-
expect(parts[2]).toMatch(/^[0-9a-f]{32}$/);
|
|
11
|
-
expect(parts[3]).toMatch(/^[0-9a-f]{64}$/);
|
|
12
|
-
});
|
|
13
|
-
it('uses at least 600,000 iterations (OWASP 2023+ guidance)', () => {
|
|
14
|
-
expect(PBKDF2_ITERATIONS).toBeGreaterThanOrEqual(600_000);
|
|
15
|
-
});
|
|
16
|
-
it('produces different hashes for the same password (random salt)', async () => {
|
|
17
|
-
const hash1 = await hashPassword('SamePassword');
|
|
18
|
-
const hash2 = await hashPassword('SamePassword');
|
|
19
|
-
expect(hash1).not.toBe(hash2);
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
describe('verifyPassword', () => {
|
|
23
|
-
it('returns true for correct password', async () => {
|
|
24
|
-
const hash = await hashPassword('Correct!Horse1');
|
|
25
|
-
const result = await verifyPassword('Correct!Horse1', hash);
|
|
26
|
-
expect(result).toBe(true);
|
|
27
|
-
});
|
|
28
|
-
it('returns false for wrong password', async () => {
|
|
29
|
-
const hash = await hashPassword('Correct!Horse1');
|
|
30
|
-
const result = await verifyPassword('WrongPassword9!', hash);
|
|
31
|
-
expect(result).toBe(false);
|
|
32
|
-
});
|
|
33
|
-
it('returns false for malformed hash (missing parts)', async () => {
|
|
34
|
-
const result = await verifyPassword('anything', 'not-a-valid-hash');
|
|
35
|
-
expect(result).toBe(false);
|
|
36
|
-
});
|
|
37
|
-
it('returns false for malformed hash (empty segments)', async () => {
|
|
38
|
-
const result = await verifyPassword('anything', 'pbkdf2:100000::');
|
|
39
|
-
expect(result).toBe(false);
|
|
40
|
-
});
|
|
41
|
-
it('verifies legacy 100k-iteration hashes (back-compat)', async () => {
|
|
42
|
-
// Build a legacy-style hash by hand with 100k iterations.
|
|
43
|
-
const password = 'LegacyPass1!';
|
|
44
|
-
const salt = crypto.getRandomValues(new Uint8Array(16));
|
|
45
|
-
const key = await crypto.subtle.importKey('raw', new TextEncoder().encode(password), 'PBKDF2', false, ['deriveBits']);
|
|
46
|
-
const derived = await crypto.subtle.deriveBits({ name: 'PBKDF2', salt, iterations: 100_000, hash: 'SHA-256' }, key, 256);
|
|
47
|
-
const legacy = `pbkdf2:100000:${Buffer.from(salt).toString('hex')}:${Buffer.from(derived).toString('hex')}`;
|
|
48
|
-
expect(await verifyPassword(password, legacy)).toBe(true);
|
|
49
|
-
expect(await verifyPassword('wrong', legacy)).toBe(false);
|
|
50
|
-
});
|
|
51
|
-
it('rejects absurdly low iteration counts (corruption guard)', async () => {
|
|
52
|
-
const result = await verifyPassword('anything', 'pbkdf2:100:abc:def');
|
|
53
|
-
expect(result).toBe(false);
|
|
54
|
-
});
|
|
55
|
-
it('rejects absurdly high iteration counts (DoS guard)', async () => {
|
|
56
|
-
const result = await verifyPassword('anything', 'pbkdf2:99999999:abc:def');
|
|
57
|
-
expect(result).toBe(false);
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
describe('needsRehash', () => {
|
|
61
|
-
it('returns true for old 100k-iteration hashes', () => {
|
|
62
|
-
expect(needsRehash('pbkdf2:100000:abc:def')).toBe(true);
|
|
63
|
-
});
|
|
64
|
-
it('returns false for current 600k-iteration hashes', async () => {
|
|
65
|
-
const hash = await hashPassword('Test1234!');
|
|
66
|
-
expect(needsRehash(hash)).toBe(false);
|
|
67
|
-
});
|
|
68
|
-
it('returns false for malformed hash', () => {
|
|
69
|
-
expect(needsRehash('not-a-hash')).toBe(false);
|
|
70
|
-
expect(needsRehash('pbkdf2:notanumber:abc:def')).toBe(false);
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
describe('compareToDummyHash', () => {
|
|
74
|
-
it('always returns false (dummy hash never matches a real password)', async () => {
|
|
75
|
-
const a = await compareToDummyHash('any password');
|
|
76
|
-
const b = await compareToDummyHash('different password');
|
|
77
|
-
const c = await compareToDummyHash('');
|
|
78
|
-
expect(a).toBe(false);
|
|
79
|
-
expect(b).toBe(false);
|
|
80
|
-
expect(c).toBe(false);
|
|
81
|
-
});
|
|
82
|
-
it('takes meaningful CPU time (defends user-enumeration timing channel)', async () => {
|
|
83
|
-
// The whole point is that this isn't a no-op. We can't assert exact ms in
|
|
84
|
-
// CI, but we can confirm it doesn't return synchronously.
|
|
85
|
-
const start = performance.now();
|
|
86
|
-
await compareToDummyHash('Some submitted password');
|
|
87
|
-
const elapsed = performance.now() - start;
|
|
88
|
-
// 600k iterations of PBKDF2-HMAC-SHA256 takes ~50-300ms on a typical CI
|
|
89
|
-
// worker. We assert >5ms as a generous lower bound that still catches
|
|
90
|
-
// a stub returning instantly.
|
|
91
|
-
expect(elapsed).toBeGreaterThan(5);
|
|
92
|
-
});
|
|
93
|
-
// Bugbot review #4 (PR #40): the original implementation lazily
|
|
94
|
-
// initialised the dummy hash on first call, making the first non-existent
|
|
95
|
-
// user login take ~2× the time of subsequent ones (one hashPassword +
|
|
96
|
-
// one verifyPassword vs just verifyPassword). That recreated the
|
|
97
|
-
// user-enumeration timing channel the dummy hash exists to close. The
|
|
98
|
-
// fix precomputes the hash via a top-level Promise — by the time the
|
|
99
|
-
// first user request arrives, the work is either done or already
|
|
100
|
-
// in-flight.
|
|
101
|
-
//
|
|
102
|
-
// Two warmups needed to measure verify-only cost on CI:
|
|
103
|
-
// 1. `_waitForDummyHashReady()` — wait for the eager hash precompute
|
|
104
|
-
// so the first measured call isn't paying that extra ~150ms.
|
|
105
|
-
// 2. Throwaway `compareToDummyHash('worker-warmup')` — warm Node's
|
|
106
|
-
// libuv worker pool used by `crypto.pbkdf2`. The first PBKDF2
|
|
107
|
-
// call across the entire process pays a ~100-150ms cold-start
|
|
108
|
-
// to spawn the worker thread + initialise the C++ binding
|
|
109
|
-
// context; subsequent calls reuse it. Without this warmup, the
|
|
110
|
-
// test failed on `main` (run 26599207053) with e1=291ms vs
|
|
111
|
-
// e2=150ms — same ~2× ratio as the historical lazy-init bug it
|
|
112
|
-
// was meant to catch, but caused by worker-pool warmup rather
|
|
113
|
-
// than a regression in the dummy-hash path.
|
|
114
|
-
//
|
|
115
|
-
// After both warmups, e1 and e2 measure the *same* verifyPassword
|
|
116
|
-
// path. Reverting PR #40 (re-introducing lazy init) would make e1
|
|
117
|
-
// also include a fresh hashPassword call (~150ms) — still ~2× e2 —
|
|
118
|
-
// and the bound would catch it.
|
|
119
|
-
it('first measured call has parity with subsequent calls after eager init resolves', async () => {
|
|
120
|
-
await _waitForDummyHashReady();
|
|
121
|
-
// Throwaway: warm Node's libuv crypto worker pool (see comment above).
|
|
122
|
-
await compareToDummyHash('worker-warmup');
|
|
123
|
-
// Timing assertions on shared CI runners are noisy: a single GC pause or
|
|
124
|
-
// scheduler quantum on either sample can spike the e1/e2 ratio (see this
|
|
125
|
-
// file's history — runs 26599207053 and 27183423830 both flaked here, the
|
|
126
|
-
// latter blocking a publish). A genuine lazy-init regression is *consistent*
|
|
127
|
-
// (~2× on every iteration, because the first call would also pay for a full
|
|
128
|
-
// hashPassword), whereas noise is intermittent. So take a best-of-N: pass as
|
|
129
|
-
// soon as one iteration is within tolerance, and only fail if EVERY attempt
|
|
130
|
-
// exceeds it. The eager-init contract itself is independently guarded by the
|
|
131
|
-
// structural test below (`_waitForDummyHashReady` resolving).
|
|
132
|
-
const ATTEMPTS = 5;
|
|
133
|
-
let lastE1 = 0;
|
|
134
|
-
let lastBound = 0;
|
|
135
|
-
let withinTolerance = false;
|
|
136
|
-
for (let i = 0; i < ATTEMPTS && !withinTolerance; i++) {
|
|
137
|
-
const t1 = performance.now();
|
|
138
|
-
await compareToDummyHash('first');
|
|
139
|
-
const e1 = performance.now() - t1;
|
|
140
|
-
const t2 = performance.now();
|
|
141
|
-
await compareToDummyHash('second');
|
|
142
|
-
const e2 = performance.now() - t2;
|
|
143
|
-
// Both calls run only verifyPassword on a warm worker pool. The tolerance
|
|
144
|
-
// (1.6× + 50ms) absorbs GC pauses and scheduler quanta; without eager init
|
|
145
|
-
// the ratio is ~2× and would blow this bound on every attempt.
|
|
146
|
-
lastE1 = e1;
|
|
147
|
-
lastBound = e2 * 1.6 + 50;
|
|
148
|
-
withinTolerance = e1 < lastBound;
|
|
149
|
-
}
|
|
150
|
-
expect(withinTolerance, `e1=${lastE1.toFixed(1)}ms exceeded the ${lastBound.toFixed(1)}ms bound on all ${ATTEMPTS} attempts ` +
|
|
151
|
-
`(consistent ~2× ratio suggests lazy-init regression; intermittent would have passed one attempt)`).toBe(true);
|
|
152
|
-
});
|
|
153
|
-
it('exposes the eager-init promise for direct verification', async () => {
|
|
154
|
-
// Module-load contract: `_waitForDummyHashReady()` MUST return a
|
|
155
|
-
// promise that resolves with no work pending on the consumer side.
|
|
156
|
-
// If a future refactor accidentally drops the top-level invocation
|
|
157
|
-
// and switches back to lazy init, this test catches it because the
|
|
158
|
-
// promise either won't exist or won't resolve without a triggering
|
|
159
|
-
// call.
|
|
160
|
-
await expect(_waitForDummyHashReady()).resolves.toBeUndefined();
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
describe('validatePasswordPolicy', () => {
|
|
164
|
-
it('passes when password meets all requirements', () => {
|
|
165
|
-
const result = validatePasswordPolicy('Str0ng!Pass', {
|
|
166
|
-
minLength: 8,
|
|
167
|
-
requireUppercase: true,
|
|
168
|
-
requireLowercase: true,
|
|
169
|
-
requireNumbers: true,
|
|
170
|
-
requireSpecialChars: true,
|
|
171
|
-
});
|
|
172
|
-
expect(result.valid).toBe(true);
|
|
173
|
-
expect(result.errors).toHaveLength(0);
|
|
174
|
-
});
|
|
175
|
-
it('fails when password is too short', () => {
|
|
176
|
-
const result = validatePasswordPolicy('Sh1!', {
|
|
177
|
-
minLength: 8,
|
|
178
|
-
});
|
|
179
|
-
expect(result.valid).toBe(false);
|
|
180
|
-
expect(result.errors).toContain('Password must be at least 8 characters');
|
|
181
|
-
});
|
|
182
|
-
it('fails when missing uppercase', () => {
|
|
183
|
-
const result = validatePasswordPolicy('alllowercase1!', {
|
|
184
|
-
requireUppercase: true,
|
|
185
|
-
});
|
|
186
|
-
expect(result.valid).toBe(false);
|
|
187
|
-
expect(result.errors).toContain('Password must contain an uppercase letter');
|
|
188
|
-
});
|
|
189
|
-
it('fails when missing lowercase', () => {
|
|
190
|
-
const result = validatePasswordPolicy('ALLUPPERCASE1!', {
|
|
191
|
-
requireLowercase: true,
|
|
192
|
-
});
|
|
193
|
-
expect(result.valid).toBe(false);
|
|
194
|
-
expect(result.errors).toContain('Password must contain a lowercase letter');
|
|
195
|
-
});
|
|
196
|
-
it('fails when missing digits', () => {
|
|
197
|
-
const result = validatePasswordPolicy('NoDigits!Here', {
|
|
198
|
-
requireNumbers: true,
|
|
199
|
-
});
|
|
200
|
-
expect(result.valid).toBe(false);
|
|
201
|
-
expect(result.errors).toContain('Password must contain a digit');
|
|
202
|
-
});
|
|
203
|
-
it('fails when missing special characters', () => {
|
|
204
|
-
const result = validatePasswordPolicy('NoSpecial1Chars', {
|
|
205
|
-
requireSpecialChars: true,
|
|
206
|
-
});
|
|
207
|
-
expect(result.valid).toBe(false);
|
|
208
|
-
expect(result.errors).toContain('Password must contain a special character');
|
|
209
|
-
});
|
|
210
|
-
it('accumulates multiple errors', () => {
|
|
211
|
-
const result = validatePasswordPolicy('abc', {
|
|
212
|
-
minLength: 8,
|
|
213
|
-
requireUppercase: true,
|
|
214
|
-
requireNumbers: true,
|
|
215
|
-
requireSpecialChars: true,
|
|
216
|
-
});
|
|
217
|
-
expect(result.valid).toBe(false);
|
|
218
|
-
expect(result.errors).toHaveLength(4);
|
|
219
|
-
});
|
|
220
|
-
it('passes with empty policy', () => {
|
|
221
|
-
const result = validatePasswordPolicy('anything', {});
|
|
222
|
-
expect(result.valid).toBe(true);
|
|
223
|
-
expect(result.errors).toHaveLength(0);
|
|
224
|
-
});
|
|
225
|
-
});
|
|
226
|
-
//# sourceMappingURL=password.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"password.test.js","sourceRoot":"","sources":["../../../src/__tests__/auth/password.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reset.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/auth/reset.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,355 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
import { generateResetToken, hashToken, createPasswordReset, executePasswordReset, } from '../../auth/reset.js';
|
|
3
|
-
import { verifyPassword } from '../../auth/password.js';
|
|
4
|
-
import { setEmailSender } from '../../email/sender.js';
|
|
5
|
-
function createFakeDb(initial = {}) {
|
|
6
|
-
const users = initial.users ?? [];
|
|
7
|
-
const tokens = [];
|
|
8
|
-
const sessions = initial.sessions ?? [];
|
|
9
|
-
const emailsSent = [];
|
|
10
|
-
const db = {
|
|
11
|
-
users,
|
|
12
|
-
tokens,
|
|
13
|
-
sessions,
|
|
14
|
-
emailsSent,
|
|
15
|
-
user: {
|
|
16
|
-
findFirst: vi.fn(async ({ where }) => {
|
|
17
|
-
const target = where.email.equals.toLowerCase();
|
|
18
|
-
return users.find((u) => u.email.toLowerCase() === target) ?? null;
|
|
19
|
-
}),
|
|
20
|
-
update: vi.fn(async ({ where, data }) => {
|
|
21
|
-
const u = users.find((u) => u.id === where.id);
|
|
22
|
-
if (u)
|
|
23
|
-
Object.assign(u, data);
|
|
24
|
-
return u;
|
|
25
|
-
}),
|
|
26
|
-
},
|
|
27
|
-
passwordResetToken: {
|
|
28
|
-
findFirst: vi.fn(async ({ where }) => {
|
|
29
|
-
return (tokens.find((t) => t.tokenHash === where.tokenHash && t.usedAt === where.usedAt) ?? null);
|
|
30
|
-
}),
|
|
31
|
-
create: vi.fn(async ({ data }) => {
|
|
32
|
-
const user = users.find((u) => u.id === data.userId);
|
|
33
|
-
const t = {
|
|
34
|
-
id: `rt_${tokens.length + 1}`,
|
|
35
|
-
userId: data.userId,
|
|
36
|
-
tokenHash: data.tokenHash,
|
|
37
|
-
expiresAt: data.expiresAt,
|
|
38
|
-
usedAt: null,
|
|
39
|
-
user,
|
|
40
|
-
};
|
|
41
|
-
tokens.push(t);
|
|
42
|
-
return t;
|
|
43
|
-
}),
|
|
44
|
-
update: vi.fn(async ({ where, data }) => {
|
|
45
|
-
const t = tokens.find((t) => t.id === where.id);
|
|
46
|
-
if (t)
|
|
47
|
-
Object.assign(t, data);
|
|
48
|
-
return t;
|
|
49
|
-
}),
|
|
50
|
-
updateMany: vi.fn(async ({ where, data }) => {
|
|
51
|
-
let count = 0;
|
|
52
|
-
for (const t of tokens) {
|
|
53
|
-
if (t.userId === where.userId && t.usedAt === where.usedAt) {
|
|
54
|
-
Object.assign(t, data);
|
|
55
|
-
count++;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return { count };
|
|
59
|
-
}),
|
|
60
|
-
},
|
|
61
|
-
session: {
|
|
62
|
-
updateMany: vi.fn(async ({ where, data }) => {
|
|
63
|
-
let count = 0;
|
|
64
|
-
for (const s of sessions) {
|
|
65
|
-
if (s.userId === where.userId && s.revokedAt === where.revokedAt) {
|
|
66
|
-
Object.assign(s, data);
|
|
67
|
-
count++;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return { count };
|
|
71
|
-
}),
|
|
72
|
-
},
|
|
73
|
-
$transaction: vi.fn(async (ops) => Promise.all(ops)),
|
|
74
|
-
};
|
|
75
|
-
// Partial mock — intersection keeps the vi.fn types visible to assertions.
|
|
76
|
-
return db;
|
|
77
|
-
}
|
|
78
|
-
const TEST_CONFIG = {
|
|
79
|
-
siteUrl: 'https://example.com',
|
|
80
|
-
platform: {
|
|
81
|
-
email: {
|
|
82
|
-
send: vi.fn(),
|
|
83
|
-
},
|
|
84
|
-
},
|
|
85
|
-
};
|
|
86
|
-
beforeEach(() => {
|
|
87
|
-
TEST_CONFIG.platform.email.send.mockClear();
|
|
88
|
-
});
|
|
89
|
-
// ─── Token generation ───────────────────────────────────────────────────
|
|
90
|
-
describe('generateResetToken', () => {
|
|
91
|
-
it('returns a 64-char hex raw token (32 random bytes)', () => {
|
|
92
|
-
const t = generateResetToken();
|
|
93
|
-
expect(t.raw).toMatch(/^[0-9a-f]{64}$/);
|
|
94
|
-
});
|
|
95
|
-
it('returns a SHA-256 hash of the raw token', () => {
|
|
96
|
-
const t = generateResetToken();
|
|
97
|
-
expect(t.hash).toBe(hashToken(t.raw));
|
|
98
|
-
expect(t.hash).toMatch(/^[0-9a-f]{64}$/);
|
|
99
|
-
});
|
|
100
|
-
it('produces unique tokens (≥ 100 entropy bits)', () => {
|
|
101
|
-
const set = new Set(Array.from({ length: 200 }, () => generateResetToken().raw));
|
|
102
|
-
expect(set.size).toBe(200);
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
// ─── createPasswordReset (request flow) ─────────────────────────────────
|
|
106
|
-
describe('createPasswordReset', () => {
|
|
107
|
-
it('silently succeeds for an unknown email (user enumeration defence)', async () => {
|
|
108
|
-
const db = createFakeDb();
|
|
109
|
-
await expect(createPasswordReset(db, 'unknown@example.com', TEST_CONFIG)).resolves.toBeUndefined();
|
|
110
|
-
expect(db.passwordResetToken.create).not.toHaveBeenCalled();
|
|
111
|
-
expect(TEST_CONFIG.platform.email.send).not.toHaveBeenCalled();
|
|
112
|
-
});
|
|
113
|
-
it('silently succeeds for a deactivated user (no token, no email)', async () => {
|
|
114
|
-
const db = createFakeDb({
|
|
115
|
-
users: [
|
|
116
|
-
{
|
|
117
|
-
id: 'u_off',
|
|
118
|
-
email: 'off@example.com',
|
|
119
|
-
name: 'Off',
|
|
120
|
-
isActive: false,
|
|
121
|
-
passwordHash: 'pbkdf2:600000:a:b',
|
|
122
|
-
},
|
|
123
|
-
],
|
|
124
|
-
});
|
|
125
|
-
await createPasswordReset(db, 'off@example.com', TEST_CONFIG);
|
|
126
|
-
expect(db.passwordResetToken.create).not.toHaveBeenCalled();
|
|
127
|
-
expect(TEST_CONFIG.platform.email.send).not.toHaveBeenCalled();
|
|
128
|
-
});
|
|
129
|
-
it('creates a token, expires prior outstanding tokens, and sends an email', async () => {
|
|
130
|
-
const db = createFakeDb({
|
|
131
|
-
users: [
|
|
132
|
-
{
|
|
133
|
-
id: 'u_1',
|
|
134
|
-
email: 'a@example.com',
|
|
135
|
-
name: 'A',
|
|
136
|
-
isActive: true,
|
|
137
|
-
passwordHash: 'pbkdf2:600000:a:b',
|
|
138
|
-
},
|
|
139
|
-
],
|
|
140
|
-
});
|
|
141
|
-
await createPasswordReset(db, 'a@example.com', TEST_CONFIG);
|
|
142
|
-
expect(db.passwordResetToken.updateMany).toHaveBeenCalledWith({
|
|
143
|
-
where: { userId: 'u_1', usedAt: null },
|
|
144
|
-
data: { usedAt: expect.any(Date) },
|
|
145
|
-
});
|
|
146
|
-
expect(db.passwordResetToken.create).toHaveBeenCalledOnce();
|
|
147
|
-
expect(TEST_CONFIG.platform.email.send).toHaveBeenCalledOnce();
|
|
148
|
-
const tokenRecord = db.tokens[0];
|
|
149
|
-
// Stored value is the hash, not the raw token
|
|
150
|
-
expect(tokenRecord.tokenHash).toMatch(/^[0-9a-f]{64}$/);
|
|
151
|
-
// 1 hour expiry, give or take a few seconds
|
|
152
|
-
const ttlMs = tokenRecord.expiresAt.getTime() - Date.now();
|
|
153
|
-
expect(ttlMs).toBeGreaterThan(59 * 60 * 1000);
|
|
154
|
-
expect(ttlMs).toBeLessThanOrEqual(60 * 60 * 1000 + 5_000);
|
|
155
|
-
});
|
|
156
|
-
it('puts a fresh raw token into the email URL (not the hash)', async () => {
|
|
157
|
-
const db = createFakeDb({
|
|
158
|
-
users: [
|
|
159
|
-
{
|
|
160
|
-
id: 'u_1',
|
|
161
|
-
email: 'a@example.com',
|
|
162
|
-
name: 'A',
|
|
163
|
-
isActive: true,
|
|
164
|
-
passwordHash: null,
|
|
165
|
-
},
|
|
166
|
-
],
|
|
167
|
-
});
|
|
168
|
-
await createPasswordReset(db, 'A@Example.com ', TEST_CONFIG);
|
|
169
|
-
const sent = TEST_CONFIG.platform.email.send.mock.calls[0][0];
|
|
170
|
-
const tokenInUrl = sent.html.match(/token=([0-9a-f]{64})/)?.[1];
|
|
171
|
-
expect(tokenInUrl).toBeDefined();
|
|
172
|
-
expect(hashToken(tokenInUrl)).toBe(db.tokens[0].tokenHash);
|
|
173
|
-
});
|
|
174
|
-
it('normalises email casing/whitespace before lookup', async () => {
|
|
175
|
-
const db = createFakeDb({
|
|
176
|
-
users: [
|
|
177
|
-
{
|
|
178
|
-
id: 'u_1',
|
|
179
|
-
email: 'a@example.com',
|
|
180
|
-
name: 'A',
|
|
181
|
-
isActive: true,
|
|
182
|
-
passwordHash: null,
|
|
183
|
-
},
|
|
184
|
-
],
|
|
185
|
-
});
|
|
186
|
-
await createPasswordReset(db, ' A@Example.COM ', TEST_CONFIG);
|
|
187
|
-
expect(db.passwordResetToken.create).toHaveBeenCalledOnce();
|
|
188
|
-
});
|
|
189
|
-
it('does nothing when the email is empty / whitespace-only', async () => {
|
|
190
|
-
const db = createFakeDb();
|
|
191
|
-
await createPasswordReset(db, ' ', TEST_CONFIG);
|
|
192
|
-
expect(db.user.findFirst).not.toHaveBeenCalled();
|
|
193
|
-
});
|
|
194
|
-
it('skips email send gracefully when no email adapter is configured', async () => {
|
|
195
|
-
const db = createFakeDb({
|
|
196
|
-
users: [
|
|
197
|
-
{
|
|
198
|
-
id: 'u_1',
|
|
199
|
-
email: 'a@example.com',
|
|
200
|
-
name: 'A',
|
|
201
|
-
isActive: true,
|
|
202
|
-
passwordHash: null,
|
|
203
|
-
},
|
|
204
|
-
],
|
|
205
|
-
});
|
|
206
|
-
await createPasswordReset(db, 'a@example.com', { siteUrl: 'https://e.com' });
|
|
207
|
-
expect(db.passwordResetToken.create).toHaveBeenCalledOnce();
|
|
208
|
-
expect(TEST_CONFIG.platform.email.send).not.toHaveBeenCalled();
|
|
209
|
-
});
|
|
210
|
-
it('builds the reset link from the configured admin path (not a hardcoded /admin)', async () => {
|
|
211
|
-
const db = createFakeDb({
|
|
212
|
-
users: [{ id: 'u_1', email: 'a@example.com', name: 'A', isActive: true, passwordHash: null }],
|
|
213
|
-
});
|
|
214
|
-
await createPasswordReset(db, 'a@example.com', {
|
|
215
|
-
siteUrl: 'https://example.com/',
|
|
216
|
-
adminPath: '/securelogin',
|
|
217
|
-
platform: TEST_CONFIG.platform,
|
|
218
|
-
});
|
|
219
|
-
const sent = TEST_CONFIG.platform.email.send.mock.calls[0][0];
|
|
220
|
-
expect(sent.html).toContain('https://example.com/securelogin/reset-password?token=');
|
|
221
|
-
expect(sent.html).not.toContain('//securelogin');
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
// ─── Registered email sender fallback ───────────────────────────────────
|
|
225
|
-
//
|
|
226
|
-
// Regression: createPasswordReset previously only sent when an explicit
|
|
227
|
-
// `platform.email` adapter was passed. Apps that configure email purely via
|
|
228
|
-
// `emailPlugin()` (the common case) register a sender through the core email
|
|
229
|
-
// registry instead, so the reset flow must fall back to it.
|
|
230
|
-
describe('createPasswordReset — registered sender fallback', () => {
|
|
231
|
-
afterEach(() => {
|
|
232
|
-
setEmailSender(null);
|
|
233
|
-
});
|
|
234
|
-
it('sends via the registered sender when no platform adapter is passed', async () => {
|
|
235
|
-
const send = vi.fn(async (_o) => { });
|
|
236
|
-
setEmailSender({ send });
|
|
237
|
-
const db = createFakeDb({
|
|
238
|
-
users: [{ id: 'u_1', email: 'a@example.com', name: 'A', isActive: true, passwordHash: null }],
|
|
239
|
-
});
|
|
240
|
-
await createPasswordReset(db, 'a@example.com', { siteUrl: 'https://e.com' });
|
|
241
|
-
expect(db.passwordResetToken.create).toHaveBeenCalledOnce();
|
|
242
|
-
expect(send).toHaveBeenCalledOnce();
|
|
243
|
-
const sent = send.mock.calls[0][0];
|
|
244
|
-
expect(sent.to).toBe('a@example.com');
|
|
245
|
-
expect(sent.html).toContain('/admin/reset-password?token=');
|
|
246
|
-
});
|
|
247
|
-
it('prefers an explicit platform adapter over the registered sender', async () => {
|
|
248
|
-
const registered = vi.fn(async (_o) => { });
|
|
249
|
-
setEmailSender({ send: registered });
|
|
250
|
-
const db = createFakeDb({
|
|
251
|
-
users: [{ id: 'u_1', email: 'a@example.com', name: 'A', isActive: true, passwordHash: null }],
|
|
252
|
-
});
|
|
253
|
-
await createPasswordReset(db, 'a@example.com', {
|
|
254
|
-
siteUrl: 'https://e.com',
|
|
255
|
-
platform: TEST_CONFIG.platform,
|
|
256
|
-
});
|
|
257
|
-
expect(TEST_CONFIG.platform.email.send).toHaveBeenCalledOnce();
|
|
258
|
-
expect(registered).not.toHaveBeenCalled();
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
// ─── executePasswordReset (consume flow) ────────────────────────────────
|
|
262
|
-
describe('executePasswordReset', () => {
|
|
263
|
-
function seedDbWithToken(opts = {}) {
|
|
264
|
-
const raw = '0'.repeat(64);
|
|
265
|
-
const db = createFakeDb({
|
|
266
|
-
users: [
|
|
267
|
-
{
|
|
268
|
-
id: 'u_1',
|
|
269
|
-
email: 'a@example.com',
|
|
270
|
-
name: 'A',
|
|
271
|
-
isActive: opts.isActive ?? true,
|
|
272
|
-
passwordHash: null,
|
|
273
|
-
},
|
|
274
|
-
],
|
|
275
|
-
sessions: [
|
|
276
|
-
{ id: 's_active', userId: 'u_1', revokedAt: null },
|
|
277
|
-
{ id: 's_other', userId: 'u_1', revokedAt: null },
|
|
278
|
-
],
|
|
279
|
-
});
|
|
280
|
-
const t = {
|
|
281
|
-
id: 'rt_1',
|
|
282
|
-
userId: 'u_1',
|
|
283
|
-
tokenHash: hashToken(raw),
|
|
284
|
-
expiresAt: opts.expiresAt ?? new Date(Date.now() + 30 * 60 * 1000),
|
|
285
|
-
usedAt: opts.usedAt ?? null,
|
|
286
|
-
user: db.users[0],
|
|
287
|
-
};
|
|
288
|
-
db.tokens.push(t);
|
|
289
|
-
return { db, raw };
|
|
290
|
-
}
|
|
291
|
-
it('rejects an unknown token without leaking which user it belonged to', async () => {
|
|
292
|
-
const { db } = seedDbWithToken();
|
|
293
|
-
const result = await executePasswordReset(db, 'a-token-that-does-not-exist', 'P@ssword1234');
|
|
294
|
-
expect(result.success).toBe(false);
|
|
295
|
-
expect(result.error).toBe('Invalid or expired reset link.');
|
|
296
|
-
expect(db.user.update).not.toHaveBeenCalled();
|
|
297
|
-
});
|
|
298
|
-
it('rejects an expired token', async () => {
|
|
299
|
-
const { db, raw } = seedDbWithToken({
|
|
300
|
-
expiresAt: new Date(Date.now() - 60 * 1000),
|
|
301
|
-
});
|
|
302
|
-
const result = await executePasswordReset(db, raw, 'P@ssword1234');
|
|
303
|
-
expect(result.success).toBe(false);
|
|
304
|
-
expect(result.error).toMatch(/expired/i);
|
|
305
|
-
expect(db.user.update).not.toHaveBeenCalled();
|
|
306
|
-
});
|
|
307
|
-
it('rejects a token that has already been used (single-use)', async () => {
|
|
308
|
-
const { db, raw } = seedDbWithToken({ usedAt: new Date(Date.now() - 1000) });
|
|
309
|
-
const result = await executePasswordReset(db, raw, 'P@ssword1234');
|
|
310
|
-
expect(result.success).toBe(false);
|
|
311
|
-
// The "usedAt: null" filter means the token isn't found -> generic error.
|
|
312
|
-
expect(result.error).toBe('Invalid or expired reset link.');
|
|
313
|
-
});
|
|
314
|
-
it('rejects when the underlying user is deactivated', async () => {
|
|
315
|
-
const { db, raw } = seedDbWithToken({ isActive: false });
|
|
316
|
-
const result = await executePasswordReset(db, raw, 'P@ssword1234');
|
|
317
|
-
expect(result.success).toBe(false);
|
|
318
|
-
expect(result.error).toMatch(/deactivated/i);
|
|
319
|
-
});
|
|
320
|
-
it('rejects passwords that do not meet the default policy', async () => {
|
|
321
|
-
const { db, raw } = seedDbWithToken();
|
|
322
|
-
const tooShort = await executePasswordReset(db, raw, 'short1A');
|
|
323
|
-
expect(tooShort.success).toBe(false);
|
|
324
|
-
const noUpper = await executePasswordReset(db, raw, 'lowercase-only-1234');
|
|
325
|
-
expect(noUpper.success).toBe(false);
|
|
326
|
-
const noNumber = await executePasswordReset(db, raw, 'NoNumbersAtAll!');
|
|
327
|
-
expect(noNumber.success).toBe(false);
|
|
328
|
-
});
|
|
329
|
-
it('updates the password, marks the token used, and revokes all sessions atomically', async () => {
|
|
330
|
-
const { db, raw } = seedDbWithToken();
|
|
331
|
-
const result = await executePasswordReset(db, raw, 'F#reshPassword2026!');
|
|
332
|
-
expect(result.success).toBe(true);
|
|
333
|
-
expect(db.$transaction).toHaveBeenCalledOnce();
|
|
334
|
-
// 1. Password hash was updated
|
|
335
|
-
const user = db.users[0];
|
|
336
|
-
expect(user.passwordHash).toBeTruthy();
|
|
337
|
-
expect(user.passwordHash).toMatch(/^pbkdf2:/);
|
|
338
|
-
// 2. New password actually verifies against the stored hash
|
|
339
|
-
expect(await verifyPassword('F#reshPassword2026!', user.passwordHash)).toBe(true);
|
|
340
|
-
// 3. Token is marked used (single-use enforced for replay attempts)
|
|
341
|
-
const t = db.tokens[0];
|
|
342
|
-
expect(t.usedAt).toBeInstanceOf(Date);
|
|
343
|
-
// 4. All non-revoked sessions revoked
|
|
344
|
-
expect(db.sessions.every((s) => s.revokedAt !== null)).toBe(true);
|
|
345
|
-
});
|
|
346
|
-
it('a second use of the same token after a successful reset is rejected', async () => {
|
|
347
|
-
const { db, raw } = seedDbWithToken();
|
|
348
|
-
const first = await executePasswordReset(db, raw, 'F#reshPassword2026!');
|
|
349
|
-
expect(first.success).toBe(true);
|
|
350
|
-
const second = await executePasswordReset(db, raw, 'AnotherV@lidPwd2026!');
|
|
351
|
-
expect(second.success).toBe(false);
|
|
352
|
-
expect(second.error).toBe('Invalid or expired reset link.');
|
|
353
|
-
});
|
|
354
|
-
});
|
|
355
|
-
//# sourceMappingURL=reset.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reset.test.js","sourceRoot":"","sources":["../../../src/__tests__/auth/reset.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACxE,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AA0BtD,SAAS,YAAY,CAAC,UAA4D,EAAE;IAClF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAA;IACjC,MAAM,MAAM,GAAqB,EAAE,CAAA;IACnC,MAAM,QAAQ,GAAkB,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAA;IACtD,MAAM,UAAU,GAA2C,EAAE,CAAA;IAE7D,MAAM,EAAE,GAAG;QACT,KAAK;QACL,MAAM;QACN,QAAQ;QACR,UAAU;QACV,IAAI,EAAE;YACJ,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAO,EAAE,EAAE;gBACxC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;gBAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAA;YACpE,CAAC,CAAC;YACF,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAO,EAAE,EAAE;gBAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAA;gBAC9C,IAAI,CAAC;oBAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;gBAC7B,OAAO,CAAE,CAAA;YACX,CAAC,CAAC;SACH;QACD,kBAAkB,EAAE;YAClB,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAO,EAAE,EAAE;gBACxC,OAAO,CACL,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CACzF,CAAA;YACH,CAAC,CAAC;YACF,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,EAAO,EAAE,EAAE;gBACpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,CAAE,CAAA;gBACrD,MAAM,CAAC,GAAmB;oBACxB,EAAE,EAAE,MAAM,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,MAAM,EAAE,IAAI;oBACZ,IAAI;iBACL,CAAA;gBACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACd,OAAO,CAAC,CAAA;YACV,CAAC,CAAC;YACF,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAO,EAAE,EAAE;gBAC3C,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAA;gBAC/C,IAAI,CAAC;oBAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;gBAC7B,OAAO,CAAE,CAAA;YACX,CAAC,CAAC;YACF,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAO,EAAE,EAAE;gBAC/C,IAAI,KAAK,GAAG,CAAC,CAAA;gBACb,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;wBAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;wBACtB,KAAK,EAAE,CAAA;oBACT,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,CAAA;YAClB,CAAC,CAAC;SACH;QACD,OAAO,EAAE;YACP,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAO,EAAE,EAAE;gBAC/C,IAAI,KAAK,GAAG,CAAC,CAAA;gBACb,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;oBACzB,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;wBACjE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;wBACtB,KAAK,EAAE,CAAA;oBACT,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,CAAA;YAClB,CAAC,CAAC;SACH;QACD,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAuB,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KACzE,CAAA;IACD,2EAA2E;IAC3E,OAAO,EAA2B,CAAA;AACpC,CAAC;AAED,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,qBAAqB;IAC9B,QAAQ,EAAE;QACR,KAAK,EAAE;YACL,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;SACd;KACF;CACF,CAAA;AAED,UAAU,CAAC,GAAG,EAAE;IACd,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;AAC7C,CAAC,CAAC,CAAA;AAEF,2EAA2E;AAE3E,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAA;QAC9B,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAA;QAC9B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACrC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QAChF,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,2EAA2E;AAE3E,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,EAAE,GAAG,YAAY,EAAE,CAAA;QACzB,MAAM,MAAM,CACV,mBAAmB,CAAC,EAAE,EAAE,qBAAqB,EAAE,WAAW,CAAC,CAC5D,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAA;QAC1B,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QAC3D,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,EAAE,GAAG,YAAY,CAAC;YACtB,KAAK,EAAE;gBACL;oBACE,EAAE,EAAE,OAAO;oBACX,KAAK,EAAE,iBAAiB;oBACxB,IAAI,EAAE,KAAK;oBACX,QAAQ,EAAE,KAAK;oBACf,YAAY,EAAE,mBAAmB;iBAClC;aACF;SACF,CAAC,CAAA;QACF,MAAM,mBAAmB,CAAC,EAAE,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAA;QAC7D,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QAC3D,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,EAAE,GAAG,YAAY,CAAC;YACtB,KAAK,EAAE;gBACL;oBACE,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,eAAe;oBACtB,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,IAAI;oBACd,YAAY,EAAE,mBAAmB;iBAClC;aACF;SACF,CAAC,CAAA;QACF,MAAM,mBAAmB,CAAC,EAAE,EAAE,eAAe,EAAE,WAAW,CAAC,CAAA;QAC3D,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC;YAC5D,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;YACtC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;SACnC,CAAC,CAAA;QACF,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,CAAA;QAC3D,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,oBAAoB,EAAE,CAAA;QAE9D,MAAM,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAE,CAAA;QACjC,8CAA8C;QAC9C,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;QACvD,4CAA4C;QAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;QAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,KAAK,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,EAAE,GAAG,YAAY,CAAC;YACtB,KAAK,EAAE;gBACL;oBACE,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,eAAe;oBACtB,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,IAAI;oBACd,YAAY,EAAE,IAAI;iBACnB;aACF;SACF,CAAC,CAAA;QACF,MAAM,mBAAmB,CAAC,EAAE,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAA;QAC7D,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAA;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC/D,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAA;QAChC,MAAM,CAAC,SAAS,CAAC,UAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,EAAE,GAAG,YAAY,CAAC;YACtB,KAAK,EAAE;gBACL;oBACE,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,eAAe;oBACtB,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,IAAI;oBACd,YAAY,EAAE,IAAI;iBACnB;aACF;SACF,CAAC,CAAA;QACF,MAAM,mBAAmB,CAAC,EAAE,EAAE,kBAAkB,EAAE,WAAW,CAAC,CAAA;QAC9D,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,GAAG,YAAY,EAAE,CAAA;QACzB,MAAM,mBAAmB,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAA;QACjD,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,EAAE,GAAG,YAAY,CAAC;YACtB,KAAK,EAAE;gBACL;oBACE,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,eAAe;oBACtB,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,IAAI;oBACd,YAAY,EAAE,IAAI;iBACnB;aACF;SACF,CAAC,CAAA;QACF,MAAM,mBAAmB,CAAC,EAAE,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAA;QAC5E,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,CAAA;QAC3D,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,EAAE,GAAG,YAAY,CAAC;YACtB,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;SAC9F,CAAC,CAAA;QACF,MAAM,mBAAmB,CAAC,EAAE,EAAE,eAAe,EAAE;YAC7C,OAAO,EAAE,sBAAsB;YAC/B,SAAS,EAAE,cAAc;YACzB,QAAQ,EAAE,WAAW,CAAC,QAAQ;SAC/B,CAAC,CAAA;QACF,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAA;QAC/D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uDAAuD,CAAC,CAAA;QACpF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,2EAA2E;AAC3E,EAAE;AACF,wEAAwE;AACxE,4EAA4E;AAC5E,6EAA6E;AAC7E,4DAA4D;AAE5D,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,SAAS,CAAC,GAAG,EAAE;QACb,cAAc,CAAC,IAAI,CAAC,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,CAChB,KAAK,EAAE,EAAgE,EAAE,EAAE,GAAE,CAAC,CAC/E,CAAA;QACD,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;QACxB,MAAM,EAAE,GAAG,YAAY,CAAC;YACtB,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;SAC9F,CAAC,CAAA;QAEF,MAAM,mBAAmB,CAAC,EAAE,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAA;QAE5E,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,CAAA;QAC3D,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,EAAE,CAAA;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAA;QACnC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,CACtB,KAAK,EAAE,EAAgE,EAAE,EAAE,GAAE,CAAC,CAC/E,CAAA;QACD,cAAc,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;QACpC,MAAM,EAAE,GAAG,YAAY,CAAC;YACtB,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;SAC9F,CAAC,CAAA;QAEF,MAAM,mBAAmB,CAAC,EAAE,EAAE,eAAe,EAAE;YAC7C,OAAO,EAAE,eAAe;YACxB,QAAQ,EAAE,WAAW,CAAC,QAAQ;SAC/B,CAAC,CAAA;QAEF,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,oBAAoB,EAAE,CAAA;QAC9D,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,2EAA2E;AAE3E,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,SAAS,eAAe,CACtB,OAII,EAAE;QAEN,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC1B,MAAM,EAAE,GAAG,YAAY,CAAC;YACtB,KAAK,EAAE;gBACL;oBACE,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,eAAe;oBACtB,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;oBAC/B,YAAY,EAAE,IAAI;iBACnB;aACF;YACD,QAAQ,EAAE;gBACR,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE;gBAClD,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE;aAClD;SACF,CAAC,CAAA;QACF,MAAM,CAAC,GAAmB;YACxB,EAAE,EAAE,MAAM;YACV,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YAClE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;YAC3B,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE;SACnB,CAAA;QACD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAAA;IACpB,CAAC;IAED,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,EAAE,EAAE,EAAE,GAAG,eAAe,EAAE,CAAA;QAChC,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,6BAA6B,EAAE,cAAc,CAAC,CAAA;QAC5F,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;QAC3D,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,eAAe,CAAC;YAClC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;SAC5C,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,cAAc,CAAC,CAAA;QAClE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACxC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;QAC5E,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,cAAc,CAAC,CAAA;QAClE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,0EAA0E;QAC1E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;QACxD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,cAAc,CAAC,CAAA;QAClE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,eAAe,EAAE,CAAA;QACrC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;QAC/D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAEpC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAA;QAC1E,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAEnC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAA;QACvE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,eAAe,EAAE,CAAA;QACrC,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAA;QACzE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,oBAAoB,EAAE,CAAA;QAE9C,+BAA+B;QAC/B,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,CAAA;QACzB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAA;QACtC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC7C,4DAA4D;QAC5D,MAAM,CAAC,MAAM,cAAc,CAAC,qBAAqB,EAAE,IAAI,CAAC,YAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClF,oEAAoE;QACpE,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAE,CAAA;QACvB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QACrC,sCAAsC;QACtC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,eAAe,EAAE,CAAA;QACrC,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAA;QACxE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChC,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,sBAAsB,CAAC,CAAA;QAC1E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"roles.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/auth/roles.test.ts"],"names":[],"mappings":""}
|