@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,291 @@
|
|
|
1
|
+
# Translation
|
|
2
|
+
|
|
3
|
+
AI translation for OMEGA consumers — one engine, config-driven, with a
|
|
4
|
+
**committed** per-string cache. Shipped cp96 (Ian directive 2026-07-11),
|
|
5
|
+
replacing both legacy systems: UJM's OpenAI-only gulp task with the
|
|
6
|
+
`cache-uj-translation` GitHub-branch cache, and BXM's Claude-only task with a
|
|
7
|
+
gitignored `.cache/` (which re-translated everything on any change and on
|
|
8
|
+
every fresh clone).
|
|
9
|
+
|
|
10
|
+
## Config (shared `translation` section of omega.json5)
|
|
11
|
+
|
|
12
|
+
```json5
|
|
13
|
+
translation: {
|
|
14
|
+
enabled: true, // optional master switch (default true)
|
|
15
|
+
default: 'en', // source language (default 'en')
|
|
16
|
+
languages: ['es', 'fr'],// target codes — EMPTY/ABSENT = translation off
|
|
17
|
+
providers: { claude: {} },// the engine is a KEY (#425): claude | chatgpt. Absent block = claude
|
|
18
|
+
model: null, // optional override for the chosen engine (claude → 'sonnet' alias, chatgpt → 'gpt-5.4-nano')
|
|
19
|
+
exclude: [], // web only: BRAND page routes/folders to skip (the framework's own default pages are already excluded — #605)
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Shared section (typically brand-level; `SHARED_SECTIONS` includes it, so
|
|
24
|
+
every target inherits it through the merge chain). Language codes
|
|
25
|
+
validate against the SSOT in `@omega.js/devkit/translate` (`LANGUAGE_NAMES`,
|
|
26
|
+
~32 codes) — an unknown code is a hard config error naming the supported set.
|
|
27
|
+
The same SSOT carries `LANGUAGE_LOCALES` + `ogLocale(code)`, the one code →
|
|
28
|
+
Open Graph `language_TERRITORY` map (`es` → `es_ES`).
|
|
29
|
+
|
|
30
|
+
## Providers
|
|
31
|
+
|
|
32
|
+
| Provider | Rides | Credentials |
|
|
33
|
+
|----------|-------|-------------|
|
|
34
|
+
| `claude` (default) | the locally-installed Claude Code via `@anthropic-ai/claude-agent-sdk` | **none** — local auth |
|
|
35
|
+
| `chatgpt` | OpenAI Responses API (native fetch) | `OPENAI_API_KEY` via the .env cascade |
|
|
36
|
+
|
|
37
|
+
The claude provider runs **hermetic** sessions: `settingSources: []` (no user
|
|
38
|
+
CLAUDE.md/hooks — they pollute mechanical output; a stop-hook reply actually
|
|
39
|
+
leaked into a canary before this was locked down), a custom translator system
|
|
40
|
+
prompt instead of the CLI persona, and NO `maxTurns` cap (a plain reply
|
|
41
|
+
already counts as the final turn — `maxTurns: 1` reports `error_max_turns`
|
|
42
|
+
even though the text arrived).
|
|
43
|
+
|
|
44
|
+
**Enabling translation on web means installing the SDK (#37).** `@omega.js/web`
|
|
45
|
+
does NOT ship `@anthropic-ai/claude-agent-sdk`: translation is opt-in and the
|
|
46
|
+
SDK is heavy, so a web brand that turns it on installs it in the target itself
|
|
47
|
+
(`npm install @anthropic-ai/claude-agent-sdk`); `@omega.js/extension` still
|
|
48
|
+
declares it. The SDK is lazy-required at the first claude call, so a brand
|
|
49
|
+
without translation never pays for it, and a brand that enabled translation
|
|
50
|
+
without the SDK gets a hard error naming the package and that install command,
|
|
51
|
+
never a silent skip. The `chatgpt` provider needs no SDK at all (native fetch
|
|
52
|
+
plus `OPENAI_API_KEY`).
|
|
53
|
+
|
|
54
|
+
**The manage cycle provisions it (#168).** Nobody types that install in a
|
|
55
|
+
managed brand: the manager's workspace service reconciles it like every other
|
|
56
|
+
brand file. A web app whose RESOLVED config translates with the `claude`
|
|
57
|
+
provider gets `@anthropic-ai/claude-agent-sdk` written into its package.json
|
|
58
|
+
`dependencies` (at the range `@omega.js/web` declares as its optional peer,
|
|
59
|
+
read from the installed web package), followed by one `npm install` at the
|
|
60
|
+
brand root. Converge-to-config, so: already declared (in `dependencies` or
|
|
61
|
+
`devDependencies`) = zero-mutation no-op that never overwrites a
|
|
62
|
+
consumer-chosen spec, `--dry-run` plans without writing, translation off or
|
|
63
|
+
provider `chatgpt` leaves the target untouched, and turning translation back OFF
|
|
64
|
+
never REMOVES the dep (uninstalling on a config flip is riskier than leaving
|
|
65
|
+
it). Only web targets are provisioned, since backend and extension declare the
|
|
66
|
+
SDK as a real dependency of the framework. The loud error above stays the backstop
|
|
67
|
+
for hand-managed brands (`packages/manager/src/services/workspace/ensure/translation-sdk.js`,
|
|
68
|
+
pinned by `packages/manager/test/workspace-translation-sdk.test.js`).
|
|
69
|
+
|
|
70
|
+
## Engine protocol (`@omega.js/devkit/translate`)
|
|
71
|
+
|
|
72
|
+
`translateStrings({ strings, language, languageName, brand, extraRules, send })`
|
|
73
|
+
→ positionally-aligned translations:
|
|
74
|
+
|
|
75
|
+
- **JSON array in → same-length JSON array out**, batches of 25.
|
|
76
|
+
- **Batches fly concurrently**, `CONCURRENCY` wide (the constant at the top of
|
|
77
|
+
`packages/devkit/src/translate/engine.js`, currently 5 —
|
|
78
|
+
[#604](https://github.com/Omega-JS-Stack/omega/issues/604)). A batch is one
|
|
79
|
+
model call and the model's latency dominates it, so a serial pass paid that
|
|
80
|
+
latency once per 25 strings and one language took minutes it never needed.
|
|
81
|
+
Results are stitched back in BATCH order, never completion order, and
|
|
82
|
+
everything below still happens per batch, unchanged. Raise it only as far as
|
|
83
|
+
the providers' rate limits allow.
|
|
84
|
+
- **Duplicates are deduped before batching** ([#529](https://github.com/Omega-JS-Stack/omega/issues/529)):
|
|
85
|
+
a page sends its title and description once per meta tag (`<title>`,
|
|
86
|
+
`og:title`, `twitter:title`), so the same string used to ride a batch three
|
|
87
|
+
times over — three times the AI spend, and adjacent twins are what a model
|
|
88
|
+
merges. Each unique string is translated ONCE and the translation is fanned
|
|
89
|
+
back to every occurrence. Occurrences key on the exact source string,
|
|
90
|
+
whitespace included, so a batch is 25 UNIQUE strings.
|
|
91
|
+
- The `OMEGA-TRANSLATION-CONTROL` sentinel is appended to EVERY batch and must
|
|
92
|
+
return unchanged at its exact position — alignment proof per batch.
|
|
93
|
+
- Validation failures (parse, length, sentinel) retry up to 2× then throw.
|
|
94
|
+
- An ALIGNMENT failure (length or sentinel) that survives the retries splits the
|
|
95
|
+
batch in half and re-asks each half, down to one string
|
|
96
|
+
([#523](https://github.com/Omega-JS-Stack/omega/issues/523)): a model that
|
|
97
|
+
merges a pair of strings does it every time, so retrying the same array can
|
|
98
|
+
only fail the same way — the playground's ship-the-docs page came back
|
|
99
|
+
25-for-26 on all six attempts, in both languages, and shipped untranslated.
|
|
100
|
+
A single string that still will not come back whole throws, and the caller
|
|
101
|
+
skips that page-language pair whole (never half-translated).
|
|
102
|
+
- Original leading/trailing whitespace is re-applied to every translation.
|
|
103
|
+
- Rules baked into the system prompt: preserve HTML/URLs/placeholders
|
|
104
|
+
(`$1`, `{name}`, `{{ value }}`), never translate the brand name.
|
|
105
|
+
|
|
106
|
+
## The committed cache (`<app>/translations/`)
|
|
107
|
+
|
|
108
|
+
`translations/{lang}/{namespace}.json` maps `sha256(source)[:12]` → translated
|
|
109
|
+
string. Committed to git — that's the whole point:
|
|
110
|
+
|
|
111
|
+
- **Incremental**: editing one source string changes one hash → exactly one
|
|
112
|
+
re-translation. Everything else is a cache hit (zero provider calls).
|
|
113
|
+
- **Survives clones/CI**: a warm cache builds a fully-translated site with NO
|
|
114
|
+
AI credentials (kills the BXM parked finding where fresh clones burned live
|
|
115
|
+
Claude calls).
|
|
116
|
+
- **Human-overridable**: hand-edit a translation VALUE in the cache file and
|
|
117
|
+
it sticks for as long as the source is unchanged (the value is the
|
|
118
|
+
translation; the key only changes when the SOURCE changes).
|
|
119
|
+
- Maps are pruned to the current source set on save — no stale entries.
|
|
120
|
+
|
|
121
|
+
`@omega.js/web` ships a second cache in exactly this shape for its OWN default
|
|
122
|
+
pages, inside the package ([below](#framework-shipped-default-page-translations-621)).
|
|
123
|
+
|
|
124
|
+
## Web (`@omega.js/web`)
|
|
125
|
+
|
|
126
|
+
`omega build` translates everything by default (Ian's #24 final call): warm
|
|
127
|
+
strings come from the committed cache instantly, cold strings translate live
|
|
128
|
+
through the provider — a build ships the COMPLETE translated site whenever
|
|
129
|
+
the provider delivers, and a warm cache means zero provider calls. A provider
|
|
130
|
+
FAILURE skips that page-language pair whole, warning loudly with the page and
|
|
131
|
+
the language (the build still exits 0): no half-translated copy ever ships
|
|
132
|
+
behind full language chrome.
|
|
133
|
+
`omega build --cached-only` skips cold page-language pairs WHOLE instead (no
|
|
134
|
+
mixed-language copies, hreflang stays honest; the warning lists them) for
|
|
135
|
+
provider-free builds.
|
|
136
|
+
`omega translate` still runs the live pass standalone against an existing
|
|
137
|
+
dist/ and exits 1 on failures. `OMEGA_TRANSLATE_ONLY=<route>` limits any of
|
|
138
|
+
these to one page (canary/debug).
|
|
139
|
+
|
|
140
|
+
Per page × language: text nodes/`<title>`/meta/attribute copy translate
|
|
141
|
+
(cache-first), then the copy lands at `dist/{lang}/...` with `<html lang dir>`
|
|
142
|
+
(RTL-aware), canonical + `og:url` + `og:locale` localized, internal links
|
|
143
|
+
rewritten to `/{lang}/...`, and hreflang + `og:locale:alternate` tags
|
|
144
|
+
stitched into BOTH the copy and the original — naming only the languages
|
|
145
|
+
actually PRODUCED for that page (a pair skipped cold or failed is never
|
|
146
|
+
advertised, on the copies as on the originals), so hreflang never lies.
|
|
147
|
+
`og:locale` carries Open Graph's `language_TERRITORY` form (`en_US`,
|
|
148
|
+
`es_ES`) from the devkit language SSOT's locale map — on translated copies
|
|
149
|
+
and on the source pages the head include renders. Cache namespace:
|
|
150
|
+
`pages/{route}` (`pages/home` for `/`).
|
|
151
|
+
|
|
152
|
+
On a site served under a base path ([#355](https://github.com/Omega-JS-Stack/omega/issues/355)),
|
|
153
|
+
link rewriting composes **prefix, then language**: the pass reads the mount
|
|
154
|
+
point off the `<html data-omega-path-prefix>` stamp the build wrote (so
|
|
155
|
+
`omega translate` standalone sees it too), takes the route from underneath it,
|
|
156
|
+
and mounts the language segment after it — `/workkit/es/pricing`, never
|
|
157
|
+
`/es/workkit/pricing` ([#359](https://github.com/Omega-JS-Stack/omega/issues/359)).
|
|
158
|
+
Exclusions are matched on that same underneath-the-prefix route. ABSOLUTE URLs
|
|
159
|
+
(canonical, `og:url`, hreflang alternates, the sitemap entries) are built from
|
|
160
|
+
`brand.url`, which for a mounted site already carries the path — nothing
|
|
161
|
+
prefixes them twice.
|
|
162
|
+
|
|
163
|
+
Never sent to the PROVIDER, and the framework owns the list
|
|
164
|
+
([#605](https://github.com/Omega-JS-Stack/omega/issues/605)): every one of its
|
|
165
|
+
OWN default pages whose layout says it is plumbing rather than marketing copy —
|
|
166
|
+
the auth flows, the `/app` shell, the account/payment/portal screens, the legal
|
|
167
|
+
boilerplate, `404`, and the redirect stubs (`/login`, `/account`, `/cancel`, …).
|
|
168
|
+
Those pages still get their `/{lang}/` copies — from the translations PACKAGED
|
|
169
|
+
with `@omega.js/web`, at no cost to the brand (next section).
|
|
170
|
+
The list is DERIVED from the packaged defaults tree
|
|
171
|
+
(`packages/web/defaults/pages/**`, read by `src/translate/default-routes.js`),
|
|
172
|
+
never typed out, so a default page that moves or arrives cannot drift out of it,
|
|
173
|
+
and each excluded route guards its subtree too. On top of that: socials
|
|
174
|
+
redirects (config `socials` keys), the `admin`/`test`/`team`/`updates` folders,
|
|
175
|
+
every known language-code folder, plus config `translation.exclude` — which is
|
|
176
|
+
for the BRAND's own pages, and only those. A brand that lists `signin` or
|
|
177
|
+
`account` is listing something the framework already skips.
|
|
178
|
+
Element opt-out: `data-omega-no-translate`. Collector fixes vs UJM:
|
|
179
|
+
`aria-describedby`/`aria-labelledby` are NOT collected (ID refs), `value`
|
|
180
|
+
only on button-type inputs (hidden-input tokens stay intact).
|
|
181
|
+
|
|
182
|
+
### Framework-shipped default-page translations ([#621](https://github.com/Omega-JS-Stack/omega/issues/621))
|
|
183
|
+
|
|
184
|
+
The default pages above render the SAME chrome on every brand, so the framework
|
|
185
|
+
translates them ONCE and ships the result: `packages/web/translations/{lang}/pages/{route}.json`,
|
|
186
|
+
the identical `{lang}/{namespace}.json` shape as a consumer's own cache (same
|
|
187
|
+
loader, same `sha256(source)[:12]` keys, same prune-on-save, hand-fixable the
|
|
188
|
+
same way), committed to the package and published under `files`.
|
|
189
|
+
|
|
190
|
+
The keys are brand-NEUTRAL. The generator renders with a fixture brand and
|
|
191
|
+
replaces every occurrence of it with the sentinel `__OMEGA_BRAND__` before
|
|
192
|
+
hashing; the read-through replaces the CONSUMER's `brand.name` with the same
|
|
193
|
+
token before the lookup and puts it back on the way out, so "Sign in to MiniCo"
|
|
194
|
+
and "Sign in to Acme" are one packaged entry (`src/translate/packaged-defaults.js`).
|
|
195
|
+
|
|
196
|
+
Consumer side, on every pass — `omega build`, `--cached-only`, `omega translate`
|
|
197
|
+
alike, since it never touches a provider:
|
|
198
|
+
|
|
199
|
+
- Each default route gets its `dist/{lang}/…` copy with the same localized
|
|
200
|
+
chrome, hreflang and sitemap entry as any other page. Link rewriting is the
|
|
201
|
+
same pass too, which means links OUT to brand pages gain the language segment
|
|
202
|
+
while links between two default routes (signin → signup) do not — those routes
|
|
203
|
+
are excluded from rewriting, and that is unchanged from #605.
|
|
204
|
+
- A string the package does not carry (copy the brand overrode, a page the
|
|
205
|
+
framework has not regenerated for) stays in the source language and is
|
|
206
|
+
COUNTED — one log line per route names the miss count. Never guessed at.
|
|
207
|
+
- A brand whose NAME is a word the chrome itself uses ("Sign") still gets every
|
|
208
|
+
string that does not interpolate the brand — the lookup falls back to the raw
|
|
209
|
+
key when the sentinel-normalized one misses. The strings that DO interpolate
|
|
210
|
+
it (`Sign in to Sign`) miss, and stay in the source language.
|
|
211
|
+
- A route the package carries nothing for gets NO copy, so hreflang keeps
|
|
212
|
+
telling the truth. That is how the legal boilerplate stays one language:
|
|
213
|
+
`terms`/`privacy`/`cookies` are deliberately not generated.
|
|
214
|
+
- A configured language the package does not ship is one log line for the whole
|
|
215
|
+
run, not an error — those routes stay in the source language.
|
|
216
|
+
- A route the brand named in `translation.exclude` is left alone entirely.
|
|
217
|
+
|
|
218
|
+
**Shipped set: `es`, `fa`.** Regenerating, or extending the set, is one command
|
|
219
|
+
in `packages/web` (the ONLY place the framework's own pages ever reach a
|
|
220
|
+
provider):
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
npm run translate:defaults # the shipped set
|
|
224
|
+
npm run translate:defaults -- --languages es,fa,de # …plus a new one
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
It renders the defaults tree through the real production build against a
|
|
228
|
+
throwaway consumer (no brand repo involved), harvests with the same collector
|
|
229
|
+
the pass uses, translates ONLY the strings the packaged cache is missing —
|
|
230
|
+
across all routes at once, so the header/footer chrome every default page
|
|
231
|
+
repeats is paid for exactly once — and writes the files back. Idempotent: a
|
|
232
|
+
re-run costs nothing, adding a language costs only that language. A provider
|
|
233
|
+
failure, or a translation that dropped the sentinel, STOPS the run and writes
|
|
234
|
+
nothing.
|
|
235
|
+
|
|
236
|
+
`dist/sitemap.xml` (emitted by the build in the source language only) is
|
|
237
|
+
rewritten afterwards so it tells the same story: every PRODUCED copy joins it
|
|
238
|
+
as its own `<url>`, and each entry of a translated set — source and copies
|
|
239
|
+
alike — carries the full `xhtml:link rel="alternate"` list (`x-default` at the
|
|
240
|
+
source language) plus the source entry's `lastmod`/`changefreq`/`priority`.
|
|
241
|
+
Entries stay in loc byte order. The language-prefixed entries are owned by that
|
|
242
|
+
pass: each run drops them all and re-emits only what it produced, so a skipped
|
|
243
|
+
or failed pair is listed nowhere.
|
|
244
|
+
|
|
245
|
+
The visitor-facing **language switcher** is the footer dropup in the shared
|
|
246
|
+
base footer include (`_includes/frontend/sections/footer.html`, the base layer
|
|
247
|
+
every theme inherits). It renders CLIENT-SIDE from the page's own
|
|
248
|
+
`link[rel="alternate"][hreflang]` tags — the produced-only SSOT above — so the
|
|
249
|
+
menu can never offer a copy that was not written: `core/js/core/language-switcher.js`
|
|
250
|
+
drops `x-default`, labels each row with its native name (`Intl.DisplayNames` in
|
|
251
|
+
that language's own locale, upper-cased code as the fallback), marks
|
|
252
|
+
`documentElement.lang` as current, and leaves the mount empty and hidden when
|
|
253
|
+
fewer than two languages exist. Selecting a language is a plain link to that
|
|
254
|
+
alternate's href — never a redirect or a negotiation.
|
|
255
|
+
|
|
256
|
+
Not here yet: no default homepage exists in the D8 set, so brand sites
|
|
257
|
+
translate their own `index` when they add one.
|
|
258
|
+
|
|
259
|
+
## Extension (`@omega.js/extension`)
|
|
260
|
+
|
|
261
|
+
Build-mode gulp `translate` task (setup/dev builds only deploy):
|
|
262
|
+
|
|
263
|
+
- **messages**: per-KEY incremental — unique `message` values without a cache
|
|
264
|
+
entry translate (CWS limits ride the prompt as extra rules; violations warn
|
|
265
|
+
with the file path to shorten). `dist/_locales/{lang}/messages.json` is
|
|
266
|
+
COMPOSED from the EN source + cache (English fallback per missing key, so
|
|
267
|
+
the file is always complete; developer `description` fields stay English).
|
|
268
|
+
- **description**: whole-document per language →
|
|
269
|
+
`translations/{lang}/description.md`, first line
|
|
270
|
+
`<!-- omega:source <hash> -->` (stripped on read; source edit →
|
|
271
|
+
re-translate). The package task ships them as store assets
|
|
272
|
+
(`packaged/assets/description/{lang}.md`).
|
|
273
|
+
|
|
274
|
+
Languages/provider come from resolved config — the old hardcoded 16-language
|
|
275
|
+
list in `gulp/config/locales.js` is gone (only the CWS `limits` remain there).
|
|
276
|
+
|
|
277
|
+
## Testing
|
|
278
|
+
|
|
279
|
+
- devkit `test/translate.test.js` — engine protocol, providers, cache,
|
|
280
|
+
language SSOT, settings reader (fake `send`).
|
|
281
|
+
- web `test/translate.test.js` — handcrafted dist through the real pipeline:
|
|
282
|
+
copies/chrome/links/exclusions/alternates/cache/override/only-filter, the
|
|
283
|
+
produced-languages-only alternates, and the loud failure skip.
|
|
284
|
+
- web `test/language-switcher.test.js` — the switcher's DOM read (x-default
|
|
285
|
+
dropped, duplicates collapsed, current marked, escaping) and the built footer
|
|
286
|
+
mount in classy and newsflash.
|
|
287
|
+
- extension `build/translate.test.js` — compose + description marker glue.
|
|
288
|
+
- Live canary (cp96, local Claude): omega-brand `/about` → es (102 strings,
|
|
289
|
+
rerun 0 calls) and the extension's 4 messages (2 unique) + 2,703-char
|
|
290
|
+
description → es, both idempotent; artifacts committed under each target's
|
|
291
|
+
`translations/`.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Dependency updates (`omega update`)
|
|
2
|
+
|
|
3
|
+
One shared implementation (`@omega.js/devkit/update`) behind every framework's `omega update` verb (aliases: `outdated`, `out` — npu's muscle memory), thin wiring in web/desktop/extension (router commands), backend (colon-style command class), and the manager (brand-root fan-out). Semantics mirror Ian's `npu out` (node-power-user): report first, apply deliberately, and never trust a brand-new release.
|
|
4
|
+
|
|
5
|
+
## The report (default — no flags)
|
|
6
|
+
|
|
7
|
+
For each dependency of the target's `package.json` (prod + dev, grouped):
|
|
8
|
+
|
|
9
|
+
| Column | Meaning |
|
|
10
|
+
|---|---|
|
|
11
|
+
| Current | the base version in `package.json` (`^1.2.3` → `1.2.3`) |
|
|
12
|
+
| Installed | the physical `node_modules` copy (nearest, climbing — npm hoists in brand monorepos) |
|
|
13
|
+
| Wanted | highest published version satisfying the range (npm-outdated semantics) |
|
|
14
|
+
| Latest | the registry `dist-tags.latest` |
|
|
15
|
+
| Bump | `patch` / `minor` / `major` — Current → Latest classification |
|
|
16
|
+
| Released | Latest's publish date + age in days |
|
|
17
|
+
| Status | `QUARANTINED` when Latest is younger than `--min-age` days (default **7**) and not already installed |
|
|
18
|
+
|
|
19
|
+
Only rows needing attention print; a fully-current tree reports one line. Rows sort prod-first.
|
|
20
|
+
|
|
21
|
+
**Quarantine (supply-chain caution, npu's `--min-age` semantics):** a release published < 7 days ago may be a compromised publish — it is flagged and **excluded from `--apply`**. `--min-age N` changes the window; `--min-age 0` or `--force-fresh` disables it. Unpublished packages (the pre-publish `@omega.js/*` set) report `not on the registry (unpublished?)` instead of a version row.
|
|
22
|
+
|
|
23
|
+
**`file:`/`link:`/git specs are SKIPPED** with a dim note — they have no registry story. In the local era every brand's `@omega.js/*` dep is a `file:` spec, so the verb never touches the linked frameworks.
|
|
24
|
+
|
|
25
|
+
## Applying (`--apply`)
|
|
26
|
+
|
|
27
|
+
- Default tier is **non-breaking**: each dep rides to its highest same-major version (npu's minor tier) — quarantined targets are held and listed.
|
|
28
|
+
- **Majors are never auto-applied**: breaking jumps are listed as held; `--apply --major` opts in explicitly.
|
|
29
|
+
- Installs run through **`npu install`** when npu is on the machine (Socket supply-chain firewall); otherwise plain `npm install` with a loud warning. Dev deps install with `--save-dev` in their own pass.
|
|
30
|
+
|
|
31
|
+
## The @omega.js family is pinned, and `omega update` is its ONE mover ([#794](https://github.com/Omega-JS-Stack/omega/issues/794))
|
|
32
|
+
|
|
33
|
+
Every `@omega.js/*` spec the manager writes into a brand is an EXACT pin, never a
|
|
34
|
+
caret: `"@omega.js/manager": "0.1.0"` at the brand root, `"@omega.js/<framework>":
|
|
35
|
+
"0.1.0"` in each target, all at the manager's own version (the family ships
|
|
36
|
+
lockstep — [publishing.md](publishing.md)). A caret would let one target float
|
|
37
|
+
ahead alone on somebody's `npm update`, which is how a brand ends up serving two
|
|
38
|
+
copies of `@omega.js/client` and validating one omega.json5 with two validators.
|
|
39
|
+
|
|
40
|
+
Pinned, the only thing that moves a brand is `omega update --apply` at the brand
|
|
41
|
+
ROOT (a bare run reports and installs nothing), and it moves every target — and
|
|
42
|
+
the root's own manager pin — together. `--apply` installs an `@omega.js/*` dep with
|
|
43
|
+
`--save-exact`, in its own command per dep group, so the mover never un-pins
|
|
44
|
+
what it just moved (npm's default save-prefix would write `^<version>` back);
|
|
45
|
+
every other dependency keeps npm's default prefix, because the pin is the
|
|
46
|
+
FAMILY's rule and not a rule for the whole tree.
|
|
47
|
+
|
|
48
|
+
The manager's boot check enforces the other half: a brand whose installed
|
|
49
|
+
versions have drifted is refused before any service or dev leg runs
|
|
50
|
+
([../manager/brand.md](../manager/brand.md)). The local era is untouched — a
|
|
51
|
+
`file:` spec has no registry story, so the verb skips it and the boot check
|
|
52
|
+
exempts it. `omega i live` (the publish-day flip back off `file:` specs) writes
|
|
53
|
+
the same exact pin ([local-dev.md](local-dev.md) § API surface).
|
|
54
|
+
|
|
55
|
+
## Brand root
|
|
56
|
+
|
|
57
|
+
`omega update` at a brand root (manager) fans out over the brand's targets — cp251's deploy fan-out shape: same target discovery, same `--target=<target|dir>` picker ([#780](https://github.com/Omega-JS-Stack/omega/issues/780)), every other flag forwarded verbatim, each target answering through its own framework's `update` verb. Unlike deploy, targets are **independent**: one failing target never blocks the rest (any failure still exits 1). The brand-root shell `package.json` rides the walk as its LAST leg ([#794](https://github.com/Omega-JS-Stack/omega/issues/794)), scoped to the one `@omega.js/*` dependency it carries — `@omega.js/manager` — and run in-process through the same devkit implementation (there is no framework bin at the root to spawn; it would dispatch straight back into this command). A brand's own root tooling is never touched, and a picked run (`--target=`) skips the root, because the picker names targets. Without that leg a manager-behind brand could never heal itself: the boot check would refuse every verb, and the fix it names would move every target except the one that was wrong.
|
|
58
|
+
|
|
59
|
+
## Testing
|
|
60
|
+
|
|
61
|
+
Registry lookups, the clock, npu detection, and exec are all injectable — the devkit suite (`packages/devkit/test/update.test.js`) runs entirely offline against fixture packuments with a frozen clock; the manager fan-out test spawns fake framework bins; framework structure tests pin the wiring. The live path is the thin defaults (native `fetch` of the full packument — the abbreviated form carries no publish times).
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Stripe Webhook Forwarding
|
|
2
|
+
|
|
3
|
+
@omega.js/backend auto-starts Stripe CLI webhook forwarding when running `npx omega serve` or `npx omega emulator`. This forwards Stripe test webhooks to the local server so the full payment pipeline works end-to-end during development.
|
|
4
|
+
|
|
5
|
+
**Requirements:**
|
|
6
|
+
- `STRIPE_SECRET_KEY` set in `functions/.env`
|
|
7
|
+
- `OMEGA_WEBHOOK_KEY` set in `functions/.env` (`OMEGA_ADMIN_KEY` also accepted as a legacy fallback)
|
|
8
|
+
- [Stripe CLI](https://stripe.com/docs/stripe-cli) installed
|
|
9
|
+
|
|
10
|
+
**Standalone usage:**
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npx omega stripe
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
If any prerequisite is missing, webhook forwarding is silently skipped with an info message.
|
|
17
|
+
|
|
18
|
+
The forwarding URL is: `http://localhost:{hostingPort}/omega/payments/webhook?provider=stripe&key={OMEGA_WEBHOOK_KEY}`
|
|
19
|
+
|
|
20
|
+
The key on that URL is the whole check — a forwarded delivery is verified exactly like a real one, and the backend holds no Stripe signing secret ([payment-system.md](payment-system.md#webhook-verification)).
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Test Framework — Boot Layer
|
|
2
|
+
|
|
3
|
+
The `boot` layer is @omega.js/backend's framework self-test. When `npx omega test` runs from the @omega.js/backend repo itself (no `firebase.json` in cwd), the runner boots a **bundled fixture Firebase project**, brings up the emulator against it, and runs the `test/boot/` smoke suite. It replaces the old "you can't run tests from the framework repo" gap with a deterministic pass/fail. @omega.js/backend's equivalent of BXM's `OMEGA_TEST_BOOT_PROJECT` boot layer and UJM's `UJ_TEST_BOOT_PROJECT` site-boot layer.
|
|
4
|
+
|
|
5
|
+
## What boot tests verify
|
|
6
|
+
|
|
7
|
+
Things that ONLY break when the whole self-test path assembles correctly:
|
|
8
|
+
- The Firebase emulator boots against the fixture (functions, firestore, auth, hosting, …)
|
|
9
|
+
- The fixture's `functions/index.js` runs `Manager.init()` inside the emulator's functions runtime — i.e. the **local** `@omega.js/backend` (symlinked in) loads and wires the built-in `omega_api` function
|
|
10
|
+
- The hosting rewrite routes `/omega/**` → `omega_api`
|
|
11
|
+
- A health request returns `200` with the fixture's `projectId` (`demo-omega-backend`) and the live `backendVersion`
|
|
12
|
+
|
|
13
|
+
If the boot smoke passes, the framework at minimum *boots a consumer backend end-to-end* — catching a class of integration breaks (broken `Manager.init`, mis-wired `omega_api`, bad hosting rewrites) that no single handler test covers.
|
|
14
|
+
|
|
15
|
+
## Test file shape
|
|
16
|
+
|
|
17
|
+
Same `{ description, type, tests }` contract as every other @omega.js/backend suite — the boot suite is just scoped to the `test/boot/` directory and gated to self-test runs:
|
|
18
|
+
|
|
19
|
+
```js
|
|
20
|
+
module.exports = {
|
|
21
|
+
description: 'Boot smoke — fixture emulator + omega_api reachable',
|
|
22
|
+
type: 'group',
|
|
23
|
+
timeout: 30000,
|
|
24
|
+
tests: [
|
|
25
|
+
{
|
|
26
|
+
name: 'omega_api-health-responds-over-hosting-rewrite',
|
|
27
|
+
async run({ http, assert }) {
|
|
28
|
+
const response = await http.get('omega/health');
|
|
29
|
+
assert.isSuccess(response, 'omega_api /health should respond through the emulator');
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## The bundled fixture project
|
|
37
|
+
|
|
38
|
+
`src/test/fixtures/firebase-project/` — a minimal, committed @omega.js/backend consumer backend:
|
|
39
|
+
|
|
40
|
+
- `firebase.json` + `.firebaserc` — a **`demo-` project** (`demo-omega-backend`) so the emulator NEVER touches real Firebase; emulator ports from `DEFAULT_EMULATOR_PORTS`; hosting rewrite to `omega_api`.
|
|
41
|
+
- `functions/index.js` — the one-line `Manager.init()` bootstrap (mirrors a real consumer).
|
|
42
|
+
- `functions/package.json` + `functions/config/omega.json5` — fake brand/config (no real secrets).
|
|
43
|
+
- `storage.rules` / `database.rules.json` / `firestore.indexes.json` — minimal locked rules (`omega_api` uses the Admin SDK, which bypasses rules). `firestore.rules` is NOT committed — the boot seeds it from the setup SSOT (`templates/firestore.rules`, the BRAND source half, exactly as shipped) and the stage compiles the framework half in, so the `rules/` suite exercises the same `dist/firestore.rules` artifact a consumer deploys ([#255](https://github.com/Omega-JS-Stack/omega/issues/255)). The seed never clobbers: an edit to the fixture's copy survives the run that reads it.
|
|
44
|
+
|
|
45
|
+
**Runtime-only, gitignored** (never committed): before boot, the test command symlinks the local `@omega.js/backend` (+ `firebase-admin`/`firebase-functions` from @omega.js/backend's own `node_modules`) into the fixture's `functions/node_modules`, injects the fixture admin keys + `OMEGA_NAMESPACE` into the env, generates a **throwaway RSA `service-account.json`** (emulator-only — a `demo-` project never authenticates against Google), and seeds the brand-half `firestore.rules` that the stage compiles into `dist/firestore.rules`. All of this lives in `setupSelfTest()` / `linkFixtureDeps()` / `ensureFixtureServiceAccount()` / `ensureFixtureRules()` in [src/cli/commands/test.js](../src/cli/commands/test.js).
|
|
46
|
+
|
|
47
|
+
Two packaging details keep the fixture sound: the fixture's `.firebaserc` is **re-included over the repo's global `.firebaserc` ignore** (the emulator boots with no `--project` flag, so it resolves `demo-omega-backend` from that file — a fresh clone needs it), and a `prepublishOnly` script **removes the runtime symlinks before `npm publish`** (the `@omega.js/backend` symlink points back at the repo root, which would loop prepare-package's publish-time tree walk; the next self-test run relinks them).
|
|
48
|
+
|
|
49
|
+
## `OMEGA_TEST_BOOT_PROJECT`
|
|
50
|
+
|
|
51
|
+
| Env | Purpose |
|
|
52
|
+
|---|---|
|
|
53
|
+
| `OMEGA_TEST_BOOT_PROJECT` | Root of a Firebase project to boot instead of the bundled fixture. Auto-set to `src/test/fixtures/firebase-project` when @omega.js/backend tests itself; set it explicitly to self-test against a **real consumer** (e.g. `ultimate-jekyll-backend`) without `cd`-ing into it. |
|
|
54
|
+
|
|
55
|
+
## What happens in a consumer run
|
|
56
|
+
|
|
57
|
+
The `boot/` smoke is **excluded from real-consumer runs** (`runner.js` `discoverTests` skips `boot/` unless `isFrameworkSelfTest`) — it targets the bundled fixture, so it would be redundant noise in a consumer's suite. Consumers run the full `routes`/`events`/`rules` suites against their own emulator as normal.
|
|
58
|
+
|
|
59
|
+
## Why this exists
|
|
60
|
+
|
|
61
|
+
@omega.js/backend has no pure-logic test layer — every `routes`/`events`/`rules` suite needs a live emulator + a real project. The boot layer is the fast, self-contained smoke proving the framework still boots a consumer backend from the repo itself — the @omega.js/backend analog of "does the extension load?" (BXM) / "does the site boot?" (UJM) — and it stays the bare-`npm test` default for speed. The FULL framework suite also passes against the fixture (`npm test -- backend:`): the fixture carries corpus-parity payment config and boot-syncs the canonical rules exactly for that (cp131), so a consumer context is no longer required to run everything.
|
|
62
|
+
|
|
63
|
+
## See also
|
|
64
|
+
|
|
65
|
+
- [test-framework.md](test-framework.md) — overall harness, running/filtering, context object, assertions, auth levels
|
|
66
|
+
- [logging.md](logging.md) — `functions/*.log` files (the emulator/test logs the boot run writes)
|
|
67
|
+
- [environment-detection.md](environment-detection.md) — `Manager.isTesting()` and the environment signals
|