@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,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: the CLI's host assumptions, pinned for a host that is not this one
|
|
3
|
+
* ([#769](https://github.com/Omega-JS-Stack/omega/issues/769)).
|
|
4
|
+
*
|
|
5
|
+
* Every case here used to be a Unix-only line: `sh -c` with no `sh` to run it,
|
|
6
|
+
* a `--exec` whose hand-quoted path lost its backslashes, an install hint that
|
|
7
|
+
* told a Windows box to use Homebrew, an `lsof` diagnostic that threw. The
|
|
8
|
+
* platform is an ARGUMENT throughout, so the Windows branch is proven from a
|
|
9
|
+
* Mac — nothing here spawns anything, which is the point: what a spawn WOULD
|
|
10
|
+
* be is decided by pure functions, and those are what a test can hold.
|
|
11
|
+
*
|
|
12
|
+
* Run: npx omega test backend:cli/cross-platform
|
|
13
|
+
*/
|
|
14
|
+
const { shellInvocation, pathInvocation } = require('../../dist/cli/utils/spawn-shell.js');
|
|
15
|
+
const { javaInstallHint } = require('../../dist/cli/commands/setup-tests/helpers.js');
|
|
16
|
+
const WatchCommand = require('../../dist/cli/commands/watch.js');
|
|
17
|
+
const BaseCommand = require('../../dist/cli/commands/base-command.js');
|
|
18
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
19
|
+
|
|
20
|
+
const { reloadTriggerExec } = WatchCommand;
|
|
21
|
+
|
|
22
|
+
// A port the OS hands out on demand and releases at once: free by
|
|
23
|
+
// construction at the moment the case reads it.
|
|
24
|
+
function freePort() {
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
const server = require('node:net').createServer();
|
|
27
|
+
server.unref();
|
|
28
|
+
server.on('error', reject);
|
|
29
|
+
server.listen(0, '127.0.0.1', () => {
|
|
30
|
+
const { port } = server.address();
|
|
31
|
+
server.close(() => resolve(port));
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The `node -e "<script>"` half of an --exec line, unwrapped.
|
|
37
|
+
function scriptOf(execLine) {
|
|
38
|
+
return execLine.slice('node -e "'.length, execLine.lastIndexOf('" && echo'));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
module.exports = defineCases({
|
|
42
|
+
description: 'Cross-platform CLI internals — the shell, the trigger script, the hints, the port probe',
|
|
43
|
+
type: 'group',
|
|
44
|
+
|
|
45
|
+
tests: [
|
|
46
|
+
{
|
|
47
|
+
name: 'a-command-line-runs-through-the-hosts-own-shell',
|
|
48
|
+
async run({ assert }) {
|
|
49
|
+
assert.deepEqual(
|
|
50
|
+
shellInvocation('firebase emulators:start --only functions', 'darwin'),
|
|
51
|
+
['sh', ['-c', 'firebase emulators:start --only functions']],
|
|
52
|
+
'unix composes sh -c',
|
|
53
|
+
);
|
|
54
|
+
assert.deepEqual(
|
|
55
|
+
shellInvocation('firebase emulators:start --only functions', 'linux'),
|
|
56
|
+
['sh', ['-c', 'firebase emulators:start --only functions']],
|
|
57
|
+
'linux is the same unix branch',
|
|
58
|
+
);
|
|
59
|
+
assert.deepEqual(
|
|
60
|
+
shellInvocation('firebase emulators:start --only functions', 'win32'),
|
|
61
|
+
['cmd.exe', ['/c', 'firebase emulators:start --only functions']],
|
|
62
|
+
'windows has no sh — cmd.exe /c, and never shell:true (DEP0190)',
|
|
63
|
+
);
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
{
|
|
68
|
+
name: 'a-bare-name-is-resolved-by-the-host-never-by-us',
|
|
69
|
+
async run({ assert }) {
|
|
70
|
+
// The whole point of the pair: `commandOnPath` says nodemon EXISTS, and
|
|
71
|
+
// this says how to run it. On Windows that must go through cmd.exe, the
|
|
72
|
+
// only thing that applies PATHEXT to a bare name and can execute the
|
|
73
|
+
// `.cmd` shim npm installed.
|
|
74
|
+
assert.deepEqual(
|
|
75
|
+
pathInvocation('nodemon', ['--watch', '/src'], 'darwin'),
|
|
76
|
+
['nodemon', ['--watch', '/src']],
|
|
77
|
+
'unix spawns the name directly — execvp searches PATH, and the child stays the real process',
|
|
78
|
+
);
|
|
79
|
+
assert.deepEqual(
|
|
80
|
+
pathInvocation('nodemon', ['--watch', 'C:\\src'], 'win32'),
|
|
81
|
+
['cmd.exe', ['/c', 'nodemon', '--watch', 'C:\\src']],
|
|
82
|
+
'windows goes through cmd.exe with the args still separate (Node quotes each one)',
|
|
83
|
+
);
|
|
84
|
+
assert.deepEqual(
|
|
85
|
+
pathInvocation('stripe', [], 'win32'),
|
|
86
|
+
['cmd.exe', ['/c', 'stripe']],
|
|
87
|
+
'no args is still the shell branch',
|
|
88
|
+
);
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
{
|
|
93
|
+
name: 'the-reload-trigger-script-survives-a-windows-path',
|
|
94
|
+
async run({ assert }) {
|
|
95
|
+
const triggerFile = 'C:\\Users\\ian\\targets\\backend\\dist\\omega-reload-trigger.js';
|
|
96
|
+
const resetPaths = ['C:\\Users\\ian\\.temp\\dev.log.reset'];
|
|
97
|
+
const script = scriptOf(reloadTriggerExec({ triggerFile, resetPaths, message: ' x' }));
|
|
98
|
+
|
|
99
|
+
// Hand-written quotes made `\U` and `\d` into escape sequences, so node
|
|
100
|
+
// parsed the path into a different one and the trigger silently missed.
|
|
101
|
+
// eslint-disable-next-line no-new-func
|
|
102
|
+
const readBack = new Function(`${script.slice(0, script.indexOf(',fs='))};return f;`)();
|
|
103
|
+
assert.equal(readBack, triggerFile, 'the path node parses must be the path we meant');
|
|
104
|
+
assert.equal(script.includes('C:\\\\Users\\\\ian'), true, 'backslashes are escaped in the literal, not lost');
|
|
105
|
+
assert.equal(script.includes(`'${resetPaths[0]}'`), false, 'the sentinel path is escaped too, not raw');
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
{
|
|
110
|
+
name: 'the-reload-trigger-script-still-round-trips-a-unix-path',
|
|
111
|
+
async run({ assert }) {
|
|
112
|
+
const triggerFile = '/Users/ian/targets/backend/dist/omega-reload-trigger.js';
|
|
113
|
+
const line = reloadTriggerExec({
|
|
114
|
+
triggerFile,
|
|
115
|
+
resetPaths: ['/Users/ian/.temp/dev.log.reset'],
|
|
116
|
+
message: ' [@omega.js/backend] Triggered hot reload',
|
|
117
|
+
});
|
|
118
|
+
const script = scriptOf(line);
|
|
119
|
+
|
|
120
|
+
// eslint-disable-next-line no-new-func
|
|
121
|
+
const readBack = new Function(`${script.slice(0, script.indexOf(',fs='))};return f;`)();
|
|
122
|
+
assert.equal(readBack, triggerFile, 'the unix path is unchanged by the escaping');
|
|
123
|
+
assert.equal(line.endsWith('&& echo " [@omega.js/backend] Triggered hot reload"'), true, 'the lane keeps its own line');
|
|
124
|
+
assert.equal(line.includes('touch '), false, 'touch is gone — it bumps mtime, and Firebase reloads on content');
|
|
125
|
+
assert.equal(line.includes('sleep'), false, 'sleep is a Unix binary; the settle wait is in-process');
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
|
|
129
|
+
{
|
|
130
|
+
name: 'the-java-hint-names-a-manager-the-host-actually-has',
|
|
131
|
+
async run({ assert }) {
|
|
132
|
+
assert.equal(javaInstallHint('darwin'), 'brew install openjdk');
|
|
133
|
+
assert.equal(javaInstallHint('win32').split('.')[0], 'winget install Microsoft', 'windows opens with winget');
|
|
134
|
+
assert.equal(javaInstallHint('linux'), 'sudo apt install default-jdk');
|
|
135
|
+
|
|
136
|
+
for (const platform of ['win32', 'linux']) {
|
|
137
|
+
assert.equal(javaInstallHint(platform).includes('brew install'), false, `${platform} has no Homebrew`);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Same rule as the mkcert hint: the head of the line is pasteable, an
|
|
141
|
+
// alternative follows in a sentence. `(or: choco …)` inside the command
|
|
142
|
+
// is a command that does not run.
|
|
143
|
+
for (const platform of ['darwin', 'win32', 'linux']) {
|
|
144
|
+
const head = javaInstallHint(platform).split('.')[0];
|
|
145
|
+
assert.equal(/\(or\b|\bor:/.test(head), false, `${platform} splices an alternative into the command`);
|
|
146
|
+
}
|
|
147
|
+
assert.equal(/choco install openjdk/.test(javaInstallHint('win32')), true, 'chocolatey is still named');
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
{
|
|
152
|
+
name: 'the-port-diagnostic-is-unix-only-and-says-so',
|
|
153
|
+
async run({ assert }) {
|
|
154
|
+
const command = new BaseCommand({ firebaseProjectPath: process.cwd(), argv: {}, options: {} });
|
|
155
|
+
|
|
156
|
+
// lsof/ps do not exist on Windows. The enrichment answers "nobody to
|
|
157
|
+
// name" rather than throwing; isPortInUse() is the real check and is
|
|
158
|
+
// OS-agnostic, so nothing downstream depends on this.
|
|
159
|
+
// The port is one the OS just handed out and released, never a fixed
|
|
160
|
+
// number: the run's own emulators bind dynamic ports, and a fixed
|
|
161
|
+
// "free" port was found held by them.
|
|
162
|
+
const port = await freePort();
|
|
163
|
+
assert.equal(command.getProcessesOnPort(port, { platform: 'win32' }), null, 'win32 short-circuits');
|
|
164
|
+
assert.equal(command.getProcessesOnPort(port, { platform: 'darwin' }), null, 'a free port is null on unix too');
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
});
|
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A backend target in CUSTOM-SERVER mode
|
|
3
|
+
* ([#584](https://github.com/Omega-JS-Stack/omega/issues/584)).
|
|
4
|
+
*
|
|
5
|
+
* `targets.backend.projectType: 'custom'` runs the SAME backend — same routes,
|
|
6
|
+
* same schemas, same auth middleware, same helpers — as an Express app
|
|
7
|
+
* listening on `PORT` for a container host (Render & co) instead of exporting
|
|
8
|
+
* Cloud Functions. What it takes away is the FIREBASE lane: no Functions
|
|
9
|
+
* deploy, no emulator, no emulator test run.
|
|
10
|
+
*
|
|
11
|
+
* What these tests hold it to:
|
|
12
|
+
* - the project type comes from the brand's omega.json5, not from a flag a
|
|
13
|
+
* brand has to remember to pass to `Manager.init()`;
|
|
14
|
+
* - a custom boot loads no `firebase-functions`, and every helper the
|
|
15
|
+
* framework exposes — the auth middleware included — is there in both modes;
|
|
16
|
+
* - the Firebase-only verbs REFUSE, loudly and with the lane that replaces
|
|
17
|
+
* each, instead of running `firebase deploy` against a project that has no
|
|
18
|
+
* functions in it;
|
|
19
|
+
* - `omega setup` scaffolds no Firebase-only artifact — no firebase.json, no
|
|
20
|
+
* rules, no indexes — and drops the checks that maintain them, while an
|
|
21
|
+
* already-authored one is left alone
|
|
22
|
+
* ([#614](https://github.com/Omega-JS-Stack/omega/issues/614));
|
|
23
|
+
* - `omega build` is unchanged: a custom backend stages src/ → dist/ like
|
|
24
|
+
* any other.
|
|
25
|
+
*
|
|
26
|
+
* Real config files on real temp dirs, the real Manager, the real command
|
|
27
|
+
* classes. The one seam is `powertools.execute` — stubbed to a recorder, so a
|
|
28
|
+
* deploy that DID reach the shell would be visible instead of running.
|
|
29
|
+
*
|
|
30
|
+
* Run: npx omega test backend:cli/custom-project-type
|
|
31
|
+
*/
|
|
32
|
+
const assert = require('node:assert');
|
|
33
|
+
const fs = require('node:fs');
|
|
34
|
+
const os = require('node:os');
|
|
35
|
+
const path = require('node:path');
|
|
36
|
+
|
|
37
|
+
const powertools = require('node-powertools');
|
|
38
|
+
const { requiredEnvKeys } = require('../../dist/vendor/config/index.js');
|
|
39
|
+
|
|
40
|
+
const { resolveProjectType, isCustomProject, FIREBASE_ONLY_VERBS, FIREBASE_ONLY_SCAFFOLD, FIREBASE_ONLY_SETUP_CHECKS } = require('../../dist/cli/utils/project-type.js');
|
|
41
|
+
const BuildCommand = require('../../dist/cli/commands/build.js');
|
|
42
|
+
const DeployCommand = require('../../dist/cli/commands/deploy.js');
|
|
43
|
+
const EmulatorCommand = require('../../dist/cli/commands/emulator.js');
|
|
44
|
+
const ServeCommand = require('../../dist/cli/commands/serve.js');
|
|
45
|
+
const { ensureTarget } = require('../../dist/cli/utils/ensure-target.js');
|
|
46
|
+
const { stageFunctions } = require('../../dist/cli/utils/stage-functions.js');
|
|
47
|
+
const TestCommand = require('../../dist/cli/commands/test.js');
|
|
48
|
+
const { getTests } = require('../../dist/cli/commands/setup-tests/index.js');
|
|
49
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
50
|
+
|
|
51
|
+
const MANAGER_PATH = require.resolve('../../dist/manager/index.js');
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* A backend target on disk: package.json, an authored src/, and a brand
|
|
55
|
+
* config declaring the project type (omitted = the firebase default).
|
|
56
|
+
*/
|
|
57
|
+
function targetDir({ projectType }) {
|
|
58
|
+
const dir = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'omega-project-type-')));
|
|
59
|
+
const backend = projectType ? { projectType } : {};
|
|
60
|
+
|
|
61
|
+
fs.writeFileSync(path.join(dir, 'package.json'), JSON.stringify({ name: 'fixture-backend', version: '0.0.0' }));
|
|
62
|
+
fs.mkdirSync(path.join(dir, 'config'));
|
|
63
|
+
fs.writeFileSync(path.join(dir, 'config', 'omega.json5'), JSON.stringify({
|
|
64
|
+
brand: { id: 'fixture', name: 'Fixture Brand', url: 'https://fixture.test' },
|
|
65
|
+
targets: { backend },
|
|
66
|
+
}));
|
|
67
|
+
fs.mkdirSync(path.join(dir, 'src'));
|
|
68
|
+
fs.writeFileSync(path.join(dir, 'src', 'index.js'), '// fixture backend entry\n');
|
|
69
|
+
|
|
70
|
+
return dir;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** A `main` shaped like the CLI's, pointed at a fixture target. */
|
|
74
|
+
function fakeMain(dir, argv = {}) {
|
|
75
|
+
return {
|
|
76
|
+
firebaseProjectPath: dir,
|
|
77
|
+
argv: { _: [], ...argv },
|
|
78
|
+
options: {},
|
|
79
|
+
testCount: 0,
|
|
80
|
+
testTotal: 0,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Run a command with console.log/error captured and `powertools.execute`
|
|
86
|
+
* swapped for a recorder — nothing this suite runs may reach a real shell.
|
|
87
|
+
*/
|
|
88
|
+
async function runCommand(CommandClass, dir, argv) {
|
|
89
|
+
const lines = [];
|
|
90
|
+
const shell = [];
|
|
91
|
+
const originalLog = console.log;
|
|
92
|
+
const originalError = console.error;
|
|
93
|
+
const originalExecute = powertools.execute;
|
|
94
|
+
const originalExitCode = process.exitCode;
|
|
95
|
+
|
|
96
|
+
console.log = (...args) => lines.push(args.map(String).join(' '));
|
|
97
|
+
console.error = (...args) => lines.push(args.map(String).join(' '));
|
|
98
|
+
powertools.execute = async (command) => { shell.push(command); return ''; };
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
await new CommandClass(fakeMain(dir, argv)).execute();
|
|
102
|
+
return { output: lines.join('\n'), shell, exitCode: process.exitCode };
|
|
103
|
+
} finally {
|
|
104
|
+
console.log = originalLog;
|
|
105
|
+
console.error = originalError;
|
|
106
|
+
powertools.execute = originalExecute;
|
|
107
|
+
process.exitCode = originalExitCode;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* The SCAFFOLD pass every verb runs (#675): ensureTarget() writes the config
|
|
113
|
+
* artifacts, then the stage builds dist/ — the same pair `ensureStaged()`
|
|
114
|
+
* makes. The CHECKS need a Firebase CLI and a network; which of them a custom
|
|
115
|
+
* target even RUNS is its own case below.
|
|
116
|
+
*/
|
|
117
|
+
function runSetupScaffold(dir) {
|
|
118
|
+
const lines = [];
|
|
119
|
+
const log = (message) => lines.push(String(message));
|
|
120
|
+
|
|
121
|
+
ensureTarget({ projectDir: dir, log });
|
|
122
|
+
stageFunctions({ projectDir: dir, log });
|
|
123
|
+
|
|
124
|
+
return { output: lines.join('\n') };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** The target checks a target actually runs, by class name, in order. */
|
|
128
|
+
function setupCheckNames(dir) {
|
|
129
|
+
return getTests({ main: { firebaseProjectPath: dir } }).map((test) => test.constructor.name);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Boot a REAL Manager against a fixture target, with every required env key
|
|
134
|
+
* present so the #581 boot guard passes, and restore the process env after.
|
|
135
|
+
*/
|
|
136
|
+
function bootManager(dir, options = {}) {
|
|
137
|
+
const saved = {};
|
|
138
|
+
for (const name of requiredEnvKeys('backend')) {
|
|
139
|
+
saved[name] = process.env[name];
|
|
140
|
+
process.env[name] = process.env[name] || 'fixture-value';
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
delete require.cache[MANAGER_PATH];
|
|
144
|
+
const FreshManager = require(MANAGER_PATH);
|
|
145
|
+
|
|
146
|
+
try {
|
|
147
|
+
return new FreshManager().init(null, { cwd: dir, log: false, ...options });
|
|
148
|
+
} finally {
|
|
149
|
+
for (const [name, value] of Object.entries(saved)) {
|
|
150
|
+
if (value === undefined) delete process.env[name];
|
|
151
|
+
else process.env[name] = value;
|
|
152
|
+
}
|
|
153
|
+
delete require.cache[MANAGER_PATH];
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Every helper a consumer's routes reach for through the Manager handle.
|
|
158
|
+
const HELPERS = ['RouteContext', 'User', 'Analytics', 'ApiManager', 'Roles', 'Usage', 'Middleware', 'BackendRouter', 'EventMiddleware', 'Settings', 'Metadata', 'Email', 'AI', 'Utilities'];
|
|
159
|
+
|
|
160
|
+
module.exports = defineCases({
|
|
161
|
+
description: "Backend custom-server mode (#584): the config switch, the boot, and the Firebase-only verbs' refusal",
|
|
162
|
+
type: 'group',
|
|
163
|
+
|
|
164
|
+
tests: [
|
|
165
|
+
{
|
|
166
|
+
name: 'the project type comes from the brand config, firebase by default',
|
|
167
|
+
|
|
168
|
+
run() {
|
|
169
|
+
const custom = targetDir({ projectType: 'custom' });
|
|
170
|
+
const firebase = targetDir({ projectType: 'firebase' });
|
|
171
|
+
const bare = targetDir({});
|
|
172
|
+
|
|
173
|
+
try {
|
|
174
|
+
assert.strictEqual(resolveProjectType(custom), 'custom');
|
|
175
|
+
assert.strictEqual(resolveProjectType(firebase), 'firebase');
|
|
176
|
+
assert.strictEqual(resolveProjectType(bare), 'firebase', 'an unset projectType is the Cloud Functions default');
|
|
177
|
+
assert.strictEqual(isCustomProject(custom), true);
|
|
178
|
+
assert.strictEqual(isCustomProject(bare), false);
|
|
179
|
+
|
|
180
|
+
// No consumer config at all (the framework booting itself) is not a
|
|
181
|
+
// custom backend — it is no backend target, and firebase is the answer
|
|
182
|
+
// that changes nothing.
|
|
183
|
+
assert.strictEqual(resolveProjectType(os.tmpdir()), 'firebase');
|
|
184
|
+
} finally {
|
|
185
|
+
for (const dir of [custom, firebase, bare]) fs.rmSync(dir, { recursive: true, force: true });
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
|
|
190
|
+
{
|
|
191
|
+
name: 'a custom boot loads no firebase-functions, and every helper still answers',
|
|
192
|
+
|
|
193
|
+
run() {
|
|
194
|
+
const custom = targetDir({ projectType: 'custom' });
|
|
195
|
+
const firebase = targetDir({});
|
|
196
|
+
|
|
197
|
+
try {
|
|
198
|
+
const customManager = bootManager(custom);
|
|
199
|
+
assert.strictEqual(customManager.options.projectType, 'custom', 'the config is the switch — no init flag needed');
|
|
200
|
+
assert.strictEqual(customManager.libraries.functions, null, 'custom mode must not load firebase-functions');
|
|
201
|
+
|
|
202
|
+
const firebaseManager = bootManager(firebase);
|
|
203
|
+
assert.strictEqual(firebaseManager.options.projectType, 'firebase');
|
|
204
|
+
assert.ok(firebaseManager.libraries.functions, 'firebase mode still loads firebase-functions');
|
|
205
|
+
|
|
206
|
+
// The whole point of the mode: the SAME backend, minus the artifact.
|
|
207
|
+
for (const helper of HELPERS) {
|
|
208
|
+
assert.strictEqual(typeof customManager[helper], 'function', `${helper}() must work in custom mode`);
|
|
209
|
+
assert.strictEqual(typeof firebaseManager[helper], 'function', `${helper}() must work in firebase mode`);
|
|
210
|
+
}
|
|
211
|
+
assert.ok(customManager.config.brand.id, 'the config still resolves in custom mode');
|
|
212
|
+
} finally {
|
|
213
|
+
for (const dir of [custom, firebase]) fs.rmSync(dir, { recursive: true, force: true });
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
|
|
218
|
+
{
|
|
219
|
+
name: 'an explicit init option still wins over the config',
|
|
220
|
+
|
|
221
|
+
run() {
|
|
222
|
+
const custom = targetDir({ projectType: 'custom' });
|
|
223
|
+
|
|
224
|
+
try {
|
|
225
|
+
const manager = bootManager(custom, { projectType: 'firebase' });
|
|
226
|
+
assert.strictEqual(manager.options.projectType, 'firebase', 'an explicit option is the caller saying so');
|
|
227
|
+
assert.ok(manager.libraries.functions);
|
|
228
|
+
} finally {
|
|
229
|
+
fs.rmSync(custom, { recursive: true, force: true });
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
|
|
234
|
+
{
|
|
235
|
+
name: 'omega deploy refuses in custom mode — nothing is staged, nothing reaches firebase',
|
|
236
|
+
|
|
237
|
+
async run() {
|
|
238
|
+
const dir = targetDir({ projectType: 'custom' });
|
|
239
|
+
|
|
240
|
+
try {
|
|
241
|
+
const run = await runCommand(DeployCommand, dir);
|
|
242
|
+
|
|
243
|
+
assert.deepStrictEqual(run.shell, [], 'a custom backend must never run `firebase deploy`');
|
|
244
|
+
assert.strictEqual(run.exitCode, 1, 'a refused deploy must fail the process, never read green');
|
|
245
|
+
assert.match(run.output, /custom/, 'the refusal must name the mode');
|
|
246
|
+
assert.match(run.output, /deploy/, 'the refusal must name the lane that replaces it');
|
|
247
|
+
assert.strictEqual(fs.existsSync(path.join(dir, 'dist')), false, 'the refusal comes BEFORE staging');
|
|
248
|
+
} finally {
|
|
249
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
|
|
254
|
+
{
|
|
255
|
+
name: 'every Firebase-only verb refuses in custom mode, each naming its replacement lane',
|
|
256
|
+
|
|
257
|
+
async run() {
|
|
258
|
+
const dir = targetDir({ projectType: 'custom' });
|
|
259
|
+
|
|
260
|
+
try {
|
|
261
|
+
assert.deepStrictEqual(
|
|
262
|
+
Object.keys(FIREBASE_ONLY_VERBS).sort(),
|
|
263
|
+
['deploy', 'emulator', 'serve', 'test'],
|
|
264
|
+
'the refused verbs live in ONE table',
|
|
265
|
+
);
|
|
266
|
+
|
|
267
|
+
for (const [CommandClass, verb] of [[EmulatorCommand, 'emulator'], [ServeCommand, 'serve'], [TestCommand, 'test']]) {
|
|
268
|
+
const run = await runCommand(CommandClass, dir);
|
|
269
|
+
|
|
270
|
+
assert.deepStrictEqual(run.shell, [], `omega ${verb} must not reach the shell in custom mode`);
|
|
271
|
+
assert.strictEqual(run.exitCode, 1, `omega ${verb} must fail the process in custom mode`);
|
|
272
|
+
assert.match(run.output, /custom/, `omega ${verb} must name the mode`);
|
|
273
|
+
assert.ok(run.output.includes(FIREBASE_ONLY_VERBS[verb]), `omega ${verb} must print its own replacement lane: ${run.output}`);
|
|
274
|
+
}
|
|
275
|
+
} finally {
|
|
276
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
|
|
281
|
+
{
|
|
282
|
+
name: 'the brand-owned scripts are exactly the ones running a refused verb',
|
|
283
|
+
|
|
284
|
+
async run() {
|
|
285
|
+
// The declaration the manager walk and this framework's own scaffold
|
|
286
|
+
// both read (#689). It is DERIVED knowledge — a script key is the
|
|
287
|
+
// brand's in custom mode precisely because the verb it runs refuses —
|
|
288
|
+
// so it must never drift from the verb table beside it.
|
|
289
|
+
const { projectScripts, projectScriptsCustomOwned } = require('../../package.json');
|
|
290
|
+
const verbOf = (command) => (String(command).match(/(?:^|&& )omega (\S+)/) || [])[1];
|
|
291
|
+
|
|
292
|
+
for (const key of projectScriptsCustomOwned) {
|
|
293
|
+
assert.ok(projectScripts[key], `projectScriptsCustomOwned names ${key}, which projectScripts must declare`);
|
|
294
|
+
assert.ok(FIREBASE_ONLY_VERBS[verbOf(projectScripts[key])],
|
|
295
|
+
`\`${key}\` is only the brand's because \`omega ${verbOf(projectScripts[key])}\` refuses in custom mode`);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
for (const [key, command] of Object.entries(projectScripts)) {
|
|
299
|
+
if (projectScriptsCustomOwned.includes(key)) continue;
|
|
300
|
+
assert.strictEqual(FIREBASE_ONLY_VERBS[verbOf(command)], undefined,
|
|
301
|
+
`\`${key}\` runs a verb this mode refuses — it belongs in projectScriptsCustomOwned`);
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
|
|
306
|
+
{
|
|
307
|
+
name: 'the verbs scaffold no Firebase-only file on a custom backend',
|
|
308
|
+
|
|
309
|
+
async run() {
|
|
310
|
+
const dir = targetDir({ projectType: 'custom' });
|
|
311
|
+
|
|
312
|
+
try {
|
|
313
|
+
const run = runSetupScaffold(dir);
|
|
314
|
+
|
|
315
|
+
for (const file of FIREBASE_ONLY_SCAFFOLD) {
|
|
316
|
+
assert.strictEqual(fs.existsSync(path.join(dir, file)), false, `a custom backend has no Firebase lane — the scaffold must not write ${file}: ${run.output}`);
|
|
317
|
+
}
|
|
318
|
+
assert.strictEqual(fs.existsSync(path.join(dir, 'dist', 'firestore.rules')), false, 'and no compiled rules artifact either — nothing deploys it');
|
|
319
|
+
|
|
320
|
+
// What custom mode does NOT take away: the project id, the authored
|
|
321
|
+
// entry, and the staged output every backend builds.
|
|
322
|
+
assert.strictEqual(fs.existsSync(path.join(dir, '.firebaserc')), true, 'the project id is still the backend\'s — the admin SDK reads it in both modes');
|
|
323
|
+
assert.strictEqual(fs.existsSync(path.join(dir, 'src', 'index.js')), true);
|
|
324
|
+
assert.strictEqual(fs.existsSync(path.join(dir, 'dist', 'index.js')), true);
|
|
325
|
+
} finally {
|
|
326
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
327
|
+
}
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
|
|
331
|
+
{
|
|
332
|
+
name: 'a firebase-mode backend scaffolds every one of them, exactly as before',
|
|
333
|
+
|
|
334
|
+
async run() {
|
|
335
|
+
const dir = targetDir({});
|
|
336
|
+
|
|
337
|
+
try {
|
|
338
|
+
const run = runSetupScaffold(dir);
|
|
339
|
+
|
|
340
|
+
for (const file of FIREBASE_ONLY_SCAFFOLD) {
|
|
341
|
+
assert.strictEqual(fs.existsSync(path.join(dir, file)), true, `the default mode is unchanged — ${file} must still be scaffolded: ${run.output}`);
|
|
342
|
+
}
|
|
343
|
+
assert.strictEqual(fs.existsSync(path.join(dir, 'dist', 'firestore.rules')), true, 'the stage still compiles the artifact firebase.json points at');
|
|
344
|
+
} finally {
|
|
345
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
|
|
350
|
+
{
|
|
351
|
+
name: 'the scaffold never rewrites what a custom project authored itself',
|
|
352
|
+
|
|
353
|
+
async run() {
|
|
354
|
+
const dir = targetDir({ projectType: 'custom' });
|
|
355
|
+
const authored = { functions: { source: 'functions' }, hosting: { public: 'public' } };
|
|
356
|
+
const authoredRules = "rules_version = '2';\nservice cloud.firestore {\n match /databases/{database}/documents {\n match /mine/{id} { allow read: if true; }\n }\n}\n";
|
|
357
|
+
|
|
358
|
+
try {
|
|
359
|
+
// This brand runs custom mode AND keeps a firebase.json of its own
|
|
360
|
+
// (it deploys rules by hand, say). Skipping is not deleting — and not
|
|
361
|
+
// migrating it under the brand either.
|
|
362
|
+
fs.writeFileSync(path.join(dir, 'firebase.json'), JSON.stringify(authored));
|
|
363
|
+
fs.writeFileSync(path.join(dir, 'firestore.rules'), authoredRules);
|
|
364
|
+
|
|
365
|
+
runSetupScaffold(dir);
|
|
366
|
+
|
|
367
|
+
assert.deepStrictEqual(JSON.parse(fs.readFileSync(path.join(dir, 'firebase.json'), 'utf8')), authored, 'an authored firebase.json is left exactly as it was');
|
|
368
|
+
assert.strictEqual(fs.readFileSync(path.join(dir, 'firestore.rules'), 'utf8'), authoredRules);
|
|
369
|
+
} finally {
|
|
370
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
371
|
+
}
|
|
372
|
+
},
|
|
373
|
+
},
|
|
374
|
+
|
|
375
|
+
{
|
|
376
|
+
name: 'the Firebase-only target checks are dropped in custom mode, and only those',
|
|
377
|
+
|
|
378
|
+
async run() {
|
|
379
|
+
const custom = targetDir({ projectType: 'custom' });
|
|
380
|
+
const firebase = targetDir({});
|
|
381
|
+
|
|
382
|
+
try {
|
|
383
|
+
const full = setupCheckNames(firebase);
|
|
384
|
+
const kept = setupCheckNames(custom);
|
|
385
|
+
|
|
386
|
+
assert.strictEqual(
|
|
387
|
+
kept.length,
|
|
388
|
+
full.length - FIREBASE_ONLY_SETUP_CHECKS.length,
|
|
389
|
+
'every Firebase-only check, and no other, comes off the list',
|
|
390
|
+
);
|
|
391
|
+
assert.deepStrictEqual(kept, full.filter((name) => kept.includes(name)), 'the surviving checks keep their order');
|
|
392
|
+
|
|
393
|
+
// The two that matter most: one hard-FAILS a custom target ("this is
|
|
394
|
+
// not a firebase project"), the other writes the emulator config.
|
|
395
|
+
assert.strictEqual(kept.includes('IsFirebaseProjectTest'), false, 'a custom backend is not a broken Firebase project');
|
|
396
|
+
assert.strictEqual(kept.includes('EmulatorConfigTest'), false, 'there is no emulator to configure');
|
|
397
|
+
|
|
398
|
+
// Everything else is identical in both modes — that is the mode.
|
|
399
|
+
for (const check of ['OmegaConfigTest', 'GitignoreTest', 'ServiceAccountTest', 'ProjectDirectoriesTest']) {
|
|
400
|
+
assert.strictEqual(kept.includes(check), true, `${check} is not a Firebase-lane check`);
|
|
401
|
+
}
|
|
402
|
+
} finally {
|
|
403
|
+
for (const dir of [custom, firebase]) fs.rmSync(dir, { recursive: true, force: true });
|
|
404
|
+
}
|
|
405
|
+
},
|
|
406
|
+
},
|
|
407
|
+
|
|
408
|
+
{
|
|
409
|
+
name: 'omega build is unchanged — a custom backend stages src/ into dist/',
|
|
410
|
+
|
|
411
|
+
async run() {
|
|
412
|
+
const dir = targetDir({ projectType: 'custom' });
|
|
413
|
+
|
|
414
|
+
try {
|
|
415
|
+
const run = await runCommand(BuildCommand, dir);
|
|
416
|
+
|
|
417
|
+
assert.strictEqual(fs.existsSync(path.join(dir, 'dist', 'index.js')), true, `the authored src/ should be staged: ${run.output}`);
|
|
418
|
+
assert.strictEqual(fs.existsSync(path.join(dir, 'dist', 'package.json')), true, 'the staged manifest is the build output the manager checks for');
|
|
419
|
+
assert.notStrictEqual(run.exitCode, 1, 'build is not a Firebase-only verb');
|
|
420
|
+
} finally {
|
|
421
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
},
|
|
425
|
+
],
|
|
426
|
+
});
|