@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,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: `npx omega setup --offline` never mutates the brand's live cloud
|
|
3
|
+
* project ([#284](https://github.com/Omega-JS-Stack/omega/issues/284)).
|
|
4
|
+
*
|
|
5
|
+
* Two setup checks reach outside the working tree with no opt-out:
|
|
6
|
+
* `firestore-indexes-synced.fix()` runs `firebase deploy --only
|
|
7
|
+
* firestore:indexes`, and `storage-lifecycle-policy.run()` runs `gsutil
|
|
8
|
+
* lifecycle set`. Scaffolding a fresh app therefore rewrote production
|
|
9
|
+
* infrastructure as a side effect. `--offline` downgrades both to REPORTED
|
|
10
|
+
* failures ('warn' — surfaced in the summary, never halting): the read-only
|
|
11
|
+
* drift report still runs, the mutation does not.
|
|
12
|
+
*
|
|
13
|
+
* The ONE stub here is `powertools.execute` — the single seam every one of
|
|
14
|
+
* these spawns goes through. The real calls deploy Firestore indexes and
|
|
15
|
+
* rewrite GCS bucket lifecycle on a LIVE project; neither surface has an
|
|
16
|
+
* emulator, and running them is the exact bug under test. Restored in a
|
|
17
|
+
* `finally`, and the read-only leg is shimmed to the real command's contract
|
|
18
|
+
* (`firebase firestore:indexes > <file>` writes the live JSON to <file>) so
|
|
19
|
+
* the check's own comparison logic runs for real.
|
|
20
|
+
*
|
|
21
|
+
* Run: npx omega test backend:cli/setup-offline-mode
|
|
22
|
+
*/
|
|
23
|
+
const path = require('path');
|
|
24
|
+
const jetpack = require('fs-jetpack');
|
|
25
|
+
const powertools = require('node-powertools');
|
|
26
|
+
const { BOOLEAN_FLAGS } = require('../../dist/cli/flags.js');
|
|
27
|
+
const FirestoreIndexesSyncedTest = require('../../dist/cli/commands/setup-tests/firestore-indexes-synced.js');
|
|
28
|
+
const StorageLifecyclePolicyTest = require('../../dist/cli/commands/setup-tests/storage-lifecycle-policy.js');
|
|
29
|
+
const MarketingCampaignsSeededTest = require('../../dist/cli/commands/setup-tests/marketing-campaigns-seeded.js');
|
|
30
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
31
|
+
|
|
32
|
+
// What the target has committed vs what the live project actually carries — one
|
|
33
|
+
// differing index is all the drift the check needs to fail.
|
|
34
|
+
const LOCAL_INDEXES = {
|
|
35
|
+
indexes: [
|
|
36
|
+
{ collectionGroup: 'users', queryScope: 'COLLECTION', fields: [{ fieldPath: 'email', order: 'ASCENDING' }] },
|
|
37
|
+
],
|
|
38
|
+
fieldOverrides: [],
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const LIVE_INDEXES = {
|
|
42
|
+
indexes: [
|
|
43
|
+
{ collectionGroup: 'posts', queryScope: 'COLLECTION', fields: [{ fieldPath: 'published', order: 'DESCENDING' }] },
|
|
44
|
+
],
|
|
45
|
+
fieldOverrides: [],
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Every command these checks spawn goes through powertools.execute. `onCommand`
|
|
49
|
+
// shims the read-only leg; anything it does not answer throws, so an unexpected
|
|
50
|
+
// spawn fails the test instead of reaching the network.
|
|
51
|
+
async function withSpawnTrap(fn, onCommand) {
|
|
52
|
+
const original = powertools.execute;
|
|
53
|
+
const spawned = [];
|
|
54
|
+
|
|
55
|
+
powertools.execute = async (command, options) => {
|
|
56
|
+
spawned.push(command);
|
|
57
|
+
|
|
58
|
+
if (onCommand) {
|
|
59
|
+
return await onCommand(command, options);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
throw new Error(`spawn trap: nothing may spawn here (got "${command}")`);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
return await fn(spawned);
|
|
67
|
+
} finally {
|
|
68
|
+
powertools.execute = original;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// The `firebase firestore:indexes > <file>` read: the real command writes the
|
|
73
|
+
// live index JSON to the redirect target, which the check then require()s.
|
|
74
|
+
function liveIndexRead(command) {
|
|
75
|
+
if (!command.startsWith('firebase firestore:indexes')) {
|
|
76
|
+
throw new Error(`spawn trap: only the read-only index fetch may spawn (got "${command}")`);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
jetpack.write(command.split('> ')[1].trim(), JSON.stringify(LIVE_INDEXES, null, 2));
|
|
80
|
+
|
|
81
|
+
return '';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// An target root seeded with committed indexes that do NOT match live.
|
|
85
|
+
function seedTarget() {
|
|
86
|
+
const targetPath = jetpack.tmpDir({ prefix: 'omega-setup-offline-' }).path();
|
|
87
|
+
|
|
88
|
+
jetpack.write(path.join(targetPath, 'firestore.indexes.json'), JSON.stringify(LOCAL_INDEXES, null, 2));
|
|
89
|
+
|
|
90
|
+
return targetPath;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function buildIndexesTest(targetPath, argv) {
|
|
94
|
+
return new FirestoreIndexesSyncedTest({
|
|
95
|
+
main: { projectId: 'real-project', argv: argv, firebaseProjectPath: targetPath },
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function buildStorageTest(argv) {
|
|
100
|
+
return new StorageLifecyclePolicyTest({
|
|
101
|
+
main: { projectId: 'real-project', argv: argv, firebaseProjectPath: '/nonexistent/project' },
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
module.exports = defineCases({
|
|
106
|
+
description: 'setup --offline — live-mutating checks downgrade to reported failures',
|
|
107
|
+
type: 'group',
|
|
108
|
+
timeout: 20000,
|
|
109
|
+
|
|
110
|
+
tests: [
|
|
111
|
+
{
|
|
112
|
+
name: 'offline-is-a-declared-boolean',
|
|
113
|
+
auth: 'none',
|
|
114
|
+
|
|
115
|
+
async run({ assert }) {
|
|
116
|
+
// Undeclared, yargs would eat the next positional as --offline's value.
|
|
117
|
+
assert.equal(BOOLEAN_FLAGS.includes('offline'), true, 'offline must be in the declared boolean list');
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
|
|
121
|
+
{
|
|
122
|
+
name: 'indexes-drift-fails-into-the-live-deploy-without-the-flag',
|
|
123
|
+
auth: 'none',
|
|
124
|
+
|
|
125
|
+
async run({ assert }) {
|
|
126
|
+
// The bug, pinned: a plain scaffold run reaches `firebase deploy`.
|
|
127
|
+
const targetPath = seedTarget();
|
|
128
|
+
const test = buildIndexesTest(targetPath, {});
|
|
129
|
+
|
|
130
|
+
await withSpawnTrap(async (spawned) => {
|
|
131
|
+
assert.equal(await test.run(), false, 'drift must fail so the runner calls fix()');
|
|
132
|
+
|
|
133
|
+
await test.fix().catch(() => {});
|
|
134
|
+
|
|
135
|
+
assert.equal(
|
|
136
|
+
spawned.some((c) => c.startsWith('firebase deploy')),
|
|
137
|
+
true,
|
|
138
|
+
'without --offline the fix deploys indexes to the live project',
|
|
139
|
+
);
|
|
140
|
+
}, (command) => {
|
|
141
|
+
if (command.startsWith('firebase deploy')) {
|
|
142
|
+
return '';
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return liveIndexRead(command);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
jetpack.remove(targetPath);
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
{
|
|
153
|
+
name: 'indexes-drift-downgrades-to-a-warning-under-offline',
|
|
154
|
+
auth: 'none',
|
|
155
|
+
|
|
156
|
+
async run({ assert }) {
|
|
157
|
+
const targetPath = seedTarget();
|
|
158
|
+
const test = buildIndexesTest(targetPath, { offline: true });
|
|
159
|
+
|
|
160
|
+
await withSpawnTrap(async (spawned) => {
|
|
161
|
+
// The read-only drift report still runs — the check reports what is
|
|
162
|
+
// out of sync — but the verdict is a non-blocking warning, so the
|
|
163
|
+
// runner never reaches the mutating fix.
|
|
164
|
+
assert.equal(await test.run(), 'warn', '--offline downgrades drift to a reported warning');
|
|
165
|
+
assert.equal(
|
|
166
|
+
spawned.some((c) => c.startsWith('firebase deploy')),
|
|
167
|
+
false,
|
|
168
|
+
'no live deploy may spawn under --offline',
|
|
169
|
+
);
|
|
170
|
+
}, liveIndexRead);
|
|
171
|
+
|
|
172
|
+
assert.match(test.getWarning().join(' '), /--offline/, 'the warning must name the flag that suppressed the deploy');
|
|
173
|
+
|
|
174
|
+
jetpack.remove(targetPath);
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
|
|
178
|
+
{
|
|
179
|
+
name: 'indexes-fix-spawns-nothing-under-offline',
|
|
180
|
+
auth: 'none',
|
|
181
|
+
|
|
182
|
+
async run({ assert }) {
|
|
183
|
+
// Belt for any direct caller: run() already warns instead of failing,
|
|
184
|
+
// so the runner cannot reach this fix.
|
|
185
|
+
const targetPath = seedTarget();
|
|
186
|
+
const test = buildIndexesTest(targetPath, { offline: true });
|
|
187
|
+
|
|
188
|
+
await withSpawnTrap(async (spawned) => {
|
|
189
|
+
await test.fix();
|
|
190
|
+
|
|
191
|
+
assert.deepEqual(spawned, [], 'fix() must spawn nothing under --offline');
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
assert.deepEqual(
|
|
195
|
+
JSON.parse(jetpack.read(path.join(targetPath, 'firestore.indexes.json'))),
|
|
196
|
+
LOCAL_INDEXES,
|
|
197
|
+
'the committed index file stays untouched under --offline',
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
jetpack.remove(targetPath);
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
|
|
204
|
+
{
|
|
205
|
+
name: 'storage-lifecycle-runs-gsutil-without-the-flag',
|
|
206
|
+
auth: 'none',
|
|
207
|
+
|
|
208
|
+
async run({ assert }) {
|
|
209
|
+
// The bug's second half: this check IS the mutation.
|
|
210
|
+
const test = buildStorageTest({});
|
|
211
|
+
|
|
212
|
+
await withSpawnTrap(async (spawned) => {
|
|
213
|
+
await test.run();
|
|
214
|
+
|
|
215
|
+
assert.equal(spawned.length > 0, true, 'without --offline the check spawns gsutil');
|
|
216
|
+
assert.equal(spawned.every((c) => c.startsWith('gsutil ')), true, 'every spawned command is gsutil');
|
|
217
|
+
}, () => {
|
|
218
|
+
throw new Error('bucket unreachable');
|
|
219
|
+
});
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
|
|
223
|
+
{
|
|
224
|
+
name: 'storage-lifecycle-spawns-nothing-under-offline',
|
|
225
|
+
auth: 'none',
|
|
226
|
+
|
|
227
|
+
async run({ assert }) {
|
|
228
|
+
const test = buildStorageTest({ offline: true });
|
|
229
|
+
|
|
230
|
+
await withSpawnTrap(async (spawned) => {
|
|
231
|
+
assert.equal(await test.run(), 'warn', '--offline downgrades the policy write to a reported warning');
|
|
232
|
+
assert.deepEqual(spawned, [], 'no gsutil process may spawn under --offline');
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
assert.match(test.getWarning().join(' '), /--offline/, 'the warning must name the flag that suppressed the write');
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
|
|
239
|
+
{
|
|
240
|
+
name: 'storage-lifecycle-passes-demo-projects-even-under-offline',
|
|
241
|
+
auth: 'none',
|
|
242
|
+
|
|
243
|
+
async run({ assert }) {
|
|
244
|
+
// A demo-* project has no live buckets: the demo gate wins over the
|
|
245
|
+
// offline warning, so a demo scaffold does not warn about a policy
|
|
246
|
+
// that can never apply.
|
|
247
|
+
const test = new StorageLifecyclePolicyTest({
|
|
248
|
+
main: { projectId: 'demo-sandbox', argv: { offline: true }, firebaseProjectPath: '/nonexistent/project' },
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
await withSpawnTrap(async (spawned) => {
|
|
252
|
+
assert.equal(await test.run(), true, 'demo projects pass, never warn');
|
|
253
|
+
assert.deepEqual(spawned, [], 'no process may spawn for a demo project');
|
|
254
|
+
});
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
|
|
258
|
+
{
|
|
259
|
+
name: 'seed-campaigns-opt-in-loses-to-offline',
|
|
260
|
+
auth: 'none',
|
|
261
|
+
|
|
262
|
+
async run({ assert }) {
|
|
263
|
+
// --offline promises NO live mutations for the whole run; the seeding
|
|
264
|
+
// fix() writes real Firestore docs, so the opt-in is ignored and the
|
|
265
|
+
// drift verdict stays a non-blocking warning.
|
|
266
|
+
const test = new MarketingCampaignsSeededTest({
|
|
267
|
+
main: { projectId: 'real-project', argv: { offline: true, seedCampaigns: true, 'seed-campaigns': true }, firebaseProjectPath: '/nonexistent/project' },
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
assert.equal(test._seedingRequested(), false, '--offline must override --seed-campaigns');
|
|
271
|
+
assert.equal(test._driftVerdict(), 'warn', 'drift stays a warning, so the runner never calls the seeding fix()');
|
|
272
|
+
assert.match(test.getWarning().join(' '), /--offline/, 'the warning names the flag that suppressed the write, not the opt-in the user already passed');
|
|
273
|
+
},
|
|
274
|
+
},
|
|
275
|
+
],
|
|
276
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: `omega setup` is retired
|
|
3
|
+
* ([#675](https://github.com/Omega-JS-Stack/omega/issues/675)).
|
|
4
|
+
*
|
|
5
|
+
* Nothing dispatches it, nothing lists it, and a bare `omega` at a backend
|
|
6
|
+
* target prints the help listing instead of running a command nobody asked
|
|
7
|
+
* for. The work it did rides the verbs now: the local scaffold in
|
|
8
|
+
* `ensureTarget()` (every verb, through ensureStaged) and the target checks
|
|
9
|
+
* in `omega test`.
|
|
10
|
+
*
|
|
11
|
+
* Run: npx omega test backend:cli/setup-retired
|
|
12
|
+
*/
|
|
13
|
+
const { COMMANDS, tokensOf, matchCommand, defaultCommand, buildHelpText } = require('../../dist/cli/command-table.js');
|
|
14
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
15
|
+
|
|
16
|
+
module.exports = defineCases({
|
|
17
|
+
description: 'The setup command is retired — the verbs carry its work',
|
|
18
|
+
type: 'group',
|
|
19
|
+
|
|
20
|
+
tests: [
|
|
21
|
+
{
|
|
22
|
+
name: 'no-setup-entry-in-the-table',
|
|
23
|
+
auth: 'none',
|
|
24
|
+
|
|
25
|
+
async run({ assert }) {
|
|
26
|
+
const tokens = COMMANDS.flatMap(tokensOf);
|
|
27
|
+
|
|
28
|
+
assert.equal(tokens.includes('setup'), false, 'nothing dispatches `omega setup`');
|
|
29
|
+
assert.equal(buildHelpText().includes('setup'), false, 'nothing lists it either');
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
{
|
|
34
|
+
name: 'no-command-claims-the-default-slot',
|
|
35
|
+
auth: 'none',
|
|
36
|
+
|
|
37
|
+
async run({ assert }) {
|
|
38
|
+
assert.equal(COMMANDS.some((command) => command.default), false, 'setup was the only default — nothing inherits the slot');
|
|
39
|
+
assert.equal(defaultCommand(), undefined, 'defaultCommand() answers "none" instead of throwing');
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
{
|
|
44
|
+
name: 'a-bare-invocation-resolves-to-help',
|
|
45
|
+
auth: 'none',
|
|
46
|
+
|
|
47
|
+
async run({ assert }) {
|
|
48
|
+
const help = COMMANDS.find((command) => command.name === 'help');
|
|
49
|
+
const lines = [];
|
|
50
|
+
const original = console.log;
|
|
51
|
+
|
|
52
|
+
console.log = (...args) => lines.push(args.map(String).join(' '));
|
|
53
|
+
try {
|
|
54
|
+
help.run();
|
|
55
|
+
} finally {
|
|
56
|
+
console.log = original;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
assert.match(lines.join('\n'), /^Usage: omega <command>/, 'the fallback prints the listing');
|
|
60
|
+
assert.equal(matchCommand(help, {}), false, 'help still only matches when it is named');
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
});
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: the index checks leave a SHARED cloud project's indexes alone
|
|
3
|
+
* ([#716](https://github.com/Omega-JS-Stack/omega/issues/716)).
|
|
4
|
+
*
|
|
5
|
+
* A `cloud.shared: true` project is one Firebase project carrying every tenant
|
|
6
|
+
* brand's collections. `firestore-indexes-synced` pulled its deployed indexes
|
|
7
|
+
* down and merged them into THIS brand's `firestore.indexes.json` — ~400 lines
|
|
8
|
+
* of other brands' collections (campaigns, courses, enrollments, inboxes) landing
|
|
9
|
+
* silently during a test run, ready for the next `git add -A`. On a shared
|
|
10
|
+
* project the live index set is nobody's single brand to track, so the whole
|
|
11
|
+
* check is skipped and the consumer's file stays authored.
|
|
12
|
+
*
|
|
13
|
+
* `firestore-indexes-file` is the SAME leak one step earlier: it runs BEFORE the
|
|
14
|
+
* sync check (setup-tests/index.js:89 vs :91), and when the file is missing or
|
|
15
|
+
* poisoned its fix live-pulled the tenant set in to create it — so gating only
|
|
16
|
+
* the sync check left the first write ungated. It seeds the template instead,
|
|
17
|
+
* the same answer a demo-* project already got.
|
|
18
|
+
*
|
|
19
|
+
* The ONE stub is `powertools.execute` — the single seam every spawn in these
|
|
20
|
+
* checks goes through, and the same seam setup-offline-mode.test.js uses. Here it
|
|
21
|
+
* refuses EVERY command, so any surviving live read fails the test instead of
|
|
22
|
+
* reaching the network; the control case shims the read-only fetch to the real
|
|
23
|
+
* command's contract (`firebase firestore:indexes > <file>`) so the ungated path
|
|
24
|
+
* is proved to still run.
|
|
25
|
+
*
|
|
26
|
+
* Run: npx omega test backend:cli/setup-shared-project-indexes
|
|
27
|
+
*/
|
|
28
|
+
const path = require('path');
|
|
29
|
+
const jetpack = require('fs-jetpack');
|
|
30
|
+
const powertools = require('node-powertools');
|
|
31
|
+
const FirestoreIndexesSyncedTest = require('../../dist/cli/commands/setup-tests/firestore-indexes-synced.js');
|
|
32
|
+
const FirestoreIndexesFileTest = require('../../dist/cli/commands/setup-tests/firestore-indexes-file.js');
|
|
33
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
34
|
+
|
|
35
|
+
// What the indexes-file fix seeds when there is no live set to pull.
|
|
36
|
+
const TEMPLATE_INDEXES = JSON.parse(jetpack.read(path.resolve(__dirname, '../../templates/firestore.indexes.json')));
|
|
37
|
+
|
|
38
|
+
// What the brand authored, and what the shared project actually carries — the
|
|
39
|
+
// live set is another tenant's collection entirely.
|
|
40
|
+
const LOCAL_INDEXES = {
|
|
41
|
+
indexes: [
|
|
42
|
+
{ collectionGroup: 'users', queryScope: 'COLLECTION', fields: [{ fieldPath: 'email', order: 'ASCENDING' }] },
|
|
43
|
+
],
|
|
44
|
+
fieldOverrides: [],
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const TENANT_INDEXES = {
|
|
48
|
+
indexes: [
|
|
49
|
+
{ collectionGroup: 'enrollments', queryScope: 'COLLECTION', fields: [{ fieldPath: 'courseId', order: 'ASCENDING' }] },
|
|
50
|
+
],
|
|
51
|
+
fieldOverrides: [],
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// Nothing may spawn: on a shared project every live read is the bug.
|
|
55
|
+
async function withSpawnTrap(fn, onCommand) {
|
|
56
|
+
const original = powertools.execute;
|
|
57
|
+
const spawned = [];
|
|
58
|
+
|
|
59
|
+
powertools.execute = async (command, options) => {
|
|
60
|
+
spawned.push(command);
|
|
61
|
+
|
|
62
|
+
if (onCommand) {
|
|
63
|
+
return await onCommand(command, options);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
throw new Error(`spawn trap: nothing may spawn here (got "${command}")`);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
return await fn(spawned);
|
|
71
|
+
} finally {
|
|
72
|
+
powertools.execute = original;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// The `firebase firestore:indexes > <file>` read: the real command writes the
|
|
77
|
+
// live index JSON to the redirect target, which the check then require()s.
|
|
78
|
+
function liveIndexRead(command) {
|
|
79
|
+
if (!command.startsWith('firebase firestore:indexes')) {
|
|
80
|
+
throw new Error(`spawn trap: only the read-only index fetch may spawn (got "${command}")`);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
jetpack.write(command.split('> ')[1].trim(), JSON.stringify(TENANT_INDEXES, null, 2));
|
|
84
|
+
|
|
85
|
+
return '';
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* A target root with committed indexes and a real (non-demo) project id, whose
|
|
90
|
+
* config declares the cloud project shared or not.
|
|
91
|
+
*
|
|
92
|
+
* `opts.indexes` swaps what lands on disk for the indexes-file cases: `false`
|
|
93
|
+
* writes no file at all, `'poisoned'` writes the 403 error text a failed live
|
|
94
|
+
* pull shell-redirects into it.
|
|
95
|
+
*/
|
|
96
|
+
function seedTarget(shared, opts = {}) {
|
|
97
|
+
const targetPath = jetpack.tmpDir({ prefix: 'omega-shared-indexes-' }).path();
|
|
98
|
+
|
|
99
|
+
if (opts.indexes === 'poisoned') {
|
|
100
|
+
jetpack.write(path.join(targetPath, 'firestore.indexes.json'), 'Error 403: Caller is missing permission');
|
|
101
|
+
} else if (opts.indexes !== false) {
|
|
102
|
+
jetpack.write(path.join(targetPath, 'firestore.indexes.json'), JSON.stringify(LOCAL_INDEXES, null, 2));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
jetpack.write(path.join(targetPath, 'config', 'omega.json5'), JSON.stringify({
|
|
106
|
+
brand: { name: 'Tenant Brand' },
|
|
107
|
+
cloud: shared ? { shared: true, config: { projectId: 'shared-project' } } : { config: { projectId: 'own-project' } },
|
|
108
|
+
targets: { backend: {} },
|
|
109
|
+
}, null, 2));
|
|
110
|
+
|
|
111
|
+
return targetPath;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function buildIndexesTest(TestClass, targetPath, projectId) {
|
|
115
|
+
return new TestClass({
|
|
116
|
+
main: { projectId: projectId, argv: {}, firebaseProjectPath: targetPath },
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function readIndexes(targetPath) {
|
|
121
|
+
return JSON.parse(jetpack.read(path.join(targetPath, 'firestore.indexes.json')));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
module.exports = defineCases({
|
|
125
|
+
description: 'the firestore index checks skip a shared cloud project',
|
|
126
|
+
type: 'group',
|
|
127
|
+
timeout: 20000,
|
|
128
|
+
|
|
129
|
+
tests: [
|
|
130
|
+
{
|
|
131
|
+
name: 'a-shared-project-is-never-read',
|
|
132
|
+
auth: 'none',
|
|
133
|
+
|
|
134
|
+
async run({ assert }) {
|
|
135
|
+
const targetPath = seedTarget(true);
|
|
136
|
+
const test = buildIndexesTest(FirestoreIndexesSyncedTest, targetPath, 'shared-project');
|
|
137
|
+
|
|
138
|
+
await withSpawnTrap(async (spawned) => {
|
|
139
|
+
assert.equal(await test.run(), true, 'a shared project has no drift of this brand\'s to report');
|
|
140
|
+
assert.deepEqual(spawned, [], 'no live index read may spawn for a shared project');
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
jetpack.remove(targetPath);
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
{
|
|
148
|
+
name: 'a-shared-project-leaves-the-authored-file-untouched',
|
|
149
|
+
auth: 'none',
|
|
150
|
+
|
|
151
|
+
async run({ assert }) {
|
|
152
|
+
// Belt for a direct caller: run() passes, so the runner never reaches
|
|
153
|
+
// fix() — and if something does, the merge-and-write stays off.
|
|
154
|
+
const targetPath = seedTarget(true);
|
|
155
|
+
const test = buildIndexesTest(FirestoreIndexesSyncedTest, targetPath, 'shared-project');
|
|
156
|
+
|
|
157
|
+
await withSpawnTrap(async (spawned) => {
|
|
158
|
+
await test.fix();
|
|
159
|
+
|
|
160
|
+
assert.deepEqual(spawned, [], 'fix() must spawn nothing for a shared project');
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
assert.deepEqual(readIndexes(targetPath), LOCAL_INDEXES, 'the consumer\'s index file stays exactly as authored');
|
|
164
|
+
|
|
165
|
+
jetpack.remove(targetPath);
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
{
|
|
170
|
+
name: 'a-brands-own-project-still-syncs',
|
|
171
|
+
auth: 'none',
|
|
172
|
+
|
|
173
|
+
async run({ assert }) {
|
|
174
|
+
// The gate is the shared flag, not a blanket skip: a project this brand
|
|
175
|
+
// owns still gets its drift read and reported.
|
|
176
|
+
const targetPath = seedTarget(false);
|
|
177
|
+
const test = buildIndexesTest(FirestoreIndexesSyncedTest, targetPath, 'own-project');
|
|
178
|
+
|
|
179
|
+
await withSpawnTrap(async (spawned) => {
|
|
180
|
+
assert.equal(await test.run(), false, 'drift on the brand\'s own project must still fail');
|
|
181
|
+
assert.equal(
|
|
182
|
+
spawned.some((c) => c.startsWith('firebase firestore:indexes')),
|
|
183
|
+
true,
|
|
184
|
+
'the brand\'s own project is still read',
|
|
185
|
+
);
|
|
186
|
+
}, liveIndexRead);
|
|
187
|
+
|
|
188
|
+
jetpack.remove(targetPath);
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
|
|
192
|
+
{
|
|
193
|
+
name: 'a-shared-project-seeds-the-template-instead-of-pulling',
|
|
194
|
+
auth: 'none',
|
|
195
|
+
|
|
196
|
+
async run({ assert }) {
|
|
197
|
+
// The earlier check: with no file to read, the fix used to create one
|
|
198
|
+
// from the live pull — the tenant set, written in whole.
|
|
199
|
+
const targetPath = seedTarget(true, { indexes: false });
|
|
200
|
+
const test = buildIndexesTest(FirestoreIndexesFileTest, targetPath, 'shared-project');
|
|
201
|
+
|
|
202
|
+
assert.equal(await test.run(), false, 'a missing indexes file still needs writing');
|
|
203
|
+
|
|
204
|
+
await withSpawnTrap(async (spawned) => {
|
|
205
|
+
await test.fix();
|
|
206
|
+
|
|
207
|
+
assert.deepEqual(spawned, [], 'no live index pull may spawn for a shared project');
|
|
208
|
+
}, liveIndexRead);
|
|
209
|
+
|
|
210
|
+
assert.deepEqual(readIndexes(targetPath), TEMPLATE_INDEXES, 'the template\'s empty shape is seeded, not the tenant set');
|
|
211
|
+
|
|
212
|
+
jetpack.remove(targetPath);
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
|
|
216
|
+
{
|
|
217
|
+
name: 'a-shared-project-rewrites-a-poisoned-file-from-the-template',
|
|
218
|
+
auth: 'none',
|
|
219
|
+
|
|
220
|
+
async run({ assert }) {
|
|
221
|
+
// The other way in: a file poisoned by an earlier failed pull is
|
|
222
|
+
// treated as missing, and that rewrite pulled the tenant set too.
|
|
223
|
+
const targetPath = seedTarget(true, { indexes: 'poisoned' });
|
|
224
|
+
const test = buildIndexesTest(FirestoreIndexesFileTest, targetPath, 'shared-project');
|
|
225
|
+
|
|
226
|
+
assert.equal(await test.run(), false, 'a poisoned file is treated as missing');
|
|
227
|
+
|
|
228
|
+
await withSpawnTrap(async (spawned) => {
|
|
229
|
+
await test.fix();
|
|
230
|
+
|
|
231
|
+
assert.deepEqual(spawned, [], 'no live index pull may spawn for a shared project');
|
|
232
|
+
}, liveIndexRead);
|
|
233
|
+
|
|
234
|
+
assert.deepEqual(readIndexes(targetPath), TEMPLATE_INDEXES, 'the poisoned file is replaced by the template, not the tenant set');
|
|
235
|
+
|
|
236
|
+
jetpack.remove(targetPath);
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
|
|
240
|
+
{
|
|
241
|
+
name: 'a-demo-project-still-seeds-the-template',
|
|
242
|
+
auth: 'none',
|
|
243
|
+
|
|
244
|
+
async run({ assert }) {
|
|
245
|
+
// Control: widening the gate must not change what a demo-* project
|
|
246
|
+
// already did — same seed, same silence.
|
|
247
|
+
const targetPath = seedTarget(false, { indexes: false });
|
|
248
|
+
const test = buildIndexesTest(FirestoreIndexesFileTest, targetPath, 'demo-tenant-brand');
|
|
249
|
+
|
|
250
|
+
await withSpawnTrap(async (spawned) => {
|
|
251
|
+
await test.fix();
|
|
252
|
+
|
|
253
|
+
assert.deepEqual(spawned, [], 'a demo project has no live project to pull from');
|
|
254
|
+
}, liveIndexRead);
|
|
255
|
+
|
|
256
|
+
assert.deepEqual(readIndexes(targetPath), TEMPLATE_INDEXES, 'the template\'s empty shape is seeded');
|
|
257
|
+
|
|
258
|
+
jetpack.remove(targetPath);
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
],
|
|
262
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: setup-tests relative requires resolve (pure logic)
|
|
3
|
+
*
|
|
4
|
+
* The lazy requires in the setup tests' live-project branches only execute
|
|
5
|
+
* during a real-project setup run, so a broken path ships silently and first
|
|
6
|
+
* fails in a consumer's boot (the playground's full `omega dev` walk hit
|
|
7
|
+
* `require('../index')`, a module that never existed). Every relative require
|
|
8
|
+
* in the directory must resolve from its own location.
|
|
9
|
+
*
|
|
10
|
+
* Run: npx omega test backend:cli/setup-tests-requires
|
|
11
|
+
*/
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
15
|
+
|
|
16
|
+
const DIR = path.join(__dirname, '..', '..', 'dist', 'cli', 'commands', 'setup-tests');
|
|
17
|
+
|
|
18
|
+
module.exports = defineCases({
|
|
19
|
+
description: 'Setup-tests relative requires resolve',
|
|
20
|
+
type: 'group',
|
|
21
|
+
tests: [
|
|
22
|
+
{
|
|
23
|
+
name: 'every-relative-require-in-setup-tests-resolves',
|
|
24
|
+
async run({ assert }) {
|
|
25
|
+
const files = fs.readdirSync(DIR).filter((f) => f.endsWith('.js'));
|
|
26
|
+
assert.equal(files.length > 10, true, `setup-tests directory found (${files.length} modules)`);
|
|
27
|
+
|
|
28
|
+
for (const file of files) {
|
|
29
|
+
const source = fs.readFileSync(path.join(DIR, file), 'utf8');
|
|
30
|
+
|
|
31
|
+
for (const match of source.matchAll(/require\(\s*['"](\.[^'"]+)['"]\s*\)/g)) {
|
|
32
|
+
const target = match[1];
|
|
33
|
+
let resolved = true;
|
|
34
|
+
try {
|
|
35
|
+
require.resolve(path.join(DIR, target));
|
|
36
|
+
} catch (e) {
|
|
37
|
+
resolved = false;
|
|
38
|
+
}
|
|
39
|
+
assert.equal(resolved, true, `${file} requires "${target}" which does not resolve`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
});
|