@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
package/docs/audit.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Audit Workflow
|
|
2
|
+
|
|
3
|
+
Full-project audit for @omega.js/backend — runs against a CONSUMER backend or the FRAMEWORK repo itself (scope auto-detected). Invoked via the `omega:backend` skill (`/omega:backend audit`) or any "audit this backend/project" request.
|
|
4
|
+
|
|
5
|
+
Every check has a stable ID, a severity, and a scope. Findings are reported as `ID @ file:line`, fixed one at a time, then re-verified. The tables below do NOT restate the rules — each check links to the doc that owns the rule and the fix.
|
|
6
|
+
|
|
7
|
+
## Protocol
|
|
8
|
+
|
|
9
|
+
1. **Detect scope** — read `package.json` (consumer: `functions/package.json`): `name` is `@omega.js/backend` → **framework audit** (U + @omega.js/backend + F checks); `@omega.js/backend` in (dev)dependencies → **consumer audit** (U + @omega.js/backend checks).
|
|
10
|
+
2. **Run the catalog** — every check matching the scope. Search with Grep/Glob/Read over `functions/` (`routes/`, `schemas/`, `hooks/`, `index.js`), `test/`, and config files; ALWAYS exclude `node_modules/`, `dist/`, `_legacy/`, `_backup/`. Record each finding as `ID @ file:line` + a one-line description.
|
|
11
|
+
3. **Persist the report** — write the findings list to `functions/.temp/audit/claude-audit.md` (@omega.js/backend's `functions/`-local convention, like its logs) so a long fix loop survives session breaks. Summarize counts by severity in chat.
|
|
12
|
+
4. **Fix loop** — TodoWrite per finding, highest severity first, ONE at a time: mark in-progress → root cause → fix → verify → complete. Ask before structural or destructive fixes (file deletions, schema reshapes, data migrations).
|
|
13
|
+
5. **Re-verify** — re-run every check that produced findings until clean; finish with `npx omega test` from `functions/` (must be green — it auto-starts its own emulator if needed).
|
|
14
|
+
6. **Doc parity** — if fixes changed behavior, update README / the framework guide / `docs/<topic>.md` / CHANGELOG in the same change set.
|
|
15
|
+
|
|
16
|
+
Severity: **CRIT** security or broken functionality · **HIGH** hard-rule violation · **MED** convention drift · **LOW** optional improvement.
|
|
17
|
+
Scope: **C** consumer · **F** framework repo · **B** both.
|
|
18
|
+
|
|
19
|
+
## Universal checks (U-xx)
|
|
20
|
+
|
|
21
|
+
Mirrored across all four OMEGA frameworks (UJM / @omega.js/backend / BXM / EM) — same ID means the same check everywhere.
|
|
22
|
+
|
|
23
|
+
| ID | Sev | Scope | Check |
|
|
24
|
+
|----|-----|-------|-------|
|
|
25
|
+
| U-01 | HIGH | B | Every feature has tests at EVERY surface it exposes — handler suites + `http.as(...)` route round-trips + rules suites; never mocked, real emulator only ([test-framework.md](test-framework.md)) |
|
|
26
|
+
| U-02 | HIGH | B | Test hygiene — side-effect tests use dedicated `journey-*` accounts; real-external-API tests gated behind `TEST_EXTENDED_MODE` in-source (not mocked); files export `{ description, type, tests }` (no raw Mocha); no trailing cleanup steps ([test-framework.md](test-framework.md)) |
|
|
27
|
+
| U-03 | CRIT | B | Sanitization — middleware is trim-only by default; HTML strip via opt-in `{ sanitize: true }`; every HTML-insertion site calls `utilities.sanitize()` ([sanitization.md](sanitization.md)) |
|
|
28
|
+
| U-04 | HIGH | B | Firebase ownership — server code uses `firebase-admin` via Manager (correct here); NO client `firebase` SDK in functions code; consuming frontends go through @omega.js/client ([the framework guide](../../../docs/backend/index.md) §Dependency Resolution) |
|
|
29
|
+
| U-05 | HIGH | C | No @omega.js/backend transitive deps installed directly in `functions/package.json` — use `Manager.require(name)` ([the framework guide](../../../docs/backend/index.md) §Dependency Resolution) |
|
|
30
|
+
| U-06 | HIGH | B | Env behavior gated on the INTENTIONAL check — `isProduction()` or `isDevelopment() \|\| isTesting()`, never `!isDevelopment()`; always `Manager.getApiUrl()`, never the cached `Manager.project.apiUrl` ([environment-detection.md](environment-detection.md)) |
|
|
31
|
+
| U-07 | HIGH | B | Config canon — `config/omega.json5` matches the documented shape; canonical cross-framework blocks (`brand`, payment products, …) not reinvented ([architecture.md](architecture.md), [payment-system.md](payment-system.md)) |
|
|
32
|
+
| U-08 | CRIT | B | No private credentials committed — `service-account.json`, `.env` secrets, API keys (Stripe `sk_`, SendGrid `SG.`, …); `.gitignore` covers them. (The Firebase WEB `apiKey` is public by design — do NOT flag it.) |
|
|
33
|
+
| U-09 | HIGH | B | Source discipline — no live code referencing `_legacy/` / `_backup/`; framework edits in `src/` (never `dist/`) ([common-mistakes.md](common-mistakes.md)) |
|
|
34
|
+
| U-10 | MED | B | Doc parity — README / the framework guide / `docs/` / CHANGELOG match shipped behavior; the docs index lists every `docs/*.md`; no stale names for renamed commands/patterns |
|
|
35
|
+
| U-11 | MED | B | SSOT/DRY — no duplicated constants/config/logic; one authoritative home per value, imported everywhere else |
|
|
36
|
+
| U-12 | MED | B | JS conventions — file structure, JSDoc, short-circuit returns, leading logical operators, `fs-jetpack`, one `module.exports` per file ([code-patterns.md](code-patterns.md) + global `js:patterns` skill) |
|
|
37
|
+
| U-13 | MED | B | Dead code & stale patterns — no orphaned files nothing imports; no leftovers of migrated-away formats (constructor routes, tiered schemas, `Manager.config.*` reads — [migration.md](migration.md)); inventory TODO/FIXME (report only) |
|
|
38
|
+
| U-14 | LOW | B | Dependency health — review `npm outdated` / `npm audit` (in `functions/`); apply fixes via the `general:update-packages` workflow (includes supply-chain checks) |
|
|
39
|
+
|
|
40
|
+
## @omega.js/backend-specific checks
|
|
41
|
+
|
|
42
|
+
| ID | Sev | Scope | Check |
|
|
43
|
+
|----|-----|-------|-------|
|
|
44
|
+
| BKD-01 | HIGH | B | Every custom route has a name-matched schema; handlers are context-object exports (`async ({ Manager, ctx, … }) => {}`) — no legacy constructor routes ([routes.md](routes.md), [schemas.md](schemas.md)) |
|
|
45
|
+
| BKD-02 | HIGH | B | Schema field rules — never `required: true` + `default` together (required is checked BEFORE defaults; use `min: 1` for path-extracted IDs); flat schema with in-function plan branching, no tier arrays ([schemas.md](schemas.md)) |
|
|
46
|
+
| BKD-03 | HIGH | B | Route handlers — ownership checks on PUT/DELETE; plural-noun route names; `ctx.respond()` only (never `res.send()`) ([routes.md](routes.md), [common-operations.md](common-operations.md)) |
|
|
47
|
+
| BKD-04 | HIGH | C | Wiring — every route exported in `functions/index.js`; `firebase.json` rewrites use bracket syntax, ordered most-specific-first ([routes.md](routes.md)) |
|
|
48
|
+
| BKD-05 | HIGH | B | Firestore canon — NO subcollections; path-string `.doc('users/abc')`; batched collection reads (~500, cursor pagination); timestamps under `metadata.{created,updated}`; mirror-the-doc responses; delete-don't-redact ([firestore.md](firestore.md)) |
|
|
49
|
+
| BKD-06 | HIGH | B | Usage — never read/write `{doc}.usage.*` manually, always the `usage` helper; expensive/abusable routes carry usage validation or rate limiting ([usage-rate-limiting.md](usage-rate-limiting.md)) |
|
|
50
|
+
| BKD-07 | MED | B | Composite indexes — every compound query (`where` + `orderBy`, multiple `where`s) is registered in the required-indexes SSOT ([the framework guide](../../../docs/backend/index.md) §File Conventions) |
|
|
51
|
+
| BKD-08 | HIGH | B | Auth gates — routes resolve the caller via `ctx`/`user` before acting; admin-only routes verify admin status ([common-operations.md](common-operations.md), [routes.md](routes.md)) |
|
|
52
|
+
| BKD-09 | HIGH | B | Rules coverage — `firestore.rules` changes ship a rules suite (`rules.asAccount` / `expectSuccess` / `expectFailure`) ([test-framework.md](test-framework.md)) |
|
|
53
|
+
|
|
54
|
+
## Framework-repo checks (F-xx)
|
|
55
|
+
|
|
56
|
+
Only when auditing the @omega.js/backend repo itself. Mirrored across the four frameworks.
|
|
57
|
+
|
|
58
|
+
| ID | Sev | Check |
|
|
59
|
+
|----|-----|-------|
|
|
60
|
+
| F-01 | MED | Sister parity — mirrored sections (config shapes, test contract, guide skeleton, shared env/test conventions) in sync with UJM / BXM / EM; deviations are deliberate and documented |
|
|
61
|
+
| F-02 | HIGH | Consumer-shipped defaults in sync — what `ensureTarget()` scaffolds (every verb runs it) matches current conventions and docs |
|
|
62
|
+
| F-03 | MED | Docs completeness — every `docs/*.md` indexed in the framework guide; every subsystem has a doc; no "(planned)" links for things that have shipped |
|
|
63
|
+
| F-04 | HIGH | `npx omega test mgr:` green before treating the audit as complete |
|
|
64
|
+
|
|
65
|
+
## See also
|
|
66
|
+
|
|
67
|
+
- [schemas.md](schemas.md) — the required-vs-default footgun behind BKD-02
|
|
68
|
+
- [firestore.md](firestore.md) — the data canon behind BKD-05
|
|
69
|
+
- [migration.md](migration.md) — the legacy formats U-13 hunts for
|
|
70
|
+
- [test-framework.md](test-framework.md) — the surfaces behind U-01 / U-02 / BKD-09
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Auth Hooks (Consumer Project)
|
|
2
|
+
|
|
3
|
+
Auth hooks let consumer projects inject custom logic into @omega.js/backend's auth event lifecycle. @omega.js/backend runs its core handler first, then looks for a matching hook at `hooks/auth/{event-name}.js`.
|
|
4
|
+
|
|
5
|
+
| Hook | File | Behavior |
|
|
6
|
+
|------|------|----------|
|
|
7
|
+
| `before-create` | `hooks/auth/before-create.js` | Runs after @omega.js/backend's disposable email + rate limit checks (the per-IP daily cap is `targets.backend.auth.signup.maxPerIpPerDay`, default 2). **Can throw `HttpsError` to block signup.** |
|
|
8
|
+
| `before-signin` | `hooks/auth/before-signin.js` | Runs after @omega.js/backend's activity update. **Can throw `HttpsError` to block sign-in.** |
|
|
9
|
+
| `on-create` | `hooks/auth/on-create.js` | Runs after @omega.js/backend creates the user doc. **Non-blocking** — errors are caught and logged. |
|
|
10
|
+
| `on-delete` | `hooks/auth/on-delete.js` | Runs after @omega.js/backend deletes the user doc. **Non-blocking** — errors are caught and logged. |
|
|
11
|
+
|
|
12
|
+
Hook signature (same as @omega.js/backend's internal handlers):
|
|
13
|
+
|
|
14
|
+
```javascript
|
|
15
|
+
module.exports = async ({ Manager, ctx, user, context, libraries }) => {
|
|
16
|
+
// user: AuthUserRecord (uid, email, providerData, etc.)
|
|
17
|
+
// context: AuthEventContext for blocking functions (ipAddress, userAgent, additionalUserInfo)
|
|
18
|
+
// EventContext for triggers (eventId, eventType, timestamp — no IP/userAgent)
|
|
19
|
+
// libraries: { admin, functions, ... }
|
|
20
|
+
};
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Blocking hook example (before-create)
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
// hooks/auth/before-create.js — Only allow Google OAuth signups
|
|
27
|
+
const ENFORCE = true;
|
|
28
|
+
|
|
29
|
+
const ALLOWED_PROVIDERS = ['google.com'];
|
|
30
|
+
|
|
31
|
+
module.exports = async ({ ctx, user, context, libraries }) => {
|
|
32
|
+
if (!ENFORCE) { return; }
|
|
33
|
+
|
|
34
|
+
const { functions } = libraries;
|
|
35
|
+
const provider = context.additionalUserInfo?.providerId;
|
|
36
|
+
|
|
37
|
+
if (!ALLOWED_PROVIDERS.includes(provider)) {
|
|
38
|
+
ctx.error(`hook/before-create: Blocked provider '${provider}' for ${user.email}`);
|
|
39
|
+
throw new functions.auth.HttpsError('permission-denied', 'Please sign up with Google.');
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Non-blocking hook example (on-create)
|
|
45
|
+
|
|
46
|
+
```javascript
|
|
47
|
+
// hooks/auth/on-create.js — Auto-delete spam referrals
|
|
48
|
+
const powertools = require('node-powertools');
|
|
49
|
+
|
|
50
|
+
const ENFORCE = true;
|
|
51
|
+
const BLOCKED_AFFILIATE_CODES = ['iLvQjmvm'];
|
|
52
|
+
|
|
53
|
+
module.exports = async ({ Manager, ctx, user, context, libraries }) => {
|
|
54
|
+
if (!ENFORCE) { return; }
|
|
55
|
+
|
|
56
|
+
const { admin } = libraries;
|
|
57
|
+
const uid = user.uid;
|
|
58
|
+
|
|
59
|
+
// Poll until signup route attaches attribution.affiliate.code
|
|
60
|
+
let referredBy = null;
|
|
61
|
+
|
|
62
|
+
await powertools.poll(async () => {
|
|
63
|
+
const userDoc = await admin.firestore().doc(`users/${uid}`).get().catch(() => null);
|
|
64
|
+
if (!userDoc?.exists) { return true; }
|
|
65
|
+
referredBy = userDoc.data()?.attribution?.affiliate?.code;
|
|
66
|
+
return !!referredBy;
|
|
67
|
+
}, { interval: 10000, timeout: 60000 }).catch(() => {});
|
|
68
|
+
|
|
69
|
+
if (!referredBy || !BLOCKED_AFFILIATE_CODES.includes(referredBy)) { return; }
|
|
70
|
+
|
|
71
|
+
// Delete spam account (triggers on-delete for cleanup)
|
|
72
|
+
await admin.auth().deleteUser(uid).catch(e => ctx.error('Delete failed:', e));
|
|
73
|
+
};
|
|
74
|
+
```
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Build System
|
|
2
|
+
|
|
3
|
+
@omega.js/backend now mirrors every other OMEGA framework: **consumer backends are src-first**. Authored code lives in `src/`, and `dist/` is staged output — generated by `omega build`, gitignored wholesale, disposable. `firebase.json` points both `functions.source` and `hosting.public` (`dist/public`) at the staged tree.
|
|
4
|
+
|
|
5
|
+
## Pipeline overview
|
|
6
|
+
|
|
7
|
+
| Stage | Command | What happens |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| Build | `npx omega build` | Stage `src/` → `dist/` (1:1 copy, derived manifest, composed brand⊕local config, public/ boilerplate, .env/.nvmrc/SA) |
|
|
10
|
+
| Local dev | `npx omega emulator` / `npx omega serve` | Auto-stages first, then watches `src/` — re-staging IS the hot reload |
|
|
11
|
+
| Test | `npx omega test` | Auto-stages first, runs suites against the emulator |
|
|
12
|
+
| Ship | `npx omega deploy` | Auto-stages first, then `firebase deploy` on the staged tree |
|
|
13
|
+
|
|
14
|
+
Environment behavior is governed by emulator vs production, not a build flag. See [environment-detection.md](environment-detection.md).
|
|
15
|
+
|
|
16
|
+
## Consumer project layout
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
targets/<brand>/targets/backend/
|
|
20
|
+
package.json # THE target manifest: scripts + runtime deps
|
|
21
|
+
.env # local-layer secrets (D15 cascade)
|
|
22
|
+
.nvmrc # Node version pin
|
|
23
|
+
src/
|
|
24
|
+
index.js # Manager.init entry
|
|
25
|
+
routes/** schemas/** hooks/** mcp.js
|
|
26
|
+
public/ # OPTIONAL: overrides for the hosting boilerplate
|
|
27
|
+
config/omega.json5 # STANDALONE escape hatch only — brand targets carry none
|
|
28
|
+
service-account.json # STANDALONE only — brand targets keep it in the
|
|
29
|
+
# brand's .omega/secrets/ (the key's ONE home)
|
|
30
|
+
test/ # project tests
|
|
31
|
+
firebase.json .firebaserc *.rules firestore.indexes.json
|
|
32
|
+
dist/ # ← GENERATED (gitignored) — never edit
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Staged dist/ output
|
|
36
|
+
|
|
37
|
+
- `src/**` → `dist/**` (1:1 copy, no transforms — CJS as-is; `src/public/` handled separately)
|
|
38
|
+
- `dist/public/` → hosting boilerplate (default `index.html` + `404.html` from templates; consumer `src/public/*` overrides win file-by-file)
|
|
39
|
+
- `package.json` → derived manifest (name/engines/deps only; relative `file:` deps respelled one level deeper for stage-local-packages)
|
|
40
|
+
- `config/omega.json5` → composed via `composeTargetConfig` (brand⊕target flattened for the deploy upload boundary — the runtime cannot walk up past it)
|
|
41
|
+
- `.env` / `.nvmrc` → verbatim copy from the target root
|
|
42
|
+
- `service-account.json` → from the target root (standalone) or the brand's `.omega/secrets/` (brand targets — the firebase manage service mints it there)
|
|
43
|
+
- `firestore.rules` → **compiled** into `dist/firestore.rules`: the target root's file is the brand's source half, the framework half ships in `@omega.js/backend/templates/firestore.framework.rules`, and `firebase.json` points the emulator and `firebase deploy` at the artifact ([#255](https://github.com/Omega-JS-Stack/omega/issues/255)). Every stage recompiles, so a brand-rules edit reaches a running emulator through the stage watch. The brand's own file is never written by the build — setup owns that.
|
|
44
|
+
|
|
45
|
+
> **Credentials at runtime.** The staged key is for LOCAL scripts that talk to the real project. On any managed runtime — deployed Cloud Functions / Cloud Run (`K_SERVICE`/`FUNCTION_TARGET`), the emulator, or an explicit `GOOGLE_APPLICATION_CREDENTIALS` — `Manager.init` calls `admin.initializeApp()` with NO arguments and authenticates as the runtime's own service identity. When it does fall back to the staged cert, a `project_id` that doesn't match the resolved Firebase `projectId` **throws at boot** rather than warning: a mismatched key authenticates every Firestore call as the wrong identity and surfaces far away as gRPC `UNAUTHENTICATED (16)` on the first read.
|
|
46
|
+
- `node_modules/` preserved across stages (runtime artifacts, never authored)
|
|
47
|
+
- `*.log` preserved (co-located with firebase-tools logs)
|
|
48
|
+
|
|
49
|
+
## prepare-package (framework-side)
|
|
50
|
+
|
|
51
|
+
The @omega.js/backend library itself has one build step: `npm run prepare` copies `src/` → `dist/` via prepare-package (`npm run prepare:watch` for watch mode). Consumers always require from `dist/`. This mirrors the framework-side prepare step in EM/BXM/UJM.
|
|
52
|
+
|
|
53
|
+
**The framework package is never a stage target.** Its root looks like a target root to the stage (a `package.json` beside a `src/`), so an `omega` verb run from inside the framework itself — no target context, so the dispatcher runs the host CLI — used to re-stage the framework's OWN `dist/`: prepare-package's output wiped, then a hard stop on the missing `omega.json5`, leaving the CLI unbootable until the next `npm run prepare` ([#308](https://github.com/Omega-JS-Stack/omega/issues/308)). `stageFunctions` now refuses by name BEFORE the wipe (`Refusing to stage <dir>: that is the @omega.js/backend framework package itself…`). The framework self-test is unaffected: `npx omega test` here retargets to the bundled fixture project before anything stages ([test-boot-layer.md](test-boot-layer.md)).
|
|
54
|
+
|
|
55
|
+
At publish time, a `prepublishOnly` script first removes the self-test fixture's runtime `node_modules` — its `@omega.js/backend` symlink points back at the repo root, which would send prepare-package's publish-time cleanup walk into an infinite cycle. The symlinks are throwaway; the next `npx omega test` self-test regenerates them (see [test-boot-layer.md](test-boot-layer.md)).
|
|
56
|
+
|
|
57
|
+
## Log files
|
|
58
|
+
|
|
59
|
+
CLI commands tee output to `dist/*.log` (`dev.log`, `emulator.log`, `test.log`, `production.log`) — co-located with firebase-tools' own debug logs. Full reference: [logging.md](logging.md).
|
|
60
|
+
|
|
61
|
+
## See also
|
|
62
|
+
|
|
63
|
+
- [architecture.md](architecture.md) — Manager class, dual-mode support (`firebase` / `custom`)
|
|
64
|
+
- [directory-structure.md](directory-structure.md) — @omega.js/backend library + consumer project layout
|
|
65
|
+
- [test-framework.md](test-framework.md) — the emulator-based test harness
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# CDP Debugging (driving a live browser)
|
|
2
|
+
|
|
3
|
+
How to drive a browser you can CONTROL — see the frontend live, screenshot it, click, type, read console logs, inspect network requests against your routes — for agents (Claude via MCP/CDP) and humans.
|
|
4
|
+
|
|
5
|
+
> Mirrored across the five sister frameworks (UJM / @omega.js/backend / BXM / EM / @omega.js/client) — same core section, framework-flavored. Edit all five together.
|
|
6
|
+
|
|
7
|
+
## The browser: your Claude session owns one
|
|
8
|
+
|
|
9
|
+
Browser work runs through the **`chrome-devtools` MCP** (via mcp-router). There is NO launch procedure anymore — no ports, no profile dirs, no curl checks:
|
|
10
|
+
|
|
11
|
+
- **Just call the tools** — `new_page`, `navigate_page`, `take_screenshot`, `click`, `fill`, `evaluate_script`, `list_console_messages`, `list_network_requests`. The browser auto-launches on the first call.
|
|
12
|
+
- **Each Claude session gets its OWN private Chrome** (`--isolated`): temp profile, CDP over an internal pipe. Parallel sessions cannot see or touch each other's pages — open and close pages freely, the whole browser is yours.
|
|
13
|
+
- **It dies with the session.** No orphans, no cleanup, nothing to kill.
|
|
14
|
+
- **Ephemeral profile** — cookies/logins do NOT persist between sessions. If a flow needs auth, log in during the task.
|
|
15
|
+
- **Self-signed HTTPS is pre-accepted** (`--acceptInsecureCerts` in the upstream) — dev servers load without certificate interstitials.
|
|
16
|
+
- **NEVER quit/kill Chrome by app name** (`killall "Google Chrome"`, osascript) — that's the user's personal browser, not yours.
|
|
17
|
+
|
|
18
|
+
Humans: the agent's Chrome window is visible — you can watch it drive. Full reference: `~/.claude/mcp-server/servers/chrome-devtools/CLAUDE.md`.
|
|
19
|
+
|
|
20
|
+
## Electron apps are the exception (attach, don't launch)
|
|
21
|
+
|
|
22
|
+
An Electron dev app is a running singleton — you ATTACH to it instead of launching a browser: the `chrome-devtools-electron` MCP upstream (reads `OMEGA_CDP_PORT`, default 9222, expanded once at session start) or EM's per-invocation `npx omega cdp`. See EM's `docs/cdp-debugging.md`.
|
|
23
|
+
|
|
24
|
+
## @omega.js/backend specifics
|
|
25
|
+
|
|
26
|
+
- **The UJM dev site URL is `https://localhost:4000` — NEVER the LAN IP** (`https://192.168.x.x:...`). Port 4000 by default, increments (4001, …) when multiple sites run; the exact port is in `.temp/_config_browsersync.yml` at the root of the WEBSITE project (the UJM consumer — e.g. `<brand>-website/.temp/_config_browsersync.yml`, NOT this backend repo).
|
|
27
|
+
- The network tab is the payoff: `list_network_requests` shows every call the frontend makes to your routes — method, status, and payloads — while you click through the real UI.
|
|
28
|
+
- **Auth'd flows**: the profile is ephemeral, so log in through the real UI at the start of the session (test creds) — then exercise the authenticated routes.
|
|
29
|
+
- Backend-side observation stays where it always was: `npx omega logs` (gcloud logs) and the emulator suite; this doc only covers the browser half of the loop.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# CLI: Firestore & Auth Commands
|
|
2
|
+
|
|
3
|
+
Quick commands for reading/writing Firestore and managing Auth users directly from the terminal. Works in any @omega.js/backend consumer project (production needs the service-account chain; the emulator needs nothing).
|
|
4
|
+
|
|
5
|
+
**Which stack a subcommand hits** ([#51](https://github.com/Omega-JS-Stack/omega/issues/51)): EVERY subcommand — reads and writes alike — targets the **emulator by default** and reaches live only with an explicit `--production`. One rule, no exceptions; `--emulator` is accepted but just names the default. Every command prints the stack it hit — the `Target: <projectId> (<stack>)` header, and again in the success line (`Document written to emulator: …`). The rule lives in one place: `src/cli/utils/target.js`.
|
|
6
|
+
|
|
7
|
+
**IMPORTANT: All CLI commands (`npx omega ...`) MUST be run from the consumer project's `functions/` subdirectory** (e.g., `cd /path/to/my-project/functions && npx omega ...`). The `mgr` binary lives in `functions/node_modules/.bin/` — running from the project root or any other directory will fail.
|
|
8
|
+
|
|
9
|
+
For log commands, see [docs/cli-logs.md](cli-logs.md).
|
|
10
|
+
|
|
11
|
+
## Firestore Commands
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx omega firestore:get <path> # Read a document (emulator; --production for live)
|
|
15
|
+
npx omega firestore:set <path> '<json>' # Write/merge a document (emulator; --production for live)
|
|
16
|
+
npx omega firestore:set <path> '<json>' --no-merge # Overwrite a document entirely
|
|
17
|
+
npx omega firestore:query <collection> # Query a collection (default limit 25)
|
|
18
|
+
--where "field==value" # Filter (repeatable for AND)
|
|
19
|
+
--orderBy "field:desc" # Sort
|
|
20
|
+
--limit N # Limit results
|
|
21
|
+
npx omega firestore:delete <path> # Delete a document (emulator; --production prompts for confirmation)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Auth Commands
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npx omega auth:get <uid-or-email> # Get user by UID or email (emulator; --production for live)
|
|
28
|
+
npx omega auth:list [--limit N] [--page-token T] # List users (emulator; --production for live)
|
|
29
|
+
npx omega auth:delete <uid-or-email> # Delete user (emulator; --production prompts for confirmation)
|
|
30
|
+
npx omega auth:set-claims <uid-or-email> '<json>' # Set custom claims (emulator; --production for live)
|
|
31
|
+
npx omega auth:token <uid-or-email> # Mint a custom token + one-click sign-in URL (QA)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### `auth:token` — log in as anyone (QA)
|
|
35
|
+
|
|
36
|
+
Mints a custom token for the user and prints a URL the auth pages consume
|
|
37
|
+
directly (`/signin?authCustomToken=…&authReturnUrl=…`) — open it and the
|
|
38
|
+
browser IS that user. Like every subcommand it targets the
|
|
39
|
+
**emulator by default**; pass `--production` deliberately.
|
|
40
|
+
|
|
41
|
+
| Flag | Description |
|
|
42
|
+
|------|-------------|
|
|
43
|
+
| `--url <base>` | Website base URL for the printed link (default `http://localhost:4000`) |
|
|
44
|
+
| `--return <path>` | `authReturnUrl` after sign-in (default `/dashboard`) |
|
|
45
|
+
| `--production` | Mint against production instead of the emulator |
|
|
46
|
+
|
|
47
|
+
## Shared Flags
|
|
48
|
+
|
|
49
|
+
| Flag | Description |
|
|
50
|
+
|------|-------------|
|
|
51
|
+
| `--production` | Target the live stack instead of the emulator (every subcommand) |
|
|
52
|
+
| `--emulator` | Accepted for muscle memory — the emulator is already the default |
|
|
53
|
+
| `--force` | Skip confirmation on destructive operations |
|
|
54
|
+
| `--raw` | Compact JSON output (for piping to `jq` etc.) |
|
|
55
|
+
|
|
56
|
+
## Examples
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Read a user document from the emulator (the default)
|
|
60
|
+
npx omega firestore:get users/abc123
|
|
61
|
+
|
|
62
|
+
# Read a user document from production (deliberate)
|
|
63
|
+
npx omega firestore:get users/abc123 --production
|
|
64
|
+
|
|
65
|
+
# Write to the emulator (the default)
|
|
66
|
+
npx omega firestore:set users/test123 '{"name":"Test User"}'
|
|
67
|
+
|
|
68
|
+
# Write to production (deliberate)
|
|
69
|
+
npx omega firestore:set users/abc123 '{"name":"Real User"}' --production
|
|
70
|
+
|
|
71
|
+
# Query with filters
|
|
72
|
+
npx omega firestore:query users --where "subscription.status==active" --limit 10
|
|
73
|
+
|
|
74
|
+
# Look up auth user by email
|
|
75
|
+
npx omega auth:get user@example.com
|
|
76
|
+
|
|
77
|
+
# Set admin claims
|
|
78
|
+
npx omega auth:set-claims user@example.com '{"admin":true}'
|
|
79
|
+
|
|
80
|
+
# One-click sign-in URL for a seeded persona (emulator)
|
|
81
|
+
npx omega auth:token _test.admin@playground.omegajs.dev --return /account
|
|
82
|
+
|
|
83
|
+
# Delete from the emulator (the default — no confirmation needed)
|
|
84
|
+
npx omega firestore:delete users/test123
|
|
85
|
+
```
|
package/docs/cli-logs.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# CLI: Logs Commands
|
|
2
|
+
|
|
3
|
+
Fetch or stream Cloud Function logs from Google Cloud Logging. Requires `gcloud` CLI installed and authenticated. Auto-resolves the project ID from `service-account.json`, `.firebaserc`, or `GCLOUD_PROJECT`.
|
|
4
|
+
|
|
5
|
+
> All `npx omega ...` commands must be run from the consumer project's `functions/` subdirectory. See [docs/cli-firestore-auth.md](cli-firestore-auth.md) for the explanation.
|
|
6
|
+
|
|
7
|
+
## Commands
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx omega logs:read # Read last 1h of logs (default: 300 entries, newest first)
|
|
11
|
+
npx omega logs:read --fn omega_api # Filter by function name
|
|
12
|
+
npx omega logs:read --fn omega_api --severity ERROR # Filter by severity (DEBUG, INFO, WARNING, ERROR, CRITICAL)
|
|
13
|
+
npx omega logs:read --since 2d --limit 100 # Custom time range and limit
|
|
14
|
+
npx omega logs:read --search "72.134.242.25" # Search textPayload for a string (IP, email, error, etc.)
|
|
15
|
+
npx omega logs:read --fn omega_authBeforeCreate --search "ian@example.com" --since 7d # Combined filters
|
|
16
|
+
npx omega logs:read --order asc # Oldest first (default: desc/newest first)
|
|
17
|
+
npx omega logs:read --filter 'jsonPayload.level="error"' # Raw gcloud filter passthrough
|
|
18
|
+
npx omega logs:tail # Stream live logs
|
|
19
|
+
npx omega logs:tail --fn omega_paymentsWebhookOnWrite # Stream filtered live logs
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Both commands save output to `functions/production.log` (overwritten on each run). `logs:read` saves raw JSON; `logs:tail` streams text.
|
|
23
|
+
|
|
24
|
+
**Cloud Logs vs Local Logs:** These commands query **production** Google Cloud Logging. For **local/dev** logs, read `functions/dev.log` (from `npx omega serve`) or `functions/emulator.log` (from `npx omega test`) directly — they are plain text files, not gcloud.
|
|
25
|
+
|
|
26
|
+
## Flags
|
|
27
|
+
|
|
28
|
+
| Flag | Description | Default | Commands |
|
|
29
|
+
|------|-------------|---------|----------|
|
|
30
|
+
| `--fn <name>` | Filter by Cloud Function name (see table below) | all | both |
|
|
31
|
+
| `--severity <level>` | Minimum severity: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` | all | both |
|
|
32
|
+
| `--search <text>` | Search textPayload for a substring (IP, email, uid, error message) | none | both |
|
|
33
|
+
| `--filter <expr>` | Raw gcloud logging filter expression (appended to built-in filters) | none | both |
|
|
34
|
+
| `--since <duration>` | Time range (`30m`, `1h`, `2d`, `1w`) | `1h` | read only |
|
|
35
|
+
| `--limit <n>` | Max entries | `300` | read only |
|
|
36
|
+
| `--order <dir>` | Sort order: `asc` (oldest first) or `desc` (newest first) | `desc` | read only |
|
|
37
|
+
| `--interval <sec>` | Polling interval in seconds | `5` | tail only |
|
|
38
|
+
| `--raw` | Output raw JSON | false | both |
|
|
39
|
+
|
|
40
|
+
## `--fn` Function Name Reference
|
|
41
|
+
|
|
42
|
+
The `--fn` flag uses the **deployed Cloud Function name**, not the route path.
|
|
43
|
+
|
|
44
|
+
**@omega.js/backend built-in functions (always deployed):**
|
|
45
|
+
|
|
46
|
+
| Function name | Type | Description |
|
|
47
|
+
|---------------|------|-------------|
|
|
48
|
+
| `omega_api` | HTTPS | Main API router — all consumer routes (GET/POST/PUT/DELETE) go through this |
|
|
49
|
+
| `omega_authBeforeCreate` | Auth blocking | Before user creation: disposable email blocking, IP rate limiting, consumer hooks |
|
|
50
|
+
| `omega_authBeforeSignIn` | Auth blocking | Before sign-in: consumer hooks |
|
|
51
|
+
| `omega_authOnCreate` | Auth event | After user creation: user doc setup |
|
|
52
|
+
| `omega_authOnDelete` | Auth event | After user deletion |
|
|
53
|
+
| `omega_paymentsWebhookOnWrite` | Firestore trigger | Processes payment webhooks |
|
|
54
|
+
| `omega_paymentsDisputeOnWrite` | Firestore trigger | Processes payment disputes |
|
|
55
|
+
| `omega_notificationsOnWrite` | Firestore trigger | Sends push notifications |
|
|
56
|
+
| `omega_cronDaily` | Scheduled | Daily cron (midnight UTC) |
|
|
57
|
+
| `omega_cronFrequent` | Scheduled | Frequent cron (every 10 min) |
|
|
58
|
+
|
|
59
|
+
**Consumer-defined functions** use the export name from `functions/index.js` (e.g., `exports.items = ...` → `--fn items`).
|
|
60
|
+
|
|
61
|
+
**Quick lookup — which function to query:**
|
|
62
|
+
- API route errors → `--fn omega_api`
|
|
63
|
+
- Signup/auth blocked → `--fn omega_authBeforeCreate`
|
|
64
|
+
- Sign-in issues → `--fn omega_authBeforeSignIn`
|
|
65
|
+
- User doc not created → `--fn omega_authOnCreate`
|
|
66
|
+
- Payment not processing → `--fn omega_paymentsWebhookOnWrite`
|
|
67
|
+
- Cron job issues → `--fn omega_cronDaily` or `--fn omega_cronFrequent`
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# CLI Output Styling (`src/cli/utils/ui.js`)
|
|
2
|
+
|
|
3
|
+
@omega.js/backend's CLI shares a single styling module so every command renders with the same
|
|
4
|
+
look as the **OMEGA Manager** (`omega-manager`): `🚀` banner, 70-char `━`
|
|
5
|
+
dividers, indented tree output, dimmed labels, timestamps, and a consistent set
|
|
6
|
+
of status symbols. This is the **SSOT for console output** — commands should pull
|
|
7
|
+
helpers from here instead of hand-rolling `chalk` + `console.log`.
|
|
8
|
+
|
|
9
|
+
The module is exposed on every command as `this.ui` (wired in
|
|
10
|
+
[`src/cli/commands/base-command.js`](../src/cli/commands/base-command.js)) and can
|
|
11
|
+
also be `require('../utils/ui')`'d directly (e.g. from setup-test files).
|
|
12
|
+
|
|
13
|
+
## Conventions
|
|
14
|
+
|
|
15
|
+
| Aspect | Value |
|
|
16
|
+
|---|---|
|
|
17
|
+
| Divider | `━` × 70 (`ui.RULE_WIDTH`, `ui.RULE_CHAR`) |
|
|
18
|
+
| Indentation | 2 spaces per level (`ui.indent(level)`) |
|
|
19
|
+
| Section label | `[UPPERCASE]` in bold magenta, at indent level 1 |
|
|
20
|
+
| Section items | one level deeper than the label (level 2) |
|
|
21
|
+
| Timestamp | `new Date().toLocaleTimeString()` (e.g. `7:47:12 PM`) |
|
|
22
|
+
| Banner | bold cyan, prefixed with `🚀` |
|
|
23
|
+
|
|
24
|
+
### Status symbols (`ui.SYMBOLS`)
|
|
25
|
+
|
|
26
|
+
| Key | Symbol | Color | Meaning |
|
|
27
|
+
|---|---|---|---|
|
|
28
|
+
| `running` | `→` | dim | step in progress / hint |
|
|
29
|
+
| `pass` | `✓` | green | success |
|
|
30
|
+
| `fail` | `✗` | red | failure |
|
|
31
|
+
| `skip` | `⊘` | dim | skipped / no-op |
|
|
32
|
+
| `warn` | `⚠` | yellow | warning |
|
|
33
|
+
| `done` | `✅` | green | final success (summary) |
|
|
34
|
+
| `add` | `+` | green | created a file/record |
|
|
35
|
+
| `change` | `↻` | yellow | modified a file/record |
|
|
36
|
+
|
|
37
|
+
## API
|
|
38
|
+
|
|
39
|
+
```js
|
|
40
|
+
const ui = require('../utils/ui'); // or this.ui inside a command
|
|
41
|
+
|
|
42
|
+
ui.banner('OMEGA Backend v5.2.18'); // 🚀 bold-cyan banner + blank lines
|
|
43
|
+
ui.header('Somiibo', { subtitle: url }); // ━ divider / title @ time / ━ divider
|
|
44
|
+
ui.section('Checks'); // blank line + bold-magenta [CHECKS]
|
|
45
|
+
ui.field('Project', 'somiibo-91d13', { pad: 9 });// dimmed "Label:" + value (pad aligns columns)
|
|
46
|
+
ui.status('pass', 'Stats fetched', { level: 2 });// <symbol> <text> at an indent level
|
|
47
|
+
ui.note('All defaults up to date', 2); // dimmed line at a level
|
|
48
|
+
ui.blank(); // blank line
|
|
49
|
+
ui.rule(); // a bare 70-char rule string (cyan)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
`ui.header(title, opts)`:
|
|
53
|
+
- `opts.subtitle` — text after the title (default cyan), e.g. a URL.
|
|
54
|
+
- `opts.subtitleColor` — chalk fn for the subtitle.
|
|
55
|
+
- `opts.time` — append `@ <time>` (default `true`).
|
|
56
|
+
- `opts.color` — chalk fn for the rules (default cyan).
|
|
57
|
+
|
|
58
|
+
`ui.field(label, value, opts)`:
|
|
59
|
+
- `opts.level` — indent level (default 1).
|
|
60
|
+
- `opts.pad` — pad the label (incl. colon) to this width for column alignment.
|
|
61
|
+
- `opts.valueColor` — chalk fn for the value.
|
|
62
|
+
|
|
63
|
+
`ui.status(kind, text, opts)`:
|
|
64
|
+
- `kind` — one of `running|pass|fail|skip|warn|add|change` (picks symbol + color).
|
|
65
|
+
- `opts.level` — indent level (default 1).
|
|
66
|
+
- `opts.detail` — dimmed trailing detail string.
|
|
67
|
+
|
|
68
|
+
### `ui.Summary`
|
|
69
|
+
|
|
70
|
+
Collects pass/warn/fail outcomes and prints an OMEGA-style summary block (green `✅`
|
|
71
|
+
when all passed, yellow `⚠` otherwise).
|
|
72
|
+
|
|
73
|
+
```js
|
|
74
|
+
const summary = new ui.Summary().start();
|
|
75
|
+
summary.pass(); // record a pass
|
|
76
|
+
summary.warn('check name', detailsArr);// record a warning (non-blocking)
|
|
77
|
+
summary.fail('check name', detailsArr);// record a fail with pre-formatted detail lines
|
|
78
|
+
summary.print({ hint: 'Fix the above, then run npx omega test again.' });
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Results line: `36 passed, 1 warned, 0 failed` (the warned segment only appears
|
|
82
|
+
when > 0). Warnings are listed before failures in the summary block — yellow `⚠`
|
|
83
|
+
lines with their detail arrays indented beneath.
|
|
84
|
+
|
|
85
|
+
## How the target checks use it
|
|
86
|
+
|
|
87
|
+
The AUDIT half of the retired `omega setup` — [`src/cli/utils/target-checks.js`](../src/cli/utils/target-checks.js),
|
|
88
|
+
the lane `omega test` runs before it boots anything — builds its whole run from
|
|
89
|
+
these helpers:
|
|
90
|
+
|
|
91
|
+
1. `ui.section('Target checks')` (printed by the test command) opens the lane.
|
|
92
|
+
2. the per-check status lines (printed by the check runner — see below), with
|
|
93
|
+
`✓ fixed` / `✗ Could not fix` sub-lines.
|
|
94
|
+
3. `main.setupSummary.print()` when the lane finishes.
|
|
95
|
+
|
|
96
|
+
### Test runner (`Main.prototype.test` in `src/cli/index.js`)
|
|
97
|
+
|
|
98
|
+
Each target check prints ` [N] <symbol> <name>`. A check's `run()` can return:
|
|
99
|
+
|
|
100
|
+
| Return value | Behavior |
|
|
101
|
+
|---|---|
|
|
102
|
+
| `true` | `✓` pass (recorded via `setupSummary.pass()`) |
|
|
103
|
+
| `false` | Attempt `fix()` → `✓ fixed` on success, `✗ Could not fix` + halt on throw |
|
|
104
|
+
| `Error` | `✗` hard halt, no fix attempted |
|
|
105
|
+
| `'warn'` | `⚠` non-blocking warning — reported in summary, does **not** halt |
|
|
106
|
+
|
|
107
|
+
**`'warn'` return type:** When `run()` returns `'warn'`, the runner prints the
|
|
108
|
+
check as `⚠`, calls `getWarning()` on the test instance for detail lines (array
|
|
109
|
+
of strings), and records it via `setupSummary.warn()`. The lane continues. The
|
|
110
|
+
summary shows `36 passed, 1 warned, 0 failed` with the warning details listed
|
|
111
|
+
at the bottom. Use this for environment prerequisites that don't block dev/deploy
|
|
112
|
+
(e.g. Java, optional CLIs). `BaseTest` provides a default `getWarning()` returning
|
|
113
|
+
`[]`; override it with your detail lines.
|
|
114
|
+
|
|
115
|
+
A failing check's `fix()` may attach `error.summaryDetails` (an array of styled
|
|
116
|
+
lines) to surface a compact version in the summary block — see
|
|
117
|
+
[`setup-tests/bem-config.js`](../src/cli/commands/setup-tests/bem-config.js),
|
|
118
|
+
which lists the missing `config/omega.json5` keys.
|
|
119
|
+
|
|
120
|
+
`--continue` records the failure but keeps going instead of halting.
|
|
121
|
+
|
|
122
|
+
`--offline` makes the run READ-ONLY against the brand's cloud project
|
|
123
|
+
([#284](https://github.com/Omega-JS-Stack/omega/issues/284)): no mutation runs,
|
|
124
|
+
but live READS still do (it is a no-mutation flag, not a no-network flag — an
|
|
125
|
+
actually-offline machine still fails on the reads). The mutating checks
|
|
126
|
+
downgrade to a `'warn'` naming the flag, so a scaffold run in CI, a sandbox, or
|
|
127
|
+
a migration never rewrites production as a side effect: `firestore-indexes-synced`
|
|
128
|
+
still fetches and prints the drift but skips `firebase deploy --only
|
|
129
|
+
firestore:indexes` (its `fix()` is inert too, for direct callers),
|
|
130
|
+
`storage-lifecycle-policy` — whose check *is* the mutation — returns before any
|
|
131
|
+
`gsutil lifecycle set`, and `--seed-campaigns` is ignored (seeding writes real
|
|
132
|
+
Firestore docs, so the opt-in loses to `--offline`). Read-only checks are
|
|
133
|
+
unaffected. `BaseTest.isOffline` is the one reader of the flag.
|
|
134
|
+
|
|
135
|
+
> **No more `UnhandledPromiseRejection`.** Hard failures exit cleanly via
|
|
136
|
+
> `haltSetup()` / `process.exit(1)`, and `bin/omega-backend` wraps the run in a
|
|
137
|
+
> `try/catch` that prints a one-line `✗ <message>` instead of Node's raw rejection
|
|
138
|
+
> dump.
|
|
139
|
+
|
|
140
|
+
## Adopting it in other commands
|
|
141
|
+
|
|
142
|
+
`serve`, `deploy`, `test`, `emulator`, etc. can migrate to the same look
|
|
143
|
+
incrementally: replace ad-hoc `console.log(chalk...)` with `this.ui.section(...)`,
|
|
144
|
+
`this.ui.status(...)`, and `this.ui.field(...)`. The legacy
|
|
145
|
+
`log/logError/logSuccess/logWarning` helpers on `BaseCommand` still work for
|
|
146
|
+
simple one-off lines.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Code Patterns
|
|
2
|
+
|
|
3
|
+
## Short-Circuit Returns
|
|
4
|
+
|
|
5
|
+
Use early returns instead of nested conditionals:
|
|
6
|
+
|
|
7
|
+
```javascript
|
|
8
|
+
// CORRECT
|
|
9
|
+
function handler(data) {
|
|
10
|
+
if (!data) {
|
|
11
|
+
return ctx.report('Missing data', { code: 400 });
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Main logic here
|
|
15
|
+
return ctx.respond({ success: true });
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// INCORRECT
|
|
19
|
+
function handler(data) {
|
|
20
|
+
if (data) {
|
|
21
|
+
// Main logic here
|
|
22
|
+
return ctx.respond({ success: true });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Logical Operators on New Lines
|
|
28
|
+
|
|
29
|
+
Place operators at the start of continuation lines:
|
|
30
|
+
|
|
31
|
+
```javascript
|
|
32
|
+
// CORRECT
|
|
33
|
+
const isValid = hasPermission
|
|
34
|
+
|| isAdmin
|
|
35
|
+
|| isOwner;
|
|
36
|
+
|
|
37
|
+
// INCORRECT
|
|
38
|
+
const isValid = hasPermission ||
|
|
39
|
+
isAdmin ||
|
|
40
|
+
isOwner;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Firestore Document Access
|
|
44
|
+
|
|
45
|
+
Use shorthand `.doc()` path:
|
|
46
|
+
|
|
47
|
+
```javascript
|
|
48
|
+
// CORRECT
|
|
49
|
+
admin.firestore().doc('users/abc123')
|
|
50
|
+
|
|
51
|
+
// INCORRECT
|
|
52
|
+
admin.firestore().collection('users').doc('abc123')
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Template Strings for Requires
|
|
56
|
+
|
|
57
|
+
```javascript
|
|
58
|
+
// CORRECT
|
|
59
|
+
require(`${functionsDir}/node_modules/@omega.js/backend`)
|
|
60
|
+
|
|
61
|
+
// INCORRECT
|
|
62
|
+
require(functionsDir + '/node_modules/@omega.js/backend')
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Prefer fs-jetpack
|
|
66
|
+
|
|
67
|
+
Use `fs-jetpack` over `fs` or `fs-extra` for file operations.
|
|
68
|
+
|
|
69
|
+
## Coded errors: 400 = permanent config fault
|
|
70
|
+
|
|
71
|
+
An error carrying `code: 400` means a brand-config hole (or an equally permanent
|
|
72
|
+
caller fault) — something a retry can never heal. The full statement of the
|
|
73
|
+
convention and every place it is caught lives in
|
|
74
|
+
[marketing-campaigns.md](marketing-campaigns.md) § Claim/Lease Lifecycle; new
|
|
75
|
+
config-hole throws follow it (`errorWithCode(..., 400)` in the email library,
|
|
76
|
+
`err.code = 400` elsewhere) rather than throwing a code-less Error, which
|
|
77
|
+
`respond()` reports as a Sentry-captured 500.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Common Mistakes to Avoid
|
|
2
|
+
|
|
3
|
+
1. **Don't modify Manager internals directly** — Use factory methods and public APIs
|
|
4
|
+
2. **Always use `ctx.respond()` for responses** — Don't use `res.send()` directly
|
|
5
|
+
3. **Match schema names to route names** — If route is `myEndpoint`, schema should be `myEndpoint`
|
|
6
|
+
4. **Always await async operations** — Don't forget `await` on Firestore operations
|
|
7
|
+
5. **Handle errors properly** — Use `ctx.report()` with appropriate status codes
|
|
8
|
+
6. **Don't call `respond()` multiple times** — Only one response per request
|
|
9
|
+
7. **Use short-circuit returns** — Return early from error conditions
|
|
10
|
+
8. **One call counts** — `await ctx.usage.consume('<feature>')` checks, counts and writes, and throws the 429 itself. Never hand-roll a gate around a counter read
|
|
11
|
+
9. **Add Firestore composite indexes for new compound queries** — Any new Firestore query using multiple `.where()` clauses or `.where()` + `.orderBy()` requires a composite index. Add it to `src/cli/commands/setup-tests/helpers/required-indexes.js` (the SSOT). Consumer projects pick these up via `npx omega test`, whose target checks sync them into `firestore.indexes.json`. Without the index, the query will crash with `FAILED_PRECONDITION` in production.
|
|
12
|
+
10. **Don't put test data cleanup at the END of a test** — End-of-test cleanup doesn't fire when the previous run was killed mid-execution, so the next run inherits stale state. ALL test-data cleanup belongs in the runner's pre-test phase ([../src/test/test-accounts.js](../src/test/test-accounts.js) `deleteTestUsers()` + [../src/test/runner.js](../src/test/runner.js) `setupAccounts()`), which **flushes the entire emulator Firestore before every run** — so there's nothing to register when you add a test that writes data. Seed any required fixtures in `test/_init.js`'s `setup()` (runs after the flush). The only acceptable trailing cleanup is within-run state isolation (one test removes a doc so the NEXT test in the same run sees a clean slate) — that's not preparing the next run, it's intra-run housekeeping. See [test-framework.md](test-framework.md) "Test Data Cleanup".
|