@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,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: which stack a backend CLI subcommand talks to
|
|
3
|
+
* ([#51](https://github.com/Omega-JS-Stack/omega/issues/51)).
|
|
4
|
+
*
|
|
5
|
+
* Ruling (uniformity amendment, Ian 2026-07-30): EVERY backend CLI subcommand
|
|
6
|
+
* targets the EMULATOR by default — reads and writes alike, one rule for the
|
|
7
|
+
* whole surface; `--production` is the only opt-in to touch live. A habitual
|
|
8
|
+
* `--emulator` names the default and consults nothing.
|
|
9
|
+
*
|
|
10
|
+
* Two layers: the resolver itself (pure), then the two command classes actually
|
|
11
|
+
* asking it — `initFirebase` is swapped for a recorder there because the real one
|
|
12
|
+
* would reach for a service account and a live project.
|
|
13
|
+
*
|
|
14
|
+
* Run: npx omega test backend:cli/target
|
|
15
|
+
*/
|
|
16
|
+
const { resolveTarget } = require('../../dist/cli/utils/target.js');
|
|
17
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
18
|
+
|
|
19
|
+
const FIREBASE_INIT_PATH = require.resolve('../../dist/cli/commands/firebase-init.js');
|
|
20
|
+
const FIRESTORE_PATH = require.resolve('../../dist/cli/commands/firestore.js');
|
|
21
|
+
const AUTH_PATH = require.resolve('../../dist/cli/commands/auth.js');
|
|
22
|
+
|
|
23
|
+
// A firebase-admin stand-in: the writes the subcommands make, recorded.
|
|
24
|
+
function recordingAdmin() {
|
|
25
|
+
const writes = [];
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
writes,
|
|
29
|
+
firestore: () => ({
|
|
30
|
+
doc: (docPath) => ({
|
|
31
|
+
set: async (data, options) => writes.push({ op: 'set', docPath, data, options }),
|
|
32
|
+
delete: async () => writes.push({ op: 'delete', docPath }),
|
|
33
|
+
}),
|
|
34
|
+
}),
|
|
35
|
+
auth: () => ({
|
|
36
|
+
getUser: async (uid) => ({ uid, email: null, toJSON: () => ({ uid }) }),
|
|
37
|
+
getUserByEmail: async (email) => ({ uid: 'uid-for-email', email, toJSON: () => ({ email }) }),
|
|
38
|
+
setCustomUserClaims: async (uid, claims) => writes.push({ op: 'set-claims', uid, claims }),
|
|
39
|
+
deleteUser: async (uid) => writes.push({ op: 'delete-user', uid }),
|
|
40
|
+
}),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Run a CLI subcommand with the Firebase door swapped for a recorder, capturing
|
|
45
|
+
// both the target it asked for and everything it printed.
|
|
46
|
+
async function runSubcommand(commandPath, args, argv) {
|
|
47
|
+
const originalInit = require.cache[FIREBASE_INIT_PATH];
|
|
48
|
+
const originalLog = console.log;
|
|
49
|
+
const admin = recordingAdmin();
|
|
50
|
+
const asked = [];
|
|
51
|
+
const printed = [];
|
|
52
|
+
|
|
53
|
+
require.cache[FIREBASE_INIT_PATH] = {
|
|
54
|
+
id: FIREBASE_INIT_PATH,
|
|
55
|
+
filename: FIREBASE_INIT_PATH,
|
|
56
|
+
loaded: true,
|
|
57
|
+
exports: {
|
|
58
|
+
initFirebase: (options) => {
|
|
59
|
+
asked.push(options);
|
|
60
|
+
return { admin, projectId: options.emulator ? 'demo-fixture' : 'live-fixture' };
|
|
61
|
+
},
|
|
62
|
+
resolveProjectId: () => 'demo-fixture',
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// Drop the command module so it re-requires the stubbed door.
|
|
67
|
+
delete require.cache[commandPath];
|
|
68
|
+
const Command = require(commandPath);
|
|
69
|
+
|
|
70
|
+
console.log = (...line) => printed.push(line.map(String).join(' '));
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
const main = {
|
|
74
|
+
firebaseProjectPath: __dirname,
|
|
75
|
+
argv: { _: args, ...argv },
|
|
76
|
+
options: {},
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
await new Command(main).execute();
|
|
80
|
+
} finally {
|
|
81
|
+
console.log = originalLog;
|
|
82
|
+
delete require.cache[commandPath];
|
|
83
|
+
if (originalInit) {
|
|
84
|
+
require.cache[FIREBASE_INIT_PATH] = originalInit;
|
|
85
|
+
} else {
|
|
86
|
+
delete require.cache[FIREBASE_INIT_PATH];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return { emulator: asked[0]?.emulator, output: printed.join('\n'), writes: admin.writes };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
module.exports = defineCases({
|
|
94
|
+
description: 'CLI target selection — emulator by default, live only with --production',
|
|
95
|
+
type: 'group',
|
|
96
|
+
|
|
97
|
+
tests: [
|
|
98
|
+
{
|
|
99
|
+
name: 'every-subcommand-defaults-to-the-emulator',
|
|
100
|
+
async run({ assert }) {
|
|
101
|
+
assert.equal(resolveTarget({}).emulator, true, 'no flags should default to the emulator');
|
|
102
|
+
assert.equal(resolveTarget({}).label, 'emulator', 'no flags should be labelled emulator');
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
{
|
|
107
|
+
name: 'production-flag-is-the-only-way-to-the-live-stack',
|
|
108
|
+
async run({ assert }) {
|
|
109
|
+
assert.equal(resolveTarget({ production: true }).emulator, false, '--production should hit live');
|
|
110
|
+
assert.equal(resolveTarget({ production: true }).label, 'production', '--production should be labelled production');
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
{
|
|
115
|
+
name: 'emulator-flag-names-the-default-and-consults-nothing',
|
|
116
|
+
async run({ assert }) {
|
|
117
|
+
assert.equal(resolveTarget({ emulator: true }).emulator, true, '--emulator lands where the default already goes');
|
|
118
|
+
assert.equal(resolveTarget({ emulator: true, production: true }).emulator, false, '--production wins; --emulator is not consulted');
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
{
|
|
123
|
+
name: 'firestore-set-asks-for-the-emulator-with-no-flag',
|
|
124
|
+
async run({ assert }) {
|
|
125
|
+
const run = await runSubcommand(FIRESTORE_PATH, ['firestore:set', 'users/_test-target', '{"a":1}'], {});
|
|
126
|
+
|
|
127
|
+
assert.equal(run.emulator, true, 'firestore:set should have initialized against the emulator');
|
|
128
|
+
assert.equal(run.writes.length, 1, 'The document should have been written');
|
|
129
|
+
assert.equal(run.output.includes('emulator'), true, `The output should name the stack it hit: ${run.output}`);
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
|
|
133
|
+
{
|
|
134
|
+
name: 'firestore-set-with-production-asks-for-the-live-stack',
|
|
135
|
+
async run({ assert }) {
|
|
136
|
+
const run = await runSubcommand(FIRESTORE_PATH, ['firestore:set', 'users/_test-target', '{"a":1}'], { production: true });
|
|
137
|
+
|
|
138
|
+
assert.equal(run.emulator, false, 'firestore:set --production should have initialized against live');
|
|
139
|
+
assert.equal(run.output.includes('production'), true, `The output should name the stack it hit: ${run.output}`);
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
|
|
143
|
+
{
|
|
144
|
+
name: 'auth-set-claims-asks-for-the-emulator-with-no-flag',
|
|
145
|
+
async run({ assert }) {
|
|
146
|
+
const run = await runSubcommand(AUTH_PATH, ['auth:set-claims', '_test-uid', '{"admin":true}'], {});
|
|
147
|
+
|
|
148
|
+
assert.equal(run.emulator, true, 'auth:set-claims should have initialized against the emulator');
|
|
149
|
+
assert.equal(run.writes.length, 1, 'The claims should have been set');
|
|
150
|
+
assert.equal(run.output.includes('emulator'), true, `The output should name the stack it hit: ${run.output}`);
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
{
|
|
155
|
+
name: 'auth-set-claims-with-production-asks-for-the-live-stack',
|
|
156
|
+
async run({ assert }) {
|
|
157
|
+
const run = await runSubcommand(AUTH_PATH, ['auth:set-claims', '_test-uid', '{"admin":true}'], { production: true });
|
|
158
|
+
|
|
159
|
+
assert.equal(run.emulator, false, 'auth:set-claims --production should have initialized against live');
|
|
160
|
+
assert.equal(run.output.includes('production'), true, `The output should name the stack it hit: ${run.output}`);
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
{
|
|
165
|
+
name: 'a-read-subcommand-follows-the-same-emulator-default',
|
|
166
|
+
async run({ assert }) {
|
|
167
|
+
const run = await runSubcommand(AUTH_PATH, ['auth:get', '_test-uid'], {});
|
|
168
|
+
|
|
169
|
+
assert.equal(run.emulator, true, 'auth:get should default to the emulator like everything else');
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
|
|
173
|
+
{
|
|
174
|
+
name: 'a-read-subcommand-reaches-live-with-production',
|
|
175
|
+
async run({ assert }) {
|
|
176
|
+
const run = await runSubcommand(AUTH_PATH, ['auth:get', '_test-uid'], { production: true });
|
|
177
|
+
|
|
178
|
+
assert.equal(run.emulator, false, 'auth:get --production should hit live');
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
});
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: the shipped scaffold templates
|
|
3
|
+
* ([#278](https://github.com/Omega-JS-Stack/omega/issues/278),
|
|
4
|
+
* [#279](https://github.com/Omega-JS-Stack/omega/issues/279)).
|
|
5
|
+
*
|
|
6
|
+
* `templates/` is what setup writes into a consumer that carries no file of
|
|
7
|
+
* its own, so a template's default IS the brand's default until someone edits
|
|
8
|
+
* it. Two defaults are pinned here: storage denies everything (a brand that
|
|
9
|
+
* serves files opts in deliberately, per-path), and the internal welcome page
|
|
10
|
+
* carries its own title instead of 404.html's.
|
|
11
|
+
*
|
|
12
|
+
* Pure file reads — no project, no emulator.
|
|
13
|
+
*
|
|
14
|
+
* Run: npx omega test backend:cli/templates
|
|
15
|
+
*/
|
|
16
|
+
const fs = require('fs');
|
|
17
|
+
const path = require('path');
|
|
18
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
19
|
+
|
|
20
|
+
const TEMPLATES_DIR = path.join(__dirname, '..', '..', 'templates');
|
|
21
|
+
|
|
22
|
+
function readTemplate(...segments) {
|
|
23
|
+
return fs.readFileSync(path.join(TEMPLATES_DIR, ...segments), 'utf8');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function readTitle(html) {
|
|
27
|
+
const match = html.match(/<title>([^<]*)<\/title>/);
|
|
28
|
+
|
|
29
|
+
return match ? match[1] : null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
module.exports = defineCases({
|
|
33
|
+
description: 'Shipped templates: storage denies by default, the welcome page owns its title',
|
|
34
|
+
type: 'group',
|
|
35
|
+
timeout: 10000,
|
|
36
|
+
|
|
37
|
+
tests: [
|
|
38
|
+
{
|
|
39
|
+
name: 'storage-rules-template-denies-by-default',
|
|
40
|
+
auth: 'none',
|
|
41
|
+
|
|
42
|
+
async run({ assert }) {
|
|
43
|
+
const rules = readTemplate('storage.rules');
|
|
44
|
+
const allows = rules.split('\n').map((line) => line.trim()).filter((line) => line.startsWith('allow '));
|
|
45
|
+
|
|
46
|
+
assert.equal(allows.length, 1, `the template must carry exactly one allow rule (found ${allows.length})`);
|
|
47
|
+
assert.match(allows[0], /^allow read, write:\s*if false;$/, `the shipped default must deny everything (found "${allows[0]}")`);
|
|
48
|
+
assert.equal(rules.includes('request.auth'), false, 'the scaffold default must not grant on authentication alone');
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
{
|
|
53
|
+
name: 'welcome-page-template-titles-itself',
|
|
54
|
+
auth: 'none',
|
|
55
|
+
|
|
56
|
+
async run({ assert }) {
|
|
57
|
+
const index = readTemplate('public', 'index.html');
|
|
58
|
+
const notFound = readTemplate('public', '404.html');
|
|
59
|
+
|
|
60
|
+
assert.equal(readTitle(index), 'Welcome', 'index.html must title itself, not carry 404.html\'s title');
|
|
61
|
+
assert.equal(index.includes('Welcome!'), true, 'index.html is still the internal welcome page');
|
|
62
|
+
assert.equal(readTitle(notFound), '404 Error Page', '404.html keeps its own title');
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
});
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: the env the test runner child is spawned with
|
|
3
|
+
* ([#292](https://github.com/Omega-JS-Stack/omega/issues/292)).
|
|
4
|
+
*
|
|
5
|
+
* The command carried the two emulator hosts but never the PROJECT they belong
|
|
6
|
+
* to, so the runner's `process.env.GCLOUD_PROJECT` was empty and every read of
|
|
7
|
+
* it downstream fell back to a default — including the auth bulk-clear URL,
|
|
8
|
+
* which the emulator answers 200 for whatever project it names. The wipe
|
|
9
|
+
* reported success and cleared a store the run never touched.
|
|
10
|
+
*
|
|
11
|
+
* Run: npx omega test backend:cli/test-runner-env
|
|
12
|
+
*
|
|
13
|
+
* The command builder is pure (a resolved test config in, a shell string out),
|
|
14
|
+
* so this runs here directly — the wipe's own behavior against a real emulator
|
|
15
|
+
* is proven in helpers/wipe-auth-project.
|
|
16
|
+
*/
|
|
17
|
+
const TestCommand = require('../../dist/cli/commands/test.js');
|
|
18
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
19
|
+
|
|
20
|
+
const PROJECT_ID = 'demo-omega-backend';
|
|
21
|
+
|
|
22
|
+
// A resolved test config the way execute() builds one (loadProjectConfig has
|
|
23
|
+
// already hard-failed on a missing cloud.config.projectId by this point).
|
|
24
|
+
const TEST_CONFIG = {
|
|
25
|
+
cloud: { config: { projectId: PROJECT_ID } },
|
|
26
|
+
apiUrl: 'http://127.0.0.1:5002',
|
|
27
|
+
projectDir: '/tmp/omega-fixture',
|
|
28
|
+
testPaths: [],
|
|
29
|
+
emulatorPorts: { firestore: 8080, auth: 9099, hosting: 5002 },
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
function buildCommand(testConfig) {
|
|
33
|
+
const command = new TestCommand({ firebaseProjectPath: testConfig.projectDir, argv: {}, options: {} });
|
|
34
|
+
|
|
35
|
+
return command.buildTestCommand(testConfig);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
module.exports = defineCases({
|
|
39
|
+
description: 'the test runner child is told which project it is testing',
|
|
40
|
+
type: 'group',
|
|
41
|
+
|
|
42
|
+
tests: [
|
|
43
|
+
{
|
|
44
|
+
name: 'the-command-exports-gcloud-project-from-the-resolved-config',
|
|
45
|
+
run({ assert }) {
|
|
46
|
+
assert.match(buildCommand(TEST_CONFIG), new RegExp(`GCLOUD_PROJECT='${PROJECT_ID}'`));
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
{
|
|
51
|
+
name: 'the-emulator-hosts-still-ride-along-with-it',
|
|
52
|
+
run({ assert }) {
|
|
53
|
+
const command = buildCommand(TEST_CONFIG);
|
|
54
|
+
|
|
55
|
+
assert.match(command, /FIRESTORE_EMULATOR_HOST='127\.0\.0\.1:8080'/);
|
|
56
|
+
assert.match(command, /FIREBASE_AUTH_EMULATOR_HOST='127\.0\.0\.1:9099'/);
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
|
|
60
|
+
{
|
|
61
|
+
name: 'bumped-ports-and-the-project-id-travel-together',
|
|
62
|
+
run({ assert }) {
|
|
63
|
+
// The auto-start path rebuilds the command from the RESOLVED ports after
|
|
64
|
+
// boot; the project id is the same either way.
|
|
65
|
+
const command = buildCommand({
|
|
66
|
+
...TEST_CONFIG,
|
|
67
|
+
emulatorPorts: { firestore: 8081, auth: 9100, hosting: 5003 },
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
assert.match(command, new RegExp(`GCLOUD_PROJECT='${PROJECT_ID}'`));
|
|
71
|
+
assert.match(command, /FIREBASE_AUTH_EMULATOR_HOST='127\.0\.0\.1:9100'/);
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
// ─── the stack the runner's own URL getters resolve
|
|
76
|
+
// ([#291](https://github.com/Omega-JS-Stack/omega/issues/291)) ───
|
|
77
|
+
|
|
78
|
+
{
|
|
79
|
+
name: 'the-resolved-port-map-rides-along-with-the-command',
|
|
80
|
+
run({ assert }) {
|
|
81
|
+
// Journey tests call route handlers IN-PROCESS, so the runner's Manager
|
|
82
|
+
// builds URLs from OMEGA_*_PORT exactly like a function worker does.
|
|
83
|
+
// Unset, every getter fell back to the classic defaults and answered for
|
|
84
|
+
// a stack that may not be there.
|
|
85
|
+
const command = buildCommand({
|
|
86
|
+
...TEST_CONFIG,
|
|
87
|
+
emulatorPorts: { firestore: 8081, auth: 9100, hosting: 5003, functions: 5004 },
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
assert.match(command, /OMEGA_HOSTING_PORT='5003'/);
|
|
91
|
+
assert.match(command, /OMEGA_FUNCTIONS_PORT='5004'/);
|
|
92
|
+
assert.match(command, /OMEGA_FIRESTORE_PORT='8081'/);
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
{
|
|
97
|
+
name: 'the-https-front-is-never-handed-to-the-runner',
|
|
98
|
+
run({ assert }) {
|
|
99
|
+
// `omega emulator` defaults HTTPS on: hosting moves to an internal plain
|
|
100
|
+
// port and the mkcert proxy takes the classic one. The runner has no CA
|
|
101
|
+
// for that cert — handed the TLS port it would send the test provider's
|
|
102
|
+
// auto-webhook through the proxy and fail on the handshake, so it gets
|
|
103
|
+
// hosting's INTERNAL port and nothing else.
|
|
104
|
+
const command = buildCommand({
|
|
105
|
+
...TEST_CONFIG,
|
|
106
|
+
apiUrl: 'http://127.0.0.1:5443',
|
|
107
|
+
emulatorPorts: { firestore: 8080, auth: 9099, hosting: 5443, https: 5002 },
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
assert.match(command, /OMEGA_HOSTING_PORT='5443'/);
|
|
111
|
+
assert.notMatch(command, /OMEGA_HTTPS_PORT/);
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
});
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: the stack `omega test` starts for itself goes down on EVERY stop signal
|
|
3
|
+
* ([#722](https://github.com/Omega-JS-Stack/omega/issues/722)).
|
|
4
|
+
*
|
|
5
|
+
* `omega test` boots its own emulator when there is none to adopt, and it wired
|
|
6
|
+
* the teardown to SIGINT alone. A run stopped any other way — a supervisor's
|
|
7
|
+
* SIGTERM, a closed terminal's SIGHUP — took Node's default action instead: the
|
|
8
|
+
* CLI process died where it stood and the whole firebase tree it had spawned
|
|
9
|
+
* reparented to PID 1, exactly the [#629](https://github.com/Omega-JS-Stack/omega/issues/629)
|
|
10
|
+
* defect on the sibling path.
|
|
11
|
+
*
|
|
12
|
+
* Run: npx omega test backend:cli/test-stack-shutdown
|
|
13
|
+
*
|
|
14
|
+
* The run under test is a REAL child process, detached into its own process
|
|
15
|
+
* group: a signal is only a signal when it arrives at a process, and an
|
|
16
|
+
* in-process case can call the stop path but never prove SIGHUP reaches it. No
|
|
17
|
+
* emulator is booted — startEmulators is the one seam replaced, because what
|
|
18
|
+
* the signal path owes its caller is decided by what it does with the HANDLE,
|
|
19
|
+
* not by how the handle came to be. The test runner it spawns is a `sleep`, so
|
|
20
|
+
* the run idles the way a real one does while its suites run.
|
|
21
|
+
*/
|
|
22
|
+
const os = require('os');
|
|
23
|
+
const path = require('path');
|
|
24
|
+
const { spawn, execSync } = require('child_process');
|
|
25
|
+
const jetpack = require('fs-jetpack');
|
|
26
|
+
const powertools = require('node-powertools');
|
|
27
|
+
|
|
28
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
29
|
+
|
|
30
|
+
// The run, in its own process. startEmulators hands back the same three things
|
|
31
|
+
// a real boot does — a shutdown, a promise that never settles on its own (the
|
|
32
|
+
// child outlives the suites), and a resolved port map — and records the one
|
|
33
|
+
// thing under test: whether the teardown was reached at all.
|
|
34
|
+
const SIGNAL_DRIVER = `
|
|
35
|
+
const fs = require('fs');
|
|
36
|
+
const [, , commandPath, emulatorPath, projectDir, statePath, readyPath] = process.argv;
|
|
37
|
+
|
|
38
|
+
const TestCommand = require(commandPath);
|
|
39
|
+
const EmulatorCommand = require(emulatorPath);
|
|
40
|
+
|
|
41
|
+
EmulatorCommand.prototype.startEmulators = async () => ({
|
|
42
|
+
// Slow on purpose: a real teardown signals a tree and waits on ports, and a
|
|
43
|
+
// second stop signal arriving DURING it is the case the handler must survive.
|
|
44
|
+
shutdown: async () => {
|
|
45
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
46
|
+
fs.appendFileSync(statePath, 'shutdown\\n');
|
|
47
|
+
},
|
|
48
|
+
exitPromise: new Promise(() => {}),
|
|
49
|
+
emulatorPorts: { hosting: 15002, firestore: 18080, auth: 19099, ui: 14000 },
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
const command = new TestCommand({ firebaseProjectPath: projectDir, argv: {}, options: {} });
|
|
53
|
+
|
|
54
|
+
// 'Logs saving to' is the last line the run prints before it settles into
|
|
55
|
+
// waiting on its test child — and it prints AFTER the stop handlers are
|
|
56
|
+
// registered, which is what the parent must not race. 'Shutting down' is the
|
|
57
|
+
// handler's own first line, so the state file counts how many times the
|
|
58
|
+
// teardown was ENTERED, not just whether it finished.
|
|
59
|
+
command.log = (message) => {
|
|
60
|
+
const text = String(message);
|
|
61
|
+
|
|
62
|
+
if (/Shutting down emulator/.test(text)) fs.appendFileSync(statePath, 'teardown\\n');
|
|
63
|
+
if (/Logs saving to/.test(text)) fs.writeFileSync(readyPath, 'ready');
|
|
64
|
+
};
|
|
65
|
+
command.logError = () => {};
|
|
66
|
+
command.logWarning = () => {};
|
|
67
|
+
command.startLane = async () => ({ env: {}, stop: () => {} });
|
|
68
|
+
command.buildTestCommand = () => 'sleep 30';
|
|
69
|
+
|
|
70
|
+
command.runEmulatorTests({}, projectDir).catch(() => {});
|
|
71
|
+
`;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Poll until `check` passes or the window closes.
|
|
75
|
+
* @param {Function} check - Returns truthy when the wait is over.
|
|
76
|
+
* @param {number} timeoutMs - How long to keep looking.
|
|
77
|
+
* @returns {Promise<boolean>} Whether it passed inside the window.
|
|
78
|
+
*/
|
|
79
|
+
async function waitUntil(check, timeoutMs) {
|
|
80
|
+
const deadline = Date.now() + timeoutMs;
|
|
81
|
+
|
|
82
|
+
while (Date.now() < deadline) {
|
|
83
|
+
if (check()) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
await powertools.wait(50);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return check();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The command line a pid is running right now, or '' when it is gone.
|
|
95
|
+
* @param {number} pid - The pid to read.
|
|
96
|
+
* @returns {string}
|
|
97
|
+
*/
|
|
98
|
+
function commandOf(pid) {
|
|
99
|
+
try {
|
|
100
|
+
return execSync(`ps -o command= -p ${Number(pid)} 2>/dev/null`, { encoding: 'utf8' }).trim();
|
|
101
|
+
} catch (error) {
|
|
102
|
+
return '';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* The run's ONE child: the test runner it spawned. Read from the process table
|
|
108
|
+
* rather than reported by the driver, because what is on trial is whether a
|
|
109
|
+
* real process is still there after the run is gone.
|
|
110
|
+
* @param {number} pid - The run's pid.
|
|
111
|
+
* @returns {number|null}
|
|
112
|
+
*/
|
|
113
|
+
function testRunnerPid(pid) {
|
|
114
|
+
try {
|
|
115
|
+
const found = execSync(`pgrep -P ${Number(pid)} 2>/dev/null`, { encoding: 'utf8' }).trim().split('\n')[0];
|
|
116
|
+
return found ? Number(found) : null;
|
|
117
|
+
} catch (error) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Boot the driver and wait for the run to reach the point where it is waiting
|
|
124
|
+
* on its test child — stop handlers registered, stack "up".
|
|
125
|
+
*/
|
|
126
|
+
async function bootedRun() {
|
|
127
|
+
const dir = path.join(os.tmpdir(), `omega-test-signal-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
128
|
+
const statePath = path.join(dir, 'state.txt');
|
|
129
|
+
const readyPath = path.join(dir, 'ready.txt');
|
|
130
|
+
|
|
131
|
+
// getLogsPath() writes test.log into dist/ — the one real directory the run
|
|
132
|
+
// touches, inside this throwaway project.
|
|
133
|
+
jetpack.dir(path.join(dir, 'dist'));
|
|
134
|
+
jetpack.write(path.join(dir, 'driver.js'), SIGNAL_DRIVER);
|
|
135
|
+
|
|
136
|
+
// Detached: the run gets its OWN process group, so the signal below lands on
|
|
137
|
+
// that ONE process and nothing else — the strictly harder case, and the one
|
|
138
|
+
// a supervisor's stop and a closed terminal both produce.
|
|
139
|
+
const child = spawn(process.execPath, [
|
|
140
|
+
path.join(dir, 'driver.js'),
|
|
141
|
+
require.resolve('../../dist/cli/commands/test.js'),
|
|
142
|
+
require.resolve('../../dist/cli/commands/emulator.js'),
|
|
143
|
+
dir,
|
|
144
|
+
statePath,
|
|
145
|
+
readyPath,
|
|
146
|
+
], {
|
|
147
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
148
|
+
detached: true,
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
let output = '';
|
|
152
|
+
child.stdout.on('data', (data) => { output += data.toString(); });
|
|
153
|
+
child.stderr.on('data', (data) => { output += data.toString(); });
|
|
154
|
+
|
|
155
|
+
let exit = null;
|
|
156
|
+
child.once('exit', (code, signal) => { exit = { code: code, signal: signal }; });
|
|
157
|
+
|
|
158
|
+
const ready = await waitUntil(() => jetpack.exists(readyPath), 60000);
|
|
159
|
+
|
|
160
|
+
// The test runner is spawned on the very next line the run executes, and it
|
|
161
|
+
// is the half of the stack the signal does NOT reach on its own.
|
|
162
|
+
let runnerPid = null;
|
|
163
|
+
await waitUntil(() => {
|
|
164
|
+
runnerPid = testRunnerPid(child.pid);
|
|
165
|
+
return runnerPid !== null;
|
|
166
|
+
}, 30000);
|
|
167
|
+
|
|
168
|
+
return {
|
|
169
|
+
child: child,
|
|
170
|
+
ready: ready,
|
|
171
|
+
runnerPid: runnerPid,
|
|
172
|
+
output: () => output,
|
|
173
|
+
exit: () => exit,
|
|
174
|
+
state: () => String(jetpack.read(statePath) || ''),
|
|
175
|
+
cleanup: () => {
|
|
176
|
+
try { process.kill(-child.pid, 'SIGKILL'); } catch (e) { /* already gone */ }
|
|
177
|
+
try { process.kill(child.pid, 'SIGKILL'); } catch (e) { /* already gone */ }
|
|
178
|
+
jetpack.remove(dir);
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Boot the run, signal it, and prove it took its teardown instead of dying.
|
|
185
|
+
* The only process signalled is the one this case spawned.
|
|
186
|
+
* @param {object} assert - The case assertions.
|
|
187
|
+
* @param {string} signal - The stop signal under test.
|
|
188
|
+
*/
|
|
189
|
+
async function tearsDownOn(assert, signal) {
|
|
190
|
+
const run = await bootedRun();
|
|
191
|
+
|
|
192
|
+
try {
|
|
193
|
+
assert.equal(run.ready, true, `the run must come up before it can be stopped: ${run.output()}`);
|
|
194
|
+
assert.equal(typeof run.runnerPid, 'number', `the run must reach its test runner before it is stopped: ${run.output()}`);
|
|
195
|
+
|
|
196
|
+
process.kill(run.child.pid, signal);
|
|
197
|
+
|
|
198
|
+
assert.equal(await waitUntil(() => run.exit() !== null, 30000), true, `the run must exit on ${signal}: ${run.output()}`);
|
|
199
|
+
assert.equal(run.state().includes('shutdown'), true, `${signal} must run the emulator teardown, not Node's default action`);
|
|
200
|
+
assert.equal(run.exit().code, 130, `a signalled run exits 130 on ${signal}, got ${JSON.stringify(run.exit())}`);
|
|
201
|
+
|
|
202
|
+
// The signal is DIRECTED at the CLI pid, so it never reaches the test
|
|
203
|
+
// runner: unless the teardown takes the child down itself, the suites keep
|
|
204
|
+
// running orphaned to PID 1 long after the run that owns them is gone.
|
|
205
|
+
const runnerGone = await waitUntil(() => !commandOf(run.runnerPid), 10000);
|
|
206
|
+
assert.equal(runnerGone, true, `${signal} must take the test runner down too — pid ${run.runnerPid} still running ${JSON.stringify(commandOf(run.runnerPid))}`);
|
|
207
|
+
} finally {
|
|
208
|
+
run.cleanup();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
module.exports = defineCases({
|
|
213
|
+
description: 'omega test: the auto-started emulator stack goes down on every stop signal',
|
|
214
|
+
type: 'group',
|
|
215
|
+
timeout: 120000,
|
|
216
|
+
|
|
217
|
+
tests: [
|
|
218
|
+
{
|
|
219
|
+
name: 'ctrl-c-tears-the-auto-started-stack-down',
|
|
220
|
+
timeout: 120000,
|
|
221
|
+
async run({ assert }) {
|
|
222
|
+
// The one signal this path always handled — it must survive the trio.
|
|
223
|
+
await tearsDownOn(assert, 'SIGINT');
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
|
|
227
|
+
{
|
|
228
|
+
name: 'a-programmatic-stop-tears-the-auto-started-stack-down',
|
|
229
|
+
timeout: 120000,
|
|
230
|
+
async run({ assert }) {
|
|
231
|
+
// SIGTERM is how anything but a terminal stops a run: a supervisor, a
|
|
232
|
+
// harness, `kill` with no flag. It killed the CLI outright and left the
|
|
233
|
+
// emulator it had spawned behind.
|
|
234
|
+
await tearsDownOn(assert, 'SIGTERM');
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
|
|
238
|
+
{
|
|
239
|
+
name: 'a-closed-terminal-tears-the-auto-started-stack-down',
|
|
240
|
+
timeout: 120000,
|
|
241
|
+
async run({ assert }) {
|
|
242
|
+
// Closing the window on a running `omega test` sends SIGHUP, and it
|
|
243
|
+
// orphaned the same tree onto PID 1.
|
|
244
|
+
await tearsDownOn(assert, 'SIGHUP');
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
|
|
248
|
+
{
|
|
249
|
+
name: 'a-second-stop-signal-does-not-start-a-second-teardown',
|
|
250
|
+
timeout: 120000,
|
|
251
|
+
async run({ assert }) {
|
|
252
|
+
// Impatient Ctrl+C, and a supervisor's escalation, both send a second
|
|
253
|
+
// signal while the first teardown is still running. Unguarded, the
|
|
254
|
+
// handler runs again underneath it and tears the same stack down twice.
|
|
255
|
+
const run = await bootedRun();
|
|
256
|
+
|
|
257
|
+
try {
|
|
258
|
+
assert.equal(run.ready, true, `the run must come up before it can be stopped: ${run.output()}`);
|
|
259
|
+
|
|
260
|
+
process.kill(run.child.pid, 'SIGINT');
|
|
261
|
+
await powertools.wait(100);
|
|
262
|
+
|
|
263
|
+
assert.equal(run.exit(), null, 'the second signal must land while the first teardown is still running');
|
|
264
|
+
try { process.kill(run.child.pid, 'SIGINT'); } catch (e) { /* raced the exit */ }
|
|
265
|
+
|
|
266
|
+
assert.equal(await waitUntil(() => run.exit() !== null, 30000), true, `the run must exit: ${run.output()}`);
|
|
267
|
+
assert.equal(run.state().split('teardown').length - 1, 1, `the teardown is ENTERED once, got ${JSON.stringify(run.state())}`);
|
|
268
|
+
assert.equal(run.state().includes('shutdown'), true, `the one teardown still runs to completion, got ${JSON.stringify(run.state())}`);
|
|
269
|
+
} finally {
|
|
270
|
+
run.cleanup();
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
],
|
|
275
|
+
});
|