@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,541 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middleware
|
|
3
|
+
* Used to handle middleware for the ctx
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const path = require('path');
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const powertools = require('node-powertools');
|
|
9
|
+
const { merge } = require('lodash');
|
|
10
|
+
const JSON5 = require('json5');
|
|
11
|
+
const User = require('./user.js');
|
|
12
|
+
const redactSecret = require('./redact-secret.js');
|
|
13
|
+
|
|
14
|
+
// The channels a credential arrives on, one-to-one with the lanes
|
|
15
|
+
// context/authenticate.js reads: the bearer/API-key header, the admin key, the
|
|
16
|
+
// __session cookie, and the two payload keys. Anything here is rendered
|
|
17
|
+
// presence + last-4 before it reaches a log line
|
|
18
|
+
// ([#275](https://github.com/Omega-JS-Stack/omega/issues/275)).
|
|
19
|
+
const CREDENTIAL_HEADERS = ['authorization', 'omega-admin-key', 'cookie'];
|
|
20
|
+
const CREDENTIAL_DATA_KEYS = ['apikey', 'authenticationtoken'];
|
|
21
|
+
|
|
22
|
+
// The credential FAMILIES a RESPONSE carries, at any depth. `GET /omega/user`
|
|
23
|
+
// answers the whole user record, so the response log line printed every
|
|
24
|
+
// connected provider's token and the caller's own key
|
|
25
|
+
// ([#796](https://github.com/Omega-JS-Stack/omega/issues/796)). A key is
|
|
26
|
+
// matched by its NORMALIZED spelling (lower-cased, `-` and `_` stripped), so
|
|
27
|
+
// `access_token`, `accessToken` and `Access-Token` are one key and every
|
|
28
|
+
// provider's spelling is covered by the family it ends with: `token` catches
|
|
29
|
+
// the OAuth pair, the `signInToken` an admin custom token rides, and
|
|
30
|
+
// `authenticationToken`; `apikey` and `privatekey` catch `api_key` /
|
|
31
|
+
// `privateKey`; `secret` catches `clientSecret` and `webhook_secret`.
|
|
32
|
+
const CREDENTIAL_RESPONSE_SUFFIXES = ['secret', 'token', 'password', 'privatekey', 'apikey'];
|
|
33
|
+
|
|
34
|
+
// The credential names no family suffix catches.
|
|
35
|
+
const CREDENTIAL_RESPONSE_KEYS = ['sessioncookie'];
|
|
36
|
+
|
|
37
|
+
// What a credential that is not a string logs as. A connection's whole `token`
|
|
38
|
+
// object IS the credential (the access and refresh pair together), so it is
|
|
39
|
+
// replaced as one piece instead of being walked key by key.
|
|
40
|
+
const REDACTED_OBJECT = '***(redacted object)';
|
|
41
|
+
|
|
42
|
+
// The `test/` route folder is DEVELOPMENT-ONLY: it exists to exercise the
|
|
43
|
+
// framework (echo the settings engine, increment a usage counter, reset a
|
|
44
|
+
// seeded persona), and nothing in it belongs at a production URL.
|
|
45
|
+
// There are no exceptions: the one route that used to need a carve-out here —
|
|
46
|
+
// the liveness + version probe @omega.js/manager's live API check reads on a
|
|
47
|
+
// PRODUCTION host — is a real route now, `routes/health`.
|
|
48
|
+
const DEV_ONLY_ROUTE_FOLDER = 'test';
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The route path's segments, normalized the SAME way the loader's
|
|
52
|
+
* path.resolve() below will read it. BackendRouter takes this straight off the
|
|
53
|
+
* request URL, so every decision must key off the normalized form or a caller
|
|
54
|
+
* walks past it with `./`, `//` or `x/../` and still lands on the handler.
|
|
55
|
+
* @param {string} routeName - Route path (e.g. 'test/usage', './test/usage')
|
|
56
|
+
* @returns {string[]} Segments ('x/../test/usage' → ['test', 'usage'])
|
|
57
|
+
*/
|
|
58
|
+
function normalizeRouteSegments(routeName) {
|
|
59
|
+
return path.posix
|
|
60
|
+
.normalize(String(routeName || '').replace(/\.js$/, '').toLowerCase())
|
|
61
|
+
.split('/')
|
|
62
|
+
.filter((segment) => segment && segment !== '.');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Whether a route path names something OUTSIDE the routes directory. A leading
|
|
67
|
+
* `..` is refused even when it climbs back in (`../routes/test/usage` resolves
|
|
68
|
+
* right back to `routes/test/usage`, walking past every folder-level gate), and
|
|
69
|
+
* an absolute path is refused because path.resolve() would hand it the whole
|
|
70
|
+
* filesystem — `/omega/../schemas/test/usage` otherwise require()s a schema
|
|
71
|
+
* module as a handler.
|
|
72
|
+
* @param {string} routeName - Route path
|
|
73
|
+
* @returns {boolean}
|
|
74
|
+
*/
|
|
75
|
+
function isRouteOutsideRoutesDir(routeName) {
|
|
76
|
+
const raw = String(routeName || '').replace(/\.js$/, '');
|
|
77
|
+
|
|
78
|
+
if (path.posix.isAbsolute(raw)) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return normalizeRouteSegments(raw)[0] === '..';
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Whether a route must be refused because it belongs to a development-only
|
|
87
|
+
* folder and this is production. ONE guard for the whole folder instead of a
|
|
88
|
+
* copy per handler, so a NEW `routes/test/*` file is gated the day it lands.
|
|
89
|
+
* @param {string} routeName - Route path (e.g. 'test/usage', 'user/sign-up')
|
|
90
|
+
* @param {string} environment - Manager.getEnvironment() ('development' | 'testing' | 'production')
|
|
91
|
+
* @returns {boolean}
|
|
92
|
+
*/
|
|
93
|
+
function isDevOnlyRouteBlocked(routeName, environment) {
|
|
94
|
+
const segments = normalizeRouteSegments(routeName);
|
|
95
|
+
|
|
96
|
+
if (segments[0] !== DEV_ONLY_ROUTE_FOLDER) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return environment === 'production';
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function Middleware(m, req, res) {
|
|
104
|
+
const self = this;
|
|
105
|
+
|
|
106
|
+
self.Manager = m;
|
|
107
|
+
self.req = req;
|
|
108
|
+
self.res = res;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
Middleware.prototype.run = function (libPath, options) {
|
|
112
|
+
const self = this;
|
|
113
|
+
|
|
114
|
+
// Shortcuts
|
|
115
|
+
const Manager = self.Manager;
|
|
116
|
+
const req = self.req;
|
|
117
|
+
const res = self.res;
|
|
118
|
+
const { cors } = Manager.libraries;
|
|
119
|
+
|
|
120
|
+
return cors(req, res, async () => {
|
|
121
|
+
const ctx = Manager.RouteContext({req: req, res: res});
|
|
122
|
+
|
|
123
|
+
// A route path may only ever name a handler INSIDE the routes directory.
|
|
124
|
+
// It arrives off the request URL, and the loader below feeds it straight to
|
|
125
|
+
// path.resolve() — so refuse anything that climbs out FIRST, before any
|
|
126
|
+
// folder-level gate keys off a path that resolve() would rewrite.
|
|
127
|
+
if (isRouteOutsideRoutesDir(libPath)) {
|
|
128
|
+
ctx.log(`Middleware.run(): Refused ${libPath} — a route path may not escape the routes directory`);
|
|
129
|
+
|
|
130
|
+
return ctx.respond('Not found', {code: 404});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Development-only route folders are 404'd in production. This is the one
|
|
134
|
+
// place BOTH request paths converge — the deployed omega_api function
|
|
135
|
+
// (Manager._processMiddleware) and the local express server
|
|
136
|
+
// (Manager.setupCustomServer) — so gating here gates every test route at
|
|
137
|
+
// once, including any added later.
|
|
138
|
+
if (isDevOnlyRouteBlocked(libPath, ctx.getEnvironment())) {
|
|
139
|
+
ctx.log(`Middleware.run(): Refused ${libPath} — the ${DEV_ONLY_ROUTE_FOLDER}/ route folder is development-only`);
|
|
140
|
+
|
|
141
|
+
return ctx.respond('Not found', {code: 404});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Set options
|
|
145
|
+
options = options || {};
|
|
146
|
+
options.authenticate = typeof options.authenticate === 'boolean' ? options.authenticate : true;
|
|
147
|
+
options.setupAnalytics = typeof options.setupAnalytics === 'boolean' ? options.setupAnalytics : true;
|
|
148
|
+
options.setupUsage = typeof options.setupUsage === 'boolean' ? options.setupUsage : true;
|
|
149
|
+
options.setupSettings = typeof options.setupSettings === 'undefined' ? true : options.setupSettings;
|
|
150
|
+
options.sanitize = typeof options.sanitize === 'undefined' ? false : options.sanitize;
|
|
151
|
+
options.includeNonSchemaSettings = typeof options.includeNonSchemaSettings === 'undefined' ? false : options.includeNonSchemaSettings;
|
|
152
|
+
options.schema = typeof options.schema === 'undefined' ? libPath : options.schema;
|
|
153
|
+
options.parseMultipartFormData = typeof options.parseMultipartFormData === 'undefined' ? true : options.parseMultipartFormData;
|
|
154
|
+
|
|
155
|
+
// Set base path
|
|
156
|
+
options.routesDir = typeof options.routesDir === 'undefined' ? `${Manager.cwd}/routes` : options.routesDir;
|
|
157
|
+
options.schemasDir = typeof options.schemasDir === 'undefined' ? `${Manager.cwd}/schemas` : options.schemasDir;
|
|
158
|
+
|
|
159
|
+
// Parse multipart/form-data if needed
|
|
160
|
+
if (options.parseMultipartFormData && req.headers['content-type']?.includes('multipart/form-data')) {
|
|
161
|
+
try {
|
|
162
|
+
const parsed = await ctx.parseMultipartFormData();
|
|
163
|
+
|
|
164
|
+
// Add each field to the body either as a whole json object or each field
|
|
165
|
+
// Parsed JSON
|
|
166
|
+
if (parsed.fields.json) {
|
|
167
|
+
ctx.request.body = JSON5.parse(parsed.fields.json || '{}');
|
|
168
|
+
} else {
|
|
169
|
+
ctx.request.body = parsed.fields;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Re-assign data how ctx normally does it
|
|
173
|
+
ctx.request.data = merge({}, ctx.request.body, ctx.request.query);
|
|
174
|
+
|
|
175
|
+
// Log that it was parsed successfully
|
|
176
|
+
ctx.log(`Middleware.run(): Parsed multipart form data successfully`);
|
|
177
|
+
} catch (e) {
|
|
178
|
+
return ctx.respond(new Error(`Failed to parse multipart form data: ${e.message}`), {code: 400});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Set properties
|
|
183
|
+
const data = ctx.request.data;
|
|
184
|
+
const headers = ctx.request.headers;
|
|
185
|
+
const method = ctx.request.method.toLowerCase();
|
|
186
|
+
const url = ctx.request.url;
|
|
187
|
+
const geolocation = ctx.request.geolocation;
|
|
188
|
+
const client = ctx.request.client;
|
|
189
|
+
|
|
190
|
+
// Strip URL
|
|
191
|
+
const strippedUrl = stripUrl(url);
|
|
192
|
+
|
|
193
|
+
// Log
|
|
194
|
+
ctx.log(`Middleware.process(): Request (${geolocation.ip || 'unknown'} @ ${geolocation.country || '?'}, ${geolocation.region || '?'}, ${geolocation.city || '?'}) [${method} > ${strippedUrl}]`, safeStringify(redactDataForLog(data)));
|
|
195
|
+
ctx.log(`Middleware.process(): Headers`, safeStringify(redactHeadersForLog(headers)));
|
|
196
|
+
|
|
197
|
+
// Set paths
|
|
198
|
+
const routesDir = path.resolve(options.routesDir, libPath.replace('.js', ''));
|
|
199
|
+
const schemasDir = path.resolve(options.schemasDir);
|
|
200
|
+
|
|
201
|
+
// Wakeup trigger (quit immediately if wakeup is true to avoid cold start on a future request)
|
|
202
|
+
if (data.wakeup) {
|
|
203
|
+
ctx.log(`Middleware.process(): Wakeup activated at ${new Date().toISOString()}`);
|
|
204
|
+
|
|
205
|
+
return ctx.respond({wakeup: true});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Load route handler
|
|
209
|
+
// First try method-specific file (e.g., get.js, post.js), then fallback to
|
|
210
|
+
// index.js. Existence is checked BEFORE require so a route module's own
|
|
211
|
+
// broken require can't be mistaken for a missing file — and a route DIR
|
|
212
|
+
// that exists with neither file for this method answers an honest 405
|
|
213
|
+
// instead of a 500 (dogfood friction #17).
|
|
214
|
+
let routeHandler;
|
|
215
|
+
|
|
216
|
+
try {
|
|
217
|
+
const methodFile = `${method}.js`;
|
|
218
|
+
const methodFilePath = path.resolve(routesDir, methodFile);
|
|
219
|
+
const indexPath = path.resolve(routesDir, 'index.js');
|
|
220
|
+
|
|
221
|
+
if (fs.existsSync(methodFilePath)) {
|
|
222
|
+
routeHandler = require(methodFilePath);
|
|
223
|
+
ctx.log(`Middleware.process(): Loaded route: ${methodFile}`);
|
|
224
|
+
} else if (fs.existsSync(indexPath)) {
|
|
225
|
+
routeHandler = require(indexPath);
|
|
226
|
+
ctx.log(`Middleware.process(): Method-specific file (${methodFile}) not found, using index.js`);
|
|
227
|
+
} else if (fs.existsSync(routesDir)) {
|
|
228
|
+
return ctx.respond(new Error(`Method not allowed: ${method.toUpperCase()} is not supported by ${libPath}`), {code: 405});
|
|
229
|
+
} else {
|
|
230
|
+
return ctx.respond(new Error(`Unable to load route @ (${libPath}): route does not exist`), {code: 500});
|
|
231
|
+
}
|
|
232
|
+
} catch (e) {
|
|
233
|
+
return ctx.respond(new Error(`Unable to load route @ (${libPath}): ${e.message}`), {code: 500});
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Setup user
|
|
237
|
+
if (options.authenticate) {
|
|
238
|
+
await ctx.authenticate();
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Setup usage — LAZY ([#647](https://github.com/Omega-JS-Stack/omega/issues/647)):
|
|
242
|
+
// attaching costs nothing, and the counter resolves the account on its
|
|
243
|
+
// first consume()/read(), so a route that never counts never pays for one
|
|
244
|
+
if (options.setupUsage) {
|
|
245
|
+
ctx.usage = Manager.Usage().attach(ctx, {log: false});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Log working user
|
|
249
|
+
const workingUser = ctx.getUser();
|
|
250
|
+
const resolvedSub = User.resolveSubscription(workingUser);
|
|
251
|
+
ctx.log(`Middleware.process(): User (${workingUser.auth.uid}, ${workingUser.auth.email}, ${workingUser.subscription.product.id}=${workingUser.subscription.status} (resolved: ${resolvedSub.plan})):`, safeStringify(projectUserForLog(workingUser)));
|
|
252
|
+
|
|
253
|
+
// Setup analytics
|
|
254
|
+
if (options.setupAnalytics) {
|
|
255
|
+
const uuid = ctx.request.user.auth.uid
|
|
256
|
+
|| ctx.request.geolocation.ip
|
|
257
|
+
|| 'unknown'
|
|
258
|
+
|
|
259
|
+
ctx.analytics = Manager.Analytics({
|
|
260
|
+
ctx: ctx,
|
|
261
|
+
uuid: uuid,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Resolve settings (hold the instance — the sanitize pass below reads the
|
|
266
|
+
// per-field schema map it exposes)
|
|
267
|
+
let settingsLib = null;
|
|
268
|
+
|
|
269
|
+
if (options.setupSettings) {
|
|
270
|
+
// Resolve settings
|
|
271
|
+
try {
|
|
272
|
+
// Attach schema to ctx
|
|
273
|
+
// ctx.schema.dir = schemasDir;
|
|
274
|
+
// ctx.schema.name = options.schema;
|
|
275
|
+
settingsLib = Manager.Settings();
|
|
276
|
+
ctx.settings = settingsLib.resolve(ctx, undefined, data, {dir: schemasDir, schema: options.schema});
|
|
277
|
+
} catch (e) {
|
|
278
|
+
return ctx.respond(new Error(`Unable to resolve schema ${options.schema}: ${e.message}`), {code: e.code || 500});
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// // Here we need to include IF it exists the apiKey (admin rides the
|
|
282
|
+
// // omega-admin-key header — never settings)
|
|
283
|
+
// if (data.apiKey) {
|
|
284
|
+
// ctx.settings.apiKey = data.apiKey;
|
|
285
|
+
// }
|
|
286
|
+
|
|
287
|
+
// Merge settings with data
|
|
288
|
+
if (options.includeNonSchemaSettings) {
|
|
289
|
+
ctx.settings = merge(data, ctx.settings)
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Log multipart files if they exist
|
|
293
|
+
const files = ctx.request.multipartData.files || {};
|
|
294
|
+
if (files) {
|
|
295
|
+
ctx.log(`Middleware.process(): Multipart files`, safeStringify(files));
|
|
296
|
+
}
|
|
297
|
+
} else {
|
|
298
|
+
ctx.settings = data;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Trim whitespace on all string settings (always on — harmless and useful).
|
|
302
|
+
ctx.settings = Manager.Utilities().trim(ctx.settings);
|
|
303
|
+
|
|
304
|
+
// Optional HTML strip (off by default — opt in with `{ sanitize: true }`).
|
|
305
|
+
// Sanitize at the HTML-insertion site instead unless you need a belt-and-suspenders pass here.
|
|
306
|
+
// Respects sanitize: false on individual schema fields.
|
|
307
|
+
if (options.sanitize) {
|
|
308
|
+
const schema = settingsLib ? settingsLib.schema : null;
|
|
309
|
+
const utilities = Manager.Utilities();
|
|
310
|
+
|
|
311
|
+
ctx.settings = sanitizeWithSchema(utilities, ctx.settings, schema);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Log
|
|
315
|
+
ctx.log(`Middleware.process(): Resolved settings with schema=${options.schema}`, safeStringify(ctx.settings));
|
|
316
|
+
|
|
317
|
+
// Build context object for route handler
|
|
318
|
+
const context = {
|
|
319
|
+
Manager: Manager,
|
|
320
|
+
ctx: ctx,
|
|
321
|
+
user: ctx.getUser(),
|
|
322
|
+
usage: ctx.usage,
|
|
323
|
+
settings: ctx.settings,
|
|
324
|
+
analytics: ctx.analytics,
|
|
325
|
+
libraries: Manager.libraries,
|
|
326
|
+
utilities: Manager.Utilities(),
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
// Execute route handler
|
|
330
|
+
try {
|
|
331
|
+
routeHandler(context)
|
|
332
|
+
.catch(e => {
|
|
333
|
+
return ctx.respond(e, {code: e.code});
|
|
334
|
+
});
|
|
335
|
+
} catch (e) {
|
|
336
|
+
return ctx.respond(e, {code: e.code});
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
function sanitizeWithSchema(utilities, obj, schema) {
|
|
342
|
+
// Not an object — sanitize directly
|
|
343
|
+
if (obj == null || typeof obj !== 'object') {
|
|
344
|
+
return utilities.sanitize(obj);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Arrays — sanitize each item (no schema for array items)
|
|
348
|
+
if (Array.isArray(obj)) {
|
|
349
|
+
return obj.map(item => utilities.sanitize(item));
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Objects — walk keys, skip fields where schema says sanitize: false
|
|
353
|
+
const result = {};
|
|
354
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
355
|
+
const schemaNode = schema ? schema[key] : null;
|
|
356
|
+
|
|
357
|
+
if (schemaNode && schemaNode.sanitize === false) {
|
|
358
|
+
result[key] = value;
|
|
359
|
+
} else {
|
|
360
|
+
result[key] = sanitizeWithSchema(utilities, value, schemaNode);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return result;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
function stripUrl(url) {
|
|
367
|
+
const newUrl = new URL(url);
|
|
368
|
+
|
|
369
|
+
return `${newUrl.host}${newUrl.pathname}`.replace(/\/$/, '');
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* The user projection a log line may carry: who the caller is, the plan the
|
|
374
|
+
* request runs under, and the roles that gate it.
|
|
375
|
+
*
|
|
376
|
+
* Built by ALLOW-LIST, not by redacting known-secret keys. The raw document
|
|
377
|
+
* carries `api.privateKey` — a live credential — so logging the doc wrote a
|
|
378
|
+
* durable copy of every caller's key into Cloud Logging on every authenticated
|
|
379
|
+
* request. An allow-list also means a field added to the account schema later
|
|
380
|
+
* stays off the line until somebody puts it here deliberately.
|
|
381
|
+
* @param {object} user - The user document (ctx.getUser())
|
|
382
|
+
* @returns {object} { id, plan: { id, status }, roles: string[] }
|
|
383
|
+
*/
|
|
384
|
+
function projectUserForLog(user) {
|
|
385
|
+
const roles = user?.roles && typeof user.roles === 'object' ? user.roles : {};
|
|
386
|
+
|
|
387
|
+
return {
|
|
388
|
+
id: user?.auth?.uid || null,
|
|
389
|
+
plan: {
|
|
390
|
+
id: user?.subscription?.product?.id || null,
|
|
391
|
+
status: user?.subscription?.status || null,
|
|
392
|
+
},
|
|
393
|
+
// Names of the ENABLED roles only. `roles` is a $passthrough group, so a
|
|
394
|
+
// consumer can hang an arbitrary value off it; emitting names keeps any
|
|
395
|
+
// such value off the line.
|
|
396
|
+
roles: Object.keys(roles).filter((role) => roles[role] === true),
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* A COPY of `source` with every credential channel rendered by `render`.
|
|
402
|
+
* A copy because ctx.request.headers IS req.headers and ctx.request.data is
|
|
403
|
+
* what the route handler reads next — redacting in place would break the
|
|
404
|
+
* authentication the line is describing.
|
|
405
|
+
* @param {object} source - Headers or request data.
|
|
406
|
+
* @param {string[]} channels - Lower-cased key names to redact.
|
|
407
|
+
* @param {function} render - (value, key) → the string to log instead.
|
|
408
|
+
* @returns {object} A shallow copy, credential channels replaced.
|
|
409
|
+
*/
|
|
410
|
+
function redactChannels(source, channels, render) {
|
|
411
|
+
const object = source && typeof source === 'object' ? source : {};
|
|
412
|
+
const redacted = { ...object };
|
|
413
|
+
|
|
414
|
+
for (const key of Object.keys(object)) {
|
|
415
|
+
if (channels.includes(key.toLowerCase())) {
|
|
416
|
+
redacted[key] = render(`${object[key] || ''}`, key.toLowerCase());
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
return redacted;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* The headers a log line may carry. An API key authenticates as
|
|
425
|
+
* `Authorization: Bearer <api.privateKey>`, so the raw headers line wrote a
|
|
426
|
+
* live credential into Cloud Logging on every API-key request
|
|
427
|
+
* ([#275](https://github.com/Omega-JS-Stack/omega/issues/275)). The auth scheme
|
|
428
|
+
* survives — it says WHICH lane the caller used, which is the diagnostic value
|
|
429
|
+
* of the line — and the credential after it does not.
|
|
430
|
+
* @param {object} headers - ctx.request.headers
|
|
431
|
+
* @returns {object} A copy safe to log.
|
|
432
|
+
*/
|
|
433
|
+
function redactHeadersForLog(headers) {
|
|
434
|
+
return redactChannels(headers, CREDENTIAL_HEADERS, (value, key) => {
|
|
435
|
+
const scheme = key === 'authorization' ? /^(\S+\s+)(.+)$/.exec(value) : null;
|
|
436
|
+
|
|
437
|
+
return scheme ? `${scheme[1]}${redactSecret(scheme[2])}` : redactSecret(value);
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* The request data a log line may carry: the two payload credential lanes
|
|
443
|
+
* (`apiKey`, `authenticationToken`) redacted, every other field intact — the
|
|
444
|
+
* line is the primary request trace and stays readable
|
|
445
|
+
* ([#275](https://github.com/Omega-JS-Stack/omega/issues/275)).
|
|
446
|
+
* @param {object} data - ctx.request.data
|
|
447
|
+
* @returns {object} A copy safe to log.
|
|
448
|
+
*/
|
|
449
|
+
function redactDataForLog(data) {
|
|
450
|
+
return redactChannels(data, CREDENTIAL_DATA_KEYS, (value) => redactSecret(value));
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* The response a log line may carry: a DEEP copy with every credential key
|
|
455
|
+
* rendered by `redactSecret()`, at any depth and whatever its case.
|
|
456
|
+
*
|
|
457
|
+
* The route logger's `Sending response` line stringifies whatever a route
|
|
458
|
+
* answers, and `GET /omega/user` answers the whole user record: every
|
|
459
|
+
* `connections.<provider>.token` plus `api.privateKey` landed in Cloud Logging
|
|
460
|
+
* on every read ([#796](https://github.com/Omega-JS-Stack/omega/issues/796)).
|
|
461
|
+
* [#275](https://github.com/Omega-JS-Stack/omega/issues/275) gave the request
|
|
462
|
+
* side of that line this treatment; this is the response side. A copy because
|
|
463
|
+
* the object is what `res.json()` sends next.
|
|
464
|
+
* @param {*} response - Whatever respond() is about to send.
|
|
465
|
+
* @returns {*} A copy safe to log; anything that is not an object passes through.
|
|
466
|
+
*/
|
|
467
|
+
function redactResponseForLog(response) {
|
|
468
|
+
if (!response || typeof response !== 'object') {
|
|
469
|
+
return response;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// Anything that serializes itself is walked through THAT shape: the copy
|
|
473
|
+
// reads own properties, and a Date has none, so a walked Date logged as `{}`
|
|
474
|
+
// where JSON.stringify would have shown its ISO string.
|
|
475
|
+
if (typeof response.toJSON === 'function') {
|
|
476
|
+
return redactResponseForLog(response.toJSON());
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
if (Array.isArray(response)) {
|
|
480
|
+
return response.map((item) => redactResponseForLog(item));
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
const redacted = {};
|
|
484
|
+
|
|
485
|
+
for (const [key, value] of Object.entries(response)) {
|
|
486
|
+
if (!isCredentialResponseKey(key)) {
|
|
487
|
+
redacted[key] = redactResponseForLog(value);
|
|
488
|
+
|
|
489
|
+
continue;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
// An absent credential says so: "no token stored" is a diagnostic the line
|
|
493
|
+
// exists for, and it gives nothing away. A flag or a count under a
|
|
494
|
+
// credential-shaped name (`hasPassword: true`) is not a secret either.
|
|
495
|
+
if (value === null || value === undefined || typeof value === 'boolean' || typeof value === 'number') {
|
|
496
|
+
redacted[key] = value;
|
|
497
|
+
} else {
|
|
498
|
+
redacted[key] = typeof value === 'string' ? redactSecret(value) : REDACTED_OBJECT;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
return redacted;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
/**
|
|
506
|
+
* Whether a response key names a credential, separator and case insensitively.
|
|
507
|
+
* @param {string} key - The key as the response spells it.
|
|
508
|
+
* @returns {boolean}
|
|
509
|
+
*/
|
|
510
|
+
function isCredentialResponseKey(key) {
|
|
511
|
+
const name = key.toLowerCase().replace(/[-_]/g, '');
|
|
512
|
+
|
|
513
|
+
return CREDENTIAL_RESPONSE_KEYS.includes(name)
|
|
514
|
+
|| CREDENTIAL_RESPONSE_SUFFIXES.some((suffix) => name.endsWith(suffix));
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// Helper to safely stringify objects by truncating long strings (like base64)
|
|
518
|
+
function safeStringify(obj, maxLength = 100) {
|
|
519
|
+
const truncate = (value) => {
|
|
520
|
+
if (typeof value === 'string' && value.length > maxLength) {
|
|
521
|
+
return `${value.substring(0, maxLength)}... [truncated ${value.length - maxLength} chars]`;
|
|
522
|
+
}
|
|
523
|
+
return value;
|
|
524
|
+
};
|
|
525
|
+
|
|
526
|
+
const truncated = JSON.parse(JSON.stringify(obj, (key, value) => truncate(value)));
|
|
527
|
+
return JSON.stringify(truncated);
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// Static, alongside User.resolveSubscription's precedent — the dev-only
|
|
531
|
+
// decision is pure, so tests exercise it directly with a real Manager's
|
|
532
|
+
// getEnvironment() rather than through a hand-rolled request.
|
|
533
|
+
Middleware.isDevOnlyRouteBlocked = isDevOnlyRouteBlocked;
|
|
534
|
+
Middleware.isRouteOutsideRoutesDir = isRouteOutsideRoutesDir;
|
|
535
|
+
Middleware.projectUserForLog = projectUserForLog;
|
|
536
|
+
Middleware.redactHeadersForLog = redactHeadersForLog;
|
|
537
|
+
Middleware.redactDataForLog = redactDataForLog;
|
|
538
|
+
Middleware.redactResponseForLog = redactResponseForLog;
|
|
539
|
+
Middleware.DEV_ONLY_ROUTE_FOLDER = DEV_ONLY_ROUTE_FOLDER;
|
|
540
|
+
|
|
541
|
+
module.exports = Middleware;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Presence + last-4 rendering for a secret that has to appear in a log line.
|
|
3
|
+
*
|
|
4
|
+
* Backend log lines land in Cloud Logging and stay there for the retention
|
|
5
|
+
* window, so a credential printed once is a credential stored. Every line that
|
|
6
|
+
* has to acknowledge a secret (the authenticator's lanes, the middleware's
|
|
7
|
+
* request/headers trace) renders it through here: enough to tell that a key was
|
|
8
|
+
* sent and to match it against a known key, never the key itself.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @param {*} value - The secret (anything stringifiable).
|
|
13
|
+
* @returns {string} `***<last 4> (<length> chars)`, or `(empty)`.
|
|
14
|
+
*/
|
|
15
|
+
function redactSecret(value) {
|
|
16
|
+
const string = `${value || ''}`;
|
|
17
|
+
|
|
18
|
+
if (!string) {
|
|
19
|
+
return '(empty)';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return `***${string.slice(-4)} (${string.length} chars)`;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
module.exports = redactSecret;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config-DERIVED values, handed to consumer code on the runtime config object
|
|
3
|
+
* as `config.resolved.*` ([#290](https://github.com/Omega-JS-Stack/omega/issues/290)).
|
|
4
|
+
*
|
|
5
|
+
* A brand target cannot require @omega.js/config — it is a PRIVATE workspace
|
|
6
|
+
* package, vendored into each framework's dist at prepare time — so a brand
|
|
7
|
+
* that needed a derived value at runtime had to re-implement the derivation in
|
|
8
|
+
* its own target (the giftly sync-gifts cron did exactly that), and every copy
|
|
9
|
+
* drifts from the real merge rules. The framework calls the recipe; brands read
|
|
10
|
+
* the finished value off the config object they already receive.
|
|
11
|
+
*
|
|
12
|
+
* Every derivation itself stays in @omega.js/config — ONE implementation. This
|
|
13
|
+
* module only names the group and the values that belong in it; new derived
|
|
14
|
+
* values join here as real brand needs surface.
|
|
15
|
+
*/
|
|
16
|
+
const { brandRepo } = require('../../vendor/config/index.js');
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Build the `resolved` group for a composed config.
|
|
20
|
+
*
|
|
21
|
+
* @param {object} config - The composed omega config (brand + backend target layers).
|
|
22
|
+
* @returns {{ github: { owner: string, name: string, repo: string } }} Derived values; each field is '' when the config cannot resolve it.
|
|
23
|
+
*/
|
|
24
|
+
function resolvedConfigValues(config) {
|
|
25
|
+
return {
|
|
26
|
+
// The brand's GitHub repo: `.repo` is the "owner/name" slug every GitHub API
|
|
27
|
+
// call wants, `.owner`/`.name` the same answer split. Resolves
|
|
28
|
+
// `repo.providers.github` overlaid by the backend target's own `github`
|
|
29
|
+
// block, which wins (the CMS/content repo override).
|
|
30
|
+
github: brandRepo(config),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = { resolvedConfigValues };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
function Roles(Manager) {
|
|
2
|
+
const self = this;
|
|
3
|
+
|
|
4
|
+
self.Manager = Manager;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
Roles.prototype.list = function () {
|
|
8
|
+
const self = this;
|
|
9
|
+
|
|
10
|
+
return [
|
|
11
|
+
// Staff
|
|
12
|
+
{
|
|
13
|
+
id: 'staff',
|
|
14
|
+
name: 'Staff',
|
|
15
|
+
regex: /(^staff$)/ig,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: 'admin',
|
|
19
|
+
name: 'Administrator',
|
|
20
|
+
regex: /(^administrator$|^admin$)/ig,
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: 'moderator',
|
|
24
|
+
name: 'Moderator',
|
|
25
|
+
regex: /(^moderator$|^mod$)/ig,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: 'moderatorJr',
|
|
29
|
+
name: 'Jr. Moderator',
|
|
30
|
+
regex: /(^moderatorjr$|^modjr$)/ig,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: 'blogger',
|
|
34
|
+
name: 'Blogger',
|
|
35
|
+
regex: /(^blogger$|^blog$)/ig,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: 'developer',
|
|
39
|
+
name: 'Developer',
|
|
40
|
+
regex: /(^developer$|^dev$)/ig,
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
// Features
|
|
44
|
+
{
|
|
45
|
+
id: 'betaTester',
|
|
46
|
+
name: 'Beta Tester',
|
|
47
|
+
regex: /(^betatester$|^beta$)/ig,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: 'serverBooster',
|
|
51
|
+
name: 'Server Booster',
|
|
52
|
+
regex: /(^serverbooster$|^booster$)/ig,
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
// Vanity
|
|
56
|
+
{
|
|
57
|
+
id: 'og',
|
|
58
|
+
name: 'OG',
|
|
59
|
+
regex: /(^og$)/ig,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'vip',
|
|
63
|
+
name: 'VIP',
|
|
64
|
+
regex: /(^vip)/ig,
|
|
65
|
+
},
|
|
66
|
+
]
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
module.exports = Roles;
|