@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,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ensure-target — the LOCAL, idempotent scaffold every verb runs
|
|
3
|
+
* ([#675](https://github.com/Omega-JS-Stack/omega/issues/675)).
|
|
4
|
+
*
|
|
5
|
+
* `omega setup` used to own this half and nothing ran it for you, so a target
|
|
6
|
+
* drifted until someone remembered the command per target. It is retired: the
|
|
7
|
+
* "write it if missing" steps live here and `ensureStaged()` calls this first,
|
|
8
|
+
* so build/dev/serve/emulator/test/deploy all heal the tree on the way past.
|
|
9
|
+
*
|
|
10
|
+
* What it guarantees, in this order (config first — the derived artifacts read
|
|
11
|
+
* it):
|
|
12
|
+
*
|
|
13
|
+
* config/omega.json5 standalone targets only (inside a brand monorepo
|
|
14
|
+
* the brand root's `targets.backend` IS the config)
|
|
15
|
+
* .firebaserc derived from the resolved config's project id
|
|
16
|
+
* firebase.json scaffolded, or migrated onto the src/dist pillar
|
|
17
|
+
* src/index.js the AUTHORED Cloud Functions entry
|
|
18
|
+
* firestore.rules the brand's rules SOURCE half (the stage compiles it)
|
|
19
|
+
* database.rules.json the emulator dies ENOENT without it
|
|
20
|
+
* package.json engines the FRAMEWORK's pinned Cloud Functions runtime
|
|
21
|
+
* package.json scripts the standard verb scripts, rewritten to their
|
|
22
|
+
* defaults (#689 — the framework owns those keys)
|
|
23
|
+
* src/defaults/** the defaults tree (copy-if-missing; AGENTS.md and
|
|
24
|
+
* .gitignore live-sync their Default section)
|
|
25
|
+
*
|
|
26
|
+
* Everything here is copy-if-missing or merge-in-place — the one exception is
|
|
27
|
+
* the standard scripts above, which the framework owns outright in every
|
|
28
|
+
* target that isn't a custom server. A run that changes nothing writes nothing
|
|
29
|
+
* and says nothing. Anything that needs the network is NOT here — that belongs
|
|
30
|
+
* to the verb that needs it.
|
|
31
|
+
*/
|
|
32
|
+
const path = require('path');
|
|
33
|
+
const jetpack = require('fs-jetpack');
|
|
34
|
+
const JSON5 = require('json5');
|
|
35
|
+
const omegaConfig = require('../../vendor/config/index.js');
|
|
36
|
+
|
|
37
|
+
const { assertScaffoldable } = require('../../vendor/devkit/scaffold-guard.js');
|
|
38
|
+
|
|
39
|
+
const { scaffoldDefaults } = require('../../utils/scaffold-defaults.js');
|
|
40
|
+
const { isCustomProject, frameworkOwnedScripts, FIREBASE_ONLY_SCAFFOLD } = require('./project-type');
|
|
41
|
+
|
|
42
|
+
// The framework's own manifest — its `omega.functionsRuntime` is the pinned
|
|
43
|
+
// Cloud Functions runtime every consumer app inherits (SSOT with the .nvmrc
|
|
44
|
+
// lockstep in setup-tests/nvmrc-version.js). Deliberately decoupled from
|
|
45
|
+
// `engines.node`, which is the honest DEV floor (`>=22`): the cloud runtime
|
|
46
|
+
// is Firebase's to provide, the laptop only has to meet the floor.
|
|
47
|
+
const frameworkPackage = require('../../../package.json');
|
|
48
|
+
|
|
49
|
+
const TEMPLATES_DIR = path.resolve(__dirname, '../../../templates');
|
|
50
|
+
|
|
51
|
+
/** Read a JSON5 file, `{}` when it is missing or empty. */
|
|
52
|
+
function loadJSON(filePath) {
|
|
53
|
+
const contents = jetpack.read(filePath);
|
|
54
|
+
return contents ? JSON5.parse(contents) : {};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function hasContent(object) {
|
|
58
|
+
return Object.keys(object).length > 0;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The project id `.firebaserc` derives from.
|
|
63
|
+
*
|
|
64
|
+
* The config is the source of truth: a wizard-seeded brand carries
|
|
65
|
+
* cloud.config.projectId (the demo-<id> convention) before any artifact
|
|
66
|
+
* exists — .firebaserc derives from it, never the reverse.
|
|
67
|
+
*
|
|
68
|
+
* @param {string} projectDir - The target root.
|
|
69
|
+
* @returns {string} The project id.
|
|
70
|
+
*/
|
|
71
|
+
function resolveProjectId(projectDir) {
|
|
72
|
+
if (omegaConfig.hasOmegaConfig(projectDir) || omegaConfig.findBrandRoot(projectDir)) {
|
|
73
|
+
try {
|
|
74
|
+
const configured = omegaConfig.loadConfig(projectDir, 'backend').config.cloud?.config?.projectId;
|
|
75
|
+
if (configured) {
|
|
76
|
+
return configured;
|
|
77
|
+
}
|
|
78
|
+
} catch (e) {
|
|
79
|
+
// Unloadable config — the omega-config target check reports it
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const saPath = path.join(projectDir, 'service-account.json');
|
|
84
|
+
if (jetpack.exists(saPath)) {
|
|
85
|
+
try {
|
|
86
|
+
const sa = JSON.parse(jetpack.read(saPath));
|
|
87
|
+
if (sa.project_id) {
|
|
88
|
+
return sa.project_id;
|
|
89
|
+
}
|
|
90
|
+
} catch (e) {
|
|
91
|
+
// Fall through
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return process.env.GCLOUD_PROJECT || 'demo-project';
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Scaffold the config artifacts a backend target cannot run without.
|
|
100
|
+
*
|
|
101
|
+
* @param {string} projectDir - The target root.
|
|
102
|
+
* @param {{ written: string[], changed: string[] }} result - Collector.
|
|
103
|
+
*/
|
|
104
|
+
function scaffoldConfigs(projectDir, result) {
|
|
105
|
+
// Custom mode has no Functions deploy and no emulator, so the Firebase-only
|
|
106
|
+
// artifacts below are scaffolded away entirely (#614). The list lives with
|
|
107
|
+
// the mode table, next to the verbs the same mode refuses.
|
|
108
|
+
const custom = isCustomProject(projectDir);
|
|
109
|
+
const skipsFirebaseFile = (file) => custom && FIREBASE_ONLY_SCAFFOLD.includes(file);
|
|
110
|
+
|
|
111
|
+
// Config FIRST (friction #11: config → derived artifacts, so .firebaserc
|
|
112
|
+
// below can read cloud.config.projectId). Inside a brand monorepo the target
|
|
113
|
+
// carries NO omega.json5 at all — brand `targets.*` is the per-target home
|
|
114
|
+
// (cp121c/cp122) and the stage step composes the runtime file. Standalone
|
|
115
|
+
// consumers (no brand root above) get the full template at the TARGET ROOT —
|
|
116
|
+
// the same escape hatch every other target uses.
|
|
117
|
+
if (!omegaConfig.hasOmegaConfig(projectDir) && !omegaConfig.findBrandRoot(projectDir)) {
|
|
118
|
+
jetpack.copy(path.join(TEMPLATES_DIR, 'config', 'omega.json5'), path.join(projectDir, 'config', 'omega.json5'));
|
|
119
|
+
result.written.push('config/omega.json5');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// .firebaserc — DERIVED from the resolved config (else service account / env)
|
|
123
|
+
if (!hasContent(loadJSON(path.join(projectDir, '.firebaserc')))) {
|
|
124
|
+
const projectId = resolveProjectId(projectDir);
|
|
125
|
+
jetpack.write(path.join(projectDir, '.firebaserc'), `${JSON.stringify({ projects: { default: projectId } }, null, 2)}\n`);
|
|
126
|
+
result.written.push('.firebaserc');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// firebase.json — scaffold or migrate
|
|
130
|
+
const firebaseJsonPath = path.join(projectDir, 'firebase.json');
|
|
131
|
+
const firebaseJSON = loadJSON(firebaseJsonPath);
|
|
132
|
+
if (skipsFirebaseFile('firebase.json')) {
|
|
133
|
+
// Nothing: not even the dist/ migration below, which would rewrite a
|
|
134
|
+
// file this mode never asked for.
|
|
135
|
+
} else if (!hasContent(firebaseJSON)) {
|
|
136
|
+
jetpack.copy(path.join(TEMPLATES_DIR, 'firebase.json'), firebaseJsonPath);
|
|
137
|
+
result.written.push('firebase.json');
|
|
138
|
+
} else {
|
|
139
|
+
// Migrate legacy `functions` → `dist` (src/dist pillar): the functions
|
|
140
|
+
// source and hosting public dir must point at the staged output tree.
|
|
141
|
+
let dirty = false;
|
|
142
|
+
const fnBlock = Array.isArray(firebaseJSON.functions) ? firebaseJSON.functions[0] : firebaseJSON.functions;
|
|
143
|
+
if (fnBlock && fnBlock.source === 'functions') {
|
|
144
|
+
fnBlock.source = 'dist';
|
|
145
|
+
dirty = true;
|
|
146
|
+
}
|
|
147
|
+
if (firebaseJSON.hosting && firebaseJSON.hosting.public === 'public') {
|
|
148
|
+
firebaseJSON.hosting.public = 'dist/public';
|
|
149
|
+
dirty = true;
|
|
150
|
+
}
|
|
151
|
+
if (dirty) {
|
|
152
|
+
jetpack.write(firebaseJsonPath, `${JSON.stringify(firebaseJSON, null, 2)}\n`);
|
|
153
|
+
result.changed.push('firebase.json (functions source + hosting public → dist/)');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// src/index.js — the AUTHORED Cloud Functions entry (src/dist pillar);
|
|
158
|
+
// the stage step mirrors it into dist/index.js
|
|
159
|
+
const indexPath = path.join(projectDir, 'src', 'index.js');
|
|
160
|
+
if (!jetpack.exists(indexPath)) {
|
|
161
|
+
jetpack.copy(path.join(TEMPLATES_DIR, 'index.js'), indexPath);
|
|
162
|
+
result.written.push('src/index.js');
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// firestore.rules — the brand's SOURCE half (#255). Seeded HERE, before the
|
|
166
|
+
// stage compiles it, so a virgin target's first stage already has a real
|
|
167
|
+
// source to splice the framework half into. Migration off a legacy marker
|
|
168
|
+
// block + the hook lint belong to the firestore-rules-file check.
|
|
169
|
+
const firestoreRulesPath = path.join(projectDir, 'firestore.rules');
|
|
170
|
+
if (!skipsFirebaseFile('firestore.rules') && !jetpack.exists(firestoreRulesPath)) {
|
|
171
|
+
jetpack.copy(path.join(TEMPLATES_DIR, 'firestore.rules'), firestoreRulesPath);
|
|
172
|
+
result.written.push('firestore.rules');
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// database.rules.json — firebase.json references it and the emulator dies
|
|
176
|
+
// ENOENT without it (friction #9). The template ships the v0.0.0-stamped
|
|
177
|
+
// marker block; the rules checks stamp the live version.
|
|
178
|
+
const databaseRulesPath = path.join(projectDir, 'database.rules.json');
|
|
179
|
+
if (!skipsFirebaseFile('database.rules.json') && !jetpack.exists(databaseRulesPath)) {
|
|
180
|
+
jetpack.copy(path.join(TEMPLATES_DIR, 'database.rules.json'), databaseRulesPath);
|
|
181
|
+
result.written.push('database.rules.json');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Sync the TARGET manifest — the engines pin and the standard verb scripts.
|
|
187
|
+
*
|
|
188
|
+
* engines.node: the stage step carries it into the derived dist/package.json
|
|
189
|
+
* (Cloud Functions runtime detection). Derived from the FRAMEWORK's pinned
|
|
190
|
+
* runtime, never the ambient node: a scaffold must produce the same app under
|
|
191
|
+
* any shell (cp195 journey catch — an ambient-24 run stamped 24 against the
|
|
192
|
+
* v22/* .nvmrc and boot died on the Manager.init version mismatch). A
|
|
193
|
+
* consumer-authored value is never overwritten.
|
|
194
|
+
*
|
|
195
|
+
* scripts: the opposite policy, and the same one the three sibling frameworks
|
|
196
|
+
* already run ([#689](https://github.com/Omega-JS-Stack/omega/issues/689)) —
|
|
197
|
+
* every key this framework declares is FRAMEWORK-owned and takes its default
|
|
198
|
+
* on every verb run, so an edited standard script heals instead of drifting
|
|
199
|
+
* (hook points are the customization seam). Keys the framework never declares
|
|
200
|
+
* are the consumer's own and are never touched; a custom-server backend keeps
|
|
201
|
+
* the ones its mode refuses (frameworkOwnedScripts is the one home of that).
|
|
202
|
+
*
|
|
203
|
+
* Identical content is not a write.
|
|
204
|
+
*
|
|
205
|
+
* @param {string} projectDir - The target root.
|
|
206
|
+
* @param {{ written: string[], changed: string[] }} result - Collector.
|
|
207
|
+
*/
|
|
208
|
+
function scaffoldPackageJson(projectDir, result) {
|
|
209
|
+
const manifestPath = path.join(projectDir, 'package.json');
|
|
210
|
+
const manifest = loadJSON(manifestPath);
|
|
211
|
+
const changes = [];
|
|
212
|
+
|
|
213
|
+
if (!(manifest.engines && manifest.engines.node)) {
|
|
214
|
+
const nodeVersion = String(parseInt(frameworkPackage.omega.functionsRuntime, 10));
|
|
215
|
+
manifest.engines = manifest.engines || {};
|
|
216
|
+
manifest.engines.node = nodeVersion;
|
|
217
|
+
changes.push(`engines.node = ${nodeVersion}`);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const owned = frameworkOwnedScripts(projectDir);
|
|
221
|
+
manifest.scripts = manifest.scripts || {};
|
|
222
|
+
for (const [key, command] of Object.entries(owned)) {
|
|
223
|
+
if (manifest.scripts[key] === command) continue;
|
|
224
|
+
manifest.scripts[key] = command;
|
|
225
|
+
changes.push(`scripts.${key}`);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (changes.length === 0) return;
|
|
229
|
+
|
|
230
|
+
// npm's own shape, trailing newline included — the same byte contract the
|
|
231
|
+
// three sibling writers and the manager walk keep (jetpack.write emits none).
|
|
232
|
+
jetpack.write(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
|
|
233
|
+
result.changed.push(`package.json (${changes.join(', ')})`);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Apply the framework's defaults tree (src/defaults/**) to the target root via
|
|
238
|
+
* the shared devkit engine. The file map lives in src/utils/scaffold-defaults.js:
|
|
239
|
+
* copy-if-missing for everything, marker-section merge (Default =
|
|
240
|
+
* framework-owned, Custom = consumer-owned) for AGENTS.md and .gitignore.
|
|
241
|
+
*
|
|
242
|
+
* @param {string} projectDir - The target root.
|
|
243
|
+
* @param {{ written: string[], merged: string[] }} result - Collector.
|
|
244
|
+
*/
|
|
245
|
+
function copyDefaults(projectDir, result) {
|
|
246
|
+
const defaultsDir = path.resolve(__dirname, '../../defaults');
|
|
247
|
+
|
|
248
|
+
// Optional — older @omega.js/backend versions shipped no defaults tree
|
|
249
|
+
if (!jetpack.exists(defaultsDir)) return;
|
|
250
|
+
|
|
251
|
+
const applied = scaffoldDefaults({
|
|
252
|
+
outputDir: projectDir,
|
|
253
|
+
logger: { log: () => {}, warn: () => {}, error: () => {} },
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
result.written.push(...applied.written);
|
|
257
|
+
result.merged.push(...applied.merged);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Sweep the transient artifacts older runs left in the tree — today just the
|
|
262
|
+
* reload trigger `npx omega watch` writes. Log sweeping belongs to the boot
|
|
263
|
+
* lanes (base-command's sweepStaleLogs), which run it per boot.
|
|
264
|
+
*
|
|
265
|
+
* @param {string} projectDir - The target root.
|
|
266
|
+
*/
|
|
267
|
+
function cleanupGeneratedArtifacts(projectDir) {
|
|
268
|
+
const triggerFile = path.join(projectDir, 'functions', 'omega-reload-trigger.js');
|
|
269
|
+
if (jetpack.exists(triggerFile)) {
|
|
270
|
+
jetpack.remove(triggerFile);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Make the target whole — idempotent, offline, and quiet when there is
|
|
276
|
+
* nothing to do.
|
|
277
|
+
*
|
|
278
|
+
* @param {object} options
|
|
279
|
+
* @param {string} options.projectDir - The target root.
|
|
280
|
+
* @param {function} [options.log] - Line logger (silent by default).
|
|
281
|
+
* @returns {{ written: string[], merged: string[], changed: string[] }}
|
|
282
|
+
* Target-relative paths per outcome — empty on a no-op run.
|
|
283
|
+
*/
|
|
284
|
+
function ensureTarget(options) {
|
|
285
|
+
const projectDir = options.projectDir;
|
|
286
|
+
const log = options.log || (() => {});
|
|
287
|
+
const result = { written: [], merged: [], changed: [] };
|
|
288
|
+
|
|
289
|
+
// The framework's own tree is not a consumer target. Running the framework's
|
|
290
|
+
// suite from packages/backend puts the framework at the cwd, and a verb that
|
|
291
|
+
// scaffolds unconditionally would scatter the consumer defaults through the
|
|
292
|
+
// package. Refuse, quietly: this is a normal state, not a broken one.
|
|
293
|
+
// (Sibling of the same guard in @omega.js/desktop's ensure-target.)
|
|
294
|
+
if (loadJSON(path.join(projectDir, 'package.json')).name === frameworkPackage.name) {
|
|
295
|
+
return result;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// A workspace ROOT is not a target either — and unlike the case above, landing
|
|
299
|
+
// there is an accident (a verb run from the wrong cwd), so it fails LOUD (#699).
|
|
300
|
+
assertScaffoldable(projectDir);
|
|
301
|
+
|
|
302
|
+
scaffoldConfigs(projectDir, result);
|
|
303
|
+
scaffoldPackageJson(projectDir, result);
|
|
304
|
+
copyDefaults(projectDir, result);
|
|
305
|
+
cleanupGeneratedArtifacts(projectDir);
|
|
306
|
+
|
|
307
|
+
for (const [label, files] of [['Created', result.written], ['Merged', result.merged], ['Synced', result.changed]]) {
|
|
308
|
+
if (files.length > 0) log(`${label} ${files.join(', ')}`);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
return result;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
module.exports = { ensureTarget, resolveProjectId };
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which SHAPE this backend target runs and deploys as
|
|
3
|
+
* ([#584](https://github.com/Omega-JS-Stack/omega/issues/584)):
|
|
4
|
+
* `firebase` — Cloud Functions, the default and what most brands are — or
|
|
5
|
+
* `custom` — the same Express app listening on `PORT`, deployed to a
|
|
6
|
+
* container host (Render & co). The switch is the brand's own config,
|
|
7
|
+
* `targets.backend.projectType`, so ONE file decides it for the runtime
|
|
8
|
+
* (`Manager.init`) and for the CLI alike.
|
|
9
|
+
*
|
|
10
|
+
* Custom mode takes three VERBS away, and FIREBASE_ONLY_VERBS is the one home
|
|
11
|
+
* of that list: the Functions deploy, the local emulator, and the emulator test
|
|
12
|
+
* run. It also takes away the Firebase-only ARTIFACTS those verbs read —
|
|
13
|
+
* FIREBASE_ONLY_SCAFFOLD and FIREBASE_ONLY_SETUP_CHECKS are the one home of
|
|
14
|
+
* that list ([#614](https://github.com/Omega-JS-Stack/omega/issues/614)) — and
|
|
15
|
+
* the package SCRIPTS that run them, which the framework manifest's
|
|
16
|
+
* `projectScriptsCustomOwned` names
|
|
17
|
+
* ([#689](https://github.com/Omega-JS-Stack/omega/issues/689)).
|
|
18
|
+
* Everything else — the routes, the schemas, the auth middleware, every
|
|
19
|
+
* helper, and the rest of setup — is identical in both modes, which is the
|
|
20
|
+
* whole point of the mode.
|
|
21
|
+
*/
|
|
22
|
+
const chalk = require('chalk').default;
|
|
23
|
+
|
|
24
|
+
const { hasOmegaConfig, loadConfig, backendProjectType } = require('../../vendor/config/index.js');
|
|
25
|
+
|
|
26
|
+
// The framework's own manifest: `projectScripts` (every standard target script)
|
|
27
|
+
// and `projectScriptsCustomOwned` (the ones a custom-server backend owns
|
|
28
|
+
// instead). Declared THERE, not here, because the manager walk reads the same
|
|
29
|
+
// pair off the installed package without loading any backend code (#689).
|
|
30
|
+
const frameworkPackage = require('../../../package.json');
|
|
31
|
+
|
|
32
|
+
// verb → what replaces it in custom mode. A refusal that doesn't name the
|
|
33
|
+
// lane is just a wall.
|
|
34
|
+
const FIREBASE_ONLY_VERBS = {
|
|
35
|
+
deploy: "a custom backend publishes through its host (Render & co) — put that command in this target's `deploy` script, which the brand-root `omega deploy` runs",
|
|
36
|
+
serve: 'a custom backend runs its own server — `npm start` boots it on PORT',
|
|
37
|
+
emulator: 'there are no Cloud Functions to emulate — `npm start` boots the server on PORT',
|
|
38
|
+
test: "the emulator lane needs Cloud Functions — `npm test` runs this target's static suite",
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// The files the scaffold writes ONLY for the Firebase lane: firebase.json
|
|
42
|
+
// (deploy targets + emulator config), and the rules sources firebase.json
|
|
43
|
+
// points at. A custom backend deploys through its host and has no emulator, so
|
|
44
|
+
// scaffolding these leaves a consumer files to delete
|
|
45
|
+
// ([#614](https://github.com/Omega-JS-Stack/omega/issues/614)). Skipped, never
|
|
46
|
+
// removed: an existing custom project keeps whatever it authored.
|
|
47
|
+
const FIREBASE_ONLY_SCAFFOLD = ['firebase.json', 'firestore.rules', 'database.rules.json'];
|
|
48
|
+
|
|
49
|
+
// The setup CHECKS that exist only for those artifacts — every check that
|
|
50
|
+
// reads or writes firebase.json, plus the ones that seed the rules and index
|
|
51
|
+
// files. Module names under src/cli/commands/setup-tests/, which is where the
|
|
52
|
+
// registry resolves them.
|
|
53
|
+
const FIREBASE_ONLY_SETUP_CHECKS = [
|
|
54
|
+
'is-firebase-project',
|
|
55
|
+
'firestore-rules-in-json',
|
|
56
|
+
'firestore-indexes-in-json',
|
|
57
|
+
'realtime-rules-in-json',
|
|
58
|
+
'storage-rules-in-json',
|
|
59
|
+
'remoteconfig-template-in-json',
|
|
60
|
+
'emulator-config',
|
|
61
|
+
'hosting-rewrites',
|
|
62
|
+
'hosting-folder',
|
|
63
|
+
'firestore-rules-file',
|
|
64
|
+
'firestore-indexes-file',
|
|
65
|
+
'firestore-indexes-required',
|
|
66
|
+
'firestore-indexes-synced',
|
|
67
|
+
'realtime-rules-file',
|
|
68
|
+
'storage-rules-file',
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* The project type of the backend target at `targetRoot`.
|
|
73
|
+
*
|
|
74
|
+
* A missing, unreadable or unparseable config reads 'firebase': that is the
|
|
75
|
+
* default, so it changes nothing, and the config problem itself belongs to the
|
|
76
|
+
* lane that loads it properly (the target checks), not to a shape question.
|
|
77
|
+
*
|
|
78
|
+
* @param {string} targetRoot - The backend target root.
|
|
79
|
+
* @returns {'firebase'|'custom'}
|
|
80
|
+
*/
|
|
81
|
+
function resolveProjectType(targetRoot) {
|
|
82
|
+
try {
|
|
83
|
+
if (!hasOmegaConfig(targetRoot)) return 'firebase';
|
|
84
|
+
return backendProjectType(loadConfig(targetRoot, 'backend').config);
|
|
85
|
+
} catch {
|
|
86
|
+
return 'firebase';
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* @param {string} targetRoot - The backend target root.
|
|
92
|
+
* @returns {boolean} True when this backend runs as a custom server.
|
|
93
|
+
*/
|
|
94
|
+
function isCustomProject(targetRoot) {
|
|
95
|
+
return resolveProjectType(targetRoot) === 'custom';
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* The package scripts THIS framework owns for the target at `targetRoot` — the
|
|
100
|
+
* ONE home of the ownership semantics, read by both writers: the scaffold every
|
|
101
|
+
* verb runs (ensure-target.js) and the setup check that holds a target to them
|
|
102
|
+
* (setup-tests/npm-project-scripts.js).
|
|
103
|
+
*
|
|
104
|
+
* Every `projectScripts` key in firebase mode. In custom mode, all but the keys
|
|
105
|
+
* whose verbs that mode refuses — those are the BRAND's (its own server command,
|
|
106
|
+
* its own host deploy), so they are never written and never scaffolded.
|
|
107
|
+
*
|
|
108
|
+
* @param {string} targetRoot - The backend target root.
|
|
109
|
+
* @returns {Object} Script key → the command this framework owns it as.
|
|
110
|
+
*/
|
|
111
|
+
function frameworkOwnedScripts(targetRoot) {
|
|
112
|
+
const declared = frameworkPackage.projectScripts || {};
|
|
113
|
+
if (!isCustomProject(targetRoot)) return { ...declared };
|
|
114
|
+
|
|
115
|
+
const brandOwned = frameworkPackage.projectScriptsCustomOwned || [];
|
|
116
|
+
return Object.fromEntries(Object.entries(declared).filter(([key]) => !brandOwned.includes(key)));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* The gate every Firebase-only verb opens with. When this target runs in
|
|
121
|
+
* custom mode it prints the refusal — the mode, and the lane that replaces
|
|
122
|
+
* this verb — fails the process, and returns true; the caller returns at once.
|
|
123
|
+
*
|
|
124
|
+
* The exit code matters: these verbs are chained in package scripts and fanned
|
|
125
|
+
* out by the manager, and a refusal that read green would look like a deploy
|
|
126
|
+
* that happened.
|
|
127
|
+
*
|
|
128
|
+
* @param {string} targetRoot - The backend target root.
|
|
129
|
+
* @param {keyof FIREBASE_ONLY_VERBS} verb - The verb being refused.
|
|
130
|
+
* @returns {boolean} True when the caller must stop.
|
|
131
|
+
*/
|
|
132
|
+
function refuseWhenCustom(targetRoot, verb) {
|
|
133
|
+
if (!isCustomProject(targetRoot)) return false;
|
|
134
|
+
|
|
135
|
+
console.log(chalk.yellow(`\n⊘ omega ${verb}: this backend runs \`projectType: 'custom'\` (config/omega.json5 → targets.backend) — ${FIREBASE_ONLY_VERBS[verb]}.`));
|
|
136
|
+
process.exitCode = 1;
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
module.exports = { resolveProjectType, isCustomProject, refuseWhenCustom, frameworkOwnedScripts, FIREBASE_ONLY_VERBS, FIREBASE_ONLY_SCAFFOLD, FIREBASE_ONLY_SETUP_CHECKS };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Hosting boilerplate generator — public/index.html + public/404.html from
|
|
2
|
+
// templates/public/. Consumers never edit or track these files (setup
|
|
3
|
+
// overwrites them on every run; the Default Values .gitignore ignores
|
|
4
|
+
// /public/), so they behave like the root package.json proxy:
|
|
5
|
+
// framework-generated output.
|
|
6
|
+
//
|
|
7
|
+
// Two entry points:
|
|
8
|
+
// - writePublicFiles (setup test, overwrite: true) — authoritative regen
|
|
9
|
+
// with the brand URL from the consumer's config/omega.json5
|
|
10
|
+
// - ensurePublicFiles (emulator boot / deploy, fill-if-missing) — a fresh
|
|
11
|
+
// clone has no public/ at all (it's gitignored), and firebase-tools
|
|
12
|
+
// refuses to boot or deploy hosting without the folder; this fills it
|
|
13
|
+
// without requiring a setup run first
|
|
14
|
+
|
|
15
|
+
const jetpack = require('fs-jetpack');
|
|
16
|
+
const path = require('path');
|
|
17
|
+
const powertools = require('node-powertools');
|
|
18
|
+
const { hasOmegaConfig, loadConfig } = require('../../vendor/config/index.js');
|
|
19
|
+
|
|
20
|
+
const TEMPLATE_DIR = path.resolve(__dirname, '../../../templates/public');
|
|
21
|
+
const FILES = ['index.html', '404.html'];
|
|
22
|
+
|
|
23
|
+
function writePublicFiles(projectPath, options) {
|
|
24
|
+
options = options || {};
|
|
25
|
+
|
|
26
|
+
FILES.forEach((file) => {
|
|
27
|
+
const destination = path.join(projectPath, 'public', file);
|
|
28
|
+
|
|
29
|
+
if (!options.overwrite && jetpack.exists(destination)) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const template = jetpack.read(path.join(TEMPLATE_DIR, file));
|
|
34
|
+
jetpack.write(destination, powertools.template(template, { url: options.url || '' }));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function ensurePublicFiles(projectPath) {
|
|
39
|
+
let url = '';
|
|
40
|
+
try {
|
|
41
|
+
url = hasOmegaConfig(projectPath) ? (loadConfig(projectPath, 'backend').config.brand?.url || '') : '';
|
|
42
|
+
} catch (e) {
|
|
43
|
+
// Unreadable config — boilerplate links home to '' until setup writes the real one
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
writePublicFiles(projectPath, { url, overwrite: false });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
module.exports = { writePublicFiles, ensurePublicFiles };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// Shared devkit module — vendored into dist/vendor/devkit at prepare time by the
|
|
2
|
+
// preparePackage `after` hook. This shim keeps the framework's internal require
|
|
3
|
+
// paths stable while the implementation lives in @omega.js/devkit.
|
|
4
|
+
module.exports = require('../../vendor/devkit/safe-install.js');
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Starting a child on a host whose shell you do not know.
|
|
3
|
+
*
|
|
4
|
+
* Two shapes, because the CLI has two kinds of child, and ONE rule underneath
|
|
5
|
+
* both: the binary is never named by an absolute path we resolved ourselves —
|
|
6
|
+
* the host's own resolver finds it.
|
|
7
|
+
*
|
|
8
|
+
* spawnShell(command) a command LINE the caller composed
|
|
9
|
+
* (`firebase emulators:start --only …`)
|
|
10
|
+
* spawnOnPath(name, args) a bare command NAME plus an argv
|
|
11
|
+
* (`nodemon`, ['--watch', dir])
|
|
12
|
+
*
|
|
13
|
+
* The platform-specific part is the shell, and it is what this module owns:
|
|
14
|
+
* - Unix: `sh -c <command>` for a line; a bare name spawns directly, since
|
|
15
|
+
* execvp already searches PATH and skipping the shell keeps the returned
|
|
16
|
+
* child the REAL process (callers pipe its stdout and kill it by pid).
|
|
17
|
+
* - Windows: `cmd.exe /c …` for both. There is no `sh`, and an npm-installed
|
|
18
|
+
* bin is a `.cmd` shim that Node's CreateProcess cannot execute directly —
|
|
19
|
+
* only a shell can, and only the shell applies PATHEXT to a bare name.
|
|
20
|
+
*
|
|
21
|
+
* Explicit `cmd.exe /c` rather than `shell: true`: an ARRAY of args under
|
|
22
|
+
* `shell: true` trips Node 24's DEP0190 deprecation warning, and the explicit
|
|
23
|
+
* form is the supported warning-free path. Node quotes each argv entry it hands
|
|
24
|
+
* to CreateProcess, so a path with spaces survives with nothing to escape here.
|
|
25
|
+
* Same call shape as `@omega.js/desktop`'s `omega runner`, which hit the trap
|
|
26
|
+
* first (`packages/desktop/src/commands/runner.js` ~313).
|
|
27
|
+
*/
|
|
28
|
+
// The module OBJECT, never a destructured `spawn`: the binding is read at CALL
|
|
29
|
+
// time, so `child_process.spawn` stays a live seam a test can stand in for
|
|
30
|
+
// ([#769](https://github.com/Omega-JS-Stack/omega/issues/769)). Destructuring
|
|
31
|
+
// here would freeze whatever `spawn` was at this module's first require —
|
|
32
|
+
// which, for a module every CLI command loads, is before any test can reach it.
|
|
33
|
+
const childProcess = require('child_process');
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* What actually runs, for a composed command LINE. Pure — the test seam.
|
|
37
|
+
*
|
|
38
|
+
* @param {string} command - The command line
|
|
39
|
+
* @param {string} [platform] - Host platform
|
|
40
|
+
* @returns {[string, string[]]} [binary, args]
|
|
41
|
+
*/
|
|
42
|
+
function shellInvocation(command, platform = process.platform) {
|
|
43
|
+
return platform === 'win32'
|
|
44
|
+
? ['cmd.exe', ['/c', command]]
|
|
45
|
+
: ['sh', ['-c', command]];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* What actually runs, for a bare command NAME plus an argv. Pure — the test seam.
|
|
50
|
+
*
|
|
51
|
+
* @param {string} name - Bare command name, never a resolved path
|
|
52
|
+
* @param {string[]} [args] - Its arguments, unquoted
|
|
53
|
+
* @param {string} [platform] - Host platform
|
|
54
|
+
* @returns {[string, string[]]} [binary, args]
|
|
55
|
+
*/
|
|
56
|
+
function pathInvocation(name, args = [], platform = process.platform) {
|
|
57
|
+
return platform === 'win32'
|
|
58
|
+
? ['cmd.exe', ['/c', name, ...args]]
|
|
59
|
+
: [name, args];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Spawn a composed command LINE through the host's shell.
|
|
64
|
+
*
|
|
65
|
+
* @param {string} command - The command line to run
|
|
66
|
+
* @param {object} [options] - Passed to child_process.spawn verbatim
|
|
67
|
+
* @returns {import('child_process').ChildProcess}
|
|
68
|
+
*/
|
|
69
|
+
function spawnShell(command, options = {}) {
|
|
70
|
+
const [bin, args] = shellInvocation(command);
|
|
71
|
+
|
|
72
|
+
return childProcess.spawn(bin, args, options);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Spawn a command by BARE NAME, letting the host resolve it off PATH.
|
|
77
|
+
*
|
|
78
|
+
* This is the counterpart to `commandOnPath()`: that probe answers whether a
|
|
79
|
+
* tool is installed, and this runs it. The probe's answer is never what gets
|
|
80
|
+
* spawned — on Windows `where` prints the extensionless shell shim first, and
|
|
81
|
+
* neither that shim nor the `.cmd` beside it is executable by CreateProcess.
|
|
82
|
+
*
|
|
83
|
+
* @param {string} name - Bare command name, e.g. 'nodemon'
|
|
84
|
+
* @param {string[]} [args] - Its arguments
|
|
85
|
+
* @param {object} [options] - Passed to child_process.spawn verbatim
|
|
86
|
+
* @returns {import('child_process').ChildProcess}
|
|
87
|
+
*/
|
|
88
|
+
function spawnOnPath(name, args = [], options = {}) {
|
|
89
|
+
const [bin, spawnArgs] = pathInvocation(name, args);
|
|
90
|
+
|
|
91
|
+
return childProcess.spawn(bin, spawnArgs, options);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
module.exports = { spawnShell, spawnOnPath, shellInvocation, pathInvocation };
|