@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,338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stage-functions — the backend consumer build step (src/dist pillar).
|
|
3
|
+
*
|
|
4
|
+
* `dist/` is GENERATED OUTPUT, staged fresh from the authored target tree:
|
|
5
|
+
*
|
|
6
|
+
* src/** → dist/** (1:1 copy, no transforms)
|
|
7
|
+
* package.json → dist/package.json (derived: name/engines/deps)
|
|
8
|
+
* config layers → dist/config/omega.json5 (composeTargetConfig —
|
|
9
|
+
* brand⊕local flattened; the deployed runtime cannot
|
|
10
|
+
* walk up past the upload boundary, cp100e)
|
|
11
|
+
* env cascade → dist/.env (COMPOSED: composeTargetEnv —
|
|
12
|
+
* company ← brand ← target, each layer overlaid by its
|
|
13
|
+
* own .env.<environment> file, filtered to the keys the
|
|
14
|
+
* env schema names for `backend`; the STAGE names the
|
|
15
|
+
* environment, #586)
|
|
16
|
+
* .nvmrc → dist/.nvmrc
|
|
17
|
+
* service-account.json → dist/service-account.json (target root, else the
|
|
18
|
+
* brand's .omega/secrets/ — the key's ONE home)
|
|
19
|
+
* src/public/** OR → dist/public/** (consumer overrides win;
|
|
20
|
+
* templates/public/** defaults fill the gaps)
|
|
21
|
+
* firestore.rules + → dist/firestore.rules (COMPILED: the brand's rules
|
|
22
|
+
* the framework half spliced with the framework's,
|
|
23
|
+
* a matching brand match block
|
|
24
|
+
* MERGED in — compile-rules.js)
|
|
25
|
+
*
|
|
26
|
+
* firebase.json references `dist` as both `functions.source` and
|
|
27
|
+
* `hosting.public` (as `dist/public`), so one staged tree feeds every
|
|
28
|
+
* Firebase surface.
|
|
29
|
+
*
|
|
30
|
+
* The stage is a full re-stage on every call (consumer src is small), with a
|
|
31
|
+
* preserve list for runtime artifacts that live inside dist/ between stages:
|
|
32
|
+
* node_modules/ (self-test symlinks, legacy installs) and *.log
|
|
33
|
+
* (dev/emulator/test/deploy logs — co-located with firebase-tools' logs by
|
|
34
|
+
* design, see docs/logging.md). Everything else is wiped first, so a file
|
|
35
|
+
* deleted from src/ disappears from the stage and a stale composed config
|
|
36
|
+
* can never shadow a brand edit.
|
|
37
|
+
*
|
|
38
|
+
* node_modules is NOT staged: local runs resolve up from dist/ to the target
|
|
39
|
+
* root's install (plain Node resolution); deploys keep cp100d's
|
|
40
|
+
* stage-local-packages (packed file: deps + lockfile) on top of this stage.
|
|
41
|
+
*/
|
|
42
|
+
const path = require('path');
|
|
43
|
+
const jetpack = require('fs-jetpack');
|
|
44
|
+
const { composeTargetConfig, composeTargetEnv, serializeEnv, resolveEnvChain, findBrandRoot, envLayerFiles, ENV_ENVIRONMENTS } = require('../../vendor/config/index.js');
|
|
45
|
+
const { compileFirestoreRules, COMPILED_RULES_FILE, BRAND_RULES_FILE } = require('./compile-rules');
|
|
46
|
+
const { isCustomProject } = require('./project-type');
|
|
47
|
+
|
|
48
|
+
// The framework's pinned Cloud Functions runtime — the engines fallback when
|
|
49
|
+
// a target manifest carries none (never the ambient node: staging must produce
|
|
50
|
+
// the same artifact under any shell)
|
|
51
|
+
const frameworkPackage = require('../../../package.json');
|
|
52
|
+
|
|
53
|
+
// dist/ entries that survive a re-stage (runtime artifacts, never authored)
|
|
54
|
+
const PRESERVE = [/^node_modules$/, /\.log$/];
|
|
55
|
+
|
|
56
|
+
const CONFIG_BANNER = '// Staged by `omega build` (brand+local config layers flattened for the runtime\n'
|
|
57
|
+
+ '// and the deploy upload boundary). GENERATED — edit the brand/local omega.json5.\n';
|
|
58
|
+
|
|
59
|
+
const PUBLIC_TEMPLATE_DIR = path.resolve(__dirname, '../../../templates/public');
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The authored service-account chain: target root (standalone projects own their
|
|
63
|
+
* copy) → the brand's .omega/secrets/ (the key's ONE home in a brand
|
|
64
|
+
* monorepo — the firebase manage service mints it there). Google shows SA
|
|
65
|
+
* keys once, so nothing else ever holds one.
|
|
66
|
+
* @param {string} projectDir - The target root.
|
|
67
|
+
* @returns {string|null} First existing key path, or null.
|
|
68
|
+
*/
|
|
69
|
+
function resolveServiceAccountPath(projectDir) {
|
|
70
|
+
const brandRoot = findBrandRoot(projectDir);
|
|
71
|
+
return [
|
|
72
|
+
path.join(projectDir, 'service-account.json'),
|
|
73
|
+
brandRoot ? path.join(brandRoot, '.omega', 'secrets', 'service-account.json') : null,
|
|
74
|
+
].filter(Boolean).find((candidate) => jetpack.exists(candidate)) || null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Stage the authored target tree into dist/.
|
|
79
|
+
* @param {object} options
|
|
80
|
+
* @param {string} options.projectDir - The target root (firebaseProjectPath).
|
|
81
|
+
* @param {string} [options.environment] - The environment the artifact is FOR:
|
|
82
|
+
* which `.env.<environment>` overlay composes into dist/.env (#586). Each lane
|
|
83
|
+
* pins its own — a deploy 'production', a test lane 'testing', the local lanes
|
|
84
|
+
* (emulator, serve, mcp) 'development'; omitted (a bare `omega build`)
|
|
85
|
+
* defaults to the running environment.
|
|
86
|
+
* @param {'licensed'|'keyless'} [options.licenseStatus] - The deploy-time license
|
|
87
|
+
* verdict ([#320](https://github.com/Omega-JS-Stack/omega/issues/320)), written
|
|
88
|
+
* into dist/.env as OMEGA_LICENSE_STATUS. DEPLOY ONLY: every local lane omits
|
|
89
|
+
* it, and an artifact with no status behaves exactly as it does today.
|
|
90
|
+
* @param {function} [options.log] - Line logger (silent by default).
|
|
91
|
+
* @returns {{ distDir: string, staged: string[] }} staged = relative paths written.
|
|
92
|
+
*/
|
|
93
|
+
function stageFunctions(options) {
|
|
94
|
+
const projectDir = options.projectDir;
|
|
95
|
+
const log = options.log || (() => {});
|
|
96
|
+
const srcDir = path.join(projectDir, 'src');
|
|
97
|
+
const distDir = path.join(projectDir, 'dist');
|
|
98
|
+
const staged = [];
|
|
99
|
+
|
|
100
|
+
const targetPackage = jetpack.read(path.join(projectDir, 'package.json'), 'json');
|
|
101
|
+
if (!targetPackage) {
|
|
102
|
+
throw new Error(`No package.json at ${projectDir} — a backend target's manifest lives at the TARGET ROOT (src/dist pillar); run an OMEGA verb from a backend target root first`);
|
|
103
|
+
}
|
|
104
|
+
if (!jetpack.exists(srcDir)) {
|
|
105
|
+
throw new Error(`No src/ under ${projectDir} — backend targets are src-first: authored code lives in src/ and dist/ is staged output (any verb scaffolds one, or move your functions code into src/)`);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// The FRAMEWORK package is not a target: its own root carries a package.json
|
|
109
|
+
// beside a src/ dir, so it passes both checks above. A stray `npx omega
|
|
110
|
+
// <verb>` inside it (no target context, so the dispatcher runs the host CLI)
|
|
111
|
+
// otherwise wiped the framework's own dist/ — prepare-package's output, the
|
|
112
|
+
// CLI it is running from — and then died on the missing omega.json5, leaving
|
|
113
|
+
// the CLI unbootable ([#308](https://github.com/Omega-JS-Stack/omega/issues/308)).
|
|
114
|
+
// Refuse BEFORE the wipe: there is no target here to stage.
|
|
115
|
+
if (targetPackage.name === frameworkPackage.name) {
|
|
116
|
+
throw new Error(`Refusing to stage ${projectDir}: that is the ${frameworkPackage.name} framework package itself, not a backend target. Its dist/ is build output of \`npm run prepare\`, never a stage target. Run omega commands from a backend TARGET root (the directory with src/ and config/omega.json5).`);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// ─── Wipe previous stage (preserve runtime artifacts) ─────────────────────
|
|
120
|
+
for (const entry of jetpack.list(distDir) || []) {
|
|
121
|
+
if (PRESERVE.some((pattern) => pattern.test(entry))) continue;
|
|
122
|
+
jetpack.remove(path.join(distDir, entry));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// ─── Composed config (ONE compose feeds both the staged file and the
|
|
126
|
+
// public boilerplate's brand url). A stale stage can never feed back
|
|
127
|
+
// in: composeTargetConfig reads only the AUTHORED layers — dist/config
|
|
128
|
+
// is not a config location (@omega.js/config CONFIG_LOCATIONS). ───────
|
|
129
|
+
const { config } = composeTargetConfig(projectDir, 'backend');
|
|
130
|
+
|
|
131
|
+
// ─── src/** → dist/** (excluding src/public — handled separately) ─────────
|
|
132
|
+
jetpack.copy(srcDir, distDir, {
|
|
133
|
+
overwrite: true,
|
|
134
|
+
matching: ['**/*', '!public', '!public/**'],
|
|
135
|
+
});
|
|
136
|
+
staged.push('src/** → dist/**');
|
|
137
|
+
|
|
138
|
+
// ─── public/ — consumer src/public/* overrides win, defaults fill gaps ────
|
|
139
|
+
const powertools = require('node-powertools');
|
|
140
|
+
const publicDir = path.join(distDir, 'public');
|
|
141
|
+
jetpack.dir(publicDir);
|
|
142
|
+
for (const file of jetpack.list(PUBLIC_TEMPLATE_DIR) || []) {
|
|
143
|
+
const consumerOverride = path.join(srcDir, 'public', file);
|
|
144
|
+
const dest = path.join(publicDir, file);
|
|
145
|
+
if (jetpack.exists(consumerOverride)) {
|
|
146
|
+
jetpack.copy(consumerOverride, dest, { overwrite: true });
|
|
147
|
+
} else {
|
|
148
|
+
const template = jetpack.read(path.join(PUBLIC_TEMPLATE_DIR, file));
|
|
149
|
+
jetpack.write(dest, powertools.template(template, { url: config.brand?.url || '' }));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
staged.push('public/ (defaults + consumer overrides)');
|
|
153
|
+
|
|
154
|
+
// ─── Derived manifest (name/engines/runtime deps only) ────────────────────
|
|
155
|
+
const dependencies = {};
|
|
156
|
+
for (const [dep, spec] of Object.entries(targetPackage.dependencies || {})) {
|
|
157
|
+
dependencies[dep] = /^file:(?!\/)/.test(spec) ? `file:../${spec.slice('file:'.length)}` : spec;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const name = String(targetPackage.name || path.basename(projectDir));
|
|
161
|
+
const manifest = {
|
|
162
|
+
name: name.endsWith('-functions') ? name : `${name}-functions`,
|
|
163
|
+
version: targetPackage.version || '0.0.1',
|
|
164
|
+
description: `Staged Cloud Functions for ${name} — GENERATED by omega build, do not edit`,
|
|
165
|
+
private: true,
|
|
166
|
+
main: 'index.js',
|
|
167
|
+
engines: targetPackage.engines || { node: String(parseInt(frameworkPackage.omega.functionsRuntime, 10)) },
|
|
168
|
+
dependencies,
|
|
169
|
+
};
|
|
170
|
+
jetpack.write(path.join(distDir, 'package.json'), `${JSON.stringify(manifest, null, 2)}\n`);
|
|
171
|
+
staged.push('package.json (derived)');
|
|
172
|
+
|
|
173
|
+
// ─── Composed config → the runtime's own view ────────────────────────────
|
|
174
|
+
jetpack.write(
|
|
175
|
+
path.join(distDir, 'config', 'omega.json5'),
|
|
176
|
+
`${CONFIG_BANNER}${JSON.stringify(config, null, 2)}\n`,
|
|
177
|
+
);
|
|
178
|
+
staged.push('config/omega.json5 (composed)');
|
|
179
|
+
|
|
180
|
+
// ─── Composed .env — the artifact's own env (#678) ───────────────────────
|
|
181
|
+
// The brand root's .env is the ONE file humans and the manager edit;
|
|
182
|
+
// the target's own .env is an optional per-key override. Every verb
|
|
183
|
+
// that stages composes this file, so a brand-root key reaches the
|
|
184
|
+
// upload without anyone remembering to run a manage first.
|
|
185
|
+
const composed = composeTargetEnv({ targetDir: projectDir, target: 'backend', environment: options.environment });
|
|
186
|
+
// The one COMPUTED key in the file (#320): the deploy's license verdict,
|
|
187
|
+
// which no cascade layer can supply and no human writes. Deploy-only, so
|
|
188
|
+
// a local stage composes byte-identically to before.
|
|
189
|
+
if (options.licenseStatus) composed.values.OMEGA_LICENSE_STATUS = options.licenseStatus;
|
|
190
|
+
jetpack.write(path.join(distDir, '.env'), serializeEnv(composed.values));
|
|
191
|
+
|
|
192
|
+
// Key NAMES and the layer each came from — never a value (the .env is all
|
|
193
|
+
// secrets)
|
|
194
|
+
const delivered = Object.keys(composed.values).map((key) => `${key} (${composed.sources[key]})`);
|
|
195
|
+
staged.push(`.env (composed from the cascade${options.environment ? ` for ${options.environment}` : ''})`);
|
|
196
|
+
log(`Composed dist/.env — ${delivered.length} keys: ${delivered.join(', ') || 'none'}`);
|
|
197
|
+
|
|
198
|
+
// ─── Target-root files that ride the artifact ────────────────────────────────
|
|
199
|
+
const nvmrc = path.join(projectDir, '.nvmrc');
|
|
200
|
+
if (jetpack.exists(nvmrc)) {
|
|
201
|
+
jetpack.copy(nvmrc, path.join(distDir, '.nvmrc'), { overwrite: true });
|
|
202
|
+
staged.push('.nvmrc');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// ─── Firestore rules: the brand's source + the framework half, compiled ───
|
|
206
|
+
// Rebuilt HERE (not just at setup) because the wipe above takes the
|
|
207
|
+
// previous artifact with it, and firebase.json points the emulator and
|
|
208
|
+
// `firebase deploy` at it — a stage that skipped this would leave both
|
|
209
|
+
// reading nothing. The AUTHORED file is never touched; setup owns that.
|
|
210
|
+
// An unmigrated (marker-block) source is refused there and reported —
|
|
211
|
+
// the step is then not claimed here either.
|
|
212
|
+
// A custom-server target has neither reader, and setup seeds it no rules
|
|
213
|
+
// source (#614) — compiling one would only write an artifact nothing
|
|
214
|
+
// deploys, under a warning telling it to run a setup that will not.
|
|
215
|
+
if (!isCustomProject(projectDir) && !compileFirestoreRules({ projectDir }).refused) {
|
|
216
|
+
staged.push(`${COMPILED_RULES_FILE.replace('dist/', '')} (compiled)`);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// ─── Service account: the authored chain (see resolveServiceAccountPath) ──
|
|
220
|
+
const saSource = resolveServiceAccountPath(projectDir);
|
|
221
|
+
if (saSource) {
|
|
222
|
+
jetpack.copy(saSource, path.join(distDir, 'service-account.json'), { overwrite: true });
|
|
223
|
+
staged.push('service-account.json');
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
log(`Staged dist/ from src/ (${staged.length} steps)`);
|
|
227
|
+
return { distDir, staged };
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* The .env layers ABOVE the target that feed the composed dist/.env — the
|
|
232
|
+
* brand root's and the company root's, resolved through the chain
|
|
233
|
+
* (@omega.js/config resolveEnvChain), never a hard-coded `../../.env`. The
|
|
234
|
+
* target's own .env is watched by name with the other target-root inputs.
|
|
235
|
+
*
|
|
236
|
+
* A standalone target has neither, so the list is empty
|
|
237
|
+
* ([#678](https://github.com/Omega-JS-Stack/omega/issues/678)).
|
|
238
|
+
*
|
|
239
|
+
* @param {string} projectDir - The target root.
|
|
240
|
+
* @returns {Array<{ layer: string, path: string }>} Absolute .env paths.
|
|
241
|
+
*/
|
|
242
|
+
function envWatchInputs(projectDir) {
|
|
243
|
+
const chain = resolveEnvChain(projectDir);
|
|
244
|
+
|
|
245
|
+
return [
|
|
246
|
+
{ layer: 'brand', path: chain.brand },
|
|
247
|
+
{ layer: 'company', path: chain.company },
|
|
248
|
+
].filter((input) => input.path);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Watch every STAGE INPUT and re-stage on change — src/, the target manifest,
|
|
253
|
+
* .env/.nvmrc/SA, the brand-root and company .env (the composed dist/.env's
|
|
254
|
+
* upper layers), firestore.rules, and the config layers (target + brand
|
|
255
|
+
* omega.json5, brand secrets). The Firebase emulator watches dist/ natively,
|
|
256
|
+
* so a re-stage IS the hot reload: a brand-config edit reaches the running
|
|
257
|
+
* emulator without a restart, and so does a brand rules edit (the re-stage
|
|
258
|
+
* recompiles dist/firestore.rules, which the firestore emulator reloads). The target-root watch filters to named files so dist/ churn (our
|
|
259
|
+
* own output) can never feed back into a re-stage loop.
|
|
260
|
+
* @param {object} options
|
|
261
|
+
* @param {string} options.projectDir
|
|
262
|
+
* @param {string} [options.environment] - The environment every re-stage
|
|
263
|
+
* composes dist/.env for (#586) — the boot's own, so a hot reload never
|
|
264
|
+
* swaps the artifact's overlay under a running lane.
|
|
265
|
+
* @param {function} [options.log]
|
|
266
|
+
* @param {number} [options.debounceMs]
|
|
267
|
+
* @returns {{ close: function }}
|
|
268
|
+
*/
|
|
269
|
+
function watchAndStage(options) {
|
|
270
|
+
const fs = require('fs');
|
|
271
|
+
const projectDir = options.projectDir;
|
|
272
|
+
const log = options.log || (() => {});
|
|
273
|
+
const debounceMs = options.debounceMs || 250;
|
|
274
|
+
const watchers = [];
|
|
275
|
+
let timer = null;
|
|
276
|
+
|
|
277
|
+
const restage = (reason) => () => {
|
|
278
|
+
clearTimeout(timer);
|
|
279
|
+
timer = setTimeout(() => {
|
|
280
|
+
try {
|
|
281
|
+
stageFunctions({ projectDir, environment: options.environment });
|
|
282
|
+
log(`Re-staged dist/ (${reason} changed)`);
|
|
283
|
+
} catch (error) {
|
|
284
|
+
log(`Re-stage failed: ${error.message}`);
|
|
285
|
+
}
|
|
286
|
+
}, debounceMs);
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
const watch = (dir, onChange, opts) => {
|
|
290
|
+
if (!jetpack.exists(dir)) return;
|
|
291
|
+
watchers.push(fs.watch(dir, opts || {}, onChange));
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
watch(path.join(projectDir, 'src'), restage('src'), { recursive: true });
|
|
295
|
+
|
|
296
|
+
// Target-root stage inputs by NAME (never react to dist/ or log churn). The
|
|
297
|
+
// `.env.<environment>` overlays are inputs too (#586), all three, because the
|
|
298
|
+
// target root is watched once for every lane and a re-stage is idempotent.
|
|
299
|
+
// The layer NAMES come from @omega.js/config's envLayerFiles, the one home of
|
|
300
|
+
// the `.env` + overlay spelling ([#681](https://github.com/Omega-JS-Stack/omega/issues/681)).
|
|
301
|
+
const TARGET_ROOT_INPUTS = new Set([
|
|
302
|
+
'package.json', '.nvmrc', 'service-account.json', BRAND_RULES_FILE,
|
|
303
|
+
...ENV_ENVIRONMENTS.flatMap((environment) => envLayerFiles('.env', environment)),
|
|
304
|
+
]);
|
|
305
|
+
watch(projectDir, (event, filename) => {
|
|
306
|
+
if (TARGET_ROOT_INPUTS.has(filename)) restage(filename)();
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
// The composed .env's upper layers: a brand-root edit restages exactly like a
|
|
310
|
+
// target .env edit, so a running dev server picks the new key up (#678). The
|
|
311
|
+
// lane's OWN overlay counts as that layer's .env (#586); another
|
|
312
|
+
// environment's file is not in this artifact and must not re-stage it. That
|
|
313
|
+
// pair IS what envLayerFiles answers, so it is asked rather than spelled out
|
|
314
|
+
// ([#681](https://github.com/Omega-JS-Stack/omega/issues/681)).
|
|
315
|
+
const laneNames = new Set(envLayerFiles('.env', options.environment));
|
|
316
|
+
for (const input of envWatchInputs(projectDir)) {
|
|
317
|
+
watch(path.dirname(input.path), (event, filename) => {
|
|
318
|
+
if (laneNames.has(filename)) restage(`${input.layer} ${filename}`)();
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// Config layers: the target's own config/ and the brand's config/ + secrets
|
|
323
|
+
const brandRoot = findBrandRoot(projectDir);
|
|
324
|
+
watch(path.join(projectDir, 'config'), restage('local config'));
|
|
325
|
+
if (brandRoot) {
|
|
326
|
+
watch(path.join(brandRoot, 'config'), restage('brand config'));
|
|
327
|
+
watch(path.join(brandRoot, '.omega', 'secrets'), restage('brand secrets'));
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return {
|
|
331
|
+
close: () => {
|
|
332
|
+
clearTimeout(timer);
|
|
333
|
+
for (const watcher of watchers) watcher.close();
|
|
334
|
+
},
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
module.exports = { stageFunctions, watchAndStage, envWatchInputs, resolveServiceAccountPath, PRESERVE };
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stage-local-packages — make `file:` dependencies deployable to Cloud Functions.
|
|
3
|
+
*
|
|
4
|
+
* Cloud Build can only install what is inside the uploaded functions folder — a
|
|
5
|
+
* dependency like `file:../../../../../packages/backend` resolves to nothing
|
|
6
|
+
* remotely, and GCF's buildpack runs `npm ci`, which also demands a
|
|
7
|
+
* package-lock.json matching the uploaded shape.
|
|
8
|
+
*
|
|
9
|
+
* This stages the functions dir IN PLACE: packs each LOCAL package the upload
|
|
10
|
+
* needs into functions/omega_modules/*.tgz (npm pack runs the package's own
|
|
11
|
+
* prepare, so the tarball always reflects current source), respells
|
|
12
|
+
* package.json to point at the tarballs, and regenerates the lockfile against
|
|
13
|
+
* that shape. `restore()` puts the original package.json + package-lock.json
|
|
14
|
+
* back verbatim and removes the tarball folder — and a FAILING stage restores
|
|
15
|
+
* before it throws, so a stopped deploy never leaves a half-staged folder.
|
|
16
|
+
*
|
|
17
|
+
* "Local" is two things, not one: the outside-the-folder `file:` deps of the
|
|
18
|
+
* functions manifest, AND — transitively — each packed package's own @omega.js
|
|
19
|
+
* runtime deps that resolve through a node_modules SYMLINK. @omega.js/client is
|
|
20
|
+
* a real runtime dependency of @omega.js/backend, never vendored and unpublished
|
|
21
|
+
* under the publish latch, so packing only the framework left the lock regen
|
|
22
|
+
* asking the registry for it (404, no deploy — #331).
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
const fs = require('fs');
|
|
26
|
+
const path = require('path');
|
|
27
|
+
const jetpack = require('fs-jetpack');
|
|
28
|
+
const powertools = require('node-powertools');
|
|
29
|
+
const chalk = require('chalk').default;
|
|
30
|
+
|
|
31
|
+
const STAGING_DIR = 'omega_modules';
|
|
32
|
+
const SCOPE = '@omega.js/';
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Resolve a LINKED local package: the first node_modules entry walking up from
|
|
36
|
+
* `fromDir` (mirroring Node resolution — npm workspaces and `mgr i local` hoist
|
|
37
|
+
* to the brand/monorepo root), and only when that entry is a SYMLINK. A symlink
|
|
38
|
+
* IS the local-era shape, and the registry may have no copy of what it points
|
|
39
|
+
* at; a real directory is a registry install Cloud Build can fetch itself.
|
|
40
|
+
* @param {string} name - Package name.
|
|
41
|
+
* @param {string} fromDir - Directory whose manifest declares it.
|
|
42
|
+
* @returns {string|null} Absolute real path of the linked checkout, or null.
|
|
43
|
+
*/
|
|
44
|
+
function resolveLinkedPackage(name, fromDir) {
|
|
45
|
+
let current = path.resolve(fromDir);
|
|
46
|
+
|
|
47
|
+
while (true) {
|
|
48
|
+
const candidate = path.join(current, 'node_modules', name);
|
|
49
|
+
const entry = jetpack.inspect(candidate);
|
|
50
|
+
|
|
51
|
+
if (entry) {
|
|
52
|
+
if (entry.type !== 'symlink') {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const real = fs.realpathSync(candidate);
|
|
56
|
+
return jetpack.exists(path.join(real, 'package.json')) ? real : null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const parent = path.dirname(current);
|
|
60
|
+
if (parent === current) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
current = parent;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Every local package the upload must carry, in pack order — direct first, then
|
|
69
|
+
* the linked @omega.js packages they pull in (the closure grows as the loop
|
|
70
|
+
* walks it, so a link behind a link rides too).
|
|
71
|
+
* @param {object} options
|
|
72
|
+
* @param {string} options.functionsPath - The functions folder being staged.
|
|
73
|
+
* @param {object} options.pkg - Its parsed package.json.
|
|
74
|
+
* @returns {Array<{name: string, dir: string, spec?: string, block?: string}>}
|
|
75
|
+
* `block`/`spec` present = a DIRECT dep, respelled in the manifest; absent =
|
|
76
|
+
* a linked transitive dep, redirected by an override.
|
|
77
|
+
*/
|
|
78
|
+
function collectTargets({ functionsPath, pkg }) {
|
|
79
|
+
const targets = [];
|
|
80
|
+
const seen = new Set();
|
|
81
|
+
|
|
82
|
+
// Direct: file: specs resolving OUTSIDE the functions dir — Cloud Build can't follow those
|
|
83
|
+
for (const block of ['dependencies', 'devDependencies']) {
|
|
84
|
+
for (const [name, spec] of Object.entries(pkg[block] || {})) {
|
|
85
|
+
if (!spec.startsWith('file:')) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const resolved = path.resolve(functionsPath, spec.slice('file:'.length));
|
|
90
|
+
if (!(resolved + path.sep).startsWith(functionsPath + path.sep)) {
|
|
91
|
+
targets.push({ name, spec, block, dir: resolved });
|
|
92
|
+
seen.add(name);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Transitive: each packed package's linked @omega.js runtime deps
|
|
98
|
+
for (let index = 0; index < targets.length; index++) {
|
|
99
|
+
const manifest = jetpack.read(path.join(targets[index].dir, 'package.json'), 'json');
|
|
100
|
+
|
|
101
|
+
for (const name of Object.keys((manifest || {}).dependencies || {})) {
|
|
102
|
+
if (!name.startsWith(SCOPE) || seen.has(name)) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const dir = resolveLinkedPackage(name, targets[index].dir);
|
|
107
|
+
if (!dir) {
|
|
108
|
+
continue; // Registry-installed (or absent) — npm resolves it the normal way
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
seen.add(name);
|
|
112
|
+
targets.push({ name, dir });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return targets;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async function stageLocalPackages({ functionsPath, log = () => {} }) {
|
|
120
|
+
const packagePath = path.join(functionsPath, 'package.json');
|
|
121
|
+
const lockPath = path.join(functionsPath, 'package-lock.json');
|
|
122
|
+
const stagingPath = path.join(functionsPath, STAGING_DIR);
|
|
123
|
+
|
|
124
|
+
const pkg = jetpack.read(packagePath, 'json');
|
|
125
|
+
if (!pkg) {
|
|
126
|
+
return { staged: [], restore: async () => {} };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const targets = collectTargets({ functionsPath, pkg });
|
|
130
|
+
|
|
131
|
+
if (!targets.length) {
|
|
132
|
+
return { staged: [], restore: async () => {} };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Originals — restored verbatim after deploy, and after a failure
|
|
136
|
+
const originalPackage = jetpack.read(packagePath);
|
|
137
|
+
const originalLock = jetpack.read(lockPath);
|
|
138
|
+
|
|
139
|
+
const restore = async () => {
|
|
140
|
+
jetpack.write(packagePath, originalPackage);
|
|
141
|
+
|
|
142
|
+
if (originalLock === undefined) {
|
|
143
|
+
jetpack.remove(lockPath);
|
|
144
|
+
} else {
|
|
145
|
+
jetpack.write(lockPath, originalLock);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
jetpack.remove(stagingPath);
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
try {
|
|
152
|
+
jetpack.remove(stagingPath);
|
|
153
|
+
jetpack.dir(stagingPath);
|
|
154
|
+
|
|
155
|
+
const overrides = {};
|
|
156
|
+
|
|
157
|
+
for (const target of targets) {
|
|
158
|
+
if (!jetpack.exists(path.join(target.dir, 'package.json'))) {
|
|
159
|
+
throw new Error(`Local dependency ${target.name} (${target.spec || 'linked'}) has no package.json at ${target.dir}`);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
log(` ${chalk.dim('→')} Packing local package ${chalk.cyan(target.name)}...`);
|
|
163
|
+
|
|
164
|
+
const output = await powertools.execute(
|
|
165
|
+
`npm pack --pack-destination "${stagingPath}" --foreground-scripts=false`,
|
|
166
|
+
{ log: false, config: { cwd: target.dir } },
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
const filename = String(output).trim().split('\n').pop().trim();
|
|
170
|
+
if (!filename.endsWith('.tgz') || !jetpack.exists(path.join(stagingPath, filename))) {
|
|
171
|
+
throw new Error(`npm pack for ${target.name} did not produce a tarball (got: ${filename || 'nothing'})`);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const staged = `file:${STAGING_DIR}/${filename}`;
|
|
175
|
+
if (target.block) {
|
|
176
|
+
pkg[target.block][target.name] = staged;
|
|
177
|
+
} else {
|
|
178
|
+
// A packed package still declares its own REGISTRY spec internally
|
|
179
|
+
// (`@omega.js/client: ^0.1.0`) — only an override redirects that nested
|
|
180
|
+
// resolution to the artifact beside it.
|
|
181
|
+
overrides[target.name] = staged;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
log(` ${chalk.green('✓')} Staged ${chalk.cyan(target.name)} → ${STAGING_DIR}/${filename}`);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (Object.keys(overrides).length > 0) {
|
|
188
|
+
pkg.overrides = Object.assign({}, pkg.overrides, overrides);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
jetpack.write(packagePath, `${JSON.stringify(pkg, null, 2)}\n`);
|
|
192
|
+
|
|
193
|
+
// Cloud Build runs `npm ci` — the uploaded lockfile must match the staged shape
|
|
194
|
+
log(` ${chalk.dim('→')} Regenerating package-lock.json for the staged shape...`);
|
|
195
|
+
jetpack.remove(lockPath);
|
|
196
|
+
await powertools.execute(
|
|
197
|
+
'npm install --package-lock-only --ignore-scripts --no-audit --no-fund',
|
|
198
|
+
{ log: false, config: { cwd: functionsPath } },
|
|
199
|
+
);
|
|
200
|
+
} catch (error) {
|
|
201
|
+
// Loud and clean: the deploy stops here, and the functions folder goes back
|
|
202
|
+
// exactly as it was rather than sitting half-staged.
|
|
203
|
+
await restore();
|
|
204
|
+
throw new Error(`Local-package staging failed — nothing deployed, ${path.basename(functionsPath)}/ restored:\n${error.message}`);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return { staged: targets.map((target) => target.name), restore };
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
module.exports = stageLocalPackages;
|