@omega.js/backend 0.1.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/LICENSE +98 -0
- package/README.md +1053 -0
- package/bin/omega +2 -0
- package/bin/omega-backend +2 -0
- package/bin/omg +2 -0
- package/cli.js +3 -0
- package/dist/cli/command-table.js +268 -0
- package/dist/cli/commands/auth.js +259 -0
- package/dist/cli/commands/base-command.js +451 -0
- package/dist/cli/commands/build.js +27 -0
- package/dist/cli/commands/clean.js +13 -0
- package/dist/cli/commands/clear.js +11 -0
- package/dist/cli/commands/cwd.js +9 -0
- package/dist/cli/commands/deploy.js +205 -0
- package/dist/cli/commands/emulator-orphans.js +440 -0
- package/dist/cli/commands/emulator.js +1829 -0
- package/dist/cli/commands/firebase-init.js +101 -0
- package/dist/cli/commands/firestore.js +261 -0
- package/dist/cli/commands/indexes.js +51 -0
- package/dist/cli/commands/install.js +151 -0
- package/dist/cli/commands/logs.js +358 -0
- package/dist/cli/commands/mcp.js +41 -0
- package/dist/cli/commands/migrate-markers.js +176 -0
- package/dist/cli/commands/migrate-rules.js +90 -0
- package/dist/cli/commands/migrate.js +59 -0
- package/dist/cli/commands/serve.js +208 -0
- package/dist/cli/commands/setup-tests/base-test.js +174 -0
- package/dist/cli/commands/setup-tests/emulator-config.js +109 -0
- package/dist/cli/commands/setup-tests/env-runtime-config-deprecated.js +47 -0
- package/dist/cli/commands/setup-tests/firebase-admin.js +49 -0
- package/dist/cli/commands/setup-tests/firebase-auth.js +26 -0
- package/dist/cli/commands/setup-tests/firebase-cli.js +26 -0
- package/dist/cli/commands/setup-tests/firebase-functions.js +49 -0
- package/dist/cli/commands/setup-tests/firestore-indexes-file.js +72 -0
- package/dist/cli/commands/setup-tests/firestore-indexes-in-json.js +20 -0
- package/dist/cli/commands/setup-tests/firestore-indexes-required.js +108 -0
- package/dist/cli/commands/setup-tests/firestore-indexes-synced.js +236 -0
- package/dist/cli/commands/setup-tests/firestore-rules-file.js +115 -0
- package/dist/cli/commands/setup-tests/firestore-rules-in-json.js +49 -0
- package/dist/cli/commands/setup-tests/functions-package.js +44 -0
- package/dist/cli/commands/setup-tests/gcloud-cli.js +26 -0
- package/dist/cli/commands/setup-tests/gitignore.js +122 -0
- package/dist/cli/commands/setup-tests/helpers/merge-line-files.js +28 -0
- package/dist/cli/commands/setup-tests/helpers/required-indexes.js +109 -0
- package/dist/cli/commands/setup-tests/helpers/seed-campaigns.js +246 -0
- package/dist/cli/commands/setup-tests/helpers.js +72 -0
- package/dist/cli/commands/setup-tests/hosting-folder.js +23 -0
- package/dist/cli/commands/setup-tests/hosting-rewrites.js +52 -0
- package/dist/cli/commands/setup-tests/index.js +111 -0
- package/dist/cli/commands/setup-tests/is-firebase-project.js +21 -0
- package/dist/cli/commands/setup-tests/java-installed.js +27 -0
- package/dist/cli/commands/setup-tests/legacy-tests-cleanup.js +43 -0
- package/dist/cli/commands/setup-tests/marketing-campaigns-seeded.js +230 -0
- package/dist/cli/commands/setup-tests/node-version.js +60 -0
- package/dist/cli/commands/setup-tests/npm-project-scripts.js +42 -0
- package/dist/cli/commands/setup-tests/nvmrc-version.js +36 -0
- package/dist/cli/commands/setup-tests/omega-backend.js +42 -0
- package/dist/cli/commands/setup-tests/omega-config.js +84 -0
- package/dist/cli/commands/setup-tests/project-directories.js +34 -0
- package/dist/cli/commands/setup-tests/project-id-consistency.js +201 -0
- package/dist/cli/commands/setup-tests/public-html-files.js +22 -0
- package/dist/cli/commands/setup-tests/realtime-rules-file.js +69 -0
- package/dist/cli/commands/setup-tests/realtime-rules-in-json.js +20 -0
- package/dist/cli/commands/setup-tests/remoteconfig-template-file.js +32 -0
- package/dist/cli/commands/setup-tests/remoteconfig-template-in-json.js +31 -0
- package/dist/cli/commands/setup-tests/service-account.js +86 -0
- package/dist/cli/commands/setup-tests/storage-lifecycle-policy.js +81 -0
- package/dist/cli/commands/setup-tests/storage-rules-file.js +32 -0
- package/dist/cli/commands/setup-tests/storage-rules-in-json.js +20 -0
- package/dist/cli/commands/stripe.js +14 -0
- package/dist/cli/commands/test-lanes/stripe-live.js +440 -0
- package/dist/cli/commands/test.js +976 -0
- package/dist/cli/commands/update.js +27 -0
- package/dist/cli/commands/version.js +10 -0
- package/dist/cli/commands/watch.js +196 -0
- package/dist/cli/flags.js +13 -0
- package/dist/cli/index.js +173 -0
- package/dist/cli/run.js +33 -0
- package/dist/cli/utils/attach-log-file.js +4 -0
- package/dist/cli/utils/compile-rules.js +1155 -0
- package/dist/cli/utils/ensure-target.js +314 -0
- package/dist/cli/utils/project-type.js +140 -0
- package/dist/cli/utils/public-files.js +49 -0
- package/dist/cli/utils/safe-install.js +4 -0
- package/dist/cli/utils/spawn-shell.js +94 -0
- package/dist/cli/utils/stage-functions.js +338 -0
- package/dist/cli/utils/stage-local-packages.js +210 -0
- package/dist/cli/utils/target-checks.js +161 -0
- package/dist/cli/utils/target.js +24 -0
- package/dist/cli/utils/ui.js +292 -0
- package/dist/defaults/AGENTS.md +125 -0
- package/dist/defaults/CHANGELOG.md +15 -0
- package/dist/defaults/CLAUDE.md +1 -0
- package/dist/defaults/_.gitignore +65 -0
- package/dist/defaults/docs/README.md +17 -0
- package/dist/defaults/test/README.md +65 -0
- package/dist/defaults/test/_init.js +14 -0
- package/dist/defaults/test/helpers/connect-trap.js +72 -0
- package/dist/defaults/test/unit/registration.test.js +143 -0
- package/dist/defaults/test/unit/rules-posture.test.js +101 -0
- package/dist/defaults/test/unit/socket-free.test.js +43 -0
- package/dist/manager/events/auth/before-create.js +89 -0
- package/dist/manager/events/auth/before-signin.js +76 -0
- package/dist/manager/events/auth/on-create.js +112 -0
- package/dist/manager/events/auth/on-delete.js +141 -0
- package/dist/manager/events/auth/utils.js +93 -0
- package/dist/manager/events/cron/daily/blog-auto-publisher.js +287 -0
- package/dist/manager/events/cron/daily/data-requests.js +57 -0
- package/dist/manager/events/cron/daily/expire-paypal-cancellations.js +191 -0
- package/dist/manager/events/cron/daily/marketing-prune.js +486 -0
- package/dist/manager/events/cron/daily/reset-usage.js +188 -0
- package/dist/manager/events/cron/daily/trial-lapse-sweep.js +355 -0
- package/dist/manager/events/cron/daily.js +3 -0
- package/dist/manager/events/cron/frequent/abandoned-carts.js +204 -0
- package/dist/manager/events/cron/frequent/email-queue.js +71 -0
- package/dist/manager/events/cron/frequent/marketing-campaigns.js +463 -0
- package/dist/manager/events/cron/frequent/retry-failed-webhooks.js +70 -0
- package/dist/manager/events/cron/frequent.js +3 -0
- package/dist/manager/events/cron/runner.js +64 -0
- package/dist/manager/events/firestore/notifications/on-write.js +123 -0
- package/dist/manager/events/firestore/payments-disputes/on-write.js +256 -0
- package/dist/manager/events/firestore/payments-disputes/providers/stripe.js +218 -0
- package/dist/manager/events/firestore/payments-disputes/providers/test.js +231 -0
- package/dist/manager/events/firestore/payments-webhooks/analytics.js +687 -0
- package/dist/manager/events/firestore/payments-webhooks/on-write.js +1224 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/index.js +395 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/one-time/purchase-completed.js +58 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/one-time/purchase-failed.js +28 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/one-time/purchase-refunded.js +30 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/send-email.js +74 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/cancellation-removed.js +14 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/cancellation-requested.js +28 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/checkout-declined.js +18 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/new-subscription.js +67 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/payment-failed.js +25 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/payment-recovered.js +26 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/payment-refunded.js +34 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/plan-changed.js +42 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/subscription-cancelled.js +33 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/subscription-winback.js +17 -0
- package/dist/manager/functions/_legacy/actions/create-post-handler.js +188 -0
- package/dist/manager/functions/_legacy/actions/generate-uuid.js +63 -0
- package/dist/manager/functions/_legacy/actions/sign-up-handler.js +205 -0
- package/dist/manager/functions/_legacy/admin/create-post.js +207 -0
- package/dist/manager/functions/_legacy/admin/firestore-write.js +72 -0
- package/dist/manager/functions/_legacy/admin/get-stats.js +218 -0
- package/dist/manager/functions/_legacy/admin/query.js +198 -0
- package/dist/manager/functions/_legacy/admin/send-notification.js +206 -0
- package/dist/manager/functions/_legacy/template.js +33 -0
- package/dist/manager/functions/_legacy/test/authenticate.js +40 -0
- package/dist/manager/functions/_legacy/test/webhook.js +37 -0
- package/dist/manager/functions/wrappers/mailchimp/addToList.js +25 -0
- package/dist/manager/helpers/analytics.js +498 -0
- package/dist/manager/helpers/api-manager.js +313 -0
- package/dist/manager/helpers/backend-router.js +37 -0
- package/dist/manager/helpers/context/authenticate.js +215 -0
- package/dist/manager/helpers/context/client-info.js +91 -0
- package/dist/manager/helpers/context/index.js +228 -0
- package/dist/manager/helpers/context/logging.js +150 -0
- package/dist/manager/helpers/context/parse.js +160 -0
- package/dist/manager/helpers/context/respond.js +247 -0
- package/dist/manager/helpers/event-middleware.js +109 -0
- package/dist/manager/helpers/metadata.js +32 -0
- package/dist/manager/helpers/middleware.js +541 -0
- package/dist/manager/helpers/redact-secret.js +25 -0
- package/dist/manager/helpers/resolved-config.js +34 -0
- package/dist/manager/helpers/roles.js +69 -0
- package/dist/manager/helpers/safe-compare.js +31 -0
- package/dist/manager/helpers/schema-engine.js +314 -0
- package/dist/manager/helpers/schema-zod.js +203 -0
- package/dist/manager/helpers/settings.js +215 -0
- package/dist/manager/helpers/usage.js +541 -0
- package/dist/manager/helpers/user.js +57 -0
- package/dist/manager/helpers/utilities.js +565 -0
- package/dist/manager/index.js +1404 -0
- package/dist/manager/libraries/abandoned-cart-config.js +12 -0
- package/dist/manager/libraries/ai/index.js +321 -0
- package/dist/manager/libraries/ai/prompt.js +85 -0
- package/dist/manager/libraries/ai/providers/anthropic-format.js +297 -0
- package/dist/manager/libraries/ai/providers/anthropic.js +169 -0
- package/dist/manager/libraries/ai/providers/claude-code.js +183 -0
- package/dist/manager/libraries/ai/providers/openai.js +1272 -0
- package/dist/manager/libraries/ai/providers/test.js +257 -0
- package/dist/manager/libraries/ai/tokens.js +54 -0
- package/dist/manager/libraries/analytics/conversions.js +478 -0
- package/dist/manager/libraries/analytics/match-data.js +573 -0
- package/dist/manager/libraries/analytics/signup.js +120 -0
- package/dist/manager/libraries/auth-user.js +46 -0
- package/dist/manager/libraries/content/feed-parser.js +198 -0
- package/dist/manager/libraries/content/ghostii.js +191 -0
- package/dist/manager/libraries/content/source-resolver.js +629 -0
- package/dist/manager/libraries/email/constants.js +532 -0
- package/dist/manager/libraries/email/data/blocked-local-parts.json +55 -0
- package/dist/manager/libraries/email/data/blocked-local-patterns.js +14 -0
- package/dist/manager/libraries/email/data/corporate-domains.json +23 -0
- package/dist/manager/libraries/email/data/custom-disposable-domains.json +58 -0
- package/dist/manager/libraries/email/data/disposable-domains.json +8184 -0
- package/dist/manager/libraries/email/data/typo-domains.js +83 -0
- package/dist/manager/libraries/email/disposable-domains.js +92 -0
- package/dist/manager/libraries/email/generators/lib/filter.js +179 -0
- package/dist/manager/libraries/email/generators/lib/image-host.js +344 -0
- package/dist/manager/libraries/email/generators/lib/image-illustrator.js +154 -0
- package/dist/manager/libraries/email/generators/lib/markdown-renderer.js +294 -0
- package/dist/manager/libraries/email/generators/lib/mjml-template.js +120 -0
- package/dist/manager/libraries/email/generators/lib/structure.js +299 -0
- package/dist/manager/libraries/email/generators/lib/svg-illustrator.js +197 -0
- package/dist/manager/libraries/email/generators/lib/templates/base.js +229 -0
- package/dist/manager/libraries/email/generators/lib/templates/card.js +33 -0
- package/dist/manager/libraries/email/generators/lib/templates/classic-schema.js +59 -0
- package/dist/manager/libraries/email/generators/lib/templates/clean.js +82 -0
- package/dist/manager/libraries/email/generators/lib/templates/editorial/helpers.js +100 -0
- package/dist/manager/libraries/email/generators/lib/templates/editorial/index.js +318 -0
- package/dist/manager/libraries/email/generators/lib/templates/feedback.js +101 -0
- package/dist/manager/libraries/email/generators/lib/templates/field-report/helpers.js +138 -0
- package/dist/manager/libraries/email/generators/lib/templates/field-report/index.js +494 -0
- package/dist/manager/libraries/email/generators/lib/templates/index.js +47 -0
- package/dist/manager/libraries/email/generators/lib/templates/newsletter-shared.js +610 -0
- package/dist/manager/libraries/email/generators/lib/templates/order.js +461 -0
- package/dist/manager/libraries/email/generators/lib/templates/plain.js +83 -0
- package/dist/manager/libraries/email/generators/lib/templates/shared-campaign.js +64 -0
- package/dist/manager/libraries/email/generators/newsletter.js +899 -0
- package/dist/manager/libraries/email/index.js +146 -0
- package/dist/manager/libraries/email/marketing/index.js +754 -0
- package/dist/manager/libraries/email/prepare.js +365 -0
- package/dist/manager/libraries/email/providers/beehiiv.js +589 -0
- package/dist/manager/libraries/email/providers/sendgrid.js +845 -0
- package/dist/manager/libraries/email/transactional/index.js +510 -0
- package/dist/manager/libraries/email/utm.js +86 -0
- package/dist/manager/libraries/email/validation-provider-neverbounce.js +70 -0
- package/dist/manager/libraries/email/validation-provider-zerobounce.js +42 -0
- package/dist/manager/libraries/email/validation.js +255 -0
- package/dist/manager/libraries/env.js +198 -0
- package/dist/manager/libraries/infer-contact.js +101 -0
- package/dist/manager/libraries/load-provider.js +65 -0
- package/dist/manager/libraries/notification.js +256 -0
- package/dist/manager/libraries/openai.js +13 -0
- package/dist/manager/libraries/payment/discount-codes.js +204 -0
- package/dist/manager/libraries/payment/fetch-failure.js +56 -0
- package/dist/manager/libraries/payment/license.js +44 -0
- package/dist/manager/libraries/payment/order-id.js +57 -0
- package/dist/manager/libraries/payment/provider-errors.js +71 -0
- package/dist/manager/libraries/payment/providers/chargebee.js +817 -0
- package/dist/manager/libraries/payment/providers/coinbase.js +330 -0
- package/dist/manager/libraries/payment/providers/paypal.js +987 -0
- package/dist/manager/libraries/payment/providers/stripe.js +755 -0
- package/dist/manager/libraries/payment/providers/test.js +250 -0
- package/dist/manager/libraries/payment/refund-linkage.js +78 -0
- package/dist/manager/libraries/payment/refund-policy.js +113 -0
- package/dist/manager/libraries/payment/winback.js +55 -0
- package/dist/manager/libraries/prompts/infer-contact.md +78 -0
- package/dist/manager/libraries/rate-limits.js +17 -0
- package/dist/manager/libraries/recaptcha.js +58 -0
- package/dist/manager/libraries/user-doc.js +234 -0
- package/dist/manager/routes/admin/backup/post.js +106 -0
- package/dist/manager/routes/admin/cron/post.js +37 -0
- package/dist/manager/routes/admin/database/get.js +35 -0
- package/dist/manager/routes/admin/database/post.js +34 -0
- package/dist/manager/routes/admin/email/post.js +74 -0
- package/dist/manager/routes/admin/firestore/get.js +35 -0
- package/dist/manager/routes/admin/firestore/post.js +56 -0
- package/dist/manager/routes/admin/firestore/query/post.js +128 -0
- package/dist/manager/routes/admin/hook/post.js +104 -0
- package/dist/manager/routes/admin/infer-contact/post.js +35 -0
- package/dist/manager/routes/admin/notification/post.js +37 -0
- package/dist/manager/routes/admin/payment/post.js +56 -0
- package/dist/manager/routes/admin/post/deduplicate-image-alts.js +52 -0
- package/dist/manager/routes/admin/post/dispatch-deploy.js +36 -0
- package/dist/manager/routes/admin/post/post.js +487 -0
- package/dist/manager/routes/admin/post/put.js +146 -0
- package/dist/manager/routes/admin/post/templates/post.html +14 -0
- package/dist/manager/routes/admin/repo/content/post.js +106 -0
- package/dist/manager/routes/admin/stats/get.js +222 -0
- package/dist/manager/routes/admin/users/disable/post.js +50 -0
- package/dist/manager/routes/admin/users/list/get.js +110 -0
- package/dist/manager/routes/admin/users/sync/post.js +119 -0
- package/dist/manager/routes/brand/get.js +26 -0
- package/dist/manager/routes/content/post/get.js +110 -0
- package/dist/manager/routes/general/email/post.js +89 -0
- package/dist/manager/routes/general/email/templates/general/download-app-link.js +42 -0
- package/dist/manager/routes/general/uuid/post.js +31 -0
- package/dist/manager/routes/handler/post/post.js +142 -0
- package/dist/manager/routes/health/get.js +43 -0
- package/dist/manager/routes/index.js +11 -0
- package/dist/manager/routes/marketing/campaign/delete.js +45 -0
- package/dist/manager/routes/marketing/campaign/get.js +69 -0
- package/dist/manager/routes/marketing/campaign/post.js +124 -0
- package/dist/manager/routes/marketing/campaign/put.js +86 -0
- package/dist/manager/routes/marketing/campaign/utils.js +59 -0
- package/dist/manager/routes/marketing/contact/delete.js +100 -0
- package/dist/manager/routes/marketing/contact/post.js +149 -0
- package/dist/manager/routes/marketing/contact/put.js +37 -0
- package/dist/manager/routes/marketing/email-preferences/post.js +275 -0
- package/dist/manager/routes/marketing/webhook/forward/post.js +170 -0
- package/dist/manager/routes/marketing/webhook/post.js +123 -0
- package/dist/manager/routes/marketing/webhook/providers/beehiiv.js +197 -0
- package/dist/manager/routes/marketing/webhook/providers/sendgrid.js +194 -0
- package/dist/manager/routes/payments/cancel/_is-trialing.js +40 -0
- package/dist/manager/routes/payments/cancel/post.js +149 -0
- package/dist/manager/routes/payments/cancel/providers/chargebee.js +41 -0
- package/dist/manager/routes/payments/cancel/providers/paypal.js +56 -0
- package/dist/manager/routes/payments/cancel/providers/stripe.js +33 -0
- package/dist/manager/routes/payments/cancel/providers/test.js +118 -0
- package/dist/manager/routes/payments/discount/get.js +25 -0
- package/dist/manager/routes/payments/dispute-alert/post.js +117 -0
- package/dist/manager/routes/payments/dispute-alert/providers/chargeblast.js +55 -0
- package/dist/manager/routes/payments/intent/post.js +341 -0
- package/dist/manager/routes/payments/intent/providers/chargebee.js +197 -0
- package/dist/manager/routes/payments/intent/providers/coinbase.js +94 -0
- package/dist/manager/routes/payments/intent/providers/paypal.js +244 -0
- package/dist/manager/routes/payments/intent/providers/stripe.js +141 -0
- package/dist/manager/routes/payments/intent/providers/test.js +341 -0
- package/dist/manager/routes/payments/plan/post.js +147 -0
- package/dist/manager/routes/payments/plan/providers/chargebee.js +62 -0
- package/dist/manager/routes/payments/plan/providers/paypal.js +62 -0
- package/dist/manager/routes/payments/plan/providers/stripe.js +59 -0
- package/dist/manager/routes/payments/plan/providers/test.js +113 -0
- package/dist/manager/routes/payments/portal/post.js +113 -0
- package/dist/manager/routes/payments/portal/providers/chargebee.js +62 -0
- package/dist/manager/routes/payments/portal/providers/paypal.js +25 -0
- package/dist/manager/routes/payments/portal/providers/stripe.js +62 -0
- package/dist/manager/routes/payments/portal/providers/test.js +18 -0
- package/dist/manager/routes/payments/refund/post.js +207 -0
- package/dist/manager/routes/payments/refund/providers/chargebee.js +147 -0
- package/dist/manager/routes/payments/refund/providers/coinbase.js +40 -0
- package/dist/manager/routes/payments/refund/providers/paypal.js +239 -0
- package/dist/manager/routes/payments/refund/providers/stripe.js +160 -0
- package/dist/manager/routes/payments/refund/providers/test.js +204 -0
- package/dist/manager/routes/payments/trial-eligibility/get.js +29 -0
- package/dist/manager/routes/payments/uncancel/post.js +106 -0
- package/dist/manager/routes/payments/uncancel/providers/chargebee.js +30 -0
- package/dist/manager/routes/payments/uncancel/providers/paypal.js +25 -0
- package/dist/manager/routes/payments/uncancel/providers/stripe.js +27 -0
- package/dist/manager/routes/payments/uncancel/providers/test.js +114 -0
- package/dist/manager/routes/payments/webhook/post.js +157 -0
- package/dist/manager/routes/payments/webhook/providers/chargebee.js +218 -0
- package/dist/manager/routes/payments/webhook/providers/coinbase.js +91 -0
- package/dist/manager/routes/payments/webhook/providers/paypal.js +214 -0
- package/dist/manager/routes/payments/webhook/providers/stripe.js +182 -0
- package/dist/manager/routes/payments/webhook/providers/test.js +18 -0
- package/dist/manager/routes/payments/winback/post.js +276 -0
- package/dist/manager/routes/payments/winback/providers/chargebee.js +24 -0
- package/dist/manager/routes/payments/winback/providers/paypal.js +22 -0
- package/dist/manager/routes/payments/winback/providers/stripe.js +41 -0
- package/dist/manager/routes/payments/winback/providers/test.js +42 -0
- package/dist/manager/routes/restart/index.js +37 -0
- package/dist/manager/routes/special/electron-client/post.js +59 -0
- package/dist/manager/routes/test/authenticate/get.js +11 -0
- package/dist/manager/routes/test/health/get.js +8 -0
- package/dist/manager/routes/test/index.js +16 -0
- package/dist/manager/routes/test/lab/post.js +17 -0
- package/dist/manager/routes/test/redirect/get.js +27 -0
- package/dist/manager/routes/test/reset-account/post.js +79 -0
- package/dist/manager/routes/test/roster/get.js +40 -0
- package/dist/manager/routes/test/schema/post.js +20 -0
- package/dist/manager/routes/test/usage/post.js +44 -0
- package/dist/manager/routes/test/webhook/post.js +21 -0
- package/dist/manager/routes/user/api-keys/post.js +51 -0
- package/dist/manager/routes/user/connections/_context.js +194 -0
- package/dist/manager/routes/user/connections/_grant.js +247 -0
- package/dist/manager/routes/user/connections/_lease.js +184 -0
- package/dist/manager/routes/user/connections/_providers.js +191 -0
- package/dist/manager/routes/user/connections/_state.js +117 -0
- package/dist/manager/routes/user/connections/delete.js +55 -0
- package/dist/manager/routes/user/connections/get.js +167 -0
- package/dist/manager/routes/user/connections/post.js +370 -0
- package/dist/manager/routes/user/connections/providers/discord.js +41 -0
- package/dist/manager/routes/user/connections/providers/google.js +55 -0
- package/dist/manager/routes/user/connections/providers/kick.js +68 -0
- package/dist/manager/routes/user/connections/providers/spotify.js +40 -0
- package/dist/manager/routes/user/connections/providers/twitch.js +52 -0
- package/dist/manager/routes/user/data-request/delete.js +84 -0
- package/dist/manager/routes/user/data-request/get.js +229 -0
- package/dist/manager/routes/user/data-request/post.js +136 -0
- package/dist/manager/routes/user/delete.js +149 -0
- package/dist/manager/routes/user/feedback/post.js +81 -0
- package/dist/manager/routes/user/get.js +14 -0
- package/dist/manager/routes/user/orders/get.js +95 -0
- package/dist/manager/routes/user/sessions/delete.js +95 -0
- package/dist/manager/routes/user/sessions/get.js +40 -0
- package/dist/manager/routes/user/settings/validate/post.js +86 -0
- package/dist/manager/routes/user/signup/post.js +662 -0
- package/dist/manager/routes/user/subscription/get.js +77 -0
- package/dist/manager/routes/user/token/post.js +30 -0
- package/dist/manager/routes/verts/delete.js +43 -0
- package/dist/manager/routes/verts/get.js +49 -0
- package/dist/manager/routes/verts/post.js +61 -0
- package/dist/manager/routes/verts/put.js +75 -0
- package/dist/manager/routes/verts/redirect/get.js +36 -0
- package/dist/manager/routes/verts/serve/get.js +67 -0
- package/dist/manager/routes/verts/utils.js +436 -0
- package/dist/manager/schemas/admin/backup/post.js +8 -0
- package/dist/manager/schemas/admin/cron/post.js +8 -0
- package/dist/manager/schemas/admin/database/get.js +5 -0
- package/dist/manager/schemas/admin/database/post.js +6 -0
- package/dist/manager/schemas/admin/email/post.js +31 -0
- package/dist/manager/schemas/admin/firestore/get.js +5 -0
- package/dist/manager/schemas/admin/firestore/post.js +8 -0
- package/dist/manager/schemas/admin/firestore/query/post.js +5 -0
- package/dist/manager/schemas/admin/hook/post.js +8 -0
- package/dist/manager/schemas/admin/infer-contact/post.js +6 -0
- package/dist/manager/schemas/admin/notification/post.js +23 -0
- package/dist/manager/schemas/admin/payment/post.js +8 -0
- package/dist/manager/schemas/admin/post/post.js +23 -0
- package/dist/manager/schemas/admin/post/put.js +13 -0
- package/dist/manager/schemas/admin/repo/content/post.js +10 -0
- package/dist/manager/schemas/admin/stats/get.js +5 -0
- package/dist/manager/schemas/admin/users/disable/post.js +9 -0
- package/dist/manager/schemas/admin/users/list/get.js +10 -0
- package/dist/manager/schemas/admin/users/sync/post.js +7 -0
- package/dist/manager/schemas/brand/get.js +3 -0
- package/dist/manager/schemas/content/post/get.js +8 -0
- package/dist/manager/schemas/general/email/post.js +10 -0
- package/dist/manager/schemas/general/uuid/post.js +9 -0
- package/dist/manager/schemas/handler/post/post.js +13 -0
- package/dist/manager/schemas/health/get.js +3 -0
- package/dist/manager/schemas/marketing/campaign/delete.js +8 -0
- package/dist/manager/schemas/marketing/campaign/get.js +13 -0
- package/dist/manager/schemas/marketing/campaign/post.js +43 -0
- package/dist/manager/schemas/marketing/campaign/put.js +37 -0
- package/dist/manager/schemas/marketing/contact/delete.js +8 -0
- package/dist/manager/schemas/marketing/contact/post.js +14 -0
- package/dist/manager/schemas/marketing/contact/put.js +8 -0
- package/dist/manager/schemas/marketing/email-preferences/post.js +15 -0
- package/dist/manager/schemas/marketing/webhook/forward/post.js +8 -0
- package/dist/manager/schemas/marketing/webhook/post.js +7 -0
- package/dist/manager/schemas/payments/cancel/post.js +15 -0
- package/dist/manager/schemas/payments/discount/get.js +8 -0
- package/dist/manager/schemas/payments/dispute-alert/post.js +6 -0
- package/dist/manager/schemas/payments/intent/post.js +28 -0
- package/dist/manager/schemas/payments/plan/post.js +11 -0
- package/dist/manager/schemas/payments/portal/post.js +12 -0
- package/dist/manager/schemas/payments/refund/post.js +14 -0
- package/dist/manager/schemas/payments/trial-eligibility/get.js +7 -0
- package/dist/manager/schemas/payments/uncancel/post.js +9 -0
- package/dist/manager/schemas/payments/webhook/post.js +6 -0
- package/dist/manager/schemas/payments/winback/post.js +12 -0
- package/dist/manager/schemas/restart/index.js +5 -0
- package/dist/manager/schemas/special/electron-client/post.js +11 -0
- package/dist/manager/schemas/test/authenticate/get.js +3 -0
- package/dist/manager/schemas/test/health/get.js +3 -0
- package/dist/manager/schemas/test/index.js +5 -0
- package/dist/manager/schemas/test/lab/post.js +3 -0
- package/dist/manager/schemas/test/redirect/get.js +7 -0
- package/dist/manager/schemas/test/reset-account/post.js +3 -0
- package/dist/manager/schemas/test/roster/get.js +3 -0
- package/dist/manager/schemas/test/schema/post.js +70 -0
- package/dist/manager/schemas/test/usage/post.js +8 -0
- package/dist/manager/schemas/test/webhook/post.js +7 -0
- package/dist/manager/schemas/user/api-keys/post.js +6 -0
- package/dist/manager/schemas/user/connections/delete.js +8 -0
- package/dist/manager/schemas/user/connections/get.js +21 -0
- package/dist/manager/schemas/user/connections/post.js +12 -0
- package/dist/manager/schemas/user/data-request/delete.js +3 -0
- package/dist/manager/schemas/user/data-request/get.js +5 -0
- package/dist/manager/schemas/user/data-request/post.js +6 -0
- package/dist/manager/schemas/user/delete.js +6 -0
- package/dist/manager/schemas/user/feedback/post.js +8 -0
- package/dist/manager/schemas/user/get.js +3 -0
- package/dist/manager/schemas/user/orders/get.js +6 -0
- package/dist/manager/schemas/user/sessions/delete.js +6 -0
- package/dist/manager/schemas/user/sessions/get.js +6 -0
- package/dist/manager/schemas/user/settings/validate/post.js +8 -0
- package/dist/manager/schemas/user/signup/post.js +27 -0
- package/dist/manager/schemas/user/subscription/get.js +5 -0
- package/dist/manager/schemas/user/token/post.js +5 -0
- package/dist/manager/schemas/verts/delete.js +8 -0
- package/dist/manager/schemas/verts/get.js +9 -0
- package/dist/manager/schemas/verts/post.js +23 -0
- package/dist/manager/schemas/verts/put.js +20 -0
- package/dist/manager/schemas/verts/redirect/get.js +10 -0
- package/dist/manager/schemas/verts/serve/get.js +14 -0
- package/dist/manager/server-manager.js +69 -0
- package/dist/mcp/client.js +98 -0
- package/dist/mcp/handler.js +521 -0
- package/dist/mcp/index.js +157 -0
- package/dist/mcp/tools.js +555 -0
- package/dist/mcp/utils.js +108 -0
- package/dist/omega-bin.js +6 -0
- package/dist/require.js +3 -0
- package/dist/test/fixtures/firebase-project/.firebaserc +5 -0
- package/dist/test/fixtures/firebase-project/config/omega.json5 +131 -0
- package/dist/test/fixtures/firebase-project/database.rules.json +6 -0
- package/dist/test/fixtures/firebase-project/firebase.json +49 -0
- package/dist/test/fixtures/firebase-project/firestore.indexes.json +4 -0
- package/dist/test/fixtures/firebase-project/package.json +14 -0
- package/dist/test/fixtures/firebase-project/src/index.js +11 -0
- package/dist/test/fixtures/firebase-project/storage.rules +8 -0
- package/dist/test/parse-audit.js +25 -0
- package/dist/test/run-tests.js +90 -0
- package/dist/test/runner.js +982 -0
- package/dist/test/seed.js +242 -0
- package/dist/test/test-accounts.js +2660 -0
- package/dist/test/utils/assertions.js +189 -0
- package/dist/test/utils/email-capture.js +252 -0
- package/dist/test/utils/extended-mode-warning.js +11 -0
- package/dist/test/utils/firestore-rules-client.js +277 -0
- package/dist/test/utils/http-client.js +228 -0
- package/dist/test/utils/test-mode-file.js +192 -0
- package/dist/utils/merge-line-files.js +6 -0
- package/dist/utils/scaffold-defaults.js +71 -0
- package/dist/utils/test-lanes.js +62 -0
- package/dist/vendor/account/engine.js +182 -0
- package/dist/vendor/account/features.js +220 -0
- package/dist/vendor/account/index.js +53 -0
- package/dist/vendor/account/schema.js +272 -0
- package/dist/vendor/account/subscription.js +38 -0
- package/dist/vendor/analytics/adapters/ga4.js +26 -0
- package/dist/vendor/analytics/adapters/meta.js +26 -0
- package/dist/vendor/analytics/adapters/resolve.js +130 -0
- package/dist/vendor/analytics/adapters/tiktok.js +27 -0
- package/dist/vendor/analytics/catalog.js +908 -0
- package/dist/vendor/analytics/identity.js +136 -0
- package/dist/vendor/config/company.js +31 -0
- package/dist/vendor/config/defaults.js +173 -0
- package/dist/vendor/config/demo.js +18 -0
- package/dist/vendor/config/desktop-artifacts.js +110 -0
- package/dist/vendor/config/edit.js +769 -0
- package/dist/vendor/config/env-delivery.js +145 -0
- package/dist/vendor/config/env-rules.js +93 -0
- package/dist/vendor/config/env-schema.js +1078 -0
- package/dist/vendor/config/env.js +445 -0
- package/dist/vendor/config/hooks.js +97 -0
- package/dist/vendor/config/index.js +237 -0
- package/dist/vendor/config/instances.js +208 -0
- package/dist/vendor/config/load.js +490 -0
- package/dist/vendor/config/merge.js +68 -0
- package/dist/vendor/config/order.js +139 -0
- package/dist/vendor/config/ports.js +374 -0
- package/dist/vendor/config/providers.js +32 -0
- package/dist/vendor/config/repo.js +142 -0
- package/dist/vendor/config/retired-keys.js +430 -0
- package/dist/vendor/config/schema.js +1610 -0
- package/dist/vendor/config/secrets.js +50 -0
- package/dist/vendor/config/seed.js +34 -0
- package/dist/vendor/config/site-global.js +205 -0
- package/dist/vendor/config/validate.js +554 -0
- package/dist/vendor/config/winback.js +61 -0
- package/dist/vendor/devkit/attach-log-file.js +262 -0
- package/dist/vendor/devkit/bare-requires.js +153 -0
- package/dist/vendor/devkit/command-path.js +46 -0
- package/dist/vendor/devkit/defaults-engine.js +372 -0
- package/dist/vendor/devkit/deploy-record.js +180 -0
- package/dist/vendor/devkit/deploy.js +286 -0
- package/dist/vendor/devkit/license.js +155 -0
- package/dist/vendor/devkit/local-https.js +360 -0
- package/dist/vendor/devkit/local.js +1905 -0
- package/dist/vendor/devkit/logger.js +128 -0
- package/dist/vendor/devkit/merge-line-files.js +296 -0
- package/dist/vendor/devkit/npm-registry.js +52 -0
- package/dist/vendor/devkit/omega-bin.js +345 -0
- package/dist/vendor/devkit/parse-audit.js +74 -0
- package/dist/vendor/devkit/safe-install.js +18 -0
- package/dist/vendor/devkit/scaffold-guard.js +96 -0
- package/dist/vendor/devkit/stop-signals.js +28 -0
- package/dist/vendor/devkit/test/assert.js +120 -0
- package/dist/vendor/devkit/test/define-cases.js +104 -0
- package/dist/vendor/devkit/test/runner-core.js +554 -0
- package/dist/vendor/devkit/test/scope.js +162 -0
- package/dist/vendor/devkit/update.js +569 -0
- package/dist/vendor/monitoring/core.js +180 -0
- package/dist/vendor/monitoring/env.js +49 -0
- package/dist/vendor/monitoring/logger.js +39 -0
- package/dist/vendor/monitoring/node.js +72 -0
- package/docs/admin-post-route.md +57 -0
- package/docs/ai-library.md +171 -0
- package/docs/architecture.md +62 -0
- package/docs/audit.md +70 -0
- package/docs/auth-hooks.md +74 -0
- package/docs/build-system.md +65 -0
- package/docs/cdp-debugging.md +29 -0
- package/docs/cli-firestore-auth.md +85 -0
- package/docs/cli-logs.md +67 -0
- package/docs/cli-output.md +146 -0
- package/docs/code-patterns.md +77 -0
- package/docs/common-mistakes.md +12 -0
- package/docs/common-operations.md +60 -0
- package/docs/connections.md +212 -0
- package/docs/consent.md +362 -0
- package/docs/directory-structure.md +150 -0
- package/docs/email-system.md +459 -0
- package/docs/environment-detection.md +93 -0
- package/docs/file-naming.md +10 -0
- package/docs/firestore.md +134 -0
- package/docs/ghostii.md +240 -0
- package/docs/index.md +299 -0
- package/docs/key-files.md +37 -0
- package/docs/logging.md +60 -0
- package/docs/marketing-campaigns.md +407 -0
- package/docs/marketing-fields.md +25 -0
- package/docs/mcp.md +222 -0
- package/docs/migration.md +129 -0
- package/docs/payment-system.md +856 -0
- package/docs/paypal-sandbox-qa.md +105 -0
- package/docs/response-headers.md +9 -0
- package/docs/routes.md +211 -0
- package/docs/sanitization.md +71 -0
- package/docs/schemas.md +163 -0
- package/docs/shared/agent-docs.md +89 -0
- package/docs/shared/analytics.md +612 -0
- package/docs/shared/brands.md +51 -0
- package/docs/shared/breaking-changes.md +497 -0
- package/docs/shared/config.md +1387 -0
- package/docs/shared/deploys.md +215 -0
- package/docs/shared/icons.md +201 -0
- package/docs/shared/local-dev.md +147 -0
- package/docs/shared/logging.md +202 -0
- package/docs/shared/monitoring.md +153 -0
- package/docs/shared/publishing.md +183 -0
- package/docs/shared/rulings.md +34 -0
- package/docs/shared/testing.md +147 -0
- package/docs/shared/theming.md +604 -0
- package/docs/shared/translation.md +291 -0
- package/docs/shared/updates.md +61 -0
- package/docs/stripe-webhook-forwarding.md +20 -0
- package/docs/test-boot-layer.md +67 -0
- package/docs/test-framework.md +583 -0
- package/docs/usage-rate-limiting.md +121 -0
- package/docs/verts.md +29 -0
- package/package.json +143 -0
- package/templates/config/omega.json5 +322 -0
- package/templates/database.rules.json +82 -0
- package/templates/firebase.json +67 -0
- package/templates/firestore.framework.rules +191 -0
- package/templates/firestore.indexes.json +4 -0
- package/templates/firestore.rules +59 -0
- package/templates/index.js +12 -0
- package/templates/public/404.html +26 -0
- package/templates/public/index.html +24 -0
- package/templates/remoteconfig.template.json +1 -0
- package/templates/storage-lifecycle-config-1-day.json +9 -0
- package/templates/storage-lifecycle-config-30-days.json +9 -0
- package/templates/storage.rules +11 -0
- package/test/_init/accounts-validation.js +58 -0
- package/test/ai/tools-live.test.js +171 -0
- package/test/analytics/conversion-delivery.test.js +1013 -0
- package/test/analytics/match-normalization.test.js +238 -0
- package/test/analytics/signup-conversion.test.js +135 -0
- package/test/boot/cli-dispatch.test.js +142 -0
- package/test/boot/defaults-scaffold.test.js +248 -0
- package/test/boot/deploy-staging.test.js +446 -0
- package/test/boot/disposable-domains.test.js +154 -0
- package/test/boot/emulator-boots.test.js +39 -0
- package/test/boot/emulator-port-preflight.test.js +126 -0
- package/test/boot/emulator-ready-timeout.test.js +46 -0
- package/test/boot/project-id-refresh.test.js +73 -0
- package/test/boot/suite-portability.test.js +278 -0
- package/test/boot/update-command.test.js +63 -0
- package/test/cli/cross-platform.test.js +168 -0
- package/test/cli/custom-project-type.test.js +426 -0
- package/test/cli/deploy-license-env.test.js +100 -0
- package/test/cli/emulator-adoption.test.js +254 -0
- package/test/cli/emulator-orphans.test.js +658 -0
- package/test/cli/emulator-ownership.test.js +177 -0
- package/test/cli/emulator-port-retry.test.js +395 -0
- package/test/cli/emulator-shutdown.test.js +788 -0
- package/test/cli/emulator-stale-reap.test.js +574 -0
- package/test/cli/ensure-target.test.js +325 -0
- package/test/cli/flags.test.js +64 -0
- package/test/cli/https-trust.test.js +38 -0
- package/test/cli/install-update-dispatch.test.js +47 -0
- package/test/cli/lane-environments.test.js +159 -0
- package/test/cli/marketing-campaigns-seeded.test.js +194 -0
- package/test/cli/migrate-bare-requires.test.js +128 -0
- package/test/cli/migrate-markers.test.js +530 -0
- package/test/cli/required-indexes.test.js +64 -0
- package/test/cli/rules-compile.test.js +622 -0
- package/test/cli/rules-migration-deferral.test.js +259 -0
- package/test/cli/rules-version.test.js +104 -0
- package/test/cli/setup-load-files.test.js +66 -0
- package/test/cli/setup-offline-mode.test.js +276 -0
- package/test/cli/setup-retired.test.js +64 -0
- package/test/cli/setup-shared-project-indexes.test.js +262 -0
- package/test/cli/setup-tests-requires.test.js +45 -0
- package/test/cli/stage-env-compose.test.js +316 -0
- package/test/cli/stripe-live-lane.test.js +303 -0
- package/test/cli/target.test.js +182 -0
- package/test/cli/templates.test.js +66 -0
- package/test/cli/test-runner-env.test.js +115 -0
- package/test/cli/test-stack-shutdown.test.js +275 -0
- package/test/cli/test-target-no-match.test.js +128 -0
- package/test/cli/verb-logs.test.js +118 -0
- package/test/cli/version-dispatch.test.js +39 -0
- package/test/content/blog-generate.test.js +164 -0
- package/test/email/campaign-config-fault.test.js +376 -0
- package/test/email/campaign-cron-pipeline.test.js +536 -0
- package/test/email/campaign-send.test.js +47 -0
- package/test/email/consent-lifecycle.test.js +258 -0
- package/test/email/content-html-policy.test.js +270 -0
- package/test/email/feedback-and-plain-send.test.js +54 -0
- package/test/email/fixtures/clean.json +30 -0
- package/test/email/fixtures/editorial.json +30 -0
- package/test/email/fixtures/field-report.json +53 -0
- package/test/email/identity.test.js +321 -0
- package/test/email/marketing/consent-gate.test.js +265 -0
- package/test/email/marketing/custom-fields-catalog.test.js +259 -0
- package/test/email/marketing/prune-per-provider.test.js +762 -0
- package/test/email/marketing/remove-log-privacy.test.js +225 -0
- package/test/email/marketing-lifecycle.test.js +139 -0
- package/test/email/newsletter-generate.test.js +853 -0
- package/test/email/newsletter-svg-tokens.test.js +51 -0
- package/test/email/newsletter-templates.test.js +492 -0
- package/test/email/order-one-time-cta.test.js +97 -0
- package/test/email/render-content.test.js +248 -0
- package/test/email/safe-url.test.js +0 -0
- package/test/email/sanitize-images.test.js +66 -0
- package/test/email/send-log-privacy.test.js +107 -0
- package/test/email/templates.test.js +288 -0
- package/test/email/testing-capture.test.js +260 -0
- package/test/email/transactional-send.test.js +36 -0
- package/test/email/transactional.test.js +562 -0
- package/test/email/unsubscribe-groups.test.js +155 -0
- package/test/email/unsubscribe-key.test.js +91 -0
- package/test/email/validation-cases.test.js +152 -0
- package/test/email/validation.test.js +746 -0
- package/test/events/auth-delete-conversion.test.js +138 -0
- package/test/events/auth-delete-race.test.js +211 -0
- package/test/events/auth-on-create-log.test.js +164 -0
- package/test/events/auth-signup-conversion.test.js +141 -0
- package/test/events/auth-signup-limit.test.js +142 -0
- package/test/events/auth-trigger-log-privacy.test.js +256 -0
- package/test/events/cron-job-doc-shape.test.js +101 -0
- package/test/events/cron-reset-usage.test.js +116 -0
- package/test/events/notification-conversion.test.js +182 -0
- package/test/events/payments/_webhook-harness.js +307 -0
- package/test/events/payments/abandoned-cart-activity.test.js +135 -0
- package/test/events/payments/analytics-payment-events.test.js +945 -0
- package/test/events/payments/dispute-email-status.test.js +55 -0
- package/test/events/payments/journey-payments-abandoned.test.js +126 -0
- package/test/events/payments/journey-payments-cancel-endpoint.test.js +102 -0
- package/test/events/payments/journey-payments-cancel-no-order.test.js +76 -0
- package/test/events/payments/journey-payments-cancel.test.js +184 -0
- package/test/events/payments/journey-payments-decline.test.js +225 -0
- package/test/events/payments/journey-payments-discount.test.js +91 -0
- package/test/events/payments/journey-payments-dispute.test.js +190 -0
- package/test/events/payments/journey-payments-failure.test.js +148 -0
- package/test/events/payments/journey-payments-legacy-product.test.js +151 -0
- package/test/events/payments/journey-payments-one-time-decline.test.js +127 -0
- package/test/events/payments/journey-payments-one-time-failure.test.js +113 -0
- package/test/events/payments/journey-payments-one-time-refund.test.js +186 -0
- package/test/events/payments/journey-payments-one-time.test.js +175 -0
- package/test/events/payments/journey-payments-plan-change.test.js +146 -0
- package/test/events/payments/journey-payments-plan-switch-trial.test.js +161 -0
- package/test/events/payments/journey-payments-plan-switch.test.js +182 -0
- package/test/events/payments/journey-payments-refund-no-order.test.js +76 -0
- package/test/events/payments/journey-payments-refund-webhook.test.js +225 -0
- package/test/events/payments/journey-payments-suspend.test.js +183 -0
- package/test/events/payments/journey-payments-trial-cancel.test.js +132 -0
- package/test/events/payments/journey-payments-trial.test.js +173 -0
- package/test/events/payments/journey-payments-uid-resolution.test.js +134 -0
- package/test/events/payments/journey-payments-uncancel.test.js +157 -0
- package/test/events/payments/journey-payments-upgrade.test.js +137 -0
- package/test/events/payments/journey-payments-winback-decline.test.js +171 -0
- package/test/events/payments/journey-payments-winback.test.js +195 -0
- package/test/events/payments/paypal-expiry-cron.test.js +166 -0
- package/test/events/payments/purchase-failed-handler.test.js +80 -0
- package/test/events/payments/purchase-refunded-handler.test.js +108 -0
- package/test/events/payments/test-processor-doc-shape.test.js +162 -0
- package/test/events/payments/transition-order-emails.test.js +185 -0
- package/test/events/payments/transition-promo-lines.test.js +192 -0
- package/test/events/payments/transitions-detect.test.js +767 -0
- package/test/events/payments/trial-lapse-sweep-staleness.test.js +173 -0
- package/test/events/payments/trial-lapse-sweep.test.js +359 -0
- package/test/events/payments/webhook-atomic-writes.test.js +69 -0
- package/test/events/payments/webhook-chargebee-unreachable.test.js +106 -0
- package/test/events/payments/webhook-discount-clear.test.js +189 -0
- package/test/events/payments/webhook-failure-intent.test.js +93 -0
- package/test/events/payments/webhook-hosted-page-uid-trust.test.js +212 -0
- package/test/events/payments/webhook-ordering.test.js +326 -0
- package/test/events/payments/webhook-provider-lookup-trust.test.js +206 -0
- package/test/events/payments/webhook-refund-amount-trust.test.js +223 -0
- package/test/events/payments/webhook-refund-envelope-shape.test.js +148 -0
- package/test/events/payments/webhook-refund-linkage-trust.test.js +404 -0
- package/test/events/payments/webhook-refund-transaction-fallback.test.js +184 -0
- package/test/events/payments/webhook-refund-without-order.test.js +170 -0
- package/test/events/payments/webhook-refusal-reporting.test.js +194 -0
- package/test/events/payments/webhook-refused-intent.test.js +142 -0
- package/test/events/payments/webhook-retry-sweep.test.js +252 -0
- package/test/events/payments/webhook-transition-claim.test.js +389 -0
- package/test/events/payments/webhook-uid-trust.test.js +203 -0
- package/test/events/payments/webhook-user-without-auth.test.js +161 -0
- package/test/fixtures/chargebee/invoice-one-time.json +27 -0
- package/test/fixtures/chargebee/subscription-active.json +44 -0
- package/test/fixtures/chargebee/subscription-cancelled.json +42 -0
- package/test/fixtures/chargebee/subscription-in-trial.json +41 -0
- package/test/fixtures/chargebee/subscription-legacy-plan.json +41 -0
- package/test/fixtures/chargebee/subscription-non-renewing.json +41 -0
- package/test/fixtures/chargebee/subscription-paused.json +42 -0
- package/test/fixtures/chargebee/webhook-payment-failed.json +51 -0
- package/test/fixtures/chargebee/webhook-subscription-created.json +47 -0
- package/test/fixtures/coinbase/charge-confirmed.json +50 -0
- package/test/fixtures/coinbase/charge-failed.json +34 -0
- package/test/fixtures/coinbase/charge-pending.json +34 -0
- package/test/fixtures/migrate/ported-route.js.txt +11 -0
- package/test/fixtures/paypal/capture-completed.json +51 -0
- package/test/fixtures/paypal/capture-refunded.json +43 -0
- package/test/fixtures/paypal/order-approved.json +62 -0
- package/test/fixtures/paypal/order-completed.json +110 -0
- package/test/fixtures/paypal/sale-refunded.json +38 -0
- package/test/fixtures/paypal/subscription-active.json +76 -0
- package/test/fixtures/paypal/subscription-cancelled.json +50 -0
- package/test/fixtures/paypal/subscription-suspended.json +65 -0
- package/test/fixtures/stripe/checkout-session-completed.json +130 -0
- package/test/fixtures/stripe/invoice-payment-failed.json +148 -0
- package/test/fixtures/stripe/invoice-subscription-payment-failed.json +28 -0
- package/test/fixtures/stripe/invoice-subscription-payment-succeeded.json +28 -0
- package/test/fixtures/stripe/subscription-active.json +161 -0
- package/test/fixtures/stripe/subscription-canceled.json +161 -0
- package/test/fixtures/stripe/subscription-trialing.json +161 -0
- package/test/helpers/_shared-config.js +15 -0
- package/test/helpers/ai-request-payload.test.js +619 -0
- package/test/helpers/ai-schema-resolve.test.js +125 -0
- package/test/helpers/ai-test-provider.test.js +227 -0
- package/test/helpers/ai-token-accounting.test.js +150 -0
- package/test/helpers/ai-tools-format.test.js +384 -0
- package/test/helpers/analytics-no-id-notice.test.js +146 -0
- package/test/helpers/analytics-user-data.test.js +194 -0
- package/test/helpers/api-manager.test.js +311 -0
- package/test/helpers/backend-router.test.js +136 -0
- package/test/helpers/content/blog-auto-publisher.test.js +482 -0
- package/test/helpers/content/feed-parser.test.js +529 -0
- package/test/helpers/content/ghostii-blocks.test.js +135 -0
- package/test/helpers/content/ghostii-feed-integration.test.js +405 -0
- package/test/helpers/content/ghostii-write-article.test.js +244 -0
- package/test/helpers/dev-only-routes.test.js +225 -0
- package/test/helpers/env-reader.test.js +362 -0
- package/test/helpers/environment.test.js +263 -0
- package/test/helpers/event-middleware.test.js +407 -0
- package/test/helpers/infer-contact.test.js +157 -0
- package/test/helpers/lane-url.test.js +90 -0
- package/test/helpers/merge-line-files.test.js +272 -0
- package/test/helpers/metadata.test.js +122 -0
- package/test/helpers/middleware-request-log.test.js +134 -0
- package/test/helpers/middleware-user-log.test.js +124 -0
- package/test/helpers/payment/chargebee/parse-webhook.test.js +490 -0
- package/test/helpers/payment/chargebee/refund-details.test.js +198 -0
- package/test/helpers/payment/chargebee/to-unified-one-time.test.js +148 -0
- package/test/helpers/payment/chargebee/to-unified-subscription.test.js +649 -0
- package/test/helpers/payment/coinbase/create-intent.test.js +247 -0
- package/test/helpers/payment/coinbase/parse-webhook.test.js +195 -0
- package/test/helpers/payment/coinbase/refund-unsupported.test.js +141 -0
- package/test/helpers/payment/coinbase/to-unified-one-time.test.js +201 -0
- package/test/helpers/payment/discount-codes.test.js +141 -0
- package/test/helpers/payment/extract-resource.test.js +113 -0
- package/test/helpers/payment/fetch-failure.test.js +215 -0
- package/test/helpers/payment/license-gate.test.js +108 -0
- package/test/helpers/payment/order-id.test.js +99 -0
- package/test/helpers/payment/paypal/create-intent.test.js +382 -0
- package/test/helpers/payment/paypal/fetch-capture.test.js +123 -0
- package/test/helpers/payment/paypal/fetch-sale.test.js +183 -0
- package/test/helpers/payment/paypal/parse-webhook.test.js +678 -0
- package/test/helpers/payment/paypal/refund-details.test.js +202 -0
- package/test/helpers/payment/paypal/resolve-plan-id.test.js +108 -0
- package/test/helpers/payment/paypal/switch-plan.test.js +92 -0
- package/test/helpers/payment/paypal/to-unified-one-time.test.js +383 -0
- package/test/helpers/payment/paypal/to-unified-subscription.test.js +884 -0
- package/test/helpers/payment/stripe/fetch-charge.test.js +147 -0
- package/test/helpers/payment/stripe/parse-webhook.test.js +448 -0
- package/test/helpers/payment/stripe/refund-details.test.js +147 -0
- package/test/helpers/payment/stripe/to-unified-one-time.test.js +307 -0
- package/test/helpers/payment/stripe/to-unified-subscription.test.js +709 -0
- package/test/helpers/persona-domain.test.js +87 -0
- package/test/helpers/recaptcha.test.js +166 -0
- package/test/helpers/resolved-config.test.js +106 -0
- package/test/helpers/response-log-redaction.test.js +262 -0
- package/test/helpers/roles.test.js +155 -0
- package/test/helpers/route-context-debug-gate.test.js +118 -0
- package/test/helpers/route-context-logging.test.js +214 -0
- package/test/helpers/route-context.test.js +129 -0
- package/test/helpers/safe-compare.test.js +114 -0
- package/test/helpers/sanitize.test.js +223 -0
- package/test/helpers/schema-engine.test.js +537 -0
- package/test/helpers/schema-zod.test.js +554 -0
- package/test/helpers/seed-accounts-load.test.js +163 -0
- package/test/helpers/seed-google-personas.test.js +114 -0
- package/test/helpers/seeded-personas.test.js +823 -0
- package/test/helpers/settings.test.js +292 -0
- package/test/helpers/setup-engines-pin.test.js +68 -0
- package/test/helpers/setup-manifest-sync.test.js +116 -0
- package/test/helpers/slugify.test.js +395 -0
- package/test/helpers/storage.test.js +195 -0
- package/test/helpers/test-banner-latch.test.js +139 -0
- package/test/helpers/usage-consume.test.js +460 -0
- package/test/helpers/usage-log-privacy.test.js +121 -0
- package/test/helpers/user-doc-heal.test.js +540 -0
- package/test/helpers/user.test.js +771 -0
- package/test/helpers/webhook-forward.test.js +419 -0
- package/test/helpers/wipe-auth-project.test.js +143 -0
- package/test/mcp/discovery.test.js +52 -0
- package/test/mcp/oauth.test.js +160 -0
- package/test/mcp/protocol.test.js +278 -0
- package/test/mcp/roles.test.js +203 -0
- package/test/mcp/utils.test.js +245 -0
- package/test/notification/identity.test.js +155 -0
- package/test/routes/admin/create-post.test.js +362 -0
- package/test/routes/admin/database.test.js +133 -0
- package/test/routes/admin/deduplicate-image-alts.test.js +191 -0
- package/test/routes/admin/email-content-html.test.js +58 -0
- package/test/routes/admin/email-request-log.test.js +86 -0
- package/test/routes/admin/email.test.js +116 -0
- package/test/routes/admin/firestore-query.test.js +206 -0
- package/test/routes/admin/firestore.test.js +129 -0
- package/test/routes/admin/infer-contact.test.js +220 -0
- package/test/routes/admin/notification.test.js +199 -0
- package/test/routes/admin/post-convert-image.test.js +159 -0
- package/test/routes/admin/post-deploy-flag.test.js +81 -0
- package/test/routes/admin/post-download-error.test.js +90 -0
- package/test/routes/admin/post-resize-image.test.js +185 -0
- package/test/routes/admin/post.test.js +369 -0
- package/test/routes/admin/repo-content.test.js +223 -0
- package/test/routes/admin/stats.test.js +114 -0
- package/test/routes/admin/users-disable.test.js +63 -0
- package/test/routes/admin/users-list.test.js +71 -0
- package/test/routes/content/post.test.js +60 -0
- package/test/routes/general/uuid.test.js +133 -0
- package/test/routes/health.test.js +110 -0
- package/test/routes/marketing/campaign.test.js +184 -0
- package/test/routes/marketing/contact.test.js +416 -0
- package/test/routes/marketing/email-preferences.test.js +293 -0
- package/test/routes/marketing/push-send.test.js +34 -0
- package/test/routes/marketing/webhook-forward.test.js +63 -0
- package/test/routes/marketing/webhook.test.js +641 -0
- package/test/routes/payments/_route-harness.js +145 -0
- package/test/routes/payments/cancel-provider-errors.test.js +227 -0
- package/test/routes/payments/cancel-skip-guards.test.js +126 -0
- package/test/routes/payments/cancel-trialing.test.js +428 -0
- package/test/routes/payments/cancel.test.js +165 -0
- package/test/routes/payments/dedup-race.test.js +186 -0
- package/test/routes/payments/discount.test.js +82 -0
- package/test/routes/payments/dispute-alert.test.js +324 -0
- package/test/routes/payments/intent-discount-amounts.test.js +550 -0
- package/test/routes/payments/intent-discount-coupons.test.js +293 -0
- package/test/routes/payments/intent-one-time-metadata.test.js +122 -0
- package/test/routes/payments/intent-purchaser-guard.test.js +139 -0
- package/test/routes/payments/intent-zero-total.test.js +260 -0
- package/test/routes/payments/intent.test.js +413 -0
- package/test/routes/payments/plan.test.js +367 -0
- package/test/routes/payments/portal-return-url.test.js +107 -0
- package/test/routes/payments/portal.test.js +94 -0
- package/test/routes/payments/refund-one-time.test.js +254 -0
- package/test/routes/payments/refund-paypal-proration.test.js +190 -0
- package/test/routes/payments/refund.test.js +181 -0
- package/test/routes/payments/trial-eligibility.test.js +73 -0
- package/test/routes/payments/uncancel.test.js +270 -0
- package/test/routes/payments/webhook-stripe-invoice.test.js +129 -0
- package/test/routes/payments/webhook-stripe-refund-one-time.test.js +130 -0
- package/test/routes/payments/webhook-test-provider.test.js +156 -0
- package/test/routes/payments/webhook.test.js +115 -0
- package/test/routes/payments/winback-stripe-coupon.test.js +126 -0
- package/test/routes/payments/winback.test.js +597 -0
- package/test/routes/test/authenticate.test.js +79 -0
- package/test/routes/test/redirect.test.js +66 -0
- package/test/routes/test/reset-account.test.js +126 -0
- package/test/routes/test/roster.test.js +101 -0
- package/test/routes/test/schema.test.js +556 -0
- package/test/routes/test/usage.test.js +374 -0
- package/test/routes/user/api-keys.test.js +158 -0
- package/test/routes/user/connections-grant.test.js +759 -0
- package/test/routes/user/connections-identity.test.js +260 -0
- package/test/routes/user/connections-log-privacy.test.js +206 -0
- package/test/routes/user/connections-refresh-lease.test.js +696 -0
- package/test/routes/user/connections-return.test.js +261 -0
- package/test/routes/user/connections-uid.test.js +516 -0
- package/test/routes/user/delete.test.js +138 -0
- package/test/routes/user/feedback.test.js +106 -0
- package/test/routes/user/orders.test.js +233 -0
- package/test/routes/user/sessions.test.js +231 -0
- package/test/routes/user/settings-validate.test.js +84 -0
- package/test/routes/user/signup-emails.test.js +113 -0
- package/test/routes/user/signup-location.test.js +84 -0
- package/test/routes/user/signup-log-privacy.test.js +112 -0
- package/test/routes/user/signup.test.js +579 -0
- package/test/routes/user/subscription.test.js +101 -0
- package/test/routes/user/token.test.js +111 -0
- package/test/routes/user/user.test.js +158 -0
- package/test/routes/verts/cache.test.js +78 -0
- package/test/routes/verts/click-destination.test.js +76 -0
- package/test/routes/verts/crud.test.js +194 -0
- package/test/routes/verts/redirect.test.js +147 -0
- package/test/routes/verts/selection.test.js +237 -0
- package/test/routes/verts/serve.test.js +185 -0
- package/test/routes/verts/unit-document.test.js +117 -0
- package/test/rules/_environment.js +66 -0
- package/test/rules/brand-merge.test.js +195 -0
- package/test/rules/field-helpers.test.js +309 -0
- package/test/rules/notifications.test.js +577 -0
- package/test/rules/payments-carts.test.js +406 -0
- package/test/rules/sessions.test.js +170 -0
- package/test/rules/user.test.js +517 -0
- package/test/rules/verts.test.js +101 -0
- package/test/security/fetch-log-secrets.test.js +124 -0
- package/test/security/primitives.test.js +105 -0
- package/test/security/repo-pinning.test.js +77 -0
- package/test/stripe-live/subscription-lifecycle.test.js +141 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: auth:on-delete fires `user_delete` as a CANONICAL conversion
|
|
3
|
+
* ([#328](https://github.com/Omega-JS-Stack/omega/issues/328)).
|
|
4
|
+
*
|
|
5
|
+
* The handler used to reach `Manager.Analytics(...).event('user_delete')`
|
|
6
|
+
* directly — the right NAME, but past the consent gate and past the catalog's
|
|
7
|
+
* per-provider walk. It now goes through `deliverConversion`, which is what
|
|
8
|
+
* makes it the same kind of event as every other server conversion.
|
|
9
|
+
*
|
|
10
|
+
* THE DEDUPE ID IS `user_delete.<uid>`. An account is deleted once; a
|
|
11
|
+
* redelivered trigger must report the same event, not a second one.
|
|
12
|
+
*
|
|
13
|
+
* The load-bearing ordering detail: the consent snapshot is read from the user
|
|
14
|
+
* doc BEFORE the delete, because the delete is the moment it stops existing. An
|
|
15
|
+
* ABSENT snapshot GRANTS (the standing rule) — a legacy account predating the
|
|
16
|
+
* consent system is still counted.
|
|
17
|
+
*
|
|
18
|
+
* Real handler, real Manager, real ctx, real Firestore delete. The doc is
|
|
19
|
+
* seeded directly and the UserRecord is a plain object, so no Auth user exists
|
|
20
|
+
* and the emulator's own trigger never races this one.
|
|
21
|
+
*
|
|
22
|
+
* Run: npx omega test framework:events/auth-delete-conversion
|
|
23
|
+
*/
|
|
24
|
+
const onDelete = require('../../dist/manager/events/auth/on-delete.js');
|
|
25
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
26
|
+
|
|
27
|
+
const EVENT_CONTEXT = {
|
|
28
|
+
eventType: 'providers/firebase.auth/eventTypes/user.delete',
|
|
29
|
+
resource: { service: 'firebaseauth.googleapis.com' },
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
function testUid() {
|
|
33
|
+
return `_test-delete-conversion-${Date.now()}-${Math.floor(Math.random() * 1e6)}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Record every console call the handler makes, restoring console afterward.
|
|
37
|
+
async function withConsoleRecorder(fn) {
|
|
38
|
+
const calls = { log: [], debug: [], error: [] };
|
|
39
|
+
const original = { log: console.log, debug: console.debug, error: console.error };
|
|
40
|
+
|
|
41
|
+
console.log = (...args) => calls.log.push(args);
|
|
42
|
+
console.debug = (...args) => calls.debug.push(args);
|
|
43
|
+
console.error = (...args) => calls.error.push(args);
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
await fn();
|
|
47
|
+
return calls;
|
|
48
|
+
} finally {
|
|
49
|
+
console.log = original.log;
|
|
50
|
+
console.debug = original.debug;
|
|
51
|
+
console.error = original.error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Seed a user doc, run the real handler against it, hand back the delivery lines. */
|
|
56
|
+
async function runHandler({ Manager, uid, doc }) {
|
|
57
|
+
const ctx = Manager.RouteContext({}, { functionName: 'omega_authOnDelete' });
|
|
58
|
+
const admin = Manager.libraries.admin;
|
|
59
|
+
|
|
60
|
+
await admin.firestore().doc(`users/${uid}`).set(doc);
|
|
61
|
+
|
|
62
|
+
const calls = await withConsoleRecorder(async () => {
|
|
63
|
+
await onDelete({
|
|
64
|
+
Manager: Manager,
|
|
65
|
+
ctx: ctx,
|
|
66
|
+
user: { uid: uid, email: `${uid}@test.invalid` },
|
|
67
|
+
context: EVENT_CONTEXT,
|
|
68
|
+
libraries: { admin: admin },
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const delivery = calls.log
|
|
73
|
+
.map((args) => String(args[1]))
|
|
74
|
+
.filter((line) => line.startsWith('deliverConversion: '));
|
|
75
|
+
|
|
76
|
+
return { calls: calls, delivery: delivery };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
module.exports = defineCases({
|
|
80
|
+
description: 'auth:on-delete fires the canonical user_delete conversion',
|
|
81
|
+
type: 'group',
|
|
82
|
+
timeout: 30000,
|
|
83
|
+
|
|
84
|
+
tests: [
|
|
85
|
+
{
|
|
86
|
+
name: 'a-deleted-account-fires-user-delete-with-the-uid-derived-dedupe-id',
|
|
87
|
+
async run({ assert, Manager, firestore }) {
|
|
88
|
+
const uid = testUid();
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
const { delivery } = await runHandler({
|
|
92
|
+
Manager: Manager,
|
|
93
|
+
uid: uid,
|
|
94
|
+
doc: { auth: { uid: uid, email: `${uid}@test.invalid` } },
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
assert.equal(delivery.length, 1, `expected one conversion delivery, got ${delivery.length}: ${delivery.join(' | ')}`);
|
|
98
|
+
assert.equal(delivery[0].startsWith('deliverConversion: user_delete →'), true, delivery[0]);
|
|
99
|
+
assert.equal(delivery[0].includes(`(event_id=user_delete.${uid})`), true, `the uid is what the deletion is about: ${delivery[0]}`);
|
|
100
|
+
|
|
101
|
+
// GA4 only — an account ending is nothing an ad platform maps.
|
|
102
|
+
for (const provider of ['meta', 'tiktok']) {
|
|
103
|
+
assert.equal(delivery[0].includes(`${provider} skipped (no mapping)`), true, `${provider} has no mapping: ${delivery[0]}`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// An account with no snapshot at all is still counted.
|
|
107
|
+
assert.equal(delivery[0].includes('ga4 skipped (consent'), false, `an absent snapshot grants: ${delivery[0]}`);
|
|
108
|
+
assert.equal(await firestore.exists(`users/${uid}`), false, 'the handler still deletes the doc');
|
|
109
|
+
} finally {
|
|
110
|
+
await firestore.delete(`users/${uid}`);
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
{
|
|
116
|
+
name: 'a-declined-snapshot-read-before-the-delete-blocks-the-fire',
|
|
117
|
+
async run({ assert, Manager, firestore }) {
|
|
118
|
+
const uid = testUid();
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
const { delivery } = await runHandler({
|
|
122
|
+
Manager: Manager,
|
|
123
|
+
uid: uid,
|
|
124
|
+
doc: {
|
|
125
|
+
auth: { uid: uid, email: `${uid}@test.invalid` },
|
|
126
|
+
trackingConsent: { analytics: false, marketing: false, region: 'opt-in', version: 1 },
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
assert.equal(delivery.length, 1, delivery.join(' | '));
|
|
131
|
+
assert.equal(delivery[0].includes('ga4 skipped (consent: analytics)'), true, `the snapshot the doc carried still gates the fire after the doc is gone: ${delivery[0]}`);
|
|
132
|
+
} finally {
|
|
133
|
+
await firestore.delete(`users/${uid}`);
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
});
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
const uuid = require('uuid');
|
|
2
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Test: auth:on-delete race condition
|
|
6
|
+
*
|
|
7
|
+
* Proves the emulator's async on-delete trigger clobbers freshly-recreated docs
|
|
8
|
+
* when you don't wait for it to settle, and that the mitigation strategies work.
|
|
9
|
+
*
|
|
10
|
+
* The production fix uses the emulator's bulk-clear REST API in deleteTestUsers()
|
|
11
|
+
* to avoid triggering on-delete at all during test setup.
|
|
12
|
+
*/
|
|
13
|
+
module.exports = defineCases({
|
|
14
|
+
description: 'auth:on-delete race condition (create → delete → recreate)',
|
|
15
|
+
type: 'group',
|
|
16
|
+
timeout: 120000,
|
|
17
|
+
|
|
18
|
+
tests: [
|
|
19
|
+
{
|
|
20
|
+
name: 'baseline-create-and-verify',
|
|
21
|
+
async run({ Manager, assert }) {
|
|
22
|
+
const admin = Manager.libraries.admin;
|
|
23
|
+
const testUid = '_test-race-baseline';
|
|
24
|
+
const testEmail = '_test.race-baseline@test.com';
|
|
25
|
+
const userRef = admin.firestore().doc(`users/${testUid}`);
|
|
26
|
+
|
|
27
|
+
await admin.auth().deleteUser(testUid).catch(() => {});
|
|
28
|
+
await pollUntilGone(userRef);
|
|
29
|
+
|
|
30
|
+
await admin.auth().createUser({
|
|
31
|
+
uid: testUid,
|
|
32
|
+
email: testEmail,
|
|
33
|
+
password: uuid.v4(),
|
|
34
|
+
emailVerified: true,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const ready = await pollUntilReady(userRef);
|
|
38
|
+
assert.ok(ready, 'on-create should complete and write api keys');
|
|
39
|
+
|
|
40
|
+
const doc = await userRef.get();
|
|
41
|
+
assert.ok(doc.data()?.api?.clientId, 'doc should have api.clientId');
|
|
42
|
+
assert.ok(doc.data()?.api?.privateKey, 'doc should have api.privateKey');
|
|
43
|
+
|
|
44
|
+
await admin.auth().deleteUser(testUid).catch(() => {});
|
|
45
|
+
await pollUntilGone(userRef);
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
{
|
|
50
|
+
name: 'no-wait-gets-clobbered',
|
|
51
|
+
async run({ Manager, assert, skip }) {
|
|
52
|
+
const admin = Manager.libraries.admin;
|
|
53
|
+
const testUid = '_test-race-no-wait';
|
|
54
|
+
const testEmail = '_test.race-no-wait@test.com';
|
|
55
|
+
const userRef = admin.firestore().doc(`users/${testUid}`);
|
|
56
|
+
|
|
57
|
+
await admin.auth().deleteUser(testUid).catch(() => {});
|
|
58
|
+
await pollUntilGone(userRef);
|
|
59
|
+
|
|
60
|
+
// Create and wait for doc to be fully ready
|
|
61
|
+
await admin.auth().createUser({
|
|
62
|
+
uid: testUid, email: testEmail,
|
|
63
|
+
password: uuid.v4(), emailVerified: true,
|
|
64
|
+
});
|
|
65
|
+
assert.ok(await pollUntilReady(userRef), 'First create should produce api keys');
|
|
66
|
+
|
|
67
|
+
// Delete auth user — do NOT wait for doc to disappear — then recreate
|
|
68
|
+
await admin.auth().deleteUser(testUid);
|
|
69
|
+
await admin.auth().createUser({
|
|
70
|
+
uid: testUid, email: testEmail,
|
|
71
|
+
password: uuid.v4(), emailVerified: true,
|
|
72
|
+
});
|
|
73
|
+
await pollUntilReady(userRef);
|
|
74
|
+
|
|
75
|
+
// The late on-delete clobbers the doc within a few seconds
|
|
76
|
+
await sleep(3000);
|
|
77
|
+
const doc = await userRef.get();
|
|
78
|
+
const survived = doc.exists && !!(doc.data()?.api?.clientId);
|
|
79
|
+
|
|
80
|
+
// The race resolves either way: when the emulator happens to finish
|
|
81
|
+
// the on-delete BEFORE the re-create's onCreate writes the doc, the
|
|
82
|
+
// dangerous late-clobber ordering never materializes that run —
|
|
83
|
+
// scheduler luck, not a regression. Only the clobber outcome is
|
|
84
|
+
// assertable; the benign ordering skips.
|
|
85
|
+
if (survived) {
|
|
86
|
+
await admin.auth().deleteUser(testUid).catch(() => {});
|
|
87
|
+
await pollUntilGone(userRef);
|
|
88
|
+
return skip('on-delete completed before the re-create this run — race did not manifest');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
await admin.auth().deleteUser(testUid).catch(() => {});
|
|
92
|
+
await pollUntilGone(userRef);
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
{
|
|
97
|
+
name: 'wait-for-gone-survives',
|
|
98
|
+
async run({ Manager, assert }) {
|
|
99
|
+
const admin = Manager.libraries.admin;
|
|
100
|
+
const testUid = '_test-race-wait-gone';
|
|
101
|
+
const testEmail = '_test.race-wait-gone@test.com';
|
|
102
|
+
const userRef = admin.firestore().doc(`users/${testUid}`);
|
|
103
|
+
|
|
104
|
+
await admin.auth().deleteUser(testUid).catch(() => {});
|
|
105
|
+
await pollUntilGone(userRef);
|
|
106
|
+
|
|
107
|
+
await admin.auth().createUser({
|
|
108
|
+
uid: testUid, email: testEmail,
|
|
109
|
+
password: uuid.v4(), emailVerified: true,
|
|
110
|
+
});
|
|
111
|
+
assert.ok(await pollUntilReady(userRef), 'First create should produce api keys');
|
|
112
|
+
|
|
113
|
+
// Delete and WAIT for doc to disappear before recreating
|
|
114
|
+
await admin.auth().deleteUser(testUid);
|
|
115
|
+
await pollUntilGone(userRef);
|
|
116
|
+
|
|
117
|
+
await admin.auth().createUser({
|
|
118
|
+
uid: testUid, email: testEmail,
|
|
119
|
+
password: uuid.v4(), emailVerified: true,
|
|
120
|
+
});
|
|
121
|
+
assert.ok(await pollUntilReady(userRef), 'Second create should produce api keys');
|
|
122
|
+
|
|
123
|
+
await sleep(3000);
|
|
124
|
+
const doc = await userRef.get();
|
|
125
|
+
const survived = doc.exists && !!(doc.data()?.api?.clientId);
|
|
126
|
+
|
|
127
|
+
assert.ok(survived, 'Doc should survive when we wait for on-delete to settle first');
|
|
128
|
+
|
|
129
|
+
await admin.auth().deleteUser(testUid).catch(() => {});
|
|
130
|
+
await pollUntilGone(userRef);
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
|
|
134
|
+
{
|
|
135
|
+
name: 'force-delete-doc-survives',
|
|
136
|
+
async run({ Manager, assert }) {
|
|
137
|
+
const admin = Manager.libraries.admin;
|
|
138
|
+
const testUid = '_test-race-force-del';
|
|
139
|
+
const testEmail = '_test.race-force-del@test.com';
|
|
140
|
+
const userRef = admin.firestore().doc(`users/${testUid}`);
|
|
141
|
+
|
|
142
|
+
await admin.auth().deleteUser(testUid).catch(() => {});
|
|
143
|
+
await pollUntilGone(userRef);
|
|
144
|
+
|
|
145
|
+
await admin.auth().createUser({
|
|
146
|
+
uid: testUid, email: testEmail,
|
|
147
|
+
password: uuid.v4(), emailVerified: true,
|
|
148
|
+
});
|
|
149
|
+
assert.ok(await pollUntilReady(userRef), 'First create should produce api keys');
|
|
150
|
+
|
|
151
|
+
// Delete auth user AND force-delete the Firestore doc, then pause
|
|
152
|
+
await admin.auth().deleteUser(testUid);
|
|
153
|
+
await userRef.delete().catch(() => {});
|
|
154
|
+
await sleep(500);
|
|
155
|
+
|
|
156
|
+
await admin.auth().createUser({
|
|
157
|
+
uid: testUid, email: testEmail,
|
|
158
|
+
password: uuid.v4(), emailVerified: true,
|
|
159
|
+
});
|
|
160
|
+
assert.ok(await pollUntilReady(userRef), 'Second create should produce api keys');
|
|
161
|
+
|
|
162
|
+
await sleep(3000);
|
|
163
|
+
const doc = await userRef.get();
|
|
164
|
+
const survived = doc.exists && !!(doc.data()?.api?.clientId);
|
|
165
|
+
|
|
166
|
+
assert.ok(survived, 'Doc should survive when we force-delete the doc before recreating');
|
|
167
|
+
|
|
168
|
+
await admin.auth().deleteUser(testUid).catch(() => {});
|
|
169
|
+
await pollUntilGone(userRef);
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
function sleep(ms) {
|
|
176
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
async function pollUntilReady(userRef, maxWait = 15000) {
|
|
180
|
+
const interval = 300;
|
|
181
|
+
let waited = 0;
|
|
182
|
+
|
|
183
|
+
while (waited < maxWait) {
|
|
184
|
+
const doc = await userRef.get();
|
|
185
|
+
const data = doc.exists ? doc.data() : null;
|
|
186
|
+
if (data?.metadata?.tag === 'auth:on-create' && data.api?.clientId && data.api?.privateKey) {
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
await sleep(interval);
|
|
190
|
+
waited += interval;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
async function pollUntilGone(userRef, maxWait = 10000) {
|
|
197
|
+
const interval = 200;
|
|
198
|
+
let waited = 0;
|
|
199
|
+
|
|
200
|
+
while (waited < maxWait) {
|
|
201
|
+
const doc = await userRef.get();
|
|
202
|
+
if (!doc.exists) {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
await sleep(interval);
|
|
206
|
+
waited += interval;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
await userRef.delete().catch(() => {});
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: auth:on-create logs ONE headline line
|
|
3
|
+
* ([#230](https://github.com/Omega-JS-Stack/omega/issues/230)).
|
|
4
|
+
*
|
|
5
|
+
* The handler used to dump the whole UserRecord (providerData, passwordHash,
|
|
6
|
+
* metadata) plus the event context onto its opening line — per created user, which
|
|
7
|
+
* buries a dev-boot seed. The headline is now `onCreate: <uid>` and nothing else
|
|
8
|
+
* — the address came off it in the #710 pass, so all four auth triggers spell
|
|
9
|
+
* their headline the one way the #657 sweep set; the full record stays reachable
|
|
10
|
+
* one level down, at debug — silent on a normal run, one `OMEGA_DEBUG=1` away.
|
|
11
|
+
*
|
|
12
|
+
* Real everything: a seeded persona's REAL UserRecord from the emulator's Auth,
|
|
13
|
+
* the real Manager and ctx, the real handler. The persona already has a user doc,
|
|
14
|
+
* so the handler logs its headline and returns at the "already exists" branch —
|
|
15
|
+
* no writes, nothing to clean up. The only stand-in is `console`, the sink.
|
|
16
|
+
*
|
|
17
|
+
* Run: npx omega test framework:events/auth-on-create-log
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const onCreate = require('../../dist/manager/events/auth/on-create.js');
|
|
21
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
22
|
+
|
|
23
|
+
// Record every console call the thunk makes, restoring console afterward.
|
|
24
|
+
async function withConsoleRecorder(fn) {
|
|
25
|
+
const calls = { log: [], debug: [], error: [] };
|
|
26
|
+
const original = { log: console.log, debug: console.debug, error: console.error };
|
|
27
|
+
|
|
28
|
+
console.log = (...args) => calls.log.push(args);
|
|
29
|
+
console.debug = (...args) => calls.debug.push(args);
|
|
30
|
+
console.error = (...args) => calls.error.push(args);
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
await fn();
|
|
34
|
+
return calls;
|
|
35
|
+
} finally {
|
|
36
|
+
console.log = original.log;
|
|
37
|
+
console.debug = original.debug;
|
|
38
|
+
console.error = original.error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// A call as one string, the way it lands in Cloud Logging: an address hides just
|
|
43
|
+
// as well inside a payload ARGUMENT as in the message, so a scan that only reads
|
|
44
|
+
// string args cannot see it. Same rendering email/marketing/remove-log-privacy
|
|
45
|
+
// scans with.
|
|
46
|
+
function render(args) {
|
|
47
|
+
return args.map((arg) => (typeof arg === 'string' ? arg : JSON.stringify(arg))).join(' ');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// The handler forwards the event context straight to the debug line and to the
|
|
51
|
+
// consumer hook — this is the 1st-gen EventContext shape for a user creation.
|
|
52
|
+
const EVENT_CONTEXT = {
|
|
53
|
+
eventType: 'providers/firebase.auth/eventTypes/user.create',
|
|
54
|
+
resource: { service: 'firebaseauth.googleapis.com' },
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// The persona's user doc must already exist — that is what sends the handler down
|
|
58
|
+
// its read-only "already exists" branch. Checked before every call so a missing doc
|
|
59
|
+
// fails the test instead of quietly rewriting a shared account.
|
|
60
|
+
async function assertDocExists({ assert, firestore, user }) {
|
|
61
|
+
const doc = await firestore.get(`users/${user.uid}`);
|
|
62
|
+
|
|
63
|
+
assert.equal(!!doc?.auth?.uid, true, `precondition: users/${user.uid} should already exist`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Run the thunk with the debug switch in a known state — the logger reads it live.
|
|
67
|
+
async function withDebug(value, fn) {
|
|
68
|
+
const saved = process.env.OMEGA_DEBUG;
|
|
69
|
+
|
|
70
|
+
if (value === undefined) {
|
|
71
|
+
delete process.env.OMEGA_DEBUG;
|
|
72
|
+
} else {
|
|
73
|
+
process.env.OMEGA_DEBUG = value;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
try {
|
|
77
|
+
return await fn();
|
|
78
|
+
} finally {
|
|
79
|
+
if (saved === undefined) {
|
|
80
|
+
delete process.env.OMEGA_DEBUG;
|
|
81
|
+
} else {
|
|
82
|
+
process.env.OMEGA_DEBUG = saved;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function runHandler({ Manager, user, debug }) {
|
|
88
|
+
const ctx = Manager.RouteContext({}, { functionName: 'omega_authOnCreate' });
|
|
89
|
+
const admin = Manager.libraries.admin;
|
|
90
|
+
|
|
91
|
+
const calls = await withConsoleRecorder(async () => {
|
|
92
|
+
await withDebug(debug, async () => {
|
|
93
|
+
await onCreate({
|
|
94
|
+
Manager: Manager,
|
|
95
|
+
ctx: ctx,
|
|
96
|
+
user: user,
|
|
97
|
+
context: EVENT_CONTEXT,
|
|
98
|
+
libraries: { admin: admin },
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
return { calls: calls, headlines: calls.log.filter((args) => args[1] === `onCreate: ${user.uid}`) };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
module.exports = defineCases({
|
|
107
|
+
description: 'auth:on-create logs one headline line, full record at debug',
|
|
108
|
+
type: 'group',
|
|
109
|
+
timeout: 30000,
|
|
110
|
+
|
|
111
|
+
tests: [
|
|
112
|
+
{
|
|
113
|
+
name: 'headline-is-the-uid-alone',
|
|
114
|
+
run: async ({ assert, Manager, accounts, firestore }) => {
|
|
115
|
+
const user = await Manager.libraries.admin.auth().getUser(accounts.basic.uid);
|
|
116
|
+
|
|
117
|
+
await assertDocExists({ assert: assert, firestore: firestore, user: user });
|
|
118
|
+
|
|
119
|
+
const { calls, headlines } = await runHandler({ Manager: Manager, user: user, debug: undefined });
|
|
120
|
+
|
|
121
|
+
assert.equal(headlines.length, 1, `expected one headline line, got ${headlines.length}`);
|
|
122
|
+
assert.equal(headlines[0][1], `onCreate: ${user.uid}`, headlines[0][1]);
|
|
123
|
+
|
|
124
|
+
// Prefix + message and nothing else — the record is off this line.
|
|
125
|
+
assert.equal(headlines[0].length, 2, `the headline carries a payload: ${JSON.stringify(headlines[0].slice(2)).slice(0, 200)}`);
|
|
126
|
+
|
|
127
|
+
// And the address is off every line, not just moved along the headline.
|
|
128
|
+
const leaked = calls.log.filter((args) => render(args).includes(user.email));
|
|
129
|
+
|
|
130
|
+
assert.equal(leaked.length, 0, `the email must not ride any log line: ${leaked.map(render).join(' | ').slice(0, 200)}`);
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
|
|
134
|
+
{
|
|
135
|
+
name: 'the-record-does-not-print-on-a-normal-run',
|
|
136
|
+
run: async ({ assert, Manager, accounts, firestore }) => {
|
|
137
|
+
const user = await Manager.libraries.admin.auth().getUser(accounts.basic.uid);
|
|
138
|
+
|
|
139
|
+
await assertDocExists({ assert: assert, firestore: firestore, user: user });
|
|
140
|
+
|
|
141
|
+
const { calls } = await runHandler({ Manager: Manager, user: user, debug: undefined });
|
|
142
|
+
|
|
143
|
+
assert.equal(calls.debug.length, 0, 'the record must stay behind the debug gate by default');
|
|
144
|
+
assert.equal(calls.log.filter((args) => args.includes(user)).length, 0, 'the record must not ride any log line');
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
|
|
148
|
+
{
|
|
149
|
+
name: 'the-full-record-is-reachable-with-omega-debug',
|
|
150
|
+
run: async ({ assert, Manager, accounts, firestore }) => {
|
|
151
|
+
const user = await Manager.libraries.admin.auth().getUser(accounts.basic.uid);
|
|
152
|
+
|
|
153
|
+
await assertDocExists({ assert: assert, firestore: firestore, user: user });
|
|
154
|
+
|
|
155
|
+
const { calls } = await runHandler({ Manager: Manager, user: user, debug: '1' });
|
|
156
|
+
|
|
157
|
+
const records = calls.debug.filter((args) => args.includes(user));
|
|
158
|
+
|
|
159
|
+
assert.equal(records.length, 1, 'the full UserRecord should log once at debug level');
|
|
160
|
+
assert.equal(records[0].includes(EVENT_CONTEXT), true, 'the event context should ride the debug line too');
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
});
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: auth:on-create fires NO conversion
|
|
3
|
+
* ([#577](https://github.com/Omega-JS-Stack/omega/issues/577), which moved the
|
|
4
|
+
* server half of `sign_up` off this trigger).
|
|
5
|
+
*
|
|
6
|
+
* The trigger used to fire it ([#385](https://github.com/Omega-JS-Stack/omega/issues/385) §4),
|
|
7
|
+
* and it fired blind: an auth trigger has no HTTP request behind it, so the
|
|
8
|
+
* registration reached Meta and TikTok with no IP, no user agent, no platform
|
|
9
|
+
* cookies and an attribution the browser had not posted yet. It now fires from
|
|
10
|
+
* the post-auth request that carries all four (`routes/user/signup`, covered by
|
|
11
|
+
* analytics/signup-conversion.test.js).
|
|
12
|
+
*
|
|
13
|
+
* Which makes THIS file's job the other half of that decision: the trigger must
|
|
14
|
+
* stay silent. Two fires with one dedupe id is one registration counted twice on
|
|
15
|
+
* platforms that merge them and two on the one that does not, so a well-meaning
|
|
16
|
+
* re-add here is exactly the regression worth a test.
|
|
17
|
+
*
|
|
18
|
+
* Real handler, real Manager, real ctx, real Firestore write. The record handed
|
|
19
|
+
* in is a UserRecord shape for a uid that has no doc yet — the branch a genuine
|
|
20
|
+
* new account takes. No Auth user is created, so the emulator's own trigger
|
|
21
|
+
* never races this one; the doc it writes is deleted afterwards.
|
|
22
|
+
*
|
|
23
|
+
* Run: npx omega test framework:events/auth-signup-conversion
|
|
24
|
+
*/
|
|
25
|
+
const onCreate = require('../../dist/manager/events/auth/on-create.js');
|
|
26
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
27
|
+
|
|
28
|
+
const EVENT_CONTEXT = {
|
|
29
|
+
eventType: 'providers/firebase.auth/eventTypes/user.create',
|
|
30
|
+
resource: { service: 'firebaseauth.googleapis.com' },
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// A brand-new account, in the UserRecord shape the 1st-gen trigger delivers.
|
|
34
|
+
function newUserRecord(providerId) {
|
|
35
|
+
const uid = `_test-signup-conversion-${Date.now()}-${Math.floor(Math.random() * 1e6)}`;
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
uid: uid,
|
|
39
|
+
email: `${uid}@test.invalid`,
|
|
40
|
+
displayName: 'Casey Buyer',
|
|
41
|
+
metadata: { creationTime: new Date().toISOString() },
|
|
42
|
+
providerData: [{ providerId: providerId, email: `${uid}@test.invalid`, displayName: 'Casey Buyer' }],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Record every console call the handler makes, restoring console afterward.
|
|
47
|
+
async function withConsoleRecorder(fn) {
|
|
48
|
+
const calls = { log: [], debug: [], error: [] };
|
|
49
|
+
const original = { log: console.log, debug: console.debug, error: console.error };
|
|
50
|
+
|
|
51
|
+
console.log = (...args) => calls.log.push(args);
|
|
52
|
+
console.debug = (...args) => calls.debug.push(args);
|
|
53
|
+
console.error = (...args) => calls.error.push(args);
|
|
54
|
+
|
|
55
|
+
try {
|
|
56
|
+
await fn();
|
|
57
|
+
return calls;
|
|
58
|
+
} finally {
|
|
59
|
+
console.log = original.log;
|
|
60
|
+
console.debug = original.debug;
|
|
61
|
+
console.error = original.error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Run the real handler for a brand-new user; hand back any delivery lines. */
|
|
66
|
+
async function runHandler({ Manager, user }) {
|
|
67
|
+
const ctx = Manager.RouteContext({}, { functionName: 'omega_authOnCreate' });
|
|
68
|
+
const admin = Manager.libraries.admin;
|
|
69
|
+
|
|
70
|
+
const calls = await withConsoleRecorder(async () => {
|
|
71
|
+
await onCreate({
|
|
72
|
+
Manager: Manager,
|
|
73
|
+
ctx: ctx,
|
|
74
|
+
user: user,
|
|
75
|
+
context: EVENT_CONTEXT,
|
|
76
|
+
libraries: { admin: admin },
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const delivery = calls.log
|
|
81
|
+
.map((args) => String(args[1]))
|
|
82
|
+
.filter((line) => line.startsWith('deliverConversion: '));
|
|
83
|
+
|
|
84
|
+
return { calls: calls, delivery: delivery };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
module.exports = defineCases({
|
|
88
|
+
description: 'auth:on-create writes the doc and fires no conversion (the post-auth request owns sign_up)',
|
|
89
|
+
type: 'group',
|
|
90
|
+
timeout: 30000,
|
|
91
|
+
|
|
92
|
+
tests: [
|
|
93
|
+
{
|
|
94
|
+
name: 'a-new-account-writes-its-doc-and-delivers-nothing',
|
|
95
|
+
async run({ assert, Manager, firestore }) {
|
|
96
|
+
const user = newUserRecord('password');
|
|
97
|
+
|
|
98
|
+
try {
|
|
99
|
+
const { delivery } = await runHandler({ Manager: Manager, user: user });
|
|
100
|
+
|
|
101
|
+
assert.deepEqual(delivery, [], `the trigger must fire no conversion — the post-auth request owns it: ${delivery.join(' | ')}`);
|
|
102
|
+
|
|
103
|
+
// And the account it is about actually landed.
|
|
104
|
+
assert.equal(await firestore.exists(`users/${user.uid}`), true, 'the handler still writes the user doc');
|
|
105
|
+
} finally {
|
|
106
|
+
await firestore.delete(`users/${user.uid}`);
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
{
|
|
112
|
+
name: 'a-provider-signup-delivers-nothing-either',
|
|
113
|
+
async run({ assert, Manager, firestore }) {
|
|
114
|
+
const user = newUserRecord('google.com');
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
const { delivery } = await runHandler({ Manager: Manager, user: user });
|
|
118
|
+
|
|
119
|
+
assert.deepEqual(delivery, [], `no signup path fires from the trigger: ${delivery.join(' | ')}`);
|
|
120
|
+
} finally {
|
|
121
|
+
await firestore.delete(`users/${user.uid}`);
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
{
|
|
127
|
+
name: 'an-existing-account-fires-nothing',
|
|
128
|
+
async run({ assert, Manager, accounts, firestore }) {
|
|
129
|
+
// A provider link or a re-fired trigger is not a registration. The
|
|
130
|
+
// handler returns at its "already exists" branch, before any work.
|
|
131
|
+
const existing = await Manager.libraries.admin.auth().getUser(accounts.basic.uid);
|
|
132
|
+
|
|
133
|
+
assert.equal(await firestore.exists(`users/${existing.uid}`), true, 'precondition: the persona already has a doc');
|
|
134
|
+
|
|
135
|
+
const { delivery } = await runHandler({ Manager: Manager, user: existing });
|
|
136
|
+
|
|
137
|
+
assert.deepEqual(delivery, [], `an existing account must fire no conversion: ${delivery.join(' | ')}`);
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
});
|