@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,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: events/auth resolveSignupLimit(), the per-IP daily signup cap (#133)
|
|
3
|
+
*
|
|
4
|
+
* Run: npx omega test backend:events/auth-signup-limit
|
|
5
|
+
*
|
|
6
|
+
* before-create.js rate-limits signups per client IP. The cap used to be a
|
|
7
|
+
* hardcoded 2, which shared egress (NAT/CGNAT/VPN) crosses with legitimate
|
|
8
|
+
* users. It now comes from config: targets.backend.auth.signup.maxPerIpPerDay,
|
|
9
|
+
* overlaid at the top level by the config loader like every other target key.
|
|
10
|
+
*
|
|
11
|
+
* Pure function (zero I/O), called directly per the test-framework contract.
|
|
12
|
+
*/
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const { loadConfig } = require('../../dist/vendor/config/index.js');
|
|
15
|
+
const { resolveSignupLimit, DEFAULT_MAX_SIGNUPS_PER_DAY } = require('../../dist/manager/events/auth/utils.js');
|
|
16
|
+
const beforeCreate = require('../../dist/manager/events/auth/before-create.js');
|
|
17
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
18
|
+
|
|
19
|
+
// A signup event driven straight through the REAL before-create, with ONE seam:
|
|
20
|
+
// what the usage counter does when the gate calls it. That is the whole subject
|
|
21
|
+
// — whether a failure that is not a rate limit is still SOLD as one.
|
|
22
|
+
class HttpsError extends Error {
|
|
23
|
+
constructor(code, message) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = 'HttpsError';
|
|
26
|
+
this.code = code;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function runBeforeCreate(consume) {
|
|
31
|
+
const lines = [];
|
|
32
|
+
const record = (...args) => lines.push(args.join(' '));
|
|
33
|
+
|
|
34
|
+
const counter = {
|
|
35
|
+
attach: () => counter,
|
|
36
|
+
forKey: () => counter,
|
|
37
|
+
consume: consume,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const Manager = { config: {}, Usage: () => counter };
|
|
41
|
+
|
|
42
|
+
const ctx = {
|
|
43
|
+
log: record,
|
|
44
|
+
debug: record,
|
|
45
|
+
warn: record,
|
|
46
|
+
error: record,
|
|
47
|
+
report: (e, options) => {
|
|
48
|
+
const error = e instanceof Error ? e : new Error(e);
|
|
49
|
+
error.code = (options || {}).code || 500;
|
|
50
|
+
return error;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
return beforeCreate({
|
|
55
|
+
Manager,
|
|
56
|
+
ctx,
|
|
57
|
+
user: { uid: 'user-647', email: 'someone@example.com' },
|
|
58
|
+
context: { ipAddress: '203.0.113.7' },
|
|
59
|
+
libraries: { functions: { auth: { HttpsError } } },
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// The framework-defaults layer the Manager resolves at boot
|
|
64
|
+
const TEMPLATES_DIR = path.join(__dirname, '../../templates');
|
|
65
|
+
|
|
66
|
+
module.exports = defineCases({
|
|
67
|
+
description: 'resolveSignupLimit(): per-IP daily signup cap from config',
|
|
68
|
+
type: 'group',
|
|
69
|
+
|
|
70
|
+
tests: [
|
|
71
|
+
{
|
|
72
|
+
name: 'framework-default-is-the-shipped-template-value',
|
|
73
|
+
auth: 'none',
|
|
74
|
+
|
|
75
|
+
async run({ assert }) {
|
|
76
|
+
const { config } = loadConfig(TEMPLATES_DIR, 'backend');
|
|
77
|
+
|
|
78
|
+
assert.equal(config.auth?.signup?.maxPerIpPerDay, 2, 'templates/config/omega.json5 ships the default cap');
|
|
79
|
+
assert.equal(resolveSignupLimit(config), 2, 'the shipped default resolves through the guard');
|
|
80
|
+
assert.equal(DEFAULT_MAX_SIGNUPS_PER_DAY, 2, 'the in-code fallback matches the shipped default');
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
{
|
|
85
|
+
name: 'configured-value-wins',
|
|
86
|
+
auth: 'none',
|
|
87
|
+
|
|
88
|
+
async run({ assert }) {
|
|
89
|
+
assert.equal(resolveSignupLimit({ auth: { signup: { maxPerIpPerDay: 25 } } }), 25);
|
|
90
|
+
assert.equal(resolveSignupLimit({ auth: { signup: { maxPerIpPerDay: 1 } } }), 1);
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
{
|
|
95
|
+
name: 'unconfigured-and-invalid-values-keep-the-default',
|
|
96
|
+
auth: 'none',
|
|
97
|
+
|
|
98
|
+
async run({ assert }) {
|
|
99
|
+
// Nothing configured: a config with no auth block at all
|
|
100
|
+
assert.equal(resolveSignupLimit({}), DEFAULT_MAX_SIGNUPS_PER_DAY);
|
|
101
|
+
assert.equal(resolveSignupLimit(undefined), DEFAULT_MAX_SIGNUPS_PER_DAY);
|
|
102
|
+
|
|
103
|
+
// Garbage is a validation error (@omega.js/config hard-fails it); the
|
|
104
|
+
// guard keeps the default rather than running the IP check unprotected
|
|
105
|
+
for (const value of [0, -1, 2.5, '25', null]) {
|
|
106
|
+
assert.equal(resolveSignupLimit({ auth: { signup: { maxPerIpPerDay: value } } }), DEFAULT_MAX_SIGNUPS_PER_DAY, `${value} falls back to the default`);
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
// The gate's catch used to swallow EVERYTHING consume() could throw. A
|
|
111
|
+
// Firestore outage, a programmer error, a 500 of any kind came back to the
|
|
112
|
+
// caller as "too many signups from this IP" — a diagnosis nobody could act
|
|
113
|
+
// on, and one that quietly told a legitimate user to wait a day.
|
|
114
|
+
{
|
|
115
|
+
name: 'a failure that is not a rate limit is never sold as one',
|
|
116
|
+
auth: 'none',
|
|
117
|
+
|
|
118
|
+
async run({ assert, ctx }) {
|
|
119
|
+
const boom = Object.assign(new Error('Firestore unavailable'), { code: 500 });
|
|
120
|
+
|
|
121
|
+
const thrown = await runBeforeCreate(async () => { throw boom; }).catch((e) => e);
|
|
122
|
+
|
|
123
|
+
assert.equal(thrown, boom, 'the original error propagates untouched');
|
|
124
|
+
assert.equal(thrown.name, 'Error', 'not converted into an auth HttpsError');
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
{
|
|
129
|
+
name: 'a real 429 still blocks the signup as resource-exhausted',
|
|
130
|
+
auth: 'none',
|
|
131
|
+
|
|
132
|
+
async run({ assert }) {
|
|
133
|
+
const refusal = Object.assign(new Error('You have used all 2 of your signups'), { code: 429 });
|
|
134
|
+
|
|
135
|
+
const thrown = await runBeforeCreate(async () => { throw refusal; }).catch((e) => e);
|
|
136
|
+
|
|
137
|
+
assert.equal(thrown.name, 'HttpsError', 'a rate limit is the one thing this catch is for');
|
|
138
|
+
assert.equal(thrown.code, 'resource-exhausted');
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
],
|
|
142
|
+
});
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: the three remaining auth triggers open with the uid and nothing else
|
|
3
|
+
* ([#657](https://github.com/Omega-JS-Stack/omega/issues/657)).
|
|
4
|
+
*
|
|
5
|
+
* `beforeCreate`, `beforeSignIn` and `onDelete` each used to open with
|
|
6
|
+
* `ctx.log(..., user, context)` — the whole Firebase user record (email, display
|
|
7
|
+
* name, provider data, password hash) plus the trigger context (IP, user agent,
|
|
8
|
+
* credential) into Cloud Logging, on every signup and every sign-in. The headline
|
|
9
|
+
* is now the uid alone, the #641 shape `onCreate` already carries, and the fat
|
|
10
|
+
* payload sits one level down at `debug` — silent on a normal run, one
|
|
11
|
+
* `OMEGA_DEBUG=1` away.
|
|
12
|
+
*
|
|
13
|
+
* Pure: the log seam #632 added is `ctx` itself, so a recorder in its place reads
|
|
14
|
+
* every line the handler writes with no emulator, no admin SDK and no ports. The
|
|
15
|
+
* only stand-ins are that recorder and the Firestore/Usage doubles the handlers
|
|
16
|
+
* reach for AFTER the line under test.
|
|
17
|
+
*
|
|
18
|
+
* Note on the IP: `beforeCreate`'s rate-limit lines still name the client IP,
|
|
19
|
+
* deliberately — it is the rate limiter's KEY, not the user's identity. The line
|
|
20
|
+
* this test is about is the headline, and the headline is asserted whole.
|
|
21
|
+
*
|
|
22
|
+
* Run: npx omega test framework:events/auth-trigger-log-privacy
|
|
23
|
+
*/
|
|
24
|
+
const beforeCreate = require('../../dist/manager/events/auth/before-create.js');
|
|
25
|
+
const beforeSignIn = require('../../dist/manager/events/auth/before-signin.js');
|
|
26
|
+
const onDelete = require('../../dist/manager/events/auth/on-delete.js');
|
|
27
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
28
|
+
|
|
29
|
+
const UID = '_test-657-uid';
|
|
30
|
+
const EMAIL = 'leaky.person@omegajs-test.dev';
|
|
31
|
+
const DISPLAY_NAME = 'Leaky Person';
|
|
32
|
+
const IP = '203.0.113.9';
|
|
33
|
+
|
|
34
|
+
// A UserRecord the way both trigger flavors receive it — the material that used
|
|
35
|
+
// to ride the headline.
|
|
36
|
+
const USER = {
|
|
37
|
+
uid: UID,
|
|
38
|
+
email: EMAIL,
|
|
39
|
+
emailVerified: true,
|
|
40
|
+
displayName: DISPLAY_NAME,
|
|
41
|
+
photoURL: 'https://cdn.omegajs-test.dev/leaky-person.png',
|
|
42
|
+
passwordHash: 'hash-657',
|
|
43
|
+
providerData: [{ providerId: 'password', uid: EMAIL, email: EMAIL, displayName: DISPLAY_NAME }],
|
|
44
|
+
metadata: { creationTime: '2026-08-30T00:00:00Z', lastSignInTime: '2026-08-30T00:00:00Z' },
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// AuthEventContext (blocking functions): carries the IP, the user agent, the locale.
|
|
48
|
+
const AUTH_CONTEXT = {
|
|
49
|
+
ipAddress: IP,
|
|
50
|
+
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)',
|
|
51
|
+
locale: 'en-US',
|
|
52
|
+
eventId: 'event-657',
|
|
53
|
+
additionalUserInfo: { providerId: 'password', email: EMAIL, isNewUser: true },
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// EventContext (1st-gen triggers): no IP, no user agent.
|
|
57
|
+
const EVENT_CONTEXT = {
|
|
58
|
+
eventId: 'event-657',
|
|
59
|
+
eventType: 'providers/firebase.auth/eventTypes/user.delete',
|
|
60
|
+
resource: { service: 'firebaseauth.googleapis.com' },
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// The log seam: every level the handlers write to, recorded verbatim.
|
|
64
|
+
function createRecorder() {
|
|
65
|
+
const calls = { log: [], debug: [], error: [] };
|
|
66
|
+
const record = (level) => (...args) => calls[level].push(args);
|
|
67
|
+
|
|
68
|
+
return {
|
|
69
|
+
calls: calls,
|
|
70
|
+
ctx: { log: record('log'), debug: record('debug'), error: record('error') },
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// A call as one string, the way it lands in Cloud Logging.
|
|
75
|
+
function render(args) {
|
|
76
|
+
return args.map((arg) => (typeof arg === 'string' ? arg : JSON.stringify(arg))).join(' ');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// No hooks/auth/*.js under this dir, so the consumer hook lookup is a no-op.
|
|
80
|
+
const MANAGER = { cwd: __dirname, config: {} };
|
|
81
|
+
|
|
82
|
+
async function runBeforeCreate() {
|
|
83
|
+
const { calls, ctx } = createRecorder();
|
|
84
|
+
|
|
85
|
+
// The rate limiter is the handler's real path — only the Usage counter is a
|
|
86
|
+
// double: attach/forKey/consume, the #647 shape the gate calls.
|
|
87
|
+
const counter = {
|
|
88
|
+
attach: () => counter,
|
|
89
|
+
forKey: () => counter,
|
|
90
|
+
consume: async () => ({ used: 1, left: 1, day: { used: 1, left: 1 } }),
|
|
91
|
+
};
|
|
92
|
+
const Manager = { ...MANAGER, Usage: () => counter };
|
|
93
|
+
|
|
94
|
+
await beforeCreate({ Manager: Manager, ctx: ctx, user: USER, context: AUTH_CONTEXT, libraries: { functions: {} } });
|
|
95
|
+
|
|
96
|
+
return calls;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function runBeforeSignIn() {
|
|
100
|
+
const { calls, ctx } = createRecorder();
|
|
101
|
+
const admin = { firestore: () => ({ doc: () => ({ set: async () => undefined }) }) };
|
|
102
|
+
|
|
103
|
+
await beforeSignIn({ Manager: MANAGER, ctx: ctx, user: USER, context: AUTH_CONTEXT, libraries: { admin: admin } });
|
|
104
|
+
|
|
105
|
+
return calls;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async function runOnDelete() {
|
|
109
|
+
const { calls, ctx } = createRecorder();
|
|
110
|
+
|
|
111
|
+
// No user doc, so the handler writes its headline and returns before the
|
|
112
|
+
// delete, the marketing removal and the conversion.
|
|
113
|
+
const admin = { firestore: () => ({ doc: () => ({ get: async () => ({ exists: false }) }) }) };
|
|
114
|
+
|
|
115
|
+
await onDelete({ Manager: MANAGER, ctx: ctx, user: USER, context: EVENT_CONTEXT, libraries: { admin: admin } });
|
|
116
|
+
|
|
117
|
+
return calls;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// What the marketing library answers `remove()` with: one entry per enabled
|
|
121
|
+
// provider, each carrying that provider's own payload — the address included.
|
|
122
|
+
const MARKETING_RESULT = {
|
|
123
|
+
campaigns: { success: true, jobId: 'job-710', contact: { email: EMAIL, name: DISPLAY_NAME } },
|
|
124
|
+
newsletter: { success: true, subscriber: { id: 'sub-710', email: EMAIL } },
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
// The full run: an existing doc, so the handler goes past its headline into the
|
|
128
|
+
// delete, the marketing removal and the conversion. The marketing removal is
|
|
129
|
+
// fire-and-forget, so the caller drains the microtask queue before reading.
|
|
130
|
+
async function runOnDeleteWithDoc() {
|
|
131
|
+
const { calls, ctx } = createRecorder();
|
|
132
|
+
|
|
133
|
+
const admin = {
|
|
134
|
+
firestore: () => ({
|
|
135
|
+
doc: () => ({
|
|
136
|
+
get: async () => ({ exists: true, data: () => ({ auth: { uid: UID, email: EMAIL } }) }),
|
|
137
|
+
delete: async () => undefined,
|
|
138
|
+
}),
|
|
139
|
+
}),
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
const Manager = { ...MANAGER, Email: () => ({ remove: async () => MARKETING_RESULT }) };
|
|
143
|
+
|
|
144
|
+
await onDelete({ Manager: Manager, ctx: ctx, user: USER, context: EVENT_CONTEXT, libraries: { admin: admin } });
|
|
145
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
146
|
+
|
|
147
|
+
return calls;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// The two claims every trigger makes, asserted the same way for each.
|
|
151
|
+
function assertHeadlineIsUidAlone({ assert, calls, tag }) {
|
|
152
|
+
const headline = calls.log[0];
|
|
153
|
+
|
|
154
|
+
assert.ok(headline, `${tag}: no headline line was logged`);
|
|
155
|
+
assert.equal(headline[0], `${tag}: ${UID}`, `${tag}: headline is not the uid alone: ${render(headline)}`);
|
|
156
|
+
assert.equal(headline.length, 1, `${tag}: the headline carries a payload: ${render(headline.slice(1))}`);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function assertNothingPrivateRidesTheLog({ assert, calls, tag, context }) {
|
|
160
|
+
const written = [...calls.log, ...calls.error];
|
|
161
|
+
|
|
162
|
+
for (const args of written) {
|
|
163
|
+
const line = render(args);
|
|
164
|
+
|
|
165
|
+
assert.equal(line.includes(EMAIL), false, `${tag}: email written to a log line: ${line}`);
|
|
166
|
+
assert.equal(line.includes(DISPLAY_NAME), false, `${tag}: display name written to a log line: ${line}`);
|
|
167
|
+
assert.equal(args.includes(USER), false, `${tag}: the user record rides a log line: ${line}`);
|
|
168
|
+
assert.equal(args.includes(context), false, `${tag}: the trigger context rides a log line: ${line}`);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Not deleted — moved behind the debug gate, which is dropped whole unless
|
|
172
|
+
// OMEGA_DEBUG is set.
|
|
173
|
+
const records = calls.debug.filter((args) => args.includes(USER) && args.includes(context));
|
|
174
|
+
|
|
175
|
+
assert.equal(records.length, 1, `${tag}: the full record should stay reachable at debug level`);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
module.exports = defineCases({
|
|
179
|
+
description: 'auth triggers log the uid only',
|
|
180
|
+
type: 'group',
|
|
181
|
+
|
|
182
|
+
tests: [
|
|
183
|
+
{
|
|
184
|
+
name: 'before-create-headline-is-the-uid-alone',
|
|
185
|
+
async run({ assert }) {
|
|
186
|
+
assertHeadlineIsUidAlone({ assert: assert, calls: await runBeforeCreate(), tag: 'beforeCreate' });
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
|
|
190
|
+
{
|
|
191
|
+
name: 'before-create-never-logs-the-record-or-the-context',
|
|
192
|
+
async run({ assert }) {
|
|
193
|
+
assertNothingPrivateRidesTheLog({ assert: assert, calls: await runBeforeCreate(), tag: 'beforeCreate', context: AUTH_CONTEXT });
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
|
|
197
|
+
{
|
|
198
|
+
name: 'before-signin-headline-is-the-uid-alone',
|
|
199
|
+
async run({ assert }) {
|
|
200
|
+
assertHeadlineIsUidAlone({ assert: assert, calls: await runBeforeSignIn(), tag: 'beforeSignIn' });
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
|
|
204
|
+
{
|
|
205
|
+
name: 'before-signin-never-logs-the-record-or-the-context',
|
|
206
|
+
async run({ assert }) {
|
|
207
|
+
assertNothingPrivateRidesTheLog({ assert: assert, calls: await runBeforeSignIn(), tag: 'beforeSignIn', context: AUTH_CONTEXT });
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
|
|
211
|
+
{
|
|
212
|
+
name: 'on-delete-headline-is-the-uid-alone',
|
|
213
|
+
async run({ assert }) {
|
|
214
|
+
assertHeadlineIsUidAlone({ assert: assert, calls: await runOnDelete(), tag: 'onDelete' });
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
|
|
218
|
+
{
|
|
219
|
+
name: 'on-delete-never-logs-the-record-or-the-context',
|
|
220
|
+
async run({ assert }) {
|
|
221
|
+
assertNothingPrivateRidesTheLog({ assert: assert, calls: await runOnDelete(), tag: 'onDelete', context: EVENT_CONTEXT });
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
|
|
225
|
+
// ─── The marketing removal's own line ([#710]) ───
|
|
226
|
+
|
|
227
|
+
{
|
|
228
|
+
name: 'on-delete-marketing-remove-logs-the-uid-and-a-count',
|
|
229
|
+
async run({ assert }) {
|
|
230
|
+
const calls = await runOnDeleteWithDoc();
|
|
231
|
+
const line = calls.log.find((args) => String(args[0]).includes('Marketing remove'));
|
|
232
|
+
|
|
233
|
+
assert.ok(line, `no marketing-remove line was logged: ${calls.log.map(render).join(' | ')}`);
|
|
234
|
+
assert.equal(line.length, 1, `the line carries the provider result: ${render(line.slice(1))}`);
|
|
235
|
+
assert.match(render(line), new RegExp(UID), 'the line should name the account the removal was for');
|
|
236
|
+
assert.match(render(line), /2/, 'the line should count the providers that answered');
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
|
|
240
|
+
{
|
|
241
|
+
name: 'on-delete-marketing-remove-keeps-the-result-behind-the-debug-gate',
|
|
242
|
+
async run({ assert }) {
|
|
243
|
+
const calls = await runOnDeleteWithDoc();
|
|
244
|
+
|
|
245
|
+
for (const args of [...calls.log, ...calls.error]) {
|
|
246
|
+
assert.equal(args.includes(MARKETING_RESULT), false, `the provider result rides a log line: ${render(args)}`);
|
|
247
|
+
assert.equal(render(args).includes(EMAIL), false, `email written to a log line: ${render(args)}`);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const records = calls.debug.filter((args) => args.includes(MARKETING_RESULT));
|
|
251
|
+
|
|
252
|
+
assert.equal(records.length, 1, 'the provider result should stay reachable at debug level');
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
],
|
|
256
|
+
});
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: the documented cron job actually RUNS
|
|
3
|
+
* ([#495](https://github.com/Omega-JS-Stack/omega/issues/495)).
|
|
4
|
+
*
|
|
5
|
+
* `docs/routes.md` § "New Cron Job (Consumer Project)" documented a
|
|
6
|
+
* `Job.prototype.main` constructor shape, but the runner does
|
|
7
|
+
* `await handler({ Manager, ctx, context, libraries })` — a job written to the
|
|
8
|
+
* doc was called as a plain function, its body never ran, and nothing errored.
|
|
9
|
+
* That is the defect class that made legacy playlisteer's clear-promotions
|
|
10
|
+
* route 500 for years (a pre-BEM export shape meeting a newer middleware).
|
|
11
|
+
*
|
|
12
|
+
* So the doc's example is not read here, it is EXECUTED: lifted out of the
|
|
13
|
+
* markdown verbatim, dropped into a jobs directory, and run through the
|
|
14
|
+
* runner's own `loadAndExecuteJobs`. A doc that drifts from the call shape goes
|
|
15
|
+
* red the day it drifts.
|
|
16
|
+
*
|
|
17
|
+
* Run: npx omega test backend:events/cron-job-doc-shape
|
|
18
|
+
*/
|
|
19
|
+
const path = require('path');
|
|
20
|
+
const jetpack = require('fs-jetpack');
|
|
21
|
+
|
|
22
|
+
const { loadAndExecuteJobs } = require('../../dist/manager/events/cron/runner.js');
|
|
23
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
24
|
+
|
|
25
|
+
const ROUTES_DOC = path.join(__dirname, '..', '..', 'docs', 'routes.md');
|
|
26
|
+
const HEADING = '## New Cron Job (Consumer Project)';
|
|
27
|
+
|
|
28
|
+
// The line the documented job logs when its body runs.
|
|
29
|
+
const JOB_MARKER = 'Running daily job...';
|
|
30
|
+
|
|
31
|
+
/** The first fenced javascript block under the cron-job heading, verbatim. */
|
|
32
|
+
function documentedCronJob() {
|
|
33
|
+
const doc = jetpack.read(ROUTES_DOC);
|
|
34
|
+
const heading = doc.indexOf(HEADING);
|
|
35
|
+
|
|
36
|
+
if (heading === -1) {
|
|
37
|
+
throw new Error(`docs/routes.md no longer carries "${HEADING}" — the consumer cron recipe must stay documented`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const fence = doc.indexOf('```javascript', heading);
|
|
41
|
+
const start = doc.indexOf('\n', fence) + 1;
|
|
42
|
+
const end = doc.indexOf('```', start);
|
|
43
|
+
|
|
44
|
+
return doc.slice(start, end);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Run `fn` with console.log captured. */
|
|
48
|
+
async function capturingLogs(fn) {
|
|
49
|
+
const lines = [];
|
|
50
|
+
const original = console.log;
|
|
51
|
+
|
|
52
|
+
console.log = (...args) => lines.push(args.map((a) => String(a)).join(' '));
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
await fn();
|
|
56
|
+
} finally {
|
|
57
|
+
console.log = original;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return lines.join('\n');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
module.exports = defineCases({
|
|
64
|
+
description: 'the documented consumer cron job runs under the real runner',
|
|
65
|
+
type: 'group',
|
|
66
|
+
|
|
67
|
+
tests: [
|
|
68
|
+
{
|
|
69
|
+
name: 'the-documented-job-body-executes',
|
|
70
|
+
auth: 'none',
|
|
71
|
+
|
|
72
|
+
async run({ assert, Manager }) {
|
|
73
|
+
const jobsDir = jetpack.tmpDir({ prefix: 'omega-cron-doc-' }).path();
|
|
74
|
+
jetpack.write(path.join(jobsDir, 'documented-job.js'), documentedCronJob());
|
|
75
|
+
|
|
76
|
+
const output = await capturingLogs(() => loadAndExecuteJobs('daily', jobsDir, Manager, {}));
|
|
77
|
+
|
|
78
|
+
assert.ok(output.includes(JOB_MARKER), 'the documented job must RUN when the runner calls it — a job the runner cannot call fails silently, exactly as this one did');
|
|
79
|
+
assert.equal(output.includes('Error executing:'), false, `the documented job must not throw: ${output}`);
|
|
80
|
+
assert.ok(output.includes('Completed!'), 'the runner must report the documented job complete');
|
|
81
|
+
|
|
82
|
+
jetpack.remove(jobsDir);
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
{
|
|
87
|
+
name: 'the-documented-job-is-authored-under-src',
|
|
88
|
+
auth: 'none',
|
|
89
|
+
|
|
90
|
+
async run({ assert }) {
|
|
91
|
+
// Consumers are src-first: `dist/` is staged output, so a doc naming
|
|
92
|
+
// the runtime path teaches an edit that the next build wipes.
|
|
93
|
+
const doc = jetpack.read(ROUTES_DOC);
|
|
94
|
+
const heading = doc.indexOf(HEADING);
|
|
95
|
+
const recipe = doc.slice(heading, doc.indexOf('```', doc.indexOf('```javascript', heading) + 3));
|
|
96
|
+
|
|
97
|
+
assert.match(recipe, /src\/hooks\/cron\/daily\//, 'the cron recipe must name the AUTHORED path (src/hooks/cron/daily/)');
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
});
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The daily usage reset cron (`events/cron/daily/reset-usage.js`)
|
|
3
|
+
* ([#647](https://github.com/Omega-JS-Stack/omega/issues/647)).
|
|
4
|
+
*
|
|
5
|
+
* The promises, all of them things a user is silently punished by when broken:
|
|
6
|
+
* - EVERY counter block under `usage` is reset, whatever its key. Catalog
|
|
7
|
+
* membership is not the test: the framework's own anti-abuse gates count on
|
|
8
|
+
* the user doc with an explicit limit and carry no catalog entry, so a
|
|
9
|
+
* catalog-only sweep left them growing forever and the user permanently
|
|
10
|
+
* refused after five email-preference changes;
|
|
11
|
+
* - `usage.overrides` is NEVER touched — an admin granted those credits and a
|
|
12
|
+
* reset is not a revoke;
|
|
13
|
+
* - the day counter resets every day, the month counter only on the 1st;
|
|
14
|
+
* - one write per user, however many counters moved.
|
|
15
|
+
*
|
|
16
|
+
* Plain-node unit test (no emulator): the cron's collaborators are the
|
|
17
|
+
* collection walk and the document write, and both are recorded here rather
|
|
18
|
+
* than performed — which is what makes the resulting patch assertable.
|
|
19
|
+
*/
|
|
20
|
+
const assert = require('node:assert');
|
|
21
|
+
|
|
22
|
+
const resetUsage = require('../../dist/manager/events/cron/daily/reset-usage.js');
|
|
23
|
+
const defineCases = require('../../dist/vendor/devkit/test/define-cases.js');
|
|
24
|
+
|
|
25
|
+
const CATALOG = {
|
|
26
|
+
saves: { name: 'Saves', usage: {} },
|
|
27
|
+
support: { name: 'Priority support' },
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// One user carrying three kinds of key under `usage`: a catalog feature, a
|
|
31
|
+
// framework gate the catalog never defines, and the overrides map.
|
|
32
|
+
function userDoc() {
|
|
33
|
+
return {
|
|
34
|
+
saves: { monthly: 40, daily: 4, total: 900 },
|
|
35
|
+
'email-preferences': { monthly: 5, daily: 5, total: 12 },
|
|
36
|
+
overrides: { saves: 500 },
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Run the whole cron over one synthetic user and hand back what it wrote. */
|
|
41
|
+
async function runCron() {
|
|
42
|
+
const writes = [];
|
|
43
|
+
const usage = userDoc();
|
|
44
|
+
|
|
45
|
+
const doc = {
|
|
46
|
+
id: 'user-647',
|
|
47
|
+
ref: { update: async (patch) => writes.push(patch) },
|
|
48
|
+
data: () => ({ usage: usage }),
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const Manager = {
|
|
52
|
+
config: { features: CATALOG },
|
|
53
|
+
storage: () => ({ setState: () => ({ write: () => {} }) }),
|
|
54
|
+
Utilities: () => ({
|
|
55
|
+
// Every query answers with the one user — the cron dedupes by doc id, so
|
|
56
|
+
// a user found by several field paths is still written once
|
|
57
|
+
iterateCollection: async (handler) => handler({ docs: [doc] }),
|
|
58
|
+
}),
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const ctx = { log: () => {}, warn: () => {}, error: () => {}, report: () => {} };
|
|
62
|
+
const libraries = { admin: { firestore: () => ({ recursiveDelete: async () => {}, collection: () => ({}) }) } };
|
|
63
|
+
|
|
64
|
+
await resetUsage({ Manager, ctx, context: {}, libraries });
|
|
65
|
+
|
|
66
|
+
return { writes, usage };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
module.exports = defineCases({
|
|
70
|
+
description: 'Daily usage reset cron',
|
|
71
|
+
type: 'group',
|
|
72
|
+
|
|
73
|
+
tests: [
|
|
74
|
+
{
|
|
75
|
+
name: 'every counter block resets — a counter the catalog never defined included',
|
|
76
|
+
|
|
77
|
+
async run() {
|
|
78
|
+
const { writes } = await runCron();
|
|
79
|
+
|
|
80
|
+
assert.equal(writes.length, 1, 'one write per user, however many counters moved');
|
|
81
|
+
|
|
82
|
+
const written = writes[0].usage;
|
|
83
|
+
|
|
84
|
+
assert.equal(written.saves.daily, 0, 'the catalog feature reset');
|
|
85
|
+
assert.equal(
|
|
86
|
+
written['email-preferences'].daily,
|
|
87
|
+
0,
|
|
88
|
+
'and so did the framework gate the catalog never defines — the counter that used to grow forever',
|
|
89
|
+
);
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
{
|
|
94
|
+
name: 'the month counter survives a day that is not the 1st',
|
|
95
|
+
|
|
96
|
+
async run() {
|
|
97
|
+
const { writes } = await runCron();
|
|
98
|
+
const written = writes[0].usage;
|
|
99
|
+
const isFirst = new Date().getDate() === 1;
|
|
100
|
+
|
|
101
|
+
assert.equal(written.saves.monthly, isFirst ? 0 : 40, 'the month resets on the 1st and only then');
|
|
102
|
+
assert.equal(written.saves.total, 900, 'the all-time counter never resets');
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
{
|
|
107
|
+
name: 'overrides are never touched — a reset is not a revoke',
|
|
108
|
+
|
|
109
|
+
async run() {
|
|
110
|
+
const { writes } = await runCron();
|
|
111
|
+
|
|
112
|
+
assert.deepEqual(writes[0].usage.overrides, { saves: 500 }, 'the granted credits survive the sweep');
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
});
|