@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,908 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The event catalog — the SSOT for every analytics event OMEGA fires
|
|
3
|
+
* ([#328](https://github.com/Omega-JS-Stack/omega/issues/328) §Architecture,
|
|
4
|
+
* built by [#382](https://github.com/Omega-JS-Stack/omega/issues/382)).
|
|
5
|
+
*
|
|
6
|
+
* ONE entry per canonical event. Callers only ever speak canonical names and
|
|
7
|
+
* canonical params; each adapter translates into its provider's own dialect,
|
|
8
|
+
* because there is no unified cross-provider signature (Ian's constraint).
|
|
9
|
+
*
|
|
10
|
+
* MANDATORY BEFORE ANY EDIT BELOW (Ian 2026-08-27): every provider `name`,
|
|
11
|
+
* `kind` and param shape in this file is checked LIVE against the platform's
|
|
12
|
+
* own specification, never from memory. Open all six, read the event you are
|
|
13
|
+
* touching, and confirm the name is spelled as the platform spells it, that
|
|
14
|
+
* `kind: 'standard'` only claims an event the platform lists, and that the
|
|
15
|
+
* shaper sends the parameters the platform documents for that event:
|
|
16
|
+
* GA4 https://support.google.com/analytics/answer/9267735
|
|
17
|
+
* Meta https://www.facebook.com/business/help/402791146561655
|
|
18
|
+
* Meta pixel https://developers.facebook.com/docs/meta-pixel/reference
|
|
19
|
+
* TikTok https://ads.tiktok.com/help/article/standard-events-parameters
|
|
20
|
+
* TikTok 2.0 https://business-api.tiktok.com/portal/docs?id=1771100865818625
|
|
21
|
+
* GA4 dedupe https://support.google.com/analytics/answer/12313109
|
|
22
|
+
* A platform renames and retires events (TikTok retired CompletePayment for
|
|
23
|
+
* Purchase); a mapping that was right when written can be wrong today. The
|
|
24
|
+
* last link is the one that binds a PARAM rather than a name: GA4
|
|
25
|
+
* deduplicates `purchase` on `transaction_id`, so a money event's id is one
|
|
26
|
+
* CHARGE's ([#656](https://github.com/Omega-JS-Stack/omega/issues/656)).
|
|
27
|
+
*
|
|
28
|
+
* Entry shape:
|
|
29
|
+
* params — the canonical param contract, documentation for callers.
|
|
30
|
+
* Drawn from the EXISTING call sites so a rewired site sends
|
|
31
|
+
* what it sends today.
|
|
32
|
+
* placement — 'client' | 'server' | 'both'. Money and account truth fire
|
|
33
|
+
* server-side, UI actions client-side, signup both.
|
|
34
|
+
* providers — per-provider mapping. A provider ABSENT from this object has
|
|
35
|
+
* no mapping: the adapter returns null and the facade logs the
|
|
36
|
+
* dev skip. Each mapping carries:
|
|
37
|
+
* name — the provider's NATIVE event name
|
|
38
|
+
* kind — 'standard' (the platform defines this event) or
|
|
39
|
+
* 'custom' (a deliberate custom event; the provider
|
|
40
|
+
* fires its custom-event mechanism)
|
|
41
|
+
* map — OPTIONAL (params, context) => payload, only where
|
|
42
|
+
* the provider's shape genuinely differs. Default is
|
|
43
|
+
* pass-through.
|
|
44
|
+
* method — OPTIONAL, browser only: the provider's own PIXEL
|
|
45
|
+
* METHOD to call instead of its tracked-event command,
|
|
46
|
+
* for the one signal a platform manages itself rather
|
|
47
|
+
* than exposing as a trackable name (TikTok's
|
|
48
|
+
* `ttq.page()`). The name and kind stay declared for the
|
|
49
|
+
* catalog and the fire log; the transport calls the
|
|
50
|
+
* method, with no name and no payload.
|
|
51
|
+
* actionSource — OPTIONAL, Meta only: the `action_source` this
|
|
52
|
+
* event's SERVER fire carries instead of the sender's
|
|
53
|
+
* default `website`. Meta requires the field and makes
|
|
54
|
+
* its accuracy a term of use, and its enum names the
|
|
55
|
+
* case itself: `system_generated`, "for example, a
|
|
56
|
+
* subscription renewal that's set to auto-pay each
|
|
57
|
+
* month". A charge a card takes on its own had nobody
|
|
58
|
+
* on a website to claim
|
|
59
|
+
* ([#498](https://github.com/Omega-JS-Stack/omega/issues/498)).
|
|
60
|
+
*
|
|
61
|
+
* The canonical param vocabulary is GA4-flavoured (flat params plus an `items`
|
|
62
|
+
* array), because that is what the live call sites and the backend's payment
|
|
63
|
+
* webhook already build — so GA4 is pass-through and the maps live where the
|
|
64
|
+
* other two platforms genuinely disagree: their commerce vocabulary (both spell
|
|
65
|
+
* a cart as `content_ids` + `contents`, but the contents OBJECT is each
|
|
66
|
+
* platform's own) and Search's `search_string`.
|
|
67
|
+
*/
|
|
68
|
+
|
|
69
|
+
// Drop keys a caller did not supply — a provider payload carrying
|
|
70
|
+
// `content_name: undefined` is noise, not data.
|
|
71
|
+
function compact(payload) {
|
|
72
|
+
const out = {};
|
|
73
|
+
for (const [key, value] of Object.entries(payload)) {
|
|
74
|
+
if (value !== undefined) {
|
|
75
|
+
out[key] = value;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ─── Shared provider shapers ────────────────────────────────────────────────
|
|
82
|
+
|
|
83
|
+
// Meta's commerce vocabulary: content_ids + contents + num_items instead of
|
|
84
|
+
// GA4's items[]. BOTH id carriers ride, because Meta accepts either and its
|
|
85
|
+
// pixel reference asks for "contents or content_ids" on Purchase and Search
|
|
86
|
+
// (plain `contents` on AddToCart) for Advantage+ catalog ads: the priced
|
|
87
|
+
// objects are what a catalog campaign can match on
|
|
88
|
+
// ([#498](https://github.com/Omega-JS-Stack/omega/issues/498)). The object's
|
|
89
|
+
// field names are Meta's own (`id`, `quantity`, `item_price`), never GA4's;
|
|
90
|
+
// `delivery_category` is the fourth and belongs to physical fulfilment, which a
|
|
91
|
+
// subscription has none of.
|
|
92
|
+
function metaCommerce(params) {
|
|
93
|
+
const items = Array.isArray(params.items) ? params.items : [];
|
|
94
|
+
|
|
95
|
+
return compact({
|
|
96
|
+
content_ids: items.length ? items.map((item) => item.item_id) : undefined,
|
|
97
|
+
contents: items.length ? items.map((item) => compact({
|
|
98
|
+
id: item.item_id,
|
|
99
|
+
// Meta's object requires id + quantity; a line naming none is one of it,
|
|
100
|
+
// the same answer num_items gives below
|
|
101
|
+
quantity: item.quantity ?? 1,
|
|
102
|
+
item_price: item.price,
|
|
103
|
+
})) : undefined,
|
|
104
|
+
// "Name of the page/product", SINGULAR. This named items[0] for a whole
|
|
105
|
+
// cart, which labels a two-product order with one of them; `content_ids` and
|
|
106
|
+
// `contents` are the members that carry every product [#498].
|
|
107
|
+
content_name: items.length === 1 ? items[0].item_name : undefined,
|
|
108
|
+
content_type: items.length ? 'product' : undefined,
|
|
109
|
+
currency: params.currency,
|
|
110
|
+
value: params.value,
|
|
111
|
+
// "The number of items that a user tries to buy", so two seats on one line
|
|
112
|
+
// are two items, and a line naming no quantity is one of that thing [#498].
|
|
113
|
+
num_items: items.length ? items.reduce((total, item) => total + (item.quantity ?? 1), 0) : undefined,
|
|
114
|
+
// The transaction's own id, in Meta's vocabulary. The dedupe `event_id` is
|
|
115
|
+
// not this: Meta reads that as the pair-key for one browser/server fire and
|
|
116
|
+
// never as the order [#498].
|
|
117
|
+
order_id: params.transaction_id,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// TikTok's commerce vocabulary: a `contents` ARRAY of product objects, plus the
|
|
122
|
+
// order's own content_type/value/currency. The pixel reference documents exactly
|
|
123
|
+
// this shape — `ttq.track('AddToCart', { contents: [{ content_id, content_name,
|
|
124
|
+
// quantity, price }], content_type: 'product', value, currency })`, with
|
|
125
|
+
// `contents` "a list of content objects that represent relevant products in a
|
|
126
|
+
// web event with product information" — and the flat single-item
|
|
127
|
+
// `content_id`/`price`/`quantity` this sent before appears nowhere in it
|
|
128
|
+
// ([#652](https://github.com/Omega-JS-Stack/omega/issues/652)).
|
|
129
|
+
//
|
|
130
|
+
// Events API 2.0 documents `content_ids` BESIDE `contents` in the same
|
|
131
|
+
// `properties` object, and TikTok's standard-events page recommends `content_ids`
|
|
132
|
+
// on every commerce event it lists, so both ride, as they do on Meta's half
|
|
133
|
+
// ([#498](https://github.com/Omega-JS-Stack/omega/issues/498)). `content_type`
|
|
134
|
+
// stays where 2.0 documents it, at the properties level: the per-item
|
|
135
|
+
// `content_type` of the older Pixel SDK model is not in 2.0's contents object,
|
|
136
|
+
// whose fields are price, content_id, content_name, content_category and brand.
|
|
137
|
+
function tiktokCommerce(params) {
|
|
138
|
+
const items = Array.isArray(params.items) ? params.items : [];
|
|
139
|
+
|
|
140
|
+
return compact({
|
|
141
|
+
content_ids: items.length ? items.map((item) => item.item_id) : undefined,
|
|
142
|
+
contents: items.length ? items.map((item) => compact({
|
|
143
|
+
content_id: item.item_id,
|
|
144
|
+
content_name: item.item_name,
|
|
145
|
+
price: item.price,
|
|
146
|
+
quantity: item.quantity,
|
|
147
|
+
})) : undefined,
|
|
148
|
+
content_type: items.length ? 'product' : undefined,
|
|
149
|
+
currency: params.currency,
|
|
150
|
+
value: params.value,
|
|
151
|
+
// 2.0's `properties.order_id`, Meta's `order_id` twin [#498].
|
|
152
|
+
order_id: params.transaction_id,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// A churn moment's ad-platform half: an EXCLUSION-AUDIENCE signal, never money
|
|
157
|
+
// ([#415](https://github.com/Omega-JS-Stack/omega/issues/415)). Neither platform
|
|
158
|
+
// can subtract revenue, so a cancellation or a refund carrying its amount would
|
|
159
|
+
// ADD to the return their ads manager reports — the exact opposite of the truth.
|
|
160
|
+
// `value: 0` is the honest number on that side; GA4 keeps the real one, where a
|
|
161
|
+
// refund is a standard event the revenue report knows how to net.
|
|
162
|
+
function metaAudienceSignal(params) {
|
|
163
|
+
// `contents` comes off whole: its `item_price` IS the amount, and Meta's
|
|
164
|
+
// object requires `id` + `quantity`, so a stripped one would be a malformed
|
|
165
|
+
// object rather than a quieter signal. `content_ids` already names the plan,
|
|
166
|
+
// which is the entire content of an exclusion audience
|
|
167
|
+
// ([#498](https://github.com/Omega-JS-Stack/omega/issues/498)).
|
|
168
|
+
const { contents, ...signal } = metaCommerce(params);
|
|
169
|
+
|
|
170
|
+
return { ...signal, value: 0 };
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function tiktokAudienceSignal(params) {
|
|
174
|
+
// TikTok's per-item `price` and `quantity` come off with the value: zeroing
|
|
175
|
+
// one field while the amount rides inside `contents` is not a zero-value
|
|
176
|
+
// signal. Meta's signal drops its own `contents` outright for the same reason,
|
|
177
|
+
// and TikTok's array stays because it is that platform's only id carrier
|
|
178
|
+
// besides `content_ids`. What is left is who and which plan, which is the
|
|
179
|
+
// whole point of the audience.
|
|
180
|
+
const signal = tiktokCommerce(params);
|
|
181
|
+
|
|
182
|
+
return compact({
|
|
183
|
+
...signal,
|
|
184
|
+
contents: signal.contents
|
|
185
|
+
? signal.contents.map(({ price, quantity, ...content }) => content)
|
|
186
|
+
: undefined,
|
|
187
|
+
value: 0,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Both ad platforms call the query `search_string`; GA4 calls it `search_term`.
|
|
192
|
+
function metaSearch(params) {
|
|
193
|
+
return compact({
|
|
194
|
+
search_string: params.search_term,
|
|
195
|
+
content_category: params.content_category,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function tiktokSearch(params) {
|
|
200
|
+
return compact({
|
|
201
|
+
search_string: params.search_term,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// The recurring-revenue events ride GA4's standard `purchase` under their own
|
|
206
|
+
// canonical name, so the flag that tells them apart in GA4 is set here.
|
|
207
|
+
function ga4Recurring(params) {
|
|
208
|
+
return { ...params, is_recurring: true };
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// The canonical commerce param contract, shared by every money event.
|
|
212
|
+
const COMMERCE_PARAMS = ['transaction_id', 'value', 'currency', 'items', 'is_trial', 'is_recurring', 'payment_provider', 'payment_frequency'];
|
|
213
|
+
|
|
214
|
+
// A plan change is the one money event with a BEFORE: `items` is the plan the
|
|
215
|
+
// subscriber moved to, and these carry the one they came from, so the direction
|
|
216
|
+
// of the switch is readable without a second event
|
|
217
|
+
// ([#407](https://github.com/Omega-JS-Stack/omega/issues/407)).
|
|
218
|
+
const PLAN_CHANGE_PARAMS = [...COMMERCE_PARAMS, 'previous_item_id', 'previous_item_name', 'previous_value'];
|
|
219
|
+
|
|
220
|
+
// ─── The catalog ────────────────────────────────────────────────────────────
|
|
221
|
+
|
|
222
|
+
const CATALOG = {
|
|
223
|
+
// ─── Auth ───
|
|
224
|
+
|
|
225
|
+
// The funnel entry, fired when the signup form is submitted. No provider
|
|
226
|
+
// mapping: the signup FUNNEL is ours to read, not an ad platform's.
|
|
227
|
+
sign_up_started: {
|
|
228
|
+
params: ['method'],
|
|
229
|
+
placement: 'client',
|
|
230
|
+
providers: {},
|
|
231
|
+
},
|
|
232
|
+
|
|
233
|
+
sign_up: {
|
|
234
|
+
params: ['method', 'user_id'],
|
|
235
|
+
placement: 'both',
|
|
236
|
+
providers: {
|
|
237
|
+
ga4: { name: 'sign_up', kind: 'standard' },
|
|
238
|
+
meta: { name: 'CompleteRegistration', kind: 'standard' },
|
|
239
|
+
tiktok: { name: 'CompleteRegistration', kind: 'standard' },
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
|
|
243
|
+
login: {
|
|
244
|
+
params: ['method', 'user_id'],
|
|
245
|
+
placement: 'client',
|
|
246
|
+
providers: {
|
|
247
|
+
ga4: { name: 'login', kind: 'standard' },
|
|
248
|
+
// Neither ad platform defines a Login event — today's call sites already
|
|
249
|
+
// fire it as a custom one, and the catalog says so out loud.
|
|
250
|
+
meta: { name: 'Login', kind: 'custom' },
|
|
251
|
+
tiktok: { name: 'Login', kind: 'custom' },
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
|
|
255
|
+
// Deliberately unmapped everywhere: a logout is not an ad signal, and GA4
|
|
256
|
+
// reads the session end on its own.
|
|
257
|
+
logout: {
|
|
258
|
+
params: [],
|
|
259
|
+
placement: 'client',
|
|
260
|
+
providers: {},
|
|
261
|
+
},
|
|
262
|
+
|
|
263
|
+
password_reset: {
|
|
264
|
+
params: ['method', 'status'],
|
|
265
|
+
placement: 'client',
|
|
266
|
+
providers: {
|
|
267
|
+
ga4: { name: 'password_reset', kind: 'custom' },
|
|
268
|
+
meta: { name: 'PasswordReset', kind: 'custom' },
|
|
269
|
+
tiktok: { name: 'SubmitForm', kind: 'standard' },
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
|
|
273
|
+
// Every platform hears the page view through THIS entry
|
|
274
|
+
// ([#409](https://github.com/Omega-JS-Stack/omega/issues/409)): the web
|
|
275
|
+
// loader's raw `fbq('track', 'PageView')` and `ttq.page()` at pixel init are
|
|
276
|
+
// retired, so a page view walks the same consent gate and the same catalog as
|
|
277
|
+
// every other event. Pass-through: a page's own params are all any of them
|
|
278
|
+
// wants, and each pixel reads the URL itself when a fire carries none.
|
|
279
|
+
page_view: {
|
|
280
|
+
params: ['page_path', 'page_title', 'page_location'],
|
|
281
|
+
placement: 'client',
|
|
282
|
+
providers: {
|
|
283
|
+
ga4: { name: 'page_view', kind: 'standard' },
|
|
284
|
+
meta: { name: 'PageView', kind: 'standard' },
|
|
285
|
+
// TikTok's page view is a pixel METHOD it manages itself (`ttq.page()`),
|
|
286
|
+
// not a name in its trackable set — `ttq.track('Pageview')` appears
|
|
287
|
+
// nowhere in TikTok's documented surface, and sending it would risk a
|
|
288
|
+
// Pageview metric that silently reads zero. So the mapping names the
|
|
289
|
+
// METHOD and the browser transport calls exactly that; the name and the
|
|
290
|
+
// honest `custom` kind stay for the catalog and the fire log.
|
|
291
|
+
tiktok: { name: 'Pageview', kind: 'custom', method: 'page' },
|
|
292
|
+
},
|
|
293
|
+
},
|
|
294
|
+
|
|
295
|
+
// The page_view twin for the runtimes that have screens, not pages —
|
|
296
|
+
// desktop's renderers fire it through the main-process singleton.
|
|
297
|
+
screen_view: {
|
|
298
|
+
params: ['screen_name'],
|
|
299
|
+
placement: 'client',
|
|
300
|
+
providers: {
|
|
301
|
+
ga4: { name: 'screen_view', kind: 'standard' },
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
|
|
305
|
+
// ─── Commerce (client funnel) ───
|
|
306
|
+
|
|
307
|
+
view_item: {
|
|
308
|
+
params: ['currency', 'value', 'items'],
|
|
309
|
+
placement: 'client',
|
|
310
|
+
providers: {
|
|
311
|
+
ga4: { name: 'view_item', kind: 'standard' },
|
|
312
|
+
meta: { name: 'ViewContent', kind: 'standard', map: metaCommerce },
|
|
313
|
+
tiktok: { name: 'ViewContent', kind: 'standard', map: tiktokCommerce },
|
|
314
|
+
},
|
|
315
|
+
},
|
|
316
|
+
|
|
317
|
+
// The pricing page's monthly/yearly switch. Both platforms define ViewContent
|
|
318
|
+
// as a PAGE or product view (Meta: "a visit to a web page you care about";
|
|
319
|
+
// TikTok: "when a visitor views a specific page") and a toggle is neither, so
|
|
320
|
+
// all three read it as the custom event it is
|
|
321
|
+
// ([#652](https://github.com/Omega-JS-Stack/omega/issues/652)).
|
|
322
|
+
pricing_toggle: {
|
|
323
|
+
params: ['billing_type'],
|
|
324
|
+
placement: 'client',
|
|
325
|
+
providers: {
|
|
326
|
+
ga4: { name: 'pricing_toggle', kind: 'custom' },
|
|
327
|
+
meta: { name: 'PricingToggle', kind: 'custom' },
|
|
328
|
+
tiktok: { name: 'PricingToggle', kind: 'custom' },
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
|
|
332
|
+
add_to_cart: {
|
|
333
|
+
params: ['currency', 'value', 'items'],
|
|
334
|
+
placement: 'client',
|
|
335
|
+
providers: {
|
|
336
|
+
ga4: { name: 'add_to_cart', kind: 'standard' },
|
|
337
|
+
meta: { name: 'AddToCart', kind: 'standard', map: metaCommerce },
|
|
338
|
+
tiktok: { name: 'AddToCart', kind: 'standard', map: tiktokCommerce },
|
|
339
|
+
},
|
|
340
|
+
},
|
|
341
|
+
|
|
342
|
+
begin_checkout: {
|
|
343
|
+
params: ['currency', 'value', 'items'],
|
|
344
|
+
placement: 'client',
|
|
345
|
+
providers: {
|
|
346
|
+
ga4: { name: 'begin_checkout', kind: 'standard' },
|
|
347
|
+
meta: { name: 'InitiateCheckout', kind: 'standard', map: metaCommerce },
|
|
348
|
+
tiktok: { name: 'InitiateCheckout', kind: 'standard', map: tiktokCommerce },
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
|
|
352
|
+
add_payment_info: {
|
|
353
|
+
params: ['currency', 'value', 'payment_type', 'items'],
|
|
354
|
+
placement: 'client',
|
|
355
|
+
providers: {
|
|
356
|
+
ga4: { name: 'add_payment_info', kind: 'standard' },
|
|
357
|
+
meta: { name: 'AddPaymentInfo', kind: 'standard', map: metaCommerce },
|
|
358
|
+
tiktok: { name: 'AddPaymentInfo', kind: 'standard', map: tiktokCommerce },
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
|
|
362
|
+
// ─── Commerce (server truth) ───
|
|
363
|
+
|
|
364
|
+
// Server is the truth: the backend's payment webhook owns the revenue. The
|
|
365
|
+
// BROWSER half is the retargeting signal the ad platforms need
|
|
366
|
+
// ([#386](https://github.com/Omega-JS-Stack/omega/issues/386)) — and GA4's
|
|
367
|
+
// too, since GA4 deduplicates `purchase` on `transaction_id`: both halves
|
|
368
|
+
// name the ORDER, so the browser adds the session, the campaign and the
|
|
369
|
+
// client id, and GA4 still counts one purchase
|
|
370
|
+
// ([#656](https://github.com/Omega-JS-Stack/omega/issues/656)). All three
|
|
371
|
+
// carry the same `<canonical>.<order id>` dedupe id for the two platforms
|
|
372
|
+
// that key on one.
|
|
373
|
+
purchase: {
|
|
374
|
+
params: COMMERCE_PARAMS,
|
|
375
|
+
placement: 'both',
|
|
376
|
+
providers: {
|
|
377
|
+
ga4: { name: 'purchase', kind: 'standard' },
|
|
378
|
+
meta: { name: 'Purchase', kind: 'standard', map: metaCommerce },
|
|
379
|
+
// TikTok RETIRED CompletePayment: `Purchase` — "when a visitor makes a
|
|
380
|
+
// purchase" — is the standard event its live list names, and the only one
|
|
381
|
+
// it documents `value`/`currency` for ([#652]).
|
|
382
|
+
tiktok: { name: 'Purchase', kind: 'standard', map: tiktokCommerce },
|
|
383
|
+
},
|
|
384
|
+
},
|
|
385
|
+
|
|
386
|
+
// A trial checkout's own conversion, and the SECOND event with a browser half
|
|
387
|
+
// ([#654](https://github.com/Omega-JS-Stack/omega/issues/654)): the
|
|
388
|
+
// confirmation page fired `purchase` for every checkout, so a $0 trial sent a
|
|
389
|
+
// browser Purchase beside this trial_start. The names, not the amounts, were
|
|
390
|
+
// the defect — two different event names never deduplicate, so each platform
|
|
391
|
+
// counted the pair as two conversions. The browser half is meta + tiktok —
|
|
392
|
+
// GA4's trial_start is a custom event the server owns outright, and there is
|
|
393
|
+
// no revenue for GA4 to deduplicate here.
|
|
394
|
+
//
|
|
395
|
+
// Value 0 on both platforms: a trial charges nothing, and both spell that out
|
|
396
|
+
// (Meta `fbq('track', 'StartTrial', { value: '0.00', currency: 'USD' })`).
|
|
397
|
+
trial_start: {
|
|
398
|
+
params: COMMERCE_PARAMS,
|
|
399
|
+
placement: 'both',
|
|
400
|
+
providers: {
|
|
401
|
+
// GA4 has no trial_start in its standard set — an explicit custom event.
|
|
402
|
+
ga4: { name: 'trial_start', kind: 'custom' },
|
|
403
|
+
meta: { name: 'StartTrial', kind: 'standard', map: metaCommerce },
|
|
404
|
+
// TikTok's own StartTrial — "when a customer begins a free trial for your
|
|
405
|
+
// product or service" — replaces the Subscribe this claimed, which TikTok
|
|
406
|
+
// defines as subscribing, paid subscriptions included ([#652]).
|
|
407
|
+
tiktok: { name: 'StartTrial', kind: 'standard', map: tiktokCommerce },
|
|
408
|
+
},
|
|
409
|
+
},
|
|
410
|
+
|
|
411
|
+
// The FIRST real charge after a trial — the funnel step the generic renewal
|
|
412
|
+
// branch used to swallow, which made a conversion indistinguishable from a
|
|
413
|
+
// routine renewal ([#407](https://github.com/Omega-JS-Stack/omega/issues/407)).
|
|
414
|
+
//
|
|
415
|
+
// GA4 hears its standard `purchase`, because this is where the money finally
|
|
416
|
+
// moves and revenue belongs in the revenue report; the pair `is_trial: true` +
|
|
417
|
+
// `is_recurring: false` is what marks it inside that stream, so the conversion
|
|
418
|
+
// is still countable on its own. The ad platforms already heard `StartTrial`
|
|
419
|
+
// at trial start, and every REAL CHARGE is a Purchase to both of them — the
|
|
420
|
+
// one event each documents `value` + `currency` for (Ian's money-event table,
|
|
421
|
+
// [#652](https://github.com/Omega-JS-Stack/omega/issues/652)).
|
|
422
|
+
trial_convert: {
|
|
423
|
+
params: COMMERCE_PARAMS,
|
|
424
|
+
placement: 'server',
|
|
425
|
+
providers: {
|
|
426
|
+
ga4: { name: 'purchase', kind: 'standard' },
|
|
427
|
+
meta: { name: 'Purchase', kind: 'standard', map: metaCommerce, actionSource: 'system_generated' },
|
|
428
|
+
tiktok: { name: 'Purchase', kind: 'standard', map: tiktokCommerce },
|
|
429
|
+
},
|
|
430
|
+
},
|
|
431
|
+
|
|
432
|
+
// The other end of the same funnel: a trial that ended without ever paying.
|
|
433
|
+
// GA4-only, and DELIBERATELY out of the exclusion lane the two entries below
|
|
434
|
+
// joined ([#415](https://github.com/Omega-JS-Stack/omega/issues/415)): a
|
|
435
|
+
// lapsed trialist is a win-back audience worth RETARGETING, not somebody to
|
|
436
|
+
// stop showing ads to. An ad platform optimizes toward conversions, so the
|
|
437
|
+
// failure itself buys nothing either.
|
|
438
|
+
trial_lapse: {
|
|
439
|
+
params: COMMERCE_PARAMS,
|
|
440
|
+
placement: 'server',
|
|
441
|
+
providers: {
|
|
442
|
+
ga4: { name: 'trial_lapse', kind: 'custom' },
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
|
|
446
|
+
// GA4's own refund event, fired by the payment webhook's refund transitions.
|
|
447
|
+
// The ad platforms hear a zero-value custom `Refund` — an audience to stop
|
|
448
|
+
// paying to reach, and the one thing they can do with a churn moment.
|
|
449
|
+
refund: {
|
|
450
|
+
params: ['transaction_id', 'value', 'currency', 'items'],
|
|
451
|
+
placement: 'server',
|
|
452
|
+
providers: {
|
|
453
|
+
ga4: { name: 'refund', kind: 'standard' },
|
|
454
|
+
meta: { name: 'Refund', kind: 'custom', map: metaAudienceSignal },
|
|
455
|
+
tiktok: { name: 'Refund', kind: 'custom', map: tiktokAudienceSignal },
|
|
456
|
+
},
|
|
457
|
+
},
|
|
458
|
+
|
|
459
|
+
// The cancellation that TOOK EFFECT. Cancellation-REQUESTED stays event-less by
|
|
460
|
+
// design: a schedule changed, nothing ended, no money moved, and the
|
|
461
|
+
// subscription may never cancel at all.
|
|
462
|
+
subscription_cancel: {
|
|
463
|
+
params: COMMERCE_PARAMS,
|
|
464
|
+
placement: 'server',
|
|
465
|
+
providers: {
|
|
466
|
+
ga4: { name: 'subscription_cancel', kind: 'custom' },
|
|
467
|
+
meta: { name: 'SubscriptionCancel', kind: 'custom', map: metaAudienceSignal },
|
|
468
|
+
tiktok: { name: 'SubscriptionCancel', kind: 'custom', map: tiktokAudienceSignal },
|
|
469
|
+
},
|
|
470
|
+
},
|
|
471
|
+
|
|
472
|
+
// The uncancel — a scheduled cancellation withdrawn. The request had no event
|
|
473
|
+
// to be the pair of, which is the point: a retention win is an outcome, and it
|
|
474
|
+
// was completely dark before [#407].
|
|
475
|
+
subscription_uncancel: {
|
|
476
|
+
params: COMMERCE_PARAMS,
|
|
477
|
+
placement: 'server',
|
|
478
|
+
providers: {
|
|
479
|
+
ga4: { name: 'subscription_uncancel', kind: 'custom' },
|
|
480
|
+
},
|
|
481
|
+
},
|
|
482
|
+
|
|
483
|
+
// An upgrade or downgrade between two paid plans. GA4-only: no money moves at
|
|
484
|
+
// the switch itself, and firing a platform's Subscribe here would count a
|
|
485
|
+
// second subscription for a customer who already has one.
|
|
486
|
+
subscription_plan_change: {
|
|
487
|
+
params: PLAN_CHANGE_PARAMS,
|
|
488
|
+
placement: 'server',
|
|
489
|
+
providers: {
|
|
490
|
+
ga4: { name: 'subscription_plan_change', kind: 'custom' },
|
|
491
|
+
},
|
|
492
|
+
},
|
|
493
|
+
|
|
494
|
+
// A renewal and a recovered payment are CHARGES, so both ad platforms hear
|
|
495
|
+
// Purchase for the real amount. Neither is a Subscribe: Meta defines that as
|
|
496
|
+
// "the START of a paid subscription", and month two starts nothing — the
|
|
497
|
+
// mapping counted a new subscriber every month
|
|
498
|
+
// ([#652](https://github.com/Omega-JS-Stack/omega/issues/652)). GA4 keeps its
|
|
499
|
+
// standard `purchase` with `is_recurring`, and its `transaction_id` is THIS
|
|
500
|
+
// charge's, never the subscription's, or GA4 dedupes every renewal after the
|
|
501
|
+
// first away ([#656](https://github.com/Omega-JS-Stack/omega/issues/656)).
|
|
502
|
+
subscription_renew: {
|
|
503
|
+
params: COMMERCE_PARAMS,
|
|
504
|
+
placement: 'server',
|
|
505
|
+
providers: {
|
|
506
|
+
ga4: { name: 'purchase', kind: 'standard', map: ga4Recurring },
|
|
507
|
+
meta: { name: 'Purchase', kind: 'standard', map: metaCommerce, actionSource: 'system_generated' },
|
|
508
|
+
tiktok: { name: 'Purchase', kind: 'standard', map: tiktokCommerce },
|
|
509
|
+
},
|
|
510
|
+
},
|
|
511
|
+
|
|
512
|
+
payment_recovered: {
|
|
513
|
+
params: COMMERCE_PARAMS,
|
|
514
|
+
placement: 'server',
|
|
515
|
+
providers: {
|
|
516
|
+
ga4: { name: 'purchase', kind: 'standard', map: ga4Recurring },
|
|
517
|
+
meta: { name: 'Purchase', kind: 'standard', map: metaCommerce, actionSource: 'system_generated' },
|
|
518
|
+
tiktok: { name: 'Purchase', kind: 'standard', map: tiktokCommerce },
|
|
519
|
+
},
|
|
520
|
+
},
|
|
521
|
+
|
|
522
|
+
// ─── Engagement ───
|
|
523
|
+
|
|
524
|
+
// Meta's Lead is exactly this ("a submission of information by a customer with
|
|
525
|
+
// the understanding that they may be contacted at a later date"), and TikTok's
|
|
526
|
+
// SubmitForm is the standard event for a form; its Contact means "when a
|
|
527
|
+
// visitor contacts you", which a lead form is not
|
|
528
|
+
// ([#652](https://github.com/Omega-JS-Stack/omega/issues/652)).
|
|
529
|
+
generate_lead: {
|
|
530
|
+
params: ['lead_source', 'subject'],
|
|
531
|
+
placement: 'client',
|
|
532
|
+
providers: {
|
|
533
|
+
ga4: { name: 'generate_lead', kind: 'standard' },
|
|
534
|
+
meta: { name: 'Lead', kind: 'standard' },
|
|
535
|
+
tiktok: { name: 'SubmitForm', kind: 'standard' },
|
|
536
|
+
},
|
|
537
|
+
},
|
|
538
|
+
|
|
539
|
+
// The enterprise "talk to us" path off the pricing page.
|
|
540
|
+
contact_enterprise: {
|
|
541
|
+
params: ['from_page'],
|
|
542
|
+
placement: 'client',
|
|
543
|
+
providers: {
|
|
544
|
+
ga4: { name: 'contact_enterprise', kind: 'custom' },
|
|
545
|
+
meta: { name: 'Contact', kind: 'standard' },
|
|
546
|
+
tiktok: { name: 'Contact', kind: 'standard' },
|
|
547
|
+
},
|
|
548
|
+
},
|
|
549
|
+
|
|
550
|
+
// The contact form's honeypot catch. GA4 only: a spam signal is ours to
|
|
551
|
+
// read, and feeding it to an ad platform would poison the audience.
|
|
552
|
+
contact_form_spam: {
|
|
553
|
+
params: ['content_type'],
|
|
554
|
+
placement: 'client',
|
|
555
|
+
providers: {
|
|
556
|
+
ga4: { name: 'contact_form_spam', kind: 'custom' },
|
|
557
|
+
},
|
|
558
|
+
},
|
|
559
|
+
|
|
560
|
+
// GA4's standard name, replacing the literal `download` today's page sends.
|
|
561
|
+
file_download: {
|
|
562
|
+
params: ['platform', 'download_name', 'download_url'],
|
|
563
|
+
placement: 'client',
|
|
564
|
+
providers: {
|
|
565
|
+
ga4: { name: 'file_download', kind: 'standard' },
|
|
566
|
+
meta: { name: 'Download', kind: 'custom' },
|
|
567
|
+
tiktok: { name: 'Download', kind: 'standard' },
|
|
568
|
+
},
|
|
569
|
+
},
|
|
570
|
+
|
|
571
|
+
// Meta's SubmitApplication is "an application for a product, service or
|
|
572
|
+
// program you offer... a credit card, educational program or job" — feedback
|
|
573
|
+
// applies for nothing, so Meta hears a custom event. TikTok's SubmitForm
|
|
574
|
+
// ("when a visitor submits a form") fits as it stands
|
|
575
|
+
// ([#652](https://github.com/Omega-JS-Stack/omega/issues/652)).
|
|
576
|
+
feedback_submit: {
|
|
577
|
+
params: ['feedback_rating'],
|
|
578
|
+
placement: 'client',
|
|
579
|
+
providers: {
|
|
580
|
+
ga4: { name: 'feedback_submit', kind: 'custom' },
|
|
581
|
+
meta: { name: 'FeedbackSubmit', kind: 'custom' },
|
|
582
|
+
tiktok: { name: 'SubmitForm', kind: 'standard' },
|
|
583
|
+
},
|
|
584
|
+
},
|
|
585
|
+
|
|
586
|
+
// A click through to a review page is neither Meta's Lead (a submission of
|
|
587
|
+
// information) nor TikTok's Contact (a visitor contacting you), so both hear
|
|
588
|
+
// the canonical event as a custom one
|
|
589
|
+
// ([#652](https://github.com/Omega-JS-Stack/omega/issues/652)).
|
|
590
|
+
review_click: {
|
|
591
|
+
params: ['review_url'],
|
|
592
|
+
placement: 'client',
|
|
593
|
+
providers: {
|
|
594
|
+
ga4: { name: 'review_click', kind: 'custom' },
|
|
595
|
+
meta: { name: 'ReviewClick', kind: 'custom' },
|
|
596
|
+
tiktok: { name: 'ReviewClick', kind: 'custom' },
|
|
597
|
+
},
|
|
598
|
+
},
|
|
599
|
+
|
|
600
|
+
// The prompt half of the review pair — ours to read, no ad signal in it.
|
|
601
|
+
review_prompt_show: {
|
|
602
|
+
params: ['review_url'],
|
|
603
|
+
placement: 'client',
|
|
604
|
+
providers: {
|
|
605
|
+
ga4: { name: 'review_prompt_show', kind: 'custom' },
|
|
606
|
+
},
|
|
607
|
+
},
|
|
608
|
+
|
|
609
|
+
search: {
|
|
610
|
+
params: ['search_term', 'content_category'],
|
|
611
|
+
placement: 'client',
|
|
612
|
+
providers: {
|
|
613
|
+
ga4: { name: 'search', kind: 'standard' },
|
|
614
|
+
meta: { name: 'Search', kind: 'standard', map: metaSearch },
|
|
615
|
+
tiktok: { name: 'Search', kind: 'standard', map: tiktokSearch },
|
|
616
|
+
},
|
|
617
|
+
},
|
|
618
|
+
|
|
619
|
+
share: {
|
|
620
|
+
params: ['method', 'content_type', 'item_id'],
|
|
621
|
+
placement: 'client',
|
|
622
|
+
providers: {
|
|
623
|
+
ga4: { name: 'share', kind: 'standard' },
|
|
624
|
+
// Neither platform defines Share — today's sites claim it as standard.
|
|
625
|
+
meta: { name: 'Share', kind: 'custom' },
|
|
626
|
+
tiktok: { name: 'Share', kind: 'custom' },
|
|
627
|
+
},
|
|
628
|
+
},
|
|
629
|
+
|
|
630
|
+
// The share panel's copy-to-clipboard half. ClickButton is on NEITHER
|
|
631
|
+
// platform's standard list — TikTok's own set runs AddPaymentInfo … ViewContent
|
|
632
|
+
// and never names it — so this is a custom event on both, under the canonical
|
|
633
|
+
// name ([#652](https://github.com/Omega-JS-Stack/omega/issues/652)).
|
|
634
|
+
copy_link: {
|
|
635
|
+
params: ['content_type', 'item_id'],
|
|
636
|
+
placement: 'client',
|
|
637
|
+
providers: {
|
|
638
|
+
ga4: { name: 'copy_link', kind: 'custom' },
|
|
639
|
+
meta: { name: 'CopyLink', kind: 'custom' },
|
|
640
|
+
tiktok: { name: 'CopyLink', kind: 'custom' },
|
|
641
|
+
},
|
|
642
|
+
},
|
|
643
|
+
|
|
644
|
+
marketing_newsletter_subscribe: {
|
|
645
|
+
params: ['method'],
|
|
646
|
+
placement: 'client',
|
|
647
|
+
providers: {
|
|
648
|
+
ga4: { name: 'marketing_newsletter_subscribe', kind: 'custom' },
|
|
649
|
+
meta: { name: 'Lead', kind: 'standard' },
|
|
650
|
+
tiktok: { name: 'Subscribe', kind: 'standard' },
|
|
651
|
+
},
|
|
652
|
+
},
|
|
653
|
+
|
|
654
|
+
// The status page's incident-updates opt-in — its own event, keeping its
|
|
655
|
+
// live provider dialect (TikTok reads it as a form submit, not a Subscribe).
|
|
656
|
+
status_subscribe: {
|
|
657
|
+
params: ['method'],
|
|
658
|
+
placement: 'client',
|
|
659
|
+
providers: {
|
|
660
|
+
ga4: { name: 'status_subscribe', kind: 'custom' },
|
|
661
|
+
meta: { name: 'Lead', kind: 'standard' },
|
|
662
|
+
tiktok: { name: 'SubmitForm', kind: 'standard' },
|
|
663
|
+
},
|
|
664
|
+
},
|
|
665
|
+
|
|
666
|
+
// ─── Exit popup ───
|
|
667
|
+
|
|
668
|
+
// The popup trio, all custom on both ad platforms
|
|
669
|
+
// ([#652](https://github.com/Omega-JS-Stack/omega/issues/652)): a popup is not
|
|
670
|
+
// a page view (TikTok's ViewContent is "when a visitor views a specific
|
|
671
|
+
// page"), a click is not Meta's Lead ("a submission of information"), and
|
|
672
|
+
// ClickButton is not on TikTok's standard list at all.
|
|
673
|
+
exit_popup_show: {
|
|
674
|
+
params: ['event_category', 'event_label', 'page_path'],
|
|
675
|
+
placement: 'client',
|
|
676
|
+
providers: {
|
|
677
|
+
ga4: { name: 'exit_popup_show', kind: 'custom' },
|
|
678
|
+
meta: { name: 'ExitPopupShow', kind: 'custom' },
|
|
679
|
+
tiktok: { name: 'ExitPopupShow', kind: 'custom' },
|
|
680
|
+
},
|
|
681
|
+
},
|
|
682
|
+
|
|
683
|
+
exit_popup_click: {
|
|
684
|
+
params: ['event_category', 'event_label', 'destination_url'],
|
|
685
|
+
placement: 'client',
|
|
686
|
+
providers: {
|
|
687
|
+
ga4: { name: 'exit_popup_click', kind: 'custom' },
|
|
688
|
+
meta: { name: 'ExitPopupClick', kind: 'custom' },
|
|
689
|
+
tiktok: { name: 'ExitPopupClick', kind: 'custom' },
|
|
690
|
+
},
|
|
691
|
+
},
|
|
692
|
+
|
|
693
|
+
exit_popup_dismiss: {
|
|
694
|
+
params: ['event_category', 'event_label'],
|
|
695
|
+
placement: 'client',
|
|
696
|
+
providers: {
|
|
697
|
+
ga4: { name: 'exit_popup_dismiss', kind: 'custom' },
|
|
698
|
+
meta: { name: 'ExitPopupDismiss', kind: 'custom' },
|
|
699
|
+
tiktok: { name: 'ExitPopupDismiss', kind: 'custom' },
|
|
700
|
+
},
|
|
701
|
+
},
|
|
702
|
+
|
|
703
|
+
// ─── Cookie consent ───
|
|
704
|
+
// TikTok is deliberately unmapped: consent bookkeeping is not an ad signal.
|
|
705
|
+
// (`cookie_consent_auto_accept` is DROPPED — the new consent system has no
|
|
706
|
+
// auto-accept-on-scroll.)
|
|
707
|
+
|
|
708
|
+
cookie_banner_show: {
|
|
709
|
+
params: ['event_category'],
|
|
710
|
+
placement: 'client',
|
|
711
|
+
providers: {
|
|
712
|
+
ga4: { name: 'cookie_banner_show', kind: 'custom' },
|
|
713
|
+
meta: { name: 'CookieBannerShow', kind: 'custom' },
|
|
714
|
+
},
|
|
715
|
+
},
|
|
716
|
+
|
|
717
|
+
cookie_consent_accept: {
|
|
718
|
+
params: ['event_category', 'consent_type'],
|
|
719
|
+
placement: 'client',
|
|
720
|
+
providers: {
|
|
721
|
+
ga4: { name: 'cookie_consent_accept', kind: 'custom' },
|
|
722
|
+
meta: { name: 'CookieConsentAccept', kind: 'custom' },
|
|
723
|
+
},
|
|
724
|
+
},
|
|
725
|
+
|
|
726
|
+
cookie_consent_deny: {
|
|
727
|
+
params: ['event_category', 'consent_type'],
|
|
728
|
+
placement: 'client',
|
|
729
|
+
providers: {
|
|
730
|
+
ga4: { name: 'cookie_consent_deny', kind: 'custom' },
|
|
731
|
+
meta: { name: 'CookieConsentDeny', kind: 'custom' },
|
|
732
|
+
},
|
|
733
|
+
},
|
|
734
|
+
|
|
735
|
+
cookie_policy_reopen: {
|
|
736
|
+
params: ['event_category'],
|
|
737
|
+
placement: 'client',
|
|
738
|
+
providers: {
|
|
739
|
+
ga4: { name: 'cookie_policy_reopen', kind: 'custom' },
|
|
740
|
+
meta: { name: 'CookiePolicyReopen', kind: 'custom' },
|
|
741
|
+
},
|
|
742
|
+
},
|
|
743
|
+
|
|
744
|
+
// ─── Account & portal ───
|
|
745
|
+
// Action buckets: one event with an `action`/`section_name` param, never a
|
|
746
|
+
// per-action event sprawl (the inventory ruling).
|
|
747
|
+
|
|
748
|
+
user_section_view: {
|
|
749
|
+
params: ['section_name'],
|
|
750
|
+
placement: 'client',
|
|
751
|
+
providers: {
|
|
752
|
+
ga4: { name: 'user_section_view', kind: 'custom' },
|
|
753
|
+
},
|
|
754
|
+
},
|
|
755
|
+
|
|
756
|
+
user_billing_action: {
|
|
757
|
+
params: ['action'],
|
|
758
|
+
placement: 'client',
|
|
759
|
+
providers: {
|
|
760
|
+
ga4: { name: 'user_billing_action', kind: 'custom' },
|
|
761
|
+
},
|
|
762
|
+
},
|
|
763
|
+
|
|
764
|
+
user_refund_request: {
|
|
765
|
+
params: ['action'],
|
|
766
|
+
placement: 'client',
|
|
767
|
+
providers: {
|
|
768
|
+
ga4: { name: 'user_refund_request', kind: 'custom' },
|
|
769
|
+
},
|
|
770
|
+
},
|
|
771
|
+
|
|
772
|
+
user_data_request: {
|
|
773
|
+
params: ['action'],
|
|
774
|
+
placement: 'client',
|
|
775
|
+
providers: {
|
|
776
|
+
ga4: { name: 'user_data_request', kind: 'custom' },
|
|
777
|
+
},
|
|
778
|
+
},
|
|
779
|
+
|
|
780
|
+
marketing_email_subscribe: {
|
|
781
|
+
params: ['content_type'],
|
|
782
|
+
placement: 'client',
|
|
783
|
+
providers: {
|
|
784
|
+
ga4: { name: 'marketing_email_subscribe', kind: 'custom' },
|
|
785
|
+
meta: { name: 'EmailSubscribe', kind: 'custom' },
|
|
786
|
+
},
|
|
787
|
+
},
|
|
788
|
+
|
|
789
|
+
marketing_email_unsubscribe: {
|
|
790
|
+
params: ['content_type'],
|
|
791
|
+
placement: 'client',
|
|
792
|
+
providers: {
|
|
793
|
+
ga4: { name: 'marketing_email_unsubscribe', kind: 'custom' },
|
|
794
|
+
meta: { name: 'EmailUnsubscribe', kind: 'custom' },
|
|
795
|
+
},
|
|
796
|
+
},
|
|
797
|
+
|
|
798
|
+
// ─── Notifications ───
|
|
799
|
+
|
|
800
|
+
notification_permission_request: {
|
|
801
|
+
params: [],
|
|
802
|
+
placement: 'client',
|
|
803
|
+
providers: {
|
|
804
|
+
ga4: { name: 'notification_permission_request', kind: 'custom' },
|
|
805
|
+
},
|
|
806
|
+
},
|
|
807
|
+
|
|
808
|
+
notification_permission_grant: {
|
|
809
|
+
params: [],
|
|
810
|
+
placement: 'client',
|
|
811
|
+
providers: {
|
|
812
|
+
ga4: { name: 'notification_permission_grant', kind: 'custom' },
|
|
813
|
+
},
|
|
814
|
+
},
|
|
815
|
+
|
|
816
|
+
notification_permission_deny: {
|
|
817
|
+
params: [],
|
|
818
|
+
placement: 'client',
|
|
819
|
+
providers: {
|
|
820
|
+
ga4: { name: 'notification_permission_deny', kind: 'custom' },
|
|
821
|
+
},
|
|
822
|
+
},
|
|
823
|
+
|
|
824
|
+
notification_subscribe: {
|
|
825
|
+
params: [],
|
|
826
|
+
placement: 'server',
|
|
827
|
+
providers: {
|
|
828
|
+
ga4: { name: 'notification_subscribe', kind: 'custom' },
|
|
829
|
+
},
|
|
830
|
+
},
|
|
831
|
+
|
|
832
|
+
notification_unsubscribe: {
|
|
833
|
+
params: [],
|
|
834
|
+
placement: 'server',
|
|
835
|
+
providers: {
|
|
836
|
+
ga4: { name: 'notification_unsubscribe', kind: 'custom' },
|
|
837
|
+
},
|
|
838
|
+
},
|
|
839
|
+
|
|
840
|
+
// ─── Surfaces ───
|
|
841
|
+
|
|
842
|
+
vert_click: {
|
|
843
|
+
params: ['vert_id', 'vert_lane', 'vert_campaign', 'vert_slot', 'vert_source'],
|
|
844
|
+
placement: 'client',
|
|
845
|
+
providers: {
|
|
846
|
+
ga4: { name: 'vert_click', kind: 'custom' },
|
|
847
|
+
},
|
|
848
|
+
},
|
|
849
|
+
|
|
850
|
+
extension_install: {
|
|
851
|
+
params: ['browser', 'install_url'],
|
|
852
|
+
placement: 'client',
|
|
853
|
+
providers: {
|
|
854
|
+
ga4: { name: 'extension_install', kind: 'custom' },
|
|
855
|
+
meta: { name: 'ExtensionInstall', kind: 'custom' },
|
|
856
|
+
tiktok: { name: 'Download', kind: 'standard' },
|
|
857
|
+
},
|
|
858
|
+
},
|
|
859
|
+
|
|
860
|
+
app_launch: {
|
|
861
|
+
params: [],
|
|
862
|
+
placement: 'client',
|
|
863
|
+
providers: {
|
|
864
|
+
ga4: { name: 'app_launch', kind: 'custom' },
|
|
865
|
+
},
|
|
866
|
+
},
|
|
867
|
+
|
|
868
|
+
// The 404 page's own event, carrying the path that missed. GA4 only: a broken
|
|
869
|
+
// link is ours to fix, never an ad signal.
|
|
870
|
+
page_not_found: {
|
|
871
|
+
params: ['path'],
|
|
872
|
+
placement: 'client',
|
|
873
|
+
providers: {
|
|
874
|
+
ga4: { name: 'page_not_found', kind: 'custom' },
|
|
875
|
+
},
|
|
876
|
+
},
|
|
877
|
+
|
|
878
|
+
user_delete: {
|
|
879
|
+
params: [],
|
|
880
|
+
placement: 'server',
|
|
881
|
+
providers: {
|
|
882
|
+
ga4: { name: 'user_delete', kind: 'custom' },
|
|
883
|
+
},
|
|
884
|
+
},
|
|
885
|
+
};
|
|
886
|
+
|
|
887
|
+
// The placements an entry may declare.
|
|
888
|
+
const PLACEMENTS = ['client', 'server', 'both'];
|
|
889
|
+
|
|
890
|
+
// The provider kinds a mapping may declare.
|
|
891
|
+
const KINDS = ['standard', 'custom'];
|
|
892
|
+
|
|
893
|
+
/**
|
|
894
|
+
* The catalog entry for a canonical event name, or null when it has none.
|
|
895
|
+
* @param {string} name - The canonical event name.
|
|
896
|
+
* @returns {object|null}
|
|
897
|
+
*/
|
|
898
|
+
function entryFor(name) {
|
|
899
|
+
return Object.prototype.hasOwnProperty.call(CATALOG, name) ? CATALOG[name] : null;
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
module.exports = {
|
|
903
|
+
CATALOG,
|
|
904
|
+
PLACEMENTS,
|
|
905
|
+
KINDS,
|
|
906
|
+
entryFor,
|
|
907
|
+
compact,
|
|
908
|
+
};
|