@omega.js/backend 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +98 -0
- package/README.md +1053 -0
- package/bin/omega +2 -0
- package/bin/omega-backend +2 -0
- package/bin/omg +2 -0
- package/cli.js +3 -0
- package/dist/cli/command-table.js +268 -0
- package/dist/cli/commands/auth.js +259 -0
- package/dist/cli/commands/base-command.js +451 -0
- package/dist/cli/commands/build.js +27 -0
- package/dist/cli/commands/clean.js +13 -0
- package/dist/cli/commands/clear.js +11 -0
- package/dist/cli/commands/cwd.js +9 -0
- package/dist/cli/commands/deploy.js +205 -0
- package/dist/cli/commands/emulator-orphans.js +440 -0
- package/dist/cli/commands/emulator.js +1829 -0
- package/dist/cli/commands/firebase-init.js +101 -0
- package/dist/cli/commands/firestore.js +261 -0
- package/dist/cli/commands/indexes.js +51 -0
- package/dist/cli/commands/install.js +151 -0
- package/dist/cli/commands/logs.js +358 -0
- package/dist/cli/commands/mcp.js +41 -0
- package/dist/cli/commands/migrate-markers.js +176 -0
- package/dist/cli/commands/migrate-rules.js +90 -0
- package/dist/cli/commands/migrate.js +59 -0
- package/dist/cli/commands/serve.js +208 -0
- package/dist/cli/commands/setup-tests/base-test.js +174 -0
- package/dist/cli/commands/setup-tests/emulator-config.js +109 -0
- package/dist/cli/commands/setup-tests/env-runtime-config-deprecated.js +47 -0
- package/dist/cli/commands/setup-tests/firebase-admin.js +49 -0
- package/dist/cli/commands/setup-tests/firebase-auth.js +26 -0
- package/dist/cli/commands/setup-tests/firebase-cli.js +26 -0
- package/dist/cli/commands/setup-tests/firebase-functions.js +49 -0
- package/dist/cli/commands/setup-tests/firestore-indexes-file.js +72 -0
- package/dist/cli/commands/setup-tests/firestore-indexes-in-json.js +20 -0
- package/dist/cli/commands/setup-tests/firestore-indexes-required.js +108 -0
- package/dist/cli/commands/setup-tests/firestore-indexes-synced.js +236 -0
- package/dist/cli/commands/setup-tests/firestore-rules-file.js +115 -0
- package/dist/cli/commands/setup-tests/firestore-rules-in-json.js +49 -0
- package/dist/cli/commands/setup-tests/functions-package.js +44 -0
- package/dist/cli/commands/setup-tests/gcloud-cli.js +26 -0
- package/dist/cli/commands/setup-tests/gitignore.js +122 -0
- package/dist/cli/commands/setup-tests/helpers/merge-line-files.js +28 -0
- package/dist/cli/commands/setup-tests/helpers/required-indexes.js +109 -0
- package/dist/cli/commands/setup-tests/helpers/seed-campaigns.js +246 -0
- package/dist/cli/commands/setup-tests/helpers.js +72 -0
- package/dist/cli/commands/setup-tests/hosting-folder.js +23 -0
- package/dist/cli/commands/setup-tests/hosting-rewrites.js +52 -0
- package/dist/cli/commands/setup-tests/index.js +111 -0
- package/dist/cli/commands/setup-tests/is-firebase-project.js +21 -0
- package/dist/cli/commands/setup-tests/java-installed.js +27 -0
- package/dist/cli/commands/setup-tests/legacy-tests-cleanup.js +43 -0
- package/dist/cli/commands/setup-tests/marketing-campaigns-seeded.js +230 -0
- package/dist/cli/commands/setup-tests/node-version.js +60 -0
- package/dist/cli/commands/setup-tests/npm-project-scripts.js +42 -0
- package/dist/cli/commands/setup-tests/nvmrc-version.js +36 -0
- package/dist/cli/commands/setup-tests/omega-backend.js +42 -0
- package/dist/cli/commands/setup-tests/omega-config.js +84 -0
- package/dist/cli/commands/setup-tests/project-directories.js +34 -0
- package/dist/cli/commands/setup-tests/project-id-consistency.js +201 -0
- package/dist/cli/commands/setup-tests/public-html-files.js +22 -0
- package/dist/cli/commands/setup-tests/realtime-rules-file.js +69 -0
- package/dist/cli/commands/setup-tests/realtime-rules-in-json.js +20 -0
- package/dist/cli/commands/setup-tests/remoteconfig-template-file.js +32 -0
- package/dist/cli/commands/setup-tests/remoteconfig-template-in-json.js +31 -0
- package/dist/cli/commands/setup-tests/service-account.js +86 -0
- package/dist/cli/commands/setup-tests/storage-lifecycle-policy.js +81 -0
- package/dist/cli/commands/setup-tests/storage-rules-file.js +32 -0
- package/dist/cli/commands/setup-tests/storage-rules-in-json.js +20 -0
- package/dist/cli/commands/stripe.js +14 -0
- package/dist/cli/commands/test-lanes/stripe-live.js +440 -0
- package/dist/cli/commands/test.js +976 -0
- package/dist/cli/commands/update.js +27 -0
- package/dist/cli/commands/version.js +10 -0
- package/dist/cli/commands/watch.js +196 -0
- package/dist/cli/flags.js +13 -0
- package/dist/cli/index.js +173 -0
- package/dist/cli/run.js +33 -0
- package/dist/cli/utils/attach-log-file.js +4 -0
- package/dist/cli/utils/compile-rules.js +1155 -0
- package/dist/cli/utils/ensure-target.js +314 -0
- package/dist/cli/utils/project-type.js +140 -0
- package/dist/cli/utils/public-files.js +49 -0
- package/dist/cli/utils/safe-install.js +4 -0
- package/dist/cli/utils/spawn-shell.js +94 -0
- package/dist/cli/utils/stage-functions.js +338 -0
- package/dist/cli/utils/stage-local-packages.js +210 -0
- package/dist/cli/utils/target-checks.js +161 -0
- package/dist/cli/utils/target.js +24 -0
- package/dist/cli/utils/ui.js +292 -0
- package/dist/defaults/AGENTS.md +125 -0
- package/dist/defaults/CHANGELOG.md +15 -0
- package/dist/defaults/CLAUDE.md +1 -0
- package/dist/defaults/_.gitignore +65 -0
- package/dist/defaults/docs/README.md +17 -0
- package/dist/defaults/test/README.md +65 -0
- package/dist/defaults/test/_init.js +14 -0
- package/dist/defaults/test/helpers/connect-trap.js +72 -0
- package/dist/defaults/test/unit/registration.test.js +143 -0
- package/dist/defaults/test/unit/rules-posture.test.js +101 -0
- package/dist/defaults/test/unit/socket-free.test.js +43 -0
- package/dist/manager/events/auth/before-create.js +89 -0
- package/dist/manager/events/auth/before-signin.js +76 -0
- package/dist/manager/events/auth/on-create.js +112 -0
- package/dist/manager/events/auth/on-delete.js +141 -0
- package/dist/manager/events/auth/utils.js +93 -0
- package/dist/manager/events/cron/daily/blog-auto-publisher.js +287 -0
- package/dist/manager/events/cron/daily/data-requests.js +57 -0
- package/dist/manager/events/cron/daily/expire-paypal-cancellations.js +191 -0
- package/dist/manager/events/cron/daily/marketing-prune.js +486 -0
- package/dist/manager/events/cron/daily/reset-usage.js +188 -0
- package/dist/manager/events/cron/daily/trial-lapse-sweep.js +355 -0
- package/dist/manager/events/cron/daily.js +3 -0
- package/dist/manager/events/cron/frequent/abandoned-carts.js +204 -0
- package/dist/manager/events/cron/frequent/email-queue.js +71 -0
- package/dist/manager/events/cron/frequent/marketing-campaigns.js +463 -0
- package/dist/manager/events/cron/frequent/retry-failed-webhooks.js +70 -0
- package/dist/manager/events/cron/frequent.js +3 -0
- package/dist/manager/events/cron/runner.js +64 -0
- package/dist/manager/events/firestore/notifications/on-write.js +123 -0
- package/dist/manager/events/firestore/payments-disputes/on-write.js +256 -0
- package/dist/manager/events/firestore/payments-disputes/providers/stripe.js +218 -0
- package/dist/manager/events/firestore/payments-disputes/providers/test.js +231 -0
- package/dist/manager/events/firestore/payments-webhooks/analytics.js +687 -0
- package/dist/manager/events/firestore/payments-webhooks/on-write.js +1224 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/index.js +395 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/one-time/purchase-completed.js +58 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/one-time/purchase-failed.js +28 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/one-time/purchase-refunded.js +30 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/send-email.js +74 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/cancellation-removed.js +14 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/cancellation-requested.js +28 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/checkout-declined.js +18 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/new-subscription.js +67 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/payment-failed.js +25 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/payment-recovered.js +26 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/payment-refunded.js +34 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/plan-changed.js +42 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/subscription-cancelled.js +33 -0
- package/dist/manager/events/firestore/payments-webhooks/transitions/subscription/subscription-winback.js +17 -0
- package/dist/manager/functions/_legacy/actions/create-post-handler.js +188 -0
- package/dist/manager/functions/_legacy/actions/generate-uuid.js +63 -0
- package/dist/manager/functions/_legacy/actions/sign-up-handler.js +205 -0
- package/dist/manager/functions/_legacy/admin/create-post.js +207 -0
- package/dist/manager/functions/_legacy/admin/firestore-write.js +72 -0
- package/dist/manager/functions/_legacy/admin/get-stats.js +218 -0
- package/dist/manager/functions/_legacy/admin/query.js +198 -0
- package/dist/manager/functions/_legacy/admin/send-notification.js +206 -0
- package/dist/manager/functions/_legacy/template.js +33 -0
- package/dist/manager/functions/_legacy/test/authenticate.js +40 -0
- package/dist/manager/functions/_legacy/test/webhook.js +37 -0
- package/dist/manager/functions/wrappers/mailchimp/addToList.js +25 -0
- package/dist/manager/helpers/analytics.js +498 -0
- package/dist/manager/helpers/api-manager.js +313 -0
- package/dist/manager/helpers/backend-router.js +37 -0
- package/dist/manager/helpers/context/authenticate.js +215 -0
- package/dist/manager/helpers/context/client-info.js +91 -0
- package/dist/manager/helpers/context/index.js +228 -0
- package/dist/manager/helpers/context/logging.js +150 -0
- package/dist/manager/helpers/context/parse.js +160 -0
- package/dist/manager/helpers/context/respond.js +247 -0
- package/dist/manager/helpers/event-middleware.js +109 -0
- package/dist/manager/helpers/metadata.js +32 -0
- package/dist/manager/helpers/middleware.js +541 -0
- package/dist/manager/helpers/redact-secret.js +25 -0
- package/dist/manager/helpers/resolved-config.js +34 -0
- package/dist/manager/helpers/roles.js +69 -0
- package/dist/manager/helpers/safe-compare.js +31 -0
- package/dist/manager/helpers/schema-engine.js +314 -0
- package/dist/manager/helpers/schema-zod.js +203 -0
- package/dist/manager/helpers/settings.js +215 -0
- package/dist/manager/helpers/usage.js +541 -0
- package/dist/manager/helpers/user.js +57 -0
- package/dist/manager/helpers/utilities.js +565 -0
- package/dist/manager/index.js +1404 -0
- package/dist/manager/libraries/abandoned-cart-config.js +12 -0
- package/dist/manager/libraries/ai/index.js +321 -0
- package/dist/manager/libraries/ai/prompt.js +85 -0
- package/dist/manager/libraries/ai/providers/anthropic-format.js +297 -0
- package/dist/manager/libraries/ai/providers/anthropic.js +169 -0
- package/dist/manager/libraries/ai/providers/claude-code.js +183 -0
- package/dist/manager/libraries/ai/providers/openai.js +1272 -0
- package/dist/manager/libraries/ai/providers/test.js +257 -0
- package/dist/manager/libraries/ai/tokens.js +54 -0
- package/dist/manager/libraries/analytics/conversions.js +478 -0
- package/dist/manager/libraries/analytics/match-data.js +573 -0
- package/dist/manager/libraries/analytics/signup.js +120 -0
- package/dist/manager/libraries/auth-user.js +46 -0
- package/dist/manager/libraries/content/feed-parser.js +198 -0
- package/dist/manager/libraries/content/ghostii.js +191 -0
- package/dist/manager/libraries/content/source-resolver.js +629 -0
- package/dist/manager/libraries/email/constants.js +532 -0
- package/dist/manager/libraries/email/data/blocked-local-parts.json +55 -0
- package/dist/manager/libraries/email/data/blocked-local-patterns.js +14 -0
- package/dist/manager/libraries/email/data/corporate-domains.json +23 -0
- package/dist/manager/libraries/email/data/custom-disposable-domains.json +58 -0
- package/dist/manager/libraries/email/data/disposable-domains.json +8184 -0
- package/dist/manager/libraries/email/data/typo-domains.js +83 -0
- package/dist/manager/libraries/email/disposable-domains.js +92 -0
- package/dist/manager/libraries/email/generators/lib/filter.js +179 -0
- package/dist/manager/libraries/email/generators/lib/image-host.js +344 -0
- package/dist/manager/libraries/email/generators/lib/image-illustrator.js +154 -0
- package/dist/manager/libraries/email/generators/lib/markdown-renderer.js +294 -0
- package/dist/manager/libraries/email/generators/lib/mjml-template.js +120 -0
- package/dist/manager/libraries/email/generators/lib/structure.js +299 -0
- package/dist/manager/libraries/email/generators/lib/svg-illustrator.js +197 -0
- package/dist/manager/libraries/email/generators/lib/templates/base.js +229 -0
- package/dist/manager/libraries/email/generators/lib/templates/card.js +33 -0
- package/dist/manager/libraries/email/generators/lib/templates/classic-schema.js +59 -0
- package/dist/manager/libraries/email/generators/lib/templates/clean.js +82 -0
- package/dist/manager/libraries/email/generators/lib/templates/editorial/helpers.js +100 -0
- package/dist/manager/libraries/email/generators/lib/templates/editorial/index.js +318 -0
- package/dist/manager/libraries/email/generators/lib/templates/feedback.js +101 -0
- package/dist/manager/libraries/email/generators/lib/templates/field-report/helpers.js +138 -0
- package/dist/manager/libraries/email/generators/lib/templates/field-report/index.js +494 -0
- package/dist/manager/libraries/email/generators/lib/templates/index.js +47 -0
- package/dist/manager/libraries/email/generators/lib/templates/newsletter-shared.js +610 -0
- package/dist/manager/libraries/email/generators/lib/templates/order.js +461 -0
- package/dist/manager/libraries/email/generators/lib/templates/plain.js +83 -0
- package/dist/manager/libraries/email/generators/lib/templates/shared-campaign.js +64 -0
- package/dist/manager/libraries/email/generators/newsletter.js +899 -0
- package/dist/manager/libraries/email/index.js +146 -0
- package/dist/manager/libraries/email/marketing/index.js +754 -0
- package/dist/manager/libraries/email/prepare.js +365 -0
- package/dist/manager/libraries/email/providers/beehiiv.js +589 -0
- package/dist/manager/libraries/email/providers/sendgrid.js +845 -0
- package/dist/manager/libraries/email/transactional/index.js +510 -0
- package/dist/manager/libraries/email/utm.js +86 -0
- package/dist/manager/libraries/email/validation-provider-neverbounce.js +70 -0
- package/dist/manager/libraries/email/validation-provider-zerobounce.js +42 -0
- package/dist/manager/libraries/email/validation.js +255 -0
- package/dist/manager/libraries/env.js +198 -0
- package/dist/manager/libraries/infer-contact.js +101 -0
- package/dist/manager/libraries/load-provider.js +65 -0
- package/dist/manager/libraries/notification.js +256 -0
- package/dist/manager/libraries/openai.js +13 -0
- package/dist/manager/libraries/payment/discount-codes.js +204 -0
- package/dist/manager/libraries/payment/fetch-failure.js +56 -0
- package/dist/manager/libraries/payment/license.js +44 -0
- package/dist/manager/libraries/payment/order-id.js +57 -0
- package/dist/manager/libraries/payment/provider-errors.js +71 -0
- package/dist/manager/libraries/payment/providers/chargebee.js +817 -0
- package/dist/manager/libraries/payment/providers/coinbase.js +330 -0
- package/dist/manager/libraries/payment/providers/paypal.js +987 -0
- package/dist/manager/libraries/payment/providers/stripe.js +755 -0
- package/dist/manager/libraries/payment/providers/test.js +250 -0
- package/dist/manager/libraries/payment/refund-linkage.js +78 -0
- package/dist/manager/libraries/payment/refund-policy.js +113 -0
- package/dist/manager/libraries/payment/winback.js +55 -0
- package/dist/manager/libraries/prompts/infer-contact.md +78 -0
- package/dist/manager/libraries/rate-limits.js +17 -0
- package/dist/manager/libraries/recaptcha.js +58 -0
- package/dist/manager/libraries/user-doc.js +234 -0
- package/dist/manager/routes/admin/backup/post.js +106 -0
- package/dist/manager/routes/admin/cron/post.js +37 -0
- package/dist/manager/routes/admin/database/get.js +35 -0
- package/dist/manager/routes/admin/database/post.js +34 -0
- package/dist/manager/routes/admin/email/post.js +74 -0
- package/dist/manager/routes/admin/firestore/get.js +35 -0
- package/dist/manager/routes/admin/firestore/post.js +56 -0
- package/dist/manager/routes/admin/firestore/query/post.js +128 -0
- package/dist/manager/routes/admin/hook/post.js +104 -0
- package/dist/manager/routes/admin/infer-contact/post.js +35 -0
- package/dist/manager/routes/admin/notification/post.js +37 -0
- package/dist/manager/routes/admin/payment/post.js +56 -0
- package/dist/manager/routes/admin/post/deduplicate-image-alts.js +52 -0
- package/dist/manager/routes/admin/post/dispatch-deploy.js +36 -0
- package/dist/manager/routes/admin/post/post.js +487 -0
- package/dist/manager/routes/admin/post/put.js +146 -0
- package/dist/manager/routes/admin/post/templates/post.html +14 -0
- package/dist/manager/routes/admin/repo/content/post.js +106 -0
- package/dist/manager/routes/admin/stats/get.js +222 -0
- package/dist/manager/routes/admin/users/disable/post.js +50 -0
- package/dist/manager/routes/admin/users/list/get.js +110 -0
- package/dist/manager/routes/admin/users/sync/post.js +119 -0
- package/dist/manager/routes/brand/get.js +26 -0
- package/dist/manager/routes/content/post/get.js +110 -0
- package/dist/manager/routes/general/email/post.js +89 -0
- package/dist/manager/routes/general/email/templates/general/download-app-link.js +42 -0
- package/dist/manager/routes/general/uuid/post.js +31 -0
- package/dist/manager/routes/handler/post/post.js +142 -0
- package/dist/manager/routes/health/get.js +43 -0
- package/dist/manager/routes/index.js +11 -0
- package/dist/manager/routes/marketing/campaign/delete.js +45 -0
- package/dist/manager/routes/marketing/campaign/get.js +69 -0
- package/dist/manager/routes/marketing/campaign/post.js +124 -0
- package/dist/manager/routes/marketing/campaign/put.js +86 -0
- package/dist/manager/routes/marketing/campaign/utils.js +59 -0
- package/dist/manager/routes/marketing/contact/delete.js +100 -0
- package/dist/manager/routes/marketing/contact/post.js +149 -0
- package/dist/manager/routes/marketing/contact/put.js +37 -0
- package/dist/manager/routes/marketing/email-preferences/post.js +275 -0
- package/dist/manager/routes/marketing/webhook/forward/post.js +170 -0
- package/dist/manager/routes/marketing/webhook/post.js +123 -0
- package/dist/manager/routes/marketing/webhook/providers/beehiiv.js +197 -0
- package/dist/manager/routes/marketing/webhook/providers/sendgrid.js +194 -0
- package/dist/manager/routes/payments/cancel/_is-trialing.js +40 -0
- package/dist/manager/routes/payments/cancel/post.js +149 -0
- package/dist/manager/routes/payments/cancel/providers/chargebee.js +41 -0
- package/dist/manager/routes/payments/cancel/providers/paypal.js +56 -0
- package/dist/manager/routes/payments/cancel/providers/stripe.js +33 -0
- package/dist/manager/routes/payments/cancel/providers/test.js +118 -0
- package/dist/manager/routes/payments/discount/get.js +25 -0
- package/dist/manager/routes/payments/dispute-alert/post.js +117 -0
- package/dist/manager/routes/payments/dispute-alert/providers/chargeblast.js +55 -0
- package/dist/manager/routes/payments/intent/post.js +341 -0
- package/dist/manager/routes/payments/intent/providers/chargebee.js +197 -0
- package/dist/manager/routes/payments/intent/providers/coinbase.js +94 -0
- package/dist/manager/routes/payments/intent/providers/paypal.js +244 -0
- package/dist/manager/routes/payments/intent/providers/stripe.js +141 -0
- package/dist/manager/routes/payments/intent/providers/test.js +341 -0
- package/dist/manager/routes/payments/plan/post.js +147 -0
- package/dist/manager/routes/payments/plan/providers/chargebee.js +62 -0
- package/dist/manager/routes/payments/plan/providers/paypal.js +62 -0
- package/dist/manager/routes/payments/plan/providers/stripe.js +59 -0
- package/dist/manager/routes/payments/plan/providers/test.js +113 -0
- package/dist/manager/routes/payments/portal/post.js +113 -0
- package/dist/manager/routes/payments/portal/providers/chargebee.js +62 -0
- package/dist/manager/routes/payments/portal/providers/paypal.js +25 -0
- package/dist/manager/routes/payments/portal/providers/stripe.js +62 -0
- package/dist/manager/routes/payments/portal/providers/test.js +18 -0
- package/dist/manager/routes/payments/refund/post.js +207 -0
- package/dist/manager/routes/payments/refund/providers/chargebee.js +147 -0
- package/dist/manager/routes/payments/refund/providers/coinbase.js +40 -0
- package/dist/manager/routes/payments/refund/providers/paypal.js +239 -0
- package/dist/manager/routes/payments/refund/providers/stripe.js +160 -0
- package/dist/manager/routes/payments/refund/providers/test.js +204 -0
- package/dist/manager/routes/payments/trial-eligibility/get.js +29 -0
- package/dist/manager/routes/payments/uncancel/post.js +106 -0
- package/dist/manager/routes/payments/uncancel/providers/chargebee.js +30 -0
- package/dist/manager/routes/payments/uncancel/providers/paypal.js +25 -0
- package/dist/manager/routes/payments/uncancel/providers/stripe.js +27 -0
- package/dist/manager/routes/payments/uncancel/providers/test.js +114 -0
- package/dist/manager/routes/payments/webhook/post.js +157 -0
- package/dist/manager/routes/payments/webhook/providers/chargebee.js +218 -0
- package/dist/manager/routes/payments/webhook/providers/coinbase.js +91 -0
- package/dist/manager/routes/payments/webhook/providers/paypal.js +214 -0
- package/dist/manager/routes/payments/webhook/providers/stripe.js +182 -0
- package/dist/manager/routes/payments/webhook/providers/test.js +18 -0
- package/dist/manager/routes/payments/winback/post.js +276 -0
- package/dist/manager/routes/payments/winback/providers/chargebee.js +24 -0
- package/dist/manager/routes/payments/winback/providers/paypal.js +22 -0
- package/dist/manager/routes/payments/winback/providers/stripe.js +41 -0
- package/dist/manager/routes/payments/winback/providers/test.js +42 -0
- package/dist/manager/routes/restart/index.js +37 -0
- package/dist/manager/routes/special/electron-client/post.js +59 -0
- package/dist/manager/routes/test/authenticate/get.js +11 -0
- package/dist/manager/routes/test/health/get.js +8 -0
- package/dist/manager/routes/test/index.js +16 -0
- package/dist/manager/routes/test/lab/post.js +17 -0
- package/dist/manager/routes/test/redirect/get.js +27 -0
- package/dist/manager/routes/test/reset-account/post.js +79 -0
- package/dist/manager/routes/test/roster/get.js +40 -0
- package/dist/manager/routes/test/schema/post.js +20 -0
- package/dist/manager/routes/test/usage/post.js +44 -0
- package/dist/manager/routes/test/webhook/post.js +21 -0
- package/dist/manager/routes/user/api-keys/post.js +51 -0
- package/dist/manager/routes/user/connections/_context.js +194 -0
- package/dist/manager/routes/user/connections/_grant.js +247 -0
- package/dist/manager/routes/user/connections/_lease.js +184 -0
- package/dist/manager/routes/user/connections/_providers.js +191 -0
- package/dist/manager/routes/user/connections/_state.js +117 -0
- package/dist/manager/routes/user/connections/delete.js +55 -0
- package/dist/manager/routes/user/connections/get.js +167 -0
- package/dist/manager/routes/user/connections/post.js +370 -0
- package/dist/manager/routes/user/connections/providers/discord.js +41 -0
- package/dist/manager/routes/user/connections/providers/google.js +55 -0
- package/dist/manager/routes/user/connections/providers/kick.js +68 -0
- package/dist/manager/routes/user/connections/providers/spotify.js +40 -0
- package/dist/manager/routes/user/connections/providers/twitch.js +52 -0
- package/dist/manager/routes/user/data-request/delete.js +84 -0
- package/dist/manager/routes/user/data-request/get.js +229 -0
- package/dist/manager/routes/user/data-request/post.js +136 -0
- package/dist/manager/routes/user/delete.js +149 -0
- package/dist/manager/routes/user/feedback/post.js +81 -0
- package/dist/manager/routes/user/get.js +14 -0
- package/dist/manager/routes/user/orders/get.js +95 -0
- package/dist/manager/routes/user/sessions/delete.js +95 -0
- package/dist/manager/routes/user/sessions/get.js +40 -0
- package/dist/manager/routes/user/settings/validate/post.js +86 -0
- package/dist/manager/routes/user/signup/post.js +662 -0
- package/dist/manager/routes/user/subscription/get.js +77 -0
- package/dist/manager/routes/user/token/post.js +30 -0
- package/dist/manager/routes/verts/delete.js +43 -0
- package/dist/manager/routes/verts/get.js +49 -0
- package/dist/manager/routes/verts/post.js +61 -0
- package/dist/manager/routes/verts/put.js +75 -0
- package/dist/manager/routes/verts/redirect/get.js +36 -0
- package/dist/manager/routes/verts/serve/get.js +67 -0
- package/dist/manager/routes/verts/utils.js +436 -0
- package/dist/manager/schemas/admin/backup/post.js +8 -0
- package/dist/manager/schemas/admin/cron/post.js +8 -0
- package/dist/manager/schemas/admin/database/get.js +5 -0
- package/dist/manager/schemas/admin/database/post.js +6 -0
- package/dist/manager/schemas/admin/email/post.js +31 -0
- package/dist/manager/schemas/admin/firestore/get.js +5 -0
- package/dist/manager/schemas/admin/firestore/post.js +8 -0
- package/dist/manager/schemas/admin/firestore/query/post.js +5 -0
- package/dist/manager/schemas/admin/hook/post.js +8 -0
- package/dist/manager/schemas/admin/infer-contact/post.js +6 -0
- package/dist/manager/schemas/admin/notification/post.js +23 -0
- package/dist/manager/schemas/admin/payment/post.js +8 -0
- package/dist/manager/schemas/admin/post/post.js +23 -0
- package/dist/manager/schemas/admin/post/put.js +13 -0
- package/dist/manager/schemas/admin/repo/content/post.js +10 -0
- package/dist/manager/schemas/admin/stats/get.js +5 -0
- package/dist/manager/schemas/admin/users/disable/post.js +9 -0
- package/dist/manager/schemas/admin/users/list/get.js +10 -0
- package/dist/manager/schemas/admin/users/sync/post.js +7 -0
- package/dist/manager/schemas/brand/get.js +3 -0
- package/dist/manager/schemas/content/post/get.js +8 -0
- package/dist/manager/schemas/general/email/post.js +10 -0
- package/dist/manager/schemas/general/uuid/post.js +9 -0
- package/dist/manager/schemas/handler/post/post.js +13 -0
- package/dist/manager/schemas/health/get.js +3 -0
- package/dist/manager/schemas/marketing/campaign/delete.js +8 -0
- package/dist/manager/schemas/marketing/campaign/get.js +13 -0
- package/dist/manager/schemas/marketing/campaign/post.js +43 -0
- package/dist/manager/schemas/marketing/campaign/put.js +37 -0
- package/dist/manager/schemas/marketing/contact/delete.js +8 -0
- package/dist/manager/schemas/marketing/contact/post.js +14 -0
- package/dist/manager/schemas/marketing/contact/put.js +8 -0
- package/dist/manager/schemas/marketing/email-preferences/post.js +15 -0
- package/dist/manager/schemas/marketing/webhook/forward/post.js +8 -0
- package/dist/manager/schemas/marketing/webhook/post.js +7 -0
- package/dist/manager/schemas/payments/cancel/post.js +15 -0
- package/dist/manager/schemas/payments/discount/get.js +8 -0
- package/dist/manager/schemas/payments/dispute-alert/post.js +6 -0
- package/dist/manager/schemas/payments/intent/post.js +28 -0
- package/dist/manager/schemas/payments/plan/post.js +11 -0
- package/dist/manager/schemas/payments/portal/post.js +12 -0
- package/dist/manager/schemas/payments/refund/post.js +14 -0
- package/dist/manager/schemas/payments/trial-eligibility/get.js +7 -0
- package/dist/manager/schemas/payments/uncancel/post.js +9 -0
- package/dist/manager/schemas/payments/webhook/post.js +6 -0
- package/dist/manager/schemas/payments/winback/post.js +12 -0
- package/dist/manager/schemas/restart/index.js +5 -0
- package/dist/manager/schemas/special/electron-client/post.js +11 -0
- package/dist/manager/schemas/test/authenticate/get.js +3 -0
- package/dist/manager/schemas/test/health/get.js +3 -0
- package/dist/manager/schemas/test/index.js +5 -0
- package/dist/manager/schemas/test/lab/post.js +3 -0
- package/dist/manager/schemas/test/redirect/get.js +7 -0
- package/dist/manager/schemas/test/reset-account/post.js +3 -0
- package/dist/manager/schemas/test/roster/get.js +3 -0
- package/dist/manager/schemas/test/schema/post.js +70 -0
- package/dist/manager/schemas/test/usage/post.js +8 -0
- package/dist/manager/schemas/test/webhook/post.js +7 -0
- package/dist/manager/schemas/user/api-keys/post.js +6 -0
- package/dist/manager/schemas/user/connections/delete.js +8 -0
- package/dist/manager/schemas/user/connections/get.js +21 -0
- package/dist/manager/schemas/user/connections/post.js +12 -0
- package/dist/manager/schemas/user/data-request/delete.js +3 -0
- package/dist/manager/schemas/user/data-request/get.js +5 -0
- package/dist/manager/schemas/user/data-request/post.js +6 -0
- package/dist/manager/schemas/user/delete.js +6 -0
- package/dist/manager/schemas/user/feedback/post.js +8 -0
- package/dist/manager/schemas/user/get.js +3 -0
- package/dist/manager/schemas/user/orders/get.js +6 -0
- package/dist/manager/schemas/user/sessions/delete.js +6 -0
- package/dist/manager/schemas/user/sessions/get.js +6 -0
- package/dist/manager/schemas/user/settings/validate/post.js +8 -0
- package/dist/manager/schemas/user/signup/post.js +27 -0
- package/dist/manager/schemas/user/subscription/get.js +5 -0
- package/dist/manager/schemas/user/token/post.js +5 -0
- package/dist/manager/schemas/verts/delete.js +8 -0
- package/dist/manager/schemas/verts/get.js +9 -0
- package/dist/manager/schemas/verts/post.js +23 -0
- package/dist/manager/schemas/verts/put.js +20 -0
- package/dist/manager/schemas/verts/redirect/get.js +10 -0
- package/dist/manager/schemas/verts/serve/get.js +14 -0
- package/dist/manager/server-manager.js +69 -0
- package/dist/mcp/client.js +98 -0
- package/dist/mcp/handler.js +521 -0
- package/dist/mcp/index.js +157 -0
- package/dist/mcp/tools.js +555 -0
- package/dist/mcp/utils.js +108 -0
- package/dist/omega-bin.js +6 -0
- package/dist/require.js +3 -0
- package/dist/test/fixtures/firebase-project/.firebaserc +5 -0
- package/dist/test/fixtures/firebase-project/config/omega.json5 +131 -0
- package/dist/test/fixtures/firebase-project/database.rules.json +6 -0
- package/dist/test/fixtures/firebase-project/firebase.json +49 -0
- package/dist/test/fixtures/firebase-project/firestore.indexes.json +4 -0
- package/dist/test/fixtures/firebase-project/package.json +14 -0
- package/dist/test/fixtures/firebase-project/src/index.js +11 -0
- package/dist/test/fixtures/firebase-project/storage.rules +8 -0
- package/dist/test/parse-audit.js +25 -0
- package/dist/test/run-tests.js +90 -0
- package/dist/test/runner.js +982 -0
- package/dist/test/seed.js +242 -0
- package/dist/test/test-accounts.js +2660 -0
- package/dist/test/utils/assertions.js +189 -0
- package/dist/test/utils/email-capture.js +252 -0
- package/dist/test/utils/extended-mode-warning.js +11 -0
- package/dist/test/utils/firestore-rules-client.js +277 -0
- package/dist/test/utils/http-client.js +228 -0
- package/dist/test/utils/test-mode-file.js +192 -0
- package/dist/utils/merge-line-files.js +6 -0
- package/dist/utils/scaffold-defaults.js +71 -0
- package/dist/utils/test-lanes.js +62 -0
- package/dist/vendor/account/engine.js +182 -0
- package/dist/vendor/account/features.js +220 -0
- package/dist/vendor/account/index.js +53 -0
- package/dist/vendor/account/schema.js +272 -0
- package/dist/vendor/account/subscription.js +38 -0
- package/dist/vendor/analytics/adapters/ga4.js +26 -0
- package/dist/vendor/analytics/adapters/meta.js +26 -0
- package/dist/vendor/analytics/adapters/resolve.js +130 -0
- package/dist/vendor/analytics/adapters/tiktok.js +27 -0
- package/dist/vendor/analytics/catalog.js +908 -0
- package/dist/vendor/analytics/identity.js +136 -0
- package/dist/vendor/config/company.js +31 -0
- package/dist/vendor/config/defaults.js +173 -0
- package/dist/vendor/config/demo.js +18 -0
- package/dist/vendor/config/desktop-artifacts.js +110 -0
- package/dist/vendor/config/edit.js +769 -0
- package/dist/vendor/config/env-delivery.js +145 -0
- package/dist/vendor/config/env-rules.js +93 -0
- package/dist/vendor/config/env-schema.js +1078 -0
- package/dist/vendor/config/env.js +445 -0
- package/dist/vendor/config/hooks.js +97 -0
- package/dist/vendor/config/index.js +237 -0
- package/dist/vendor/config/instances.js +208 -0
- package/dist/vendor/config/load.js +490 -0
- package/dist/vendor/config/merge.js +68 -0
- package/dist/vendor/config/order.js +139 -0
- package/dist/vendor/config/ports.js +374 -0
- package/dist/vendor/config/providers.js +32 -0
- package/dist/vendor/config/repo.js +142 -0
- package/dist/vendor/config/retired-keys.js +430 -0
- package/dist/vendor/config/schema.js +1610 -0
- package/dist/vendor/config/secrets.js +50 -0
- package/dist/vendor/config/seed.js +34 -0
- package/dist/vendor/config/site-global.js +205 -0
- package/dist/vendor/config/validate.js +554 -0
- package/dist/vendor/config/winback.js +61 -0
- package/dist/vendor/devkit/attach-log-file.js +262 -0
- package/dist/vendor/devkit/bare-requires.js +153 -0
- package/dist/vendor/devkit/command-path.js +46 -0
- package/dist/vendor/devkit/defaults-engine.js +372 -0
- package/dist/vendor/devkit/deploy-record.js +180 -0
- package/dist/vendor/devkit/deploy.js +286 -0
- package/dist/vendor/devkit/license.js +155 -0
- package/dist/vendor/devkit/local-https.js +360 -0
- package/dist/vendor/devkit/local.js +1905 -0
- package/dist/vendor/devkit/logger.js +128 -0
- package/dist/vendor/devkit/merge-line-files.js +296 -0
- package/dist/vendor/devkit/npm-registry.js +52 -0
- package/dist/vendor/devkit/omega-bin.js +345 -0
- package/dist/vendor/devkit/parse-audit.js +74 -0
- package/dist/vendor/devkit/safe-install.js +18 -0
- package/dist/vendor/devkit/scaffold-guard.js +96 -0
- package/dist/vendor/devkit/stop-signals.js +28 -0
- package/dist/vendor/devkit/test/assert.js +120 -0
- package/dist/vendor/devkit/test/define-cases.js +104 -0
- package/dist/vendor/devkit/test/runner-core.js +554 -0
- package/dist/vendor/devkit/test/scope.js +162 -0
- package/dist/vendor/devkit/update.js +569 -0
- package/dist/vendor/monitoring/core.js +180 -0
- package/dist/vendor/monitoring/env.js +49 -0
- package/dist/vendor/monitoring/logger.js +39 -0
- package/dist/vendor/monitoring/node.js +72 -0
- package/docs/admin-post-route.md +57 -0
- package/docs/ai-library.md +171 -0
- package/docs/architecture.md +62 -0
- package/docs/audit.md +70 -0
- package/docs/auth-hooks.md +74 -0
- package/docs/build-system.md +65 -0
- package/docs/cdp-debugging.md +29 -0
- package/docs/cli-firestore-auth.md +85 -0
- package/docs/cli-logs.md +67 -0
- package/docs/cli-output.md +146 -0
- package/docs/code-patterns.md +77 -0
- package/docs/common-mistakes.md +12 -0
- package/docs/common-operations.md +60 -0
- package/docs/connections.md +212 -0
- package/docs/consent.md +362 -0
- package/docs/directory-structure.md +150 -0
- package/docs/email-system.md +459 -0
- package/docs/environment-detection.md +93 -0
- package/docs/file-naming.md +10 -0
- package/docs/firestore.md +134 -0
- package/docs/ghostii.md +240 -0
- package/docs/index.md +299 -0
- package/docs/key-files.md +37 -0
- package/docs/logging.md +60 -0
- package/docs/marketing-campaigns.md +407 -0
- package/docs/marketing-fields.md +25 -0
- package/docs/mcp.md +222 -0
- package/docs/migration.md +129 -0
- package/docs/payment-system.md +856 -0
- package/docs/paypal-sandbox-qa.md +105 -0
- package/docs/response-headers.md +9 -0
- package/docs/routes.md +211 -0
- package/docs/sanitization.md +71 -0
- package/docs/schemas.md +163 -0
- package/docs/shared/agent-docs.md +89 -0
- package/docs/shared/analytics.md +612 -0
- package/docs/shared/brands.md +51 -0
- package/docs/shared/breaking-changes.md +497 -0
- package/docs/shared/config.md +1387 -0
- package/docs/shared/deploys.md +215 -0
- package/docs/shared/icons.md +201 -0
- package/docs/shared/local-dev.md +147 -0
- package/docs/shared/logging.md +202 -0
- package/docs/shared/monitoring.md +153 -0
- package/docs/shared/publishing.md +183 -0
- package/docs/shared/rulings.md +34 -0
- package/docs/shared/testing.md +147 -0
- package/docs/shared/theming.md +604 -0
- package/docs/shared/translation.md +291 -0
- package/docs/shared/updates.md +61 -0
- package/docs/stripe-webhook-forwarding.md +20 -0
- package/docs/test-boot-layer.md +67 -0
- package/docs/test-framework.md +583 -0
- package/docs/usage-rate-limiting.md +121 -0
- package/docs/verts.md +29 -0
- package/package.json +143 -0
- package/templates/config/omega.json5 +322 -0
- package/templates/database.rules.json +82 -0
- package/templates/firebase.json +67 -0
- package/templates/firestore.framework.rules +191 -0
- package/templates/firestore.indexes.json +4 -0
- package/templates/firestore.rules +59 -0
- package/templates/index.js +12 -0
- package/templates/public/404.html +26 -0
- package/templates/public/index.html +24 -0
- package/templates/remoteconfig.template.json +1 -0
- package/templates/storage-lifecycle-config-1-day.json +9 -0
- package/templates/storage-lifecycle-config-30-days.json +9 -0
- package/templates/storage.rules +11 -0
- package/test/_init/accounts-validation.js +58 -0
- package/test/ai/tools-live.test.js +171 -0
- package/test/analytics/conversion-delivery.test.js +1013 -0
- package/test/analytics/match-normalization.test.js +238 -0
- package/test/analytics/signup-conversion.test.js +135 -0
- package/test/boot/cli-dispatch.test.js +142 -0
- package/test/boot/defaults-scaffold.test.js +248 -0
- package/test/boot/deploy-staging.test.js +446 -0
- package/test/boot/disposable-domains.test.js +154 -0
- package/test/boot/emulator-boots.test.js +39 -0
- package/test/boot/emulator-port-preflight.test.js +126 -0
- package/test/boot/emulator-ready-timeout.test.js +46 -0
- package/test/boot/project-id-refresh.test.js +73 -0
- package/test/boot/suite-portability.test.js +278 -0
- package/test/boot/update-command.test.js +63 -0
- package/test/cli/cross-platform.test.js +168 -0
- package/test/cli/custom-project-type.test.js +426 -0
- package/test/cli/deploy-license-env.test.js +100 -0
- package/test/cli/emulator-adoption.test.js +254 -0
- package/test/cli/emulator-orphans.test.js +658 -0
- package/test/cli/emulator-ownership.test.js +177 -0
- package/test/cli/emulator-port-retry.test.js +395 -0
- package/test/cli/emulator-shutdown.test.js +788 -0
- package/test/cli/emulator-stale-reap.test.js +574 -0
- package/test/cli/ensure-target.test.js +325 -0
- package/test/cli/flags.test.js +64 -0
- package/test/cli/https-trust.test.js +38 -0
- package/test/cli/install-update-dispatch.test.js +47 -0
- package/test/cli/lane-environments.test.js +159 -0
- package/test/cli/marketing-campaigns-seeded.test.js +194 -0
- package/test/cli/migrate-bare-requires.test.js +128 -0
- package/test/cli/migrate-markers.test.js +530 -0
- package/test/cli/required-indexes.test.js +64 -0
- package/test/cli/rules-compile.test.js +622 -0
- package/test/cli/rules-migration-deferral.test.js +259 -0
- package/test/cli/rules-version.test.js +104 -0
- package/test/cli/setup-load-files.test.js +66 -0
- package/test/cli/setup-offline-mode.test.js +276 -0
- package/test/cli/setup-retired.test.js +64 -0
- package/test/cli/setup-shared-project-indexes.test.js +262 -0
- package/test/cli/setup-tests-requires.test.js +45 -0
- package/test/cli/stage-env-compose.test.js +316 -0
- package/test/cli/stripe-live-lane.test.js +303 -0
- package/test/cli/target.test.js +182 -0
- package/test/cli/templates.test.js +66 -0
- package/test/cli/test-runner-env.test.js +115 -0
- package/test/cli/test-stack-shutdown.test.js +275 -0
- package/test/cli/test-target-no-match.test.js +128 -0
- package/test/cli/verb-logs.test.js +118 -0
- package/test/cli/version-dispatch.test.js +39 -0
- package/test/content/blog-generate.test.js +164 -0
- package/test/email/campaign-config-fault.test.js +376 -0
- package/test/email/campaign-cron-pipeline.test.js +536 -0
- package/test/email/campaign-send.test.js +47 -0
- package/test/email/consent-lifecycle.test.js +258 -0
- package/test/email/content-html-policy.test.js +270 -0
- package/test/email/feedback-and-plain-send.test.js +54 -0
- package/test/email/fixtures/clean.json +30 -0
- package/test/email/fixtures/editorial.json +30 -0
- package/test/email/fixtures/field-report.json +53 -0
- package/test/email/identity.test.js +321 -0
- package/test/email/marketing/consent-gate.test.js +265 -0
- package/test/email/marketing/custom-fields-catalog.test.js +259 -0
- package/test/email/marketing/prune-per-provider.test.js +762 -0
- package/test/email/marketing/remove-log-privacy.test.js +225 -0
- package/test/email/marketing-lifecycle.test.js +139 -0
- package/test/email/newsletter-generate.test.js +853 -0
- package/test/email/newsletter-svg-tokens.test.js +51 -0
- package/test/email/newsletter-templates.test.js +492 -0
- package/test/email/order-one-time-cta.test.js +97 -0
- package/test/email/render-content.test.js +248 -0
- package/test/email/safe-url.test.js +0 -0
- package/test/email/sanitize-images.test.js +66 -0
- package/test/email/send-log-privacy.test.js +107 -0
- package/test/email/templates.test.js +288 -0
- package/test/email/testing-capture.test.js +260 -0
- package/test/email/transactional-send.test.js +36 -0
- package/test/email/transactional.test.js +562 -0
- package/test/email/unsubscribe-groups.test.js +155 -0
- package/test/email/unsubscribe-key.test.js +91 -0
- package/test/email/validation-cases.test.js +152 -0
- package/test/email/validation.test.js +746 -0
- package/test/events/auth-delete-conversion.test.js +138 -0
- package/test/events/auth-delete-race.test.js +211 -0
- package/test/events/auth-on-create-log.test.js +164 -0
- package/test/events/auth-signup-conversion.test.js +141 -0
- package/test/events/auth-signup-limit.test.js +142 -0
- package/test/events/auth-trigger-log-privacy.test.js +256 -0
- package/test/events/cron-job-doc-shape.test.js +101 -0
- package/test/events/cron-reset-usage.test.js +116 -0
- package/test/events/notification-conversion.test.js +182 -0
- package/test/events/payments/_webhook-harness.js +307 -0
- package/test/events/payments/abandoned-cart-activity.test.js +135 -0
- package/test/events/payments/analytics-payment-events.test.js +945 -0
- package/test/events/payments/dispute-email-status.test.js +55 -0
- package/test/events/payments/journey-payments-abandoned.test.js +126 -0
- package/test/events/payments/journey-payments-cancel-endpoint.test.js +102 -0
- package/test/events/payments/journey-payments-cancel-no-order.test.js +76 -0
- package/test/events/payments/journey-payments-cancel.test.js +184 -0
- package/test/events/payments/journey-payments-decline.test.js +225 -0
- package/test/events/payments/journey-payments-discount.test.js +91 -0
- package/test/events/payments/journey-payments-dispute.test.js +190 -0
- package/test/events/payments/journey-payments-failure.test.js +148 -0
- package/test/events/payments/journey-payments-legacy-product.test.js +151 -0
- package/test/events/payments/journey-payments-one-time-decline.test.js +127 -0
- package/test/events/payments/journey-payments-one-time-failure.test.js +113 -0
- package/test/events/payments/journey-payments-one-time-refund.test.js +186 -0
- package/test/events/payments/journey-payments-one-time.test.js +175 -0
- package/test/events/payments/journey-payments-plan-change.test.js +146 -0
- package/test/events/payments/journey-payments-plan-switch-trial.test.js +161 -0
- package/test/events/payments/journey-payments-plan-switch.test.js +182 -0
- package/test/events/payments/journey-payments-refund-no-order.test.js +76 -0
- package/test/events/payments/journey-payments-refund-webhook.test.js +225 -0
- package/test/events/payments/journey-payments-suspend.test.js +183 -0
- package/test/events/payments/journey-payments-trial-cancel.test.js +132 -0
- package/test/events/payments/journey-payments-trial.test.js +173 -0
- package/test/events/payments/journey-payments-uid-resolution.test.js +134 -0
- package/test/events/payments/journey-payments-uncancel.test.js +157 -0
- package/test/events/payments/journey-payments-upgrade.test.js +137 -0
- package/test/events/payments/journey-payments-winback-decline.test.js +171 -0
- package/test/events/payments/journey-payments-winback.test.js +195 -0
- package/test/events/payments/paypal-expiry-cron.test.js +166 -0
- package/test/events/payments/purchase-failed-handler.test.js +80 -0
- package/test/events/payments/purchase-refunded-handler.test.js +108 -0
- package/test/events/payments/test-processor-doc-shape.test.js +162 -0
- package/test/events/payments/transition-order-emails.test.js +185 -0
- package/test/events/payments/transition-promo-lines.test.js +192 -0
- package/test/events/payments/transitions-detect.test.js +767 -0
- package/test/events/payments/trial-lapse-sweep-staleness.test.js +173 -0
- package/test/events/payments/trial-lapse-sweep.test.js +359 -0
- package/test/events/payments/webhook-atomic-writes.test.js +69 -0
- package/test/events/payments/webhook-chargebee-unreachable.test.js +106 -0
- package/test/events/payments/webhook-discount-clear.test.js +189 -0
- package/test/events/payments/webhook-failure-intent.test.js +93 -0
- package/test/events/payments/webhook-hosted-page-uid-trust.test.js +212 -0
- package/test/events/payments/webhook-ordering.test.js +326 -0
- package/test/events/payments/webhook-provider-lookup-trust.test.js +206 -0
- package/test/events/payments/webhook-refund-amount-trust.test.js +223 -0
- package/test/events/payments/webhook-refund-envelope-shape.test.js +148 -0
- package/test/events/payments/webhook-refund-linkage-trust.test.js +404 -0
- package/test/events/payments/webhook-refund-transaction-fallback.test.js +184 -0
- package/test/events/payments/webhook-refund-without-order.test.js +170 -0
- package/test/events/payments/webhook-refusal-reporting.test.js +194 -0
- package/test/events/payments/webhook-refused-intent.test.js +142 -0
- package/test/events/payments/webhook-retry-sweep.test.js +252 -0
- package/test/events/payments/webhook-transition-claim.test.js +389 -0
- package/test/events/payments/webhook-uid-trust.test.js +203 -0
- package/test/events/payments/webhook-user-without-auth.test.js +161 -0
- package/test/fixtures/chargebee/invoice-one-time.json +27 -0
- package/test/fixtures/chargebee/subscription-active.json +44 -0
- package/test/fixtures/chargebee/subscription-cancelled.json +42 -0
- package/test/fixtures/chargebee/subscription-in-trial.json +41 -0
- package/test/fixtures/chargebee/subscription-legacy-plan.json +41 -0
- package/test/fixtures/chargebee/subscription-non-renewing.json +41 -0
- package/test/fixtures/chargebee/subscription-paused.json +42 -0
- package/test/fixtures/chargebee/webhook-payment-failed.json +51 -0
- package/test/fixtures/chargebee/webhook-subscription-created.json +47 -0
- package/test/fixtures/coinbase/charge-confirmed.json +50 -0
- package/test/fixtures/coinbase/charge-failed.json +34 -0
- package/test/fixtures/coinbase/charge-pending.json +34 -0
- package/test/fixtures/migrate/ported-route.js.txt +11 -0
- package/test/fixtures/paypal/capture-completed.json +51 -0
- package/test/fixtures/paypal/capture-refunded.json +43 -0
- package/test/fixtures/paypal/order-approved.json +62 -0
- package/test/fixtures/paypal/order-completed.json +110 -0
- package/test/fixtures/paypal/sale-refunded.json +38 -0
- package/test/fixtures/paypal/subscription-active.json +76 -0
- package/test/fixtures/paypal/subscription-cancelled.json +50 -0
- package/test/fixtures/paypal/subscription-suspended.json +65 -0
- package/test/fixtures/stripe/checkout-session-completed.json +130 -0
- package/test/fixtures/stripe/invoice-payment-failed.json +148 -0
- package/test/fixtures/stripe/invoice-subscription-payment-failed.json +28 -0
- package/test/fixtures/stripe/invoice-subscription-payment-succeeded.json +28 -0
- package/test/fixtures/stripe/subscription-active.json +161 -0
- package/test/fixtures/stripe/subscription-canceled.json +161 -0
- package/test/fixtures/stripe/subscription-trialing.json +161 -0
- package/test/helpers/_shared-config.js +15 -0
- package/test/helpers/ai-request-payload.test.js +619 -0
- package/test/helpers/ai-schema-resolve.test.js +125 -0
- package/test/helpers/ai-test-provider.test.js +227 -0
- package/test/helpers/ai-token-accounting.test.js +150 -0
- package/test/helpers/ai-tools-format.test.js +384 -0
- package/test/helpers/analytics-no-id-notice.test.js +146 -0
- package/test/helpers/analytics-user-data.test.js +194 -0
- package/test/helpers/api-manager.test.js +311 -0
- package/test/helpers/backend-router.test.js +136 -0
- package/test/helpers/content/blog-auto-publisher.test.js +482 -0
- package/test/helpers/content/feed-parser.test.js +529 -0
- package/test/helpers/content/ghostii-blocks.test.js +135 -0
- package/test/helpers/content/ghostii-feed-integration.test.js +405 -0
- package/test/helpers/content/ghostii-write-article.test.js +244 -0
- package/test/helpers/dev-only-routes.test.js +225 -0
- package/test/helpers/env-reader.test.js +362 -0
- package/test/helpers/environment.test.js +263 -0
- package/test/helpers/event-middleware.test.js +407 -0
- package/test/helpers/infer-contact.test.js +157 -0
- package/test/helpers/lane-url.test.js +90 -0
- package/test/helpers/merge-line-files.test.js +272 -0
- package/test/helpers/metadata.test.js +122 -0
- package/test/helpers/middleware-request-log.test.js +134 -0
- package/test/helpers/middleware-user-log.test.js +124 -0
- package/test/helpers/payment/chargebee/parse-webhook.test.js +490 -0
- package/test/helpers/payment/chargebee/refund-details.test.js +198 -0
- package/test/helpers/payment/chargebee/to-unified-one-time.test.js +148 -0
- package/test/helpers/payment/chargebee/to-unified-subscription.test.js +649 -0
- package/test/helpers/payment/coinbase/create-intent.test.js +247 -0
- package/test/helpers/payment/coinbase/parse-webhook.test.js +195 -0
- package/test/helpers/payment/coinbase/refund-unsupported.test.js +141 -0
- package/test/helpers/payment/coinbase/to-unified-one-time.test.js +201 -0
- package/test/helpers/payment/discount-codes.test.js +141 -0
- package/test/helpers/payment/extract-resource.test.js +113 -0
- package/test/helpers/payment/fetch-failure.test.js +215 -0
- package/test/helpers/payment/license-gate.test.js +108 -0
- package/test/helpers/payment/order-id.test.js +99 -0
- package/test/helpers/payment/paypal/create-intent.test.js +382 -0
- package/test/helpers/payment/paypal/fetch-capture.test.js +123 -0
- package/test/helpers/payment/paypal/fetch-sale.test.js +183 -0
- package/test/helpers/payment/paypal/parse-webhook.test.js +678 -0
- package/test/helpers/payment/paypal/refund-details.test.js +202 -0
- package/test/helpers/payment/paypal/resolve-plan-id.test.js +108 -0
- package/test/helpers/payment/paypal/switch-plan.test.js +92 -0
- package/test/helpers/payment/paypal/to-unified-one-time.test.js +383 -0
- package/test/helpers/payment/paypal/to-unified-subscription.test.js +884 -0
- package/test/helpers/payment/stripe/fetch-charge.test.js +147 -0
- package/test/helpers/payment/stripe/parse-webhook.test.js +448 -0
- package/test/helpers/payment/stripe/refund-details.test.js +147 -0
- package/test/helpers/payment/stripe/to-unified-one-time.test.js +307 -0
- package/test/helpers/payment/stripe/to-unified-subscription.test.js +709 -0
- package/test/helpers/persona-domain.test.js +87 -0
- package/test/helpers/recaptcha.test.js +166 -0
- package/test/helpers/resolved-config.test.js +106 -0
- package/test/helpers/response-log-redaction.test.js +262 -0
- package/test/helpers/roles.test.js +155 -0
- package/test/helpers/route-context-debug-gate.test.js +118 -0
- package/test/helpers/route-context-logging.test.js +214 -0
- package/test/helpers/route-context.test.js +129 -0
- package/test/helpers/safe-compare.test.js +114 -0
- package/test/helpers/sanitize.test.js +223 -0
- package/test/helpers/schema-engine.test.js +537 -0
- package/test/helpers/schema-zod.test.js +554 -0
- package/test/helpers/seed-accounts-load.test.js +163 -0
- package/test/helpers/seed-google-personas.test.js +114 -0
- package/test/helpers/seeded-personas.test.js +823 -0
- package/test/helpers/settings.test.js +292 -0
- package/test/helpers/setup-engines-pin.test.js +68 -0
- package/test/helpers/setup-manifest-sync.test.js +116 -0
- package/test/helpers/slugify.test.js +395 -0
- package/test/helpers/storage.test.js +195 -0
- package/test/helpers/test-banner-latch.test.js +139 -0
- package/test/helpers/usage-consume.test.js +460 -0
- package/test/helpers/usage-log-privacy.test.js +121 -0
- package/test/helpers/user-doc-heal.test.js +540 -0
- package/test/helpers/user.test.js +771 -0
- package/test/helpers/webhook-forward.test.js +419 -0
- package/test/helpers/wipe-auth-project.test.js +143 -0
- package/test/mcp/discovery.test.js +52 -0
- package/test/mcp/oauth.test.js +160 -0
- package/test/mcp/protocol.test.js +278 -0
- package/test/mcp/roles.test.js +203 -0
- package/test/mcp/utils.test.js +245 -0
- package/test/notification/identity.test.js +155 -0
- package/test/routes/admin/create-post.test.js +362 -0
- package/test/routes/admin/database.test.js +133 -0
- package/test/routes/admin/deduplicate-image-alts.test.js +191 -0
- package/test/routes/admin/email-content-html.test.js +58 -0
- package/test/routes/admin/email-request-log.test.js +86 -0
- package/test/routes/admin/email.test.js +116 -0
- package/test/routes/admin/firestore-query.test.js +206 -0
- package/test/routes/admin/firestore.test.js +129 -0
- package/test/routes/admin/infer-contact.test.js +220 -0
- package/test/routes/admin/notification.test.js +199 -0
- package/test/routes/admin/post-convert-image.test.js +159 -0
- package/test/routes/admin/post-deploy-flag.test.js +81 -0
- package/test/routes/admin/post-download-error.test.js +90 -0
- package/test/routes/admin/post-resize-image.test.js +185 -0
- package/test/routes/admin/post.test.js +369 -0
- package/test/routes/admin/repo-content.test.js +223 -0
- package/test/routes/admin/stats.test.js +114 -0
- package/test/routes/admin/users-disable.test.js +63 -0
- package/test/routes/admin/users-list.test.js +71 -0
- package/test/routes/content/post.test.js +60 -0
- package/test/routes/general/uuid.test.js +133 -0
- package/test/routes/health.test.js +110 -0
- package/test/routes/marketing/campaign.test.js +184 -0
- package/test/routes/marketing/contact.test.js +416 -0
- package/test/routes/marketing/email-preferences.test.js +293 -0
- package/test/routes/marketing/push-send.test.js +34 -0
- package/test/routes/marketing/webhook-forward.test.js +63 -0
- package/test/routes/marketing/webhook.test.js +641 -0
- package/test/routes/payments/_route-harness.js +145 -0
- package/test/routes/payments/cancel-provider-errors.test.js +227 -0
- package/test/routes/payments/cancel-skip-guards.test.js +126 -0
- package/test/routes/payments/cancel-trialing.test.js +428 -0
- package/test/routes/payments/cancel.test.js +165 -0
- package/test/routes/payments/dedup-race.test.js +186 -0
- package/test/routes/payments/discount.test.js +82 -0
- package/test/routes/payments/dispute-alert.test.js +324 -0
- package/test/routes/payments/intent-discount-amounts.test.js +550 -0
- package/test/routes/payments/intent-discount-coupons.test.js +293 -0
- package/test/routes/payments/intent-one-time-metadata.test.js +122 -0
- package/test/routes/payments/intent-purchaser-guard.test.js +139 -0
- package/test/routes/payments/intent-zero-total.test.js +260 -0
- package/test/routes/payments/intent.test.js +413 -0
- package/test/routes/payments/plan.test.js +367 -0
- package/test/routes/payments/portal-return-url.test.js +107 -0
- package/test/routes/payments/portal.test.js +94 -0
- package/test/routes/payments/refund-one-time.test.js +254 -0
- package/test/routes/payments/refund-paypal-proration.test.js +190 -0
- package/test/routes/payments/refund.test.js +181 -0
- package/test/routes/payments/trial-eligibility.test.js +73 -0
- package/test/routes/payments/uncancel.test.js +270 -0
- package/test/routes/payments/webhook-stripe-invoice.test.js +129 -0
- package/test/routes/payments/webhook-stripe-refund-one-time.test.js +130 -0
- package/test/routes/payments/webhook-test-provider.test.js +156 -0
- package/test/routes/payments/webhook.test.js +115 -0
- package/test/routes/payments/winback-stripe-coupon.test.js +126 -0
- package/test/routes/payments/winback.test.js +597 -0
- package/test/routes/test/authenticate.test.js +79 -0
- package/test/routes/test/redirect.test.js +66 -0
- package/test/routes/test/reset-account.test.js +126 -0
- package/test/routes/test/roster.test.js +101 -0
- package/test/routes/test/schema.test.js +556 -0
- package/test/routes/test/usage.test.js +374 -0
- package/test/routes/user/api-keys.test.js +158 -0
- package/test/routes/user/connections-grant.test.js +759 -0
- package/test/routes/user/connections-identity.test.js +260 -0
- package/test/routes/user/connections-log-privacy.test.js +206 -0
- package/test/routes/user/connections-refresh-lease.test.js +696 -0
- package/test/routes/user/connections-return.test.js +261 -0
- package/test/routes/user/connections-uid.test.js +516 -0
- package/test/routes/user/delete.test.js +138 -0
- package/test/routes/user/feedback.test.js +106 -0
- package/test/routes/user/orders.test.js +233 -0
- package/test/routes/user/sessions.test.js +231 -0
- package/test/routes/user/settings-validate.test.js +84 -0
- package/test/routes/user/signup-emails.test.js +113 -0
- package/test/routes/user/signup-location.test.js +84 -0
- package/test/routes/user/signup-log-privacy.test.js +112 -0
- package/test/routes/user/signup.test.js +579 -0
- package/test/routes/user/subscription.test.js +101 -0
- package/test/routes/user/token.test.js +111 -0
- package/test/routes/user/user.test.js +158 -0
- package/test/routes/verts/cache.test.js +78 -0
- package/test/routes/verts/click-destination.test.js +76 -0
- package/test/routes/verts/crud.test.js +194 -0
- package/test/routes/verts/redirect.test.js +147 -0
- package/test/routes/verts/selection.test.js +237 -0
- package/test/routes/verts/serve.test.js +185 -0
- package/test/routes/verts/unit-document.test.js +117 -0
- package/test/rules/_environment.js +66 -0
- package/test/rules/brand-merge.test.js +195 -0
- package/test/rules/field-helpers.test.js +309 -0
- package/test/rules/notifications.test.js +577 -0
- package/test/rules/payments-carts.test.js +406 -0
- package/test/rules/sessions.test.js +170 -0
- package/test/rules/user.test.js +517 -0
- package/test/rules/verts.test.js +101 -0
- package/test/security/fetch-log-secrets.test.js +124 -0
- package/test/security/primitives.test.js +105 -0
- package/test/security/repo-pinning.test.js +77 -0
- package/test/stripe-live/subscription-lifecycle.test.js +141 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POST /special/electron-client - Setup Electron Manager client
|
|
3
|
+
* Returns client configuration with optional auth
|
|
4
|
+
*/
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const { buildPublicConfig } = require(path.join(__dirname, '..', '..', 'brand', 'get.js'));
|
|
7
|
+
|
|
8
|
+
module.exports = async ({ ctx, Manager, settings, analytics, libraries }) => {
|
|
9
|
+
const { admin } = libraries;
|
|
10
|
+
|
|
11
|
+
// brandId/brand fallback to Manager.config
|
|
12
|
+
let uid = settings.uid;
|
|
13
|
+
let config = settings.config;
|
|
14
|
+
|
|
15
|
+
let uuid = null;
|
|
16
|
+
let signInToken = null;
|
|
17
|
+
|
|
18
|
+
// If authenticated, get user and create custom token
|
|
19
|
+
const user = ctx.getUser();
|
|
20
|
+
if (user.authenticated && user.roles?.admin) {
|
|
21
|
+
uid = user.auth?.uid ?? null;
|
|
22
|
+
|
|
23
|
+
if (uid) {
|
|
24
|
+
try {
|
|
25
|
+
signInToken = await admin.auth().createCustomToken(uid);
|
|
26
|
+
} catch (e) {
|
|
27
|
+
return ctx.respond(`Failed to create custom token: ${e}`, { code: 500 });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Generate UUID if uid is available
|
|
33
|
+
if (uid) {
|
|
34
|
+
const uuidLib = Manager.require('uuid');
|
|
35
|
+
const NAMESPACE = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
|
|
36
|
+
uuid = uuidLib.v5(uid, NAMESPACE);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Validate config — kept only when the REQUEST is admin-authenticated (the
|
|
40
|
+
// omega-admin-key header); the config payload itself never carries a secret
|
|
41
|
+
if (user.roles?.admin) {
|
|
42
|
+
ctx.log('Validated config', config);
|
|
43
|
+
} else {
|
|
44
|
+
config = {};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Track analytics
|
|
48
|
+
analytics.event('special/electron-client', { action: 'setup' });
|
|
49
|
+
|
|
50
|
+
return ctx.respond({
|
|
51
|
+
uuid: uuid,
|
|
52
|
+
signInToken: signInToken,
|
|
53
|
+
timestamp: new Date().toISOString(),
|
|
54
|
+
ip: ctx.request.geolocation.ip,
|
|
55
|
+
country: ctx.request.geolocation.country,
|
|
56
|
+
brand: buildPublicConfig(Manager.config),
|
|
57
|
+
config: config,
|
|
58
|
+
});
|
|
59
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const { projectUserForLog } = require('../../../helpers/middleware.js');
|
|
2
|
+
|
|
3
|
+
module.exports = async ({ ctx, user }) => {
|
|
4
|
+
|
|
5
|
+
// Log user info — the allow-listed projection, never the document: it carries
|
|
6
|
+
// api.privateKey ([#632](https://github.com/Omega-JS-Stack/omega/issues/632))
|
|
7
|
+
ctx.log('User:', projectUserForLog(user));
|
|
8
|
+
|
|
9
|
+
// Return user info
|
|
10
|
+
return ctx.respond({ user });
|
|
11
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /test/health — the liveness probe's old home, kept for the dev/testing
|
|
3
|
+
* callers that still ask for it. ONE implementation: the probe is a real route
|
|
4
|
+
* now (`routes/health`), and this folder is development-only, so the path 404s
|
|
5
|
+
* in production like every other test route
|
|
6
|
+
* ([#238](https://github.com/Omega-JS-Stack/omega/issues/238)).
|
|
7
|
+
*/
|
|
8
|
+
module.exports = require('../../health/get.js');
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module.exports = async ({ ctx, analytics }) => {
|
|
2
|
+
|
|
3
|
+
// Send analytics event
|
|
4
|
+
analytics.event('test', {});
|
|
5
|
+
|
|
6
|
+
// Log
|
|
7
|
+
ctx.log('Running test');
|
|
8
|
+
ctx.log('ctx.request.body', ctx.request.body);
|
|
9
|
+
ctx.log('ctx.request.query', ctx.request.query);
|
|
10
|
+
ctx.log('ctx.request.headers', ctx.request.headers);
|
|
11
|
+
ctx.log('ctx.request.data', ctx.request.data);
|
|
12
|
+
ctx.log('ctx.settings', ctx.settings);
|
|
13
|
+
|
|
14
|
+
// Return success
|
|
15
|
+
return ctx.respond({timestamp: new Date().toISOString(), id: ctx.id});
|
|
16
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module.exports = async ({ ctx, user, settings }) => {
|
|
2
|
+
|
|
3
|
+
// Check admin
|
|
4
|
+
if (!user.roles.admin) {
|
|
5
|
+
ctx.log('User is not admin');
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// Example: Send notification (demonstrates calling another @omega.js/backend endpoint)
|
|
9
|
+
const url = 'https://itwcreativeworks.com';
|
|
10
|
+
const title = 'https://itwcreativeworks.com';
|
|
11
|
+
const icon = 'https://cdn.itwcreativeworks.com/assets/itw-creative-works/images/socials/itw-creative-works-brandmark-square-black-1024x1024.png?cb=1651834176';
|
|
12
|
+
|
|
13
|
+
// For now, just return success - the lab is a testing sandbox
|
|
14
|
+
ctx.log('Lab test executed', { url, title, icon });
|
|
15
|
+
|
|
16
|
+
return ctx.respond({ success: true });
|
|
17
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /test/redirect
|
|
3
|
+
* Exercises ctx.redirect(). Development-only like the rest of the `test/`
|
|
4
|
+
* folder (the middleware gates the whole family), and RELATIVE PATHS ONLY.
|
|
5
|
+
*/
|
|
6
|
+
module.exports = async ({ ctx, settings }) => {
|
|
7
|
+
|
|
8
|
+
// Get URL from settings (defaults to the site root)
|
|
9
|
+
const url = settings.url;
|
|
10
|
+
|
|
11
|
+
// Reflecting a caller-supplied absolute URL would make this an open redirect.
|
|
12
|
+
// Refuse a scheme (`https:`, `javascript:`) and the protocol-relative forms
|
|
13
|
+
// (`//host`, `/\host`, which browsers treat as `//host`) outright rather than
|
|
14
|
+
// trying to sanitize them.
|
|
15
|
+
const isRelative = url.startsWith('/') && !url.startsWith('//') && !url.startsWith('/\\');
|
|
16
|
+
|
|
17
|
+
if (!isRelative) {
|
|
18
|
+
// The refused value is logged, never echoed into the response body.
|
|
19
|
+
ctx.log('Refusing to redirect to a non-relative URL', url);
|
|
20
|
+
|
|
21
|
+
return ctx.respond('Only relative paths may be redirected to', { code: 400 });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
ctx.log('Redirecting', url);
|
|
25
|
+
|
|
26
|
+
return ctx.redirect(url);
|
|
27
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
const { resolvedBrandHost } = require('../../../../vendor/config/index.js');
|
|
2
|
+
const { getAccountDefinitions, createAccount, seedOrderFixture, seedSessionFixture } = require('../../../../test/test-accounts.js');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* POST /test/reset-account
|
|
6
|
+
* Restore the CALLER's own seeded persona to its seed shape — the user doc
|
|
7
|
+
* `test-accounts.js` defines plus its canonical purchase record — so a browser
|
|
8
|
+
* flow that mutated a persona (a cancellation, an upgrade, a trial) can be run
|
|
9
|
+
* again without rebooting the emulator.
|
|
10
|
+
*
|
|
11
|
+
* The one route in the framework that reads the seeder from a request handler:
|
|
12
|
+
* the seeder IS the shape, so re-seeding here can never drift from the boot
|
|
13
|
+
* seed. Development/testing only, and only for the account the caller is
|
|
14
|
+
* signed in as — there is no uid parameter.
|
|
15
|
+
*/
|
|
16
|
+
module.exports = async ({ ctx, user }) => {
|
|
17
|
+
// Emulator-only: never a route outside development/testing (an explicit
|
|
18
|
+
// positive check, per the context contract — not `!isProduction()`)
|
|
19
|
+
if (!ctx.isDevelopment() && !ctx.isTesting()) {
|
|
20
|
+
return ctx.respond('Not found', { code: 404 });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Require authentication
|
|
24
|
+
if (!user.authenticated) {
|
|
25
|
+
return ctx.respond('Authentication required', { code: 401 });
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const admin = ctx.Manager.libraries.admin;
|
|
29
|
+
const config = ctx.Manager.config;
|
|
30
|
+
// An admin-key caller authenticates without being anybody, and this route
|
|
31
|
+
// only ever acts on the account it is called AS.
|
|
32
|
+
const uid = user.auth?.uid;
|
|
33
|
+
|
|
34
|
+
// The seeder resolves persona emails against the brand's HOST — the same
|
|
35
|
+
// derivation `omega emulator` seeds with, and the one the dev palette signs
|
|
36
|
+
// in on ([#708](https://github.com/Omega-JS-Stack/omega/issues/708)).
|
|
37
|
+
const domain = resolvedBrandHost(config);
|
|
38
|
+
const definitions = getAccountDefinitions(domain, config);
|
|
39
|
+
const entry = Object.entries(definitions).find(([, definition]) => definition.uid === uid);
|
|
40
|
+
|
|
41
|
+
// Only a persona the FRAMEWORK seeds may be reset: resetting deletes and
|
|
42
|
+
// recreates the account, which no real user's account may ever undergo.
|
|
43
|
+
if (!entry) {
|
|
44
|
+
ctx.log(`test/reset-account: refused — uid ${uid} is not a seeded test account`);
|
|
45
|
+
return ctx.respond('Not a seeded test account', { code: 403 });
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const [key, definition] = entry;
|
|
49
|
+
|
|
50
|
+
ctx.log(`test/reset-account: resetting persona ${key} (${definition.email}) to its seed`);
|
|
51
|
+
|
|
52
|
+
// Clear the persona's purchase records FIRST — a journey buys its own
|
|
53
|
+
// orders, and a stale one would outlive the reset and re-disqualify the
|
|
54
|
+
// persona from a trial it is supposed to be offered.
|
|
55
|
+
const orders = await admin.firestore().collection('payments-orders').where('owner', '==', uid).get();
|
|
56
|
+
await Promise.all(orders.docs.map((doc) => doc.ref.delete()));
|
|
57
|
+
|
|
58
|
+
// Re-run the seeder's own per-account primitive (auth delete + create, then
|
|
59
|
+
// the seed properties merged over the fresh doc) and stand the persona's
|
|
60
|
+
// canonical order fixture back up. Its active sessions come back too: they
|
|
61
|
+
// live in the Realtime Database rather than on the doc, so recreating the
|
|
62
|
+
// account leaves them behind — and signing out of all sessions is one of the
|
|
63
|
+
// flows a browser rehearses on this persona.
|
|
64
|
+
await createAccount(admin, definition);
|
|
65
|
+
const order = await seedOrderFixture(admin, key, config);
|
|
66
|
+
const sessions = await seedSessionFixture(admin, key);
|
|
67
|
+
|
|
68
|
+
ctx.log(`test/reset-account: ${key} reset (${orders.size} order(s) cleared, ${order ? `order ${order.orderId} reseeded` : 'no order fixture'}, ${sessions ? `${sessions.length} session(s) reseeded` : 'no session fixtures'})`);
|
|
69
|
+
|
|
70
|
+
return ctx.respond({
|
|
71
|
+
success: true,
|
|
72
|
+
persona: key,
|
|
73
|
+
uid,
|
|
74
|
+
email: definition.email,
|
|
75
|
+
ordersCleared: orders.size,
|
|
76
|
+
orderId: order?.orderId || null,
|
|
77
|
+
sessions: sessions?.length || 0,
|
|
78
|
+
});
|
|
79
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const { getPaletteRoster } = require('../../../../test/test-accounts.js');
|
|
3
|
+
const { loadSeedAccounts } = require('../../../../test/seed.js');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* GET /test/roster
|
|
7
|
+
* The personas a HUMAN switches between: every seeded account that carries a
|
|
8
|
+
* `palette` label, in the order the seeder declares them.
|
|
9
|
+
* The seed is the ONE owner of that roster ([#400](https://github.com/Omega-JS-Stack/omega/issues/400)):
|
|
10
|
+
* the dev palette used to keep a hand-curated copy of the list, and the two
|
|
11
|
+
* drifted apart the moment a persona was seeded without one being added.
|
|
12
|
+
*
|
|
13
|
+
* The WHOLE seed, both halves ([#712](https://github.com/Omega-JS-Stack/omega/issues/712)):
|
|
14
|
+
* the framework's own table plus the project's `test/_init.js` accounts — the
|
|
15
|
+
* documented extension point the seeder itself merges in. Reading the table
|
|
16
|
+
* alone made a consumer persona carrying a label invisible, which is the exact
|
|
17
|
+
* drift #400 built this route to end.
|
|
18
|
+
*
|
|
19
|
+
* Development/testing only, and deliberately unauthenticated: the palette asks
|
|
20
|
+
* for the roster before anybody is signed in, which is the whole point of it.
|
|
21
|
+
*/
|
|
22
|
+
module.exports = async ({ ctx }) => {
|
|
23
|
+
// Emulator-only: never a route outside development/testing (an explicit
|
|
24
|
+
// positive check, per the context contract, not `!isProduction()`)
|
|
25
|
+
if (!ctx.isDevelopment() && !ctx.isTesting()) {
|
|
26
|
+
return ctx.respond('Not found', { code: 404 });
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Manager.cwd is the consumer's functions/ directory; test/_init.js lives one
|
|
30
|
+
// level up at <projectRoot>/test/ — the same resolution the test-mode watcher
|
|
31
|
+
// makes. Loaded once per process, not per request.
|
|
32
|
+
const projectDir = path.dirname(ctx.Manager.cwd);
|
|
33
|
+
const projectAccounts = loadSeedAccounts({ projectDir, config: ctx.Manager.config, Manager: ctx.Manager });
|
|
34
|
+
|
|
35
|
+
const personas = getPaletteRoster(projectAccounts);
|
|
36
|
+
|
|
37
|
+
ctx.log(`test/roster: ${personas.length} palette persona(s)`);
|
|
38
|
+
|
|
39
|
+
return ctx.respond({ personas });
|
|
40
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POST /test/schema - Test schema validation
|
|
3
|
+
* Returns the resolved settings for testing purposes
|
|
4
|
+
*/
|
|
5
|
+
module.exports = async ({ ctx, user, settings }) => {
|
|
6
|
+
ctx.log('test/schema: User subscription info', {
|
|
7
|
+
subscriptionId: user.subscription?.product?.id,
|
|
8
|
+
subscriptionStatus: user.subscription?.status,
|
|
9
|
+
fullSubscription: user.subscription,
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
return ctx.respond({
|
|
13
|
+
settings,
|
|
14
|
+
user: {
|
|
15
|
+
authenticated: user.authenticated,
|
|
16
|
+
uid: user.auth?.uid || null,
|
|
17
|
+
subscription: user.subscription?.product?.id || 'basic',
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POST /test/usage - Test usage tracking
|
|
3
|
+
* Consumes the 'requests' counted feature and returns what the call left behind
|
|
4
|
+
* Signed-in callers count on their own account; anonymous callers count against
|
|
5
|
+
* their IP, which is an EXPLICIT keyed counter
|
|
6
|
+
* ([#647](https://github.com/Omega-JS-Stack/omega/issues/647))
|
|
7
|
+
*/
|
|
8
|
+
module.exports = async ({ ctx, user, settings }) => {
|
|
9
|
+
const amount = settings.amount;
|
|
10
|
+
|
|
11
|
+
// Anonymous callers are keyed EXPLICITLY — a key can never silently move a
|
|
12
|
+
// signed-in user's own counters into the anonymous store
|
|
13
|
+
const usage = user.authenticated
|
|
14
|
+
? ctx.usage
|
|
15
|
+
: ctx.usage.forKey(ctx.request.geolocation.ip);
|
|
16
|
+
|
|
17
|
+
const before = await usage.read('requests');
|
|
18
|
+
|
|
19
|
+
// Check, count and write, in one call — a 429 is thrown, never returned
|
|
20
|
+
const after = await usage.consume('requests', amount);
|
|
21
|
+
|
|
22
|
+
// Log
|
|
23
|
+
ctx.log(`test/usage: Consumed ${amount} requests`, {
|
|
24
|
+
authenticated: user.authenticated,
|
|
25
|
+
key: usage.key,
|
|
26
|
+
before: { used: before.used, left: before.left, day: before.day },
|
|
27
|
+
after: after,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
return ctx.respond({
|
|
31
|
+
feature: 'requests',
|
|
32
|
+
amount,
|
|
33
|
+
authenticated: user.authenticated,
|
|
34
|
+
key: usage.key,
|
|
35
|
+
limit: before.limit,
|
|
36
|
+
dayLimit: before.day.limit,
|
|
37
|
+
before: {
|
|
38
|
+
used: before.used,
|
|
39
|
+
left: before.left,
|
|
40
|
+
day: { used: before.day.used, left: before.day.left },
|
|
41
|
+
},
|
|
42
|
+
after: after,
|
|
43
|
+
});
|
|
44
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const powertools = require('node-powertools');
|
|
2
|
+
|
|
3
|
+
module.exports = async ({ ctx, settings }) => {
|
|
4
|
+
|
|
5
|
+
// Optional delay
|
|
6
|
+
if (settings.delay > 0) {
|
|
7
|
+
await powertools.wait(settings.delay);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// Return based on status code
|
|
11
|
+
if (settings.status >= 200 && settings.status <= 299) {
|
|
12
|
+
return ctx.respond(settings.response, { code: settings.status });
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (settings.status >= 400 && settings.status <= 599) {
|
|
16
|
+
return ctx.respond(settings.response, { code: settings.status });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Default response
|
|
20
|
+
return ctx.respond({ received: true });
|
|
21
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const uuid4 = require('uuid').v4;
|
|
2
|
+
const UIDGenerator = require('uid-generator');
|
|
3
|
+
const powertools = require('node-powertools');
|
|
4
|
+
const uidgen = new UIDGenerator(256);
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* POST /user/api-keys - Regenerate API keys
|
|
8
|
+
* Regenerates clientId and/or privateKey for the user
|
|
9
|
+
*/
|
|
10
|
+
module.exports = async ({ ctx, Manager, user, settings, libraries }) => {
|
|
11
|
+
const { admin } = libraries;
|
|
12
|
+
|
|
13
|
+
// Require authentication
|
|
14
|
+
if (!user.authenticated) {
|
|
15
|
+
return ctx.respond('Authentication required', { code: 401 });
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Get target UID
|
|
19
|
+
const uid = settings.uid;
|
|
20
|
+
|
|
21
|
+
// Require admin to regenerate other users' keys
|
|
22
|
+
if (uid !== user.auth.uid && !user.roles.admin) {
|
|
23
|
+
return ctx.respond('Admin required', { code: 403 });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Determine which keys to regenerate
|
|
27
|
+
const keys = powertools.arrayify(settings.keys);
|
|
28
|
+
const newKeys = {};
|
|
29
|
+
|
|
30
|
+
keys.forEach((key) => {
|
|
31
|
+
if (key.match(/client/i)) {
|
|
32
|
+
newKeys.clientId = uuid4();
|
|
33
|
+
} else if (key.match(/private/i)) {
|
|
34
|
+
newKeys.privateKey = uidgen.generateSync();
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Update user document
|
|
39
|
+
const write = await admin.firestore().doc(`users/${uid}`)
|
|
40
|
+
.set({
|
|
41
|
+
api: newKeys,
|
|
42
|
+
metadata: Manager.Metadata().set({ tag: 'user/api-keys' }),
|
|
43
|
+
}, { merge: true })
|
|
44
|
+
.catch((e) => e);
|
|
45
|
+
|
|
46
|
+
if (write instanceof Error) {
|
|
47
|
+
return ctx.respond(`Failed to generate keys: ${write}`, { code: 500 });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return ctx.respond(newKeys);
|
|
51
|
+
};
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHO a call acts on, and the two 400s that decide it
|
|
3
|
+
* ([#793](https://github.com/Omega-JS-Stack/omega/issues/793)): the
|
|
4
|
+
* authenticated caller, the target user an admin may name, and the destination
|
|
5
|
+
* an authorize leg may come back to.
|
|
6
|
+
*
|
|
7
|
+
* One concern, one file: the provider lookup is `_providers.js`, the secrets
|
|
8
|
+
* are `_state.js`, the steps are `_grant.js`.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const { loadProvider } = require('./_providers.js');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The 400 an action that does NOT take `uid` answers when one is passed
|
|
15
|
+
* ([#782](https://github.com/Omega-JS-Stack/omega/issues/782)).
|
|
16
|
+
*
|
|
17
|
+
* `authorize` and `tokenize` are the connecting user's OWN legs — the
|
|
18
|
+
* authorization URL is opened by their browser and the code comes back from it —
|
|
19
|
+
* so an admin cannot run them for somebody else. A caller still passing `uid`
|
|
20
|
+
* was written against the argument they used to take, and ignoring it silently
|
|
21
|
+
* would answer for the WRONG user; it fails loudly here instead, naming the
|
|
22
|
+
* argument. A plain read of another user's stored record is the admin firestore
|
|
23
|
+
* route (`GET /admin/firestore?path=users/<uid>`).
|
|
24
|
+
*
|
|
25
|
+
* @param {object} settings - The resolved route settings
|
|
26
|
+
* @returns {object|null} The error, or null when no uid was passed
|
|
27
|
+
*/
|
|
28
|
+
function droppedUidError(settings) {
|
|
29
|
+
if (!settings.uid) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
message: 'The uid parameter is not accepted by this action: it acts on the authenticated user. Use `status`, `refresh` or `delete` to act on another user as an admin, or GET /admin/firestore to read their record.',
|
|
35
|
+
code: 400,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// The rule `returnUrl` has to satisfy, in the words the 400 says it in
|
|
40
|
+
// ([#784](https://github.com/Omega-JS-Stack/omega/issues/784))
|
|
41
|
+
const RETURN_PATH_RULE = 'a path on this site: it starts with a single `/` and carries no scheme, no `//`, no backslash and no whitespace (a query and a hash are fine)';
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Whether a value is a path on this site — the ONE home of the rule
|
|
45
|
+
* ([#784](https://github.com/Omega-JS-Stack/omega/issues/784)).
|
|
46
|
+
*
|
|
47
|
+
* The value ends up assigned to `location` in the connecting user's browser, so
|
|
48
|
+
* every shape that could name another origin is out: an absolute URL, a
|
|
49
|
+
* protocol-relative `//host`, a backslash (browsers read `/\host` as `//host`),
|
|
50
|
+
* a `javascript:` scheme, and any whitespace a parser might strip on the way to
|
|
51
|
+
* one of those. What is left is a path, and a path can only land here.
|
|
52
|
+
*
|
|
53
|
+
* @param {*} value - The candidate
|
|
54
|
+
* @returns {boolean} True when it is a path on this site
|
|
55
|
+
*/
|
|
56
|
+
function isSitePath(value) {
|
|
57
|
+
return typeof value === 'string'
|
|
58
|
+
&& value.startsWith('/')
|
|
59
|
+
&& !value.startsWith('//')
|
|
60
|
+
&& !value.includes('\\')
|
|
61
|
+
&& !/\s/.test(value);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The 400 `authorize` answers when its optional `returnUrl` is not a path
|
|
66
|
+
* ([#784](https://github.com/Omega-JS-Stack/omega/issues/784)).
|
|
67
|
+
*
|
|
68
|
+
* The parameter is optional, so an absent one is no error. A value that is not a
|
|
69
|
+
* path is refused rather than dropped: a caller that asked to be sent somewhere
|
|
70
|
+
* would otherwise be silently landed on the default and never learn why.
|
|
71
|
+
*
|
|
72
|
+
* @param {object} settings - The resolved route settings
|
|
73
|
+
* @returns {object|null} The error, or null when no returnUrl was passed or it is a path
|
|
74
|
+
*/
|
|
75
|
+
function returnUrlError(settings) {
|
|
76
|
+
if (!settings.returnUrl) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (isSitePath(settings.returnUrl)) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
// The caller's value is never echoed: it is refused precisely because it may
|
|
86
|
+
// be an attacker's, and this message can end up on a page
|
|
87
|
+
message: `The returnUrl parameter must be ${RETURN_PATH_RULE}.`,
|
|
88
|
+
code: 400,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Build context object with common connection data
|
|
94
|
+
* Used by GET, POST, DELETE handlers
|
|
95
|
+
*
|
|
96
|
+
* `honorUid` is the per-action flag ([#782](https://github.com/Omega-JS-Stack/omega/issues/782)):
|
|
97
|
+
* true for the actions a trusted server may run at the provider on a user's
|
|
98
|
+
* behalf (`status`, `refresh`, `delete`), false for the ones that need the
|
|
99
|
+
* connecting user's own browser (`authorize`, `tokenize`) — those answer
|
|
100
|
+
* droppedUidError() rather than acting on anybody.
|
|
101
|
+
*
|
|
102
|
+
* @param {object} options
|
|
103
|
+
* @param {object} options.ctx - The route context
|
|
104
|
+
* @param {object} options.user - The authenticated caller
|
|
105
|
+
* @param {object} options.settings - The resolved route settings
|
|
106
|
+
* @param {boolean} [options.requireProvider] - Load the provider named in `settings`
|
|
107
|
+
* @param {boolean} [options.honorUid] - Whether an admin's `uid` acts on that user
|
|
108
|
+
* @returns {Promise<object>} The route context, or `{ error }`
|
|
109
|
+
*/
|
|
110
|
+
async function buildContext({ ctx, user, settings, requireProvider = true, honorUid = false }) {
|
|
111
|
+
const Manager = ctx.Manager;
|
|
112
|
+
const { admin } = Manager.libraries;
|
|
113
|
+
|
|
114
|
+
// Require authentication
|
|
115
|
+
if (!user.authenticated) {
|
|
116
|
+
return { error: { message: 'Authentication required', code: 401 } };
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (!honorUid) {
|
|
120
|
+
const dropped = droppedUidError(settings);
|
|
121
|
+
|
|
122
|
+
if (dropped) {
|
|
123
|
+
return { error: dropped };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Get target user (admin can manage other users)
|
|
128
|
+
const targetUid = (honorUid && settings.uid) || user.auth.uid;
|
|
129
|
+
|
|
130
|
+
if (targetUid !== user.auth.uid && !user.roles.admin) {
|
|
131
|
+
return { error: { message: 'Admin required to manage other users', code: 403 } };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Resolve target user data
|
|
135
|
+
let targetUser = user;
|
|
136
|
+
|
|
137
|
+
if (targetUid !== user.auth.uid) {
|
|
138
|
+
const doc = await admin.firestore().doc(`users/${targetUid}`).get();
|
|
139
|
+
|
|
140
|
+
if (!doc.exists) {
|
|
141
|
+
return { error: { message: 'User not found', code: 404 } };
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
targetUser = doc.data();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Build redirect URI
|
|
148
|
+
const redirectUri = `${Manager.project.websiteUrl}/connections/callback`;
|
|
149
|
+
|
|
150
|
+
// If provider not required (e.g., tokenize gets it from encrypted state), skip loading
|
|
151
|
+
if (!requireProvider) {
|
|
152
|
+
return {
|
|
153
|
+
ctx,
|
|
154
|
+
Manager,
|
|
155
|
+
admin,
|
|
156
|
+
settings,
|
|
157
|
+
targetUid,
|
|
158
|
+
targetUser,
|
|
159
|
+
redirectUri,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Provider is required
|
|
164
|
+
if (!settings.provider) {
|
|
165
|
+
return { error: { message: 'The provider parameter is required', code: 400 } };
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// The module and the credentials it was registered with, in ONE lookup: the
|
|
169
|
+
// brand's own dir first, then the package's
|
|
170
|
+
const resolved = loadProvider(settings.provider, Manager);
|
|
171
|
+
|
|
172
|
+
if (resolved.error) {
|
|
173
|
+
return { error: resolved.error };
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return {
|
|
177
|
+
ctx,
|
|
178
|
+
Manager,
|
|
179
|
+
admin,
|
|
180
|
+
connectionProvider: resolved.connectionProvider,
|
|
181
|
+
settings,
|
|
182
|
+
targetUid,
|
|
183
|
+
targetUser,
|
|
184
|
+
clientId: resolved.clientId,
|
|
185
|
+
clientSecret: resolved.clientSecret,
|
|
186
|
+
redirectUri,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
module.exports = {
|
|
191
|
+
buildContext,
|
|
192
|
+
droppedUidError,
|
|
193
|
+
returnUrlError,
|
|
194
|
+
};
|