@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,104 @@
|
|
|
1
|
+
// defineCases — the wrapper every OMEGA case file exports its spec through
|
|
2
|
+
// ([#630](https://github.com/Omega-JS-Stack/omega/issues/630)).
|
|
3
|
+
//
|
|
4
|
+
// A case file is a plain module: `module.exports = { tests: [...] }` with the
|
|
5
|
+
// bodies as `run(ctx)` functions. Only the OMEGA runner (src/test/runner-core.js
|
|
6
|
+
// here, @omega.js/backend's own runner there) ever CALLS those bodies. So
|
|
7
|
+
// `node --test <case-file>` loads the module, executes nothing, and reports
|
|
8
|
+
// `pass 1` — a hollow green that reads like a passing suite to a human and to a
|
|
9
|
+
// verifier alike. That is the trap this closes.
|
|
10
|
+
//
|
|
11
|
+
// The signal is `NODE_TEST_CONTEXT`, which node:test sets in the child process
|
|
12
|
+
// it spawns per file (`child-v8`); it is present for the whole module load, so a
|
|
13
|
+
// require-time check sees it. It is NOT enough on its own: the env var is
|
|
14
|
+
// inherited, so a legitimate `omega test` run nested inside a node:test process
|
|
15
|
+
// would trip too. The runners therefore call markRunnerActive() before loading
|
|
16
|
+
// any case file, and that opt-out is an ENV var rather than a module flag
|
|
17
|
+
// because the desktop/extension lanes load their case files in spawned children
|
|
18
|
+
// (Electron), which inherit the environment but not module state.
|
|
19
|
+
|
|
20
|
+
const path = require('path');
|
|
21
|
+
|
|
22
|
+
// Set by every OMEGA case runner before it loads a case file; inherited by the
|
|
23
|
+
// children those runners spawn. Its presence means "the cases are about to run
|
|
24
|
+
// for real", which is exactly what NODE_TEST_CONTEXT alone cannot tell us.
|
|
25
|
+
const RUNNER_ENV = 'OMEGA_CASE_RUNNER';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Mark the current process (and anything it spawns) as an OMEGA case run.
|
|
29
|
+
* @returns {void}
|
|
30
|
+
*/
|
|
31
|
+
function markRunnerActive() {
|
|
32
|
+
process.env[RUNNER_ENV] = 'true';
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Resolve the file that called defineCases, so the failure can name it.
|
|
37
|
+
* @returns {string|null} Absolute path, or null when the stack is unreadable.
|
|
38
|
+
*/
|
|
39
|
+
function callerFile() {
|
|
40
|
+
const original = Error.prepareStackTrace;
|
|
41
|
+
try {
|
|
42
|
+
Error.prepareStackTrace = (_, frames) => frames;
|
|
43
|
+
const error = new Error();
|
|
44
|
+
Error.captureStackTrace(error, defineCases);
|
|
45
|
+
const frames = error.stack;
|
|
46
|
+
return (frames && frames[0] && frames[0].getFileName()) || null;
|
|
47
|
+
} catch (e) {
|
|
48
|
+
return null;
|
|
49
|
+
} finally {
|
|
50
|
+
Error.prepareStackTrace = original;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The runner-scoped path a human types to run just this file, derived from the
|
|
56
|
+
* case file's position under its test root (`test/suites/` or `test/`).
|
|
57
|
+
* @param {string|null} file - Absolute path of the case file.
|
|
58
|
+
* @returns {string} A path filter, or '' when the file sits outside a test root.
|
|
59
|
+
*/
|
|
60
|
+
function scopedPath(file) {
|
|
61
|
+
if (!file) return '';
|
|
62
|
+
const normalized = file.split(path.sep).join('/');
|
|
63
|
+
const root = ['/test/suites/', '/test/'].find((marker) => normalized.includes(marker));
|
|
64
|
+
if (!root) return '';
|
|
65
|
+
// FIRST occurrence anchors on the package's test root: a nested test/ dir
|
|
66
|
+
// (backend test/routes/test/) must stay part of the filter, not swallow it.
|
|
67
|
+
return normalized
|
|
68
|
+
.slice(normalized.indexOf(root) + root.length)
|
|
69
|
+
.replace(/\.test\.js$/, '')
|
|
70
|
+
.replace(/\.js$/, '');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Return a case spec, failing loudly when the file was loaded by `node --test`.
|
|
75
|
+
* @param {object|Array} spec - The case-runner spec (suite, group, standalone, or array form).
|
|
76
|
+
* @returns {object|Array} The same spec, unchanged.
|
|
77
|
+
*/
|
|
78
|
+
function defineCases(spec) {
|
|
79
|
+
// NODE_TEST_CONTEXT only exists in the default per-file child; with
|
|
80
|
+
// --experimental-test-isolation=none the file loads in the main process,
|
|
81
|
+
// where the --test flag itself is the surviving signal.
|
|
82
|
+
if ((process.env.NODE_TEST_CONTEXT || process.execArgv.includes('--test')) && process.env[RUNNER_ENV] !== 'true') {
|
|
83
|
+
const file = callerFile();
|
|
84
|
+
const filter = scopedPath(file);
|
|
85
|
+
throw new Error([
|
|
86
|
+
'OMEGA case file loaded under `node --test` — NOTHING RAN.',
|
|
87
|
+
'',
|
|
88
|
+
` ${file || '(this file)'}`,
|
|
89
|
+
'',
|
|
90
|
+
'`node --test` only loads the module; the case bodies never execute, so the',
|
|
91
|
+
'run reports a hollow pass. These cases run under the OMEGA runner:',
|
|
92
|
+
'',
|
|
93
|
+
` npx omega test framework:${filter} (a framework suite)`,
|
|
94
|
+
` npx omega test ${filter} (a project's own test/)`,
|
|
95
|
+
'',
|
|
96
|
+
].join('\n'));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return spec;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
module.exports = defineCases;
|
|
103
|
+
module.exports.markRunnerActive = markRunnerActive;
|
|
104
|
+
module.exports.RUNNER_ENV = RUNNER_ENV;
|
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
// Shared test-runner core for the OMEGA frameworks — discovery, suite/group/standalone
|
|
2
|
+
// execution, filtering, skip semantics, init hooks, and reporting. Extracted from UJM's
|
|
3
|
+
// runner (the canonical 3-layer build/page/boot model); BXM/EM/UJM differ only in title,
|
|
4
|
+
// package name, CLI target alias, and their special layers — all injected via config.
|
|
5
|
+
//
|
|
6
|
+
// Test-definition forms supported (see each framework's test/index.js for docs):
|
|
7
|
+
// - Standalone: module.exports = { layer, description, run, cleanup, timeout, skip };
|
|
8
|
+
// - Suite: module.exports = { type: 'suite', layer, description, tests: [...], cleanup, stopOnFailure };
|
|
9
|
+
// - Group: module.exports = { type: 'group', layer, description, tests: [...], cleanup };
|
|
10
|
+
// - Array form: module.exports = [ {name, run}, ... ]; // implicit group
|
|
11
|
+
//
|
|
12
|
+
// Suites stop on first failure (sequential, share state). Groups run all tests regardless.
|
|
13
|
+
//
|
|
14
|
+
// createRunner(config) config surface:
|
|
15
|
+
// title — heading printed at the top of a run ('Browser Extension Manager Tests')
|
|
16
|
+
// packageName — framework npm name; cwd package === this ⇒ framework self-test mode
|
|
17
|
+
// (framework boot/ suites only run in self-test mode — they assert on
|
|
18
|
+
// the framework's own fixture consumer)
|
|
19
|
+
// targetAlias — framework-specific target prefix (e.g. 'desktop' | 'extension');
|
|
20
|
+
// 'framework:'/'omega:'/'mgr:' (framework suite), 'project:'/'brand:'
|
|
21
|
+
// (project tests) and 'full:' (both) are universal — see test/scope.js.
|
|
22
|
+
// C5 semantics: bare/no-target runs PROJECT tests only in a consumer,
|
|
23
|
+
// the framework suite in framework self-test mode.
|
|
24
|
+
// suitesDir — the framework's built default suites dir (dist/test/suites)
|
|
25
|
+
// frameworkTestDir — the framework repo's own test/ dir (for its _init.js hook)
|
|
26
|
+
// middleLayers — ordered special layers between 'build' and 'boot':
|
|
27
|
+
// [{ layers: ['background','view'], run: async ({ byLayer, wants,
|
|
28
|
+
// options, results, projectRoot }) => void }]
|
|
29
|
+
// The callback owns runner loading, skip messaging, and results
|
|
30
|
+
// mutation — framework glue stays framework-side.
|
|
31
|
+
// bootDefaultTimeout — per-test default for boot-layer inspect() (UJM/BXM 20000, EM 15000)
|
|
32
|
+
// boot: { run: async ({ tests, suites, options, results, projectRoot }) => void }
|
|
33
|
+
// Called with the aggregated flat boot test list plus the boot-BOUND
|
|
34
|
+
// suites (at least one of the two is non-empty).
|
|
35
|
+
// Owns runner loading, skip messaging, label, and results mutation.
|
|
36
|
+
// bootBound: (mod) => boolean, a predicate over a loaded test module. True
|
|
37
|
+
// partitions that FILE into the boot layer whatever its `layer` says,
|
|
38
|
+
// and hands it to boot.run WHOLE (`suites: [{ file, mod }]`) instead
|
|
39
|
+
// of flattening it into the inspect list: for suites that need the
|
|
40
|
+
// boot lane's built app but run their own way (EM's `view:` renderer
|
|
41
|
+
// suites). Default: () => false. An array-form file is never bound.
|
|
42
|
+
|
|
43
|
+
const path = require('path');
|
|
44
|
+
const glob = require('glob').globSync;
|
|
45
|
+
const jetpack = require('fs-jetpack');
|
|
46
|
+
const chalk = require('chalk').default;
|
|
47
|
+
|
|
48
|
+
const expect = require('./assert.js');
|
|
49
|
+
const { parseTestScope, isPathTargeted } = require('./scope.js');
|
|
50
|
+
const { markRunnerActive } = require('./define-cases.js');
|
|
51
|
+
|
|
52
|
+
class SkipError extends Error {
|
|
53
|
+
constructor(reason) { super(reason); this.name = 'SkipError'; }
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Glob ignore patterns implementing the "underscore = not a suite" convention:
|
|
57
|
+
// `_`-prefixed FILES (e.g. test/_init.js) and everything under a `_`-prefixed
|
|
58
|
+
// DIRECTORY at any depth (helpers, fixtures — e.g. test/_helpers/harness.js).
|
|
59
|
+
const DISCOVERY_IGNORE = ['**/_*.js', '**/_*/**'];
|
|
60
|
+
|
|
61
|
+
function createRunner(config) {
|
|
62
|
+
const middleLayers = config.middleLayers || [];
|
|
63
|
+
const layerNames = ['build', ...middleLayers.flatMap((m) => m.layers), 'boot'];
|
|
64
|
+
const bootDefaultTimeout = config.bootDefaultTimeout || 20000;
|
|
65
|
+
const bootBound = config.bootBound || (() => false);
|
|
66
|
+
|
|
67
|
+
async function run(options = {}) {
|
|
68
|
+
options.layer = options.layer || 'all';
|
|
69
|
+
options.target = options.target || null;
|
|
70
|
+
options.filter = options.filter || null;
|
|
71
|
+
options.reporter = options.reporter || 'pretty';
|
|
72
|
+
|
|
73
|
+
const startTime = Date.now();
|
|
74
|
+
|
|
75
|
+
// Claim the run before any case file is required: defineCases() only lets a
|
|
76
|
+
// spec through once a real runner is loading it (#630).
|
|
77
|
+
markRunnerActive();
|
|
78
|
+
|
|
79
|
+
const sources = discoverTestFiles(options.target);
|
|
80
|
+
|
|
81
|
+
console.log('');
|
|
82
|
+
console.log(chalk.bold(` ${config.title}`));
|
|
83
|
+
|
|
84
|
+
// Run the optional test/_init.js setup() hooks (framework + consumer) ONCE,
|
|
85
|
+
// before any suite. There is no cleanup hook — tests clean up after themselves.
|
|
86
|
+
await runInitSetups();
|
|
87
|
+
|
|
88
|
+
// noMatch carries the target a run named that selected nothing; the CLI
|
|
89
|
+
// turns it into a non-zero exit ([#814](https://github.com/Omega-JS-Stack/omega/issues/814)).
|
|
90
|
+
const results = { passed: 0, failed: 0, skipped: 0, noMatch: null, tests: [] };
|
|
91
|
+
|
|
92
|
+
if (sources.framework.length > 0) {
|
|
93
|
+
console.log('');
|
|
94
|
+
console.log(chalk.bold(' Framework Tests'));
|
|
95
|
+
await runSource(sources.framework, 'framework', options, results);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (sources.project.length > 0) {
|
|
99
|
+
console.log('');
|
|
100
|
+
console.log(chalk.bold(' Project Tests'));
|
|
101
|
+
await runSource(sources.project, 'project', options, results);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (sources.framework.length === 0 && sources.project.length === 0) {
|
|
105
|
+
if (isPathTargeted(sources.scope)) {
|
|
106
|
+
// The run named a path and got nothing: a typo, or a suite that was
|
|
107
|
+
// renamed out from under the target. Reporting "0 passing" and exiting
|
|
108
|
+
// 0 there runs silently green
|
|
109
|
+
// ([#814](https://github.com/Omega-JS-Stack/omega/issues/814)); the
|
|
110
|
+
// caller prints the tagged line and fails the run.
|
|
111
|
+
results.noMatch = options.target;
|
|
112
|
+
} else {
|
|
113
|
+
console.log(chalk.gray(' No test files found.'));
|
|
114
|
+
}
|
|
115
|
+
} else if (options.layer === 'boot'
|
|
116
|
+
&& results.passed + results.failed + results.skipped === 0) {
|
|
117
|
+
// Explain the silence: framework boot/ suites are excluded from consumer
|
|
118
|
+
// discovery (they assert on the framework's own fixture consumer), so a
|
|
119
|
+
// consumer asking for the boot layer with no suites of their own runs nothing.
|
|
120
|
+
console.log(chalk.gray(' No boot tests ran. Framework boot suites are self-test only; write yours under test/boot/.'));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
reportResults(results, Date.now() - startTime);
|
|
124
|
+
|
|
125
|
+
return results;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
async function runSource(files, source, options, results) {
|
|
129
|
+
// Partition by layer (peek at module.exports without invoking run functions).
|
|
130
|
+
const byLayer = {};
|
|
131
|
+
layerNames.forEach((name) => { byLayer[name] = []; });
|
|
132
|
+
for (const file of files) {
|
|
133
|
+
const layer = peekLayer(file) || 'build';
|
|
134
|
+
if (byLayer[layer]) byLayer[layer].push(file);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Build layer — run inline.
|
|
138
|
+
if ((options.layer === 'all' || options.layer === 'build') && byLayer.build.length > 0) {
|
|
139
|
+
for (const file of byLayer.build) {
|
|
140
|
+
await runBuildFile(file, source, options, results);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Special layers (framework glue owns runner loading + results mutation).
|
|
145
|
+
for (const middle of middleLayers) {
|
|
146
|
+
const wants = {};
|
|
147
|
+
let any = false;
|
|
148
|
+
for (const name of middle.layers) {
|
|
149
|
+
wants[name] = (options.layer === 'all' || options.layer === name) && byLayer[name].length > 0;
|
|
150
|
+
any = any || wants[name];
|
|
151
|
+
}
|
|
152
|
+
if (any) {
|
|
153
|
+
await middle.run({ byLayer, wants, options, results, projectRoot: process.cwd() });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Boot layer — aggregate then hand to framework glue.
|
|
158
|
+
if ((options.layer === 'all' || options.layer === 'boot') && byLayer.boot.length > 0) {
|
|
159
|
+
await runBootLayer(byLayer.boot, source, options, results);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async function runBootLayer(files, source, options, results) {
|
|
164
|
+
// Aggregate every boot test (whether standalone or inside a suite) into one flat list.
|
|
165
|
+
// The boot harness runs them sequentially in a single process to keep startup cost
|
|
166
|
+
// amortized. State doesn't carry across boot tests.
|
|
167
|
+
//
|
|
168
|
+
// Boot-BOUND files (config.bootBound) are the exception: they ride this lane for its
|
|
169
|
+
// built app, but the framework glue runs them its own way, so they stay whole.
|
|
170
|
+
const tests = [];
|
|
171
|
+
const suites = [];
|
|
172
|
+
|
|
173
|
+
for (const file of files) {
|
|
174
|
+
let mod;
|
|
175
|
+
try {
|
|
176
|
+
delete require.cache[require.resolve(file)];
|
|
177
|
+
mod = require(file);
|
|
178
|
+
} catch (e) {
|
|
179
|
+
const rel = relativizePath(file, source);
|
|
180
|
+
console.log(chalk.red(` ✗ ${rel}`));
|
|
181
|
+
console.log(chalk.red(` Failed to load: ${e.message}`));
|
|
182
|
+
results.failed += 1;
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (Array.isArray(mod)) mod = { type: 'group', tests: mod };
|
|
187
|
+
|
|
188
|
+
if (bootBound(mod)) {
|
|
189
|
+
// The filter reads the same way it does for the inspect list below: a test whose
|
|
190
|
+
// own name misses it is dropped, and a suite with nothing left never runs.
|
|
191
|
+
const bound = (mod.tests || []).filter((t) => !options.filter
|
|
192
|
+
|| String(t.name || t.description || '').includes(options.filter));
|
|
193
|
+
if (options.filter && bound.length === 0) continue;
|
|
194
|
+
suites.push({
|
|
195
|
+
file,
|
|
196
|
+
mod: bound.length === (mod.tests || []).length ? mod : { ...mod, tests: bound },
|
|
197
|
+
});
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (Array.isArray(mod.tests)) {/* multi-test */ }
|
|
202
|
+
else if (typeof mod.inspect === 'function') mod = { tests: [mod] };
|
|
203
|
+
|
|
204
|
+
const baseDescription = mod.description || relativizePath(file, source);
|
|
205
|
+
|
|
206
|
+
for (const t of (mod.tests || [])) {
|
|
207
|
+
if (typeof t.inspect !== 'function') continue;
|
|
208
|
+
if (options.filter && !(t.description || baseDescription).includes(options.filter)) continue;
|
|
209
|
+
tests.push({
|
|
210
|
+
description: t.description || baseDescription,
|
|
211
|
+
timeout: t.timeout || mod.timeout || bootDefaultTimeout,
|
|
212
|
+
inspect: t.inspect,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (tests.length === 0 && suites.length === 0) return;
|
|
218
|
+
|
|
219
|
+
await config.boot.run({ tests, suites, options, results, projectRoot: process.cwd() });
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function peekLayer(file) {
|
|
223
|
+
try {
|
|
224
|
+
delete require.cache[require.resolve(file)];
|
|
225
|
+
let mod = require(file);
|
|
226
|
+
if (Array.isArray(mod)) mod = { type: 'group', tests: mod };
|
|
227
|
+
// A boot-bound file belongs to the boot lane whatever its own layer says.
|
|
228
|
+
if (bootBound(mod)) return 'boot';
|
|
229
|
+
return mod.layer || 'build';
|
|
230
|
+
} catch (e) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
async function runBuildFile(file, source, options, results) {
|
|
236
|
+
let mod;
|
|
237
|
+
try {
|
|
238
|
+
delete require.cache[require.resolve(file)];
|
|
239
|
+
mod = require(file);
|
|
240
|
+
} catch (e) {
|
|
241
|
+
const rel = relativizePath(file, source);
|
|
242
|
+
console.log(chalk.red(` ✗ ${rel}`));
|
|
243
|
+
console.log(chalk.red(` Failed to load: ${e.message}`));
|
|
244
|
+
results.failed += 1;
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (Array.isArray(mod)) {
|
|
249
|
+
mod = { type: 'group', tests: mod };
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const rel = relativizePath(file, source);
|
|
253
|
+
|
|
254
|
+
if (mod.skip) {
|
|
255
|
+
const reason = typeof mod.skip === 'string' ? mod.skip : '';
|
|
256
|
+
console.log(`${chalk.yellow(` ○ ${mod.description || rel}`)}${chalk.gray(` (skipped${reason ? `: ${reason}` : ''})`)}`);
|
|
257
|
+
const count = Array.isArray(mod.tests) ? mod.tests.length : 1;
|
|
258
|
+
results.skipped += count;
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (mod.type === 'suite' || mod.type === 'group' || Array.isArray(mod.tests)) {
|
|
263
|
+
await runSuite(mod, rel, options, results);
|
|
264
|
+
} else {
|
|
265
|
+
await runStandalone(mod, rel, options, results);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
async function runSuite(suite, rel, options, results) {
|
|
270
|
+
const description = suite.description || rel;
|
|
271
|
+
const isGroup = suite.type === 'group';
|
|
272
|
+
const stopOnFailure = !isGroup && suite.stopOnFailure !== false;
|
|
273
|
+
const tests = suite.tests || [];
|
|
274
|
+
|
|
275
|
+
console.log(chalk.cyan(` ⤷ ${description}`));
|
|
276
|
+
|
|
277
|
+
const state = {};
|
|
278
|
+
|
|
279
|
+
for (let i = 0; i < tests.length; i += 1) {
|
|
280
|
+
const t = tests[i];
|
|
281
|
+
const name = t.name || `step-${i + 1}`;
|
|
282
|
+
|
|
283
|
+
if (options.filter && !name.includes(options.filter) && !description.includes(options.filter)) continue;
|
|
284
|
+
|
|
285
|
+
if (t.skip) {
|
|
286
|
+
const reason = typeof t.skip === 'string' ? t.skip : '';
|
|
287
|
+
console.log(`${chalk.yellow(` ○ ${name}`)}${chalk.gray(` (skipped${reason ? `: ${reason}` : ''})`)}`);
|
|
288
|
+
results.skipped += 1;
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const ctx = createContext({ state, layer: suite.layer || 'build' });
|
|
293
|
+
const timeout = t.timeout || suite.timeout || 30000;
|
|
294
|
+
|
|
295
|
+
const start = Date.now();
|
|
296
|
+
try {
|
|
297
|
+
await Promise.race([
|
|
298
|
+
Promise.resolve(t.run(ctx)),
|
|
299
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Test timeout')), timeout)),
|
|
300
|
+
]);
|
|
301
|
+
const duration = Date.now() - start;
|
|
302
|
+
console.log(chalk.green(` ✓ ${name}`) + chalk.gray(` (${duration}ms)`));
|
|
303
|
+
results.passed += 1;
|
|
304
|
+
|
|
305
|
+
if (t.cleanup) {
|
|
306
|
+
try { await t.cleanup(ctx); } catch (e) {
|
|
307
|
+
console.log(chalk.yellow(` ⚠ Cleanup failed: ${e.message}`));
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
} catch (e) {
|
|
311
|
+
const duration = Date.now() - start;
|
|
312
|
+
if (e.name === 'SkipError') {
|
|
313
|
+
console.log(chalk.yellow(` ○ ${name}`) + chalk.gray(` (skipped: ${e.message})`));
|
|
314
|
+
results.skipped += 1;
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
console.log(chalk.red(` ✗ ${name}`) + chalk.gray(` (${duration}ms)`));
|
|
318
|
+
console.log(chalk.red(` ${e.message || e}`));
|
|
319
|
+
results.failed += 1;
|
|
320
|
+
|
|
321
|
+
if (stopOnFailure) {
|
|
322
|
+
const remaining = tests.length - i - 1;
|
|
323
|
+
if (remaining > 0) {
|
|
324
|
+
console.log(chalk.yellow(` Skipping ${remaining} remaining test(s) in suite`));
|
|
325
|
+
results.skipped += remaining;
|
|
326
|
+
}
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
if (suite.cleanup) {
|
|
333
|
+
try {
|
|
334
|
+
const ctx = createContext({ state, layer: suite.layer || 'build' });
|
|
335
|
+
await suite.cleanup(ctx);
|
|
336
|
+
} catch (e) {
|
|
337
|
+
console.log(chalk.yellow(` ⚠ Suite cleanup failed: ${e.message}`));
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
async function runStandalone(mod, rel, options, results) {
|
|
343
|
+
const description = mod.description || rel;
|
|
344
|
+
if (options.filter && !description.includes(options.filter)) return;
|
|
345
|
+
|
|
346
|
+
const ctx = createContext({ state: {}, layer: mod.layer || 'build' });
|
|
347
|
+
const timeout = mod.timeout || 30000;
|
|
348
|
+
|
|
349
|
+
const start = Date.now();
|
|
350
|
+
try {
|
|
351
|
+
await Promise.race([
|
|
352
|
+
Promise.resolve(mod.run(ctx)),
|
|
353
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Test timeout')), timeout)),
|
|
354
|
+
]);
|
|
355
|
+
const duration = Date.now() - start;
|
|
356
|
+
console.log(chalk.green(` ✓ ${description}`) + chalk.gray(` (${duration}ms)`));
|
|
357
|
+
results.passed += 1;
|
|
358
|
+
|
|
359
|
+
if (mod.cleanup) {
|
|
360
|
+
try { await mod.cleanup(ctx); } catch (e) {
|
|
361
|
+
console.log(chalk.yellow(` ⚠ Cleanup failed: ${e.message}`));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
} catch (e) {
|
|
365
|
+
const duration = Date.now() - start;
|
|
366
|
+
if (e.name === 'SkipError') {
|
|
367
|
+
console.log(chalk.yellow(` ○ ${description}`) + chalk.gray(` (skipped: ${e.message})`));
|
|
368
|
+
results.skipped += 1;
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
console.log(chalk.red(` ✗ ${description}`) + chalk.gray(` (${duration}ms)`));
|
|
372
|
+
console.log(chalk.red(` ${e.message || e}`));
|
|
373
|
+
results.failed += 1;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function createContext({ state, layer }) {
|
|
378
|
+
return {
|
|
379
|
+
expect,
|
|
380
|
+
state,
|
|
381
|
+
layer,
|
|
382
|
+
skip(reason) { throw new SkipError(reason || 'skipped at runtime'); },
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
function reportResults(results, durationMs) {
|
|
387
|
+
const total = results.passed + results.failed + results.skipped;
|
|
388
|
+
console.log('');
|
|
389
|
+
console.log(` ${chalk.bold('Results')}`);
|
|
390
|
+
console.log(` ${chalk.green(`${results.passed} passing`)}`);
|
|
391
|
+
if (results.failed > 0) console.log(` ${chalk.red(`${results.failed} failing`)}`);
|
|
392
|
+
if (results.skipped > 0) console.log(` ${chalk.yellow(`${results.skipped} skipped`)}`);
|
|
393
|
+
console.log(chalk.gray(`\n Total: ${total} tests in ${durationMs}ms\n`));
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// A relative path in the scope grammar's own spelling: forward slashes,
|
|
397
|
+
// whatever separator the OS handed back.
|
|
398
|
+
function toPosix(p) {
|
|
399
|
+
return String(p).split(path.sep).join('/').replace(/\\/g, '/');
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Narrow a source's file list by that source's scope filters (C5: source
|
|
403
|
+
// selection already happened in parseTestScope — this only path-matches).
|
|
404
|
+
function filterBySource(source, files, scope) {
|
|
405
|
+
if (!scope.sources.includes(source)) {
|
|
406
|
+
return [];
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
const filters = scope.filters[source];
|
|
410
|
+
if (filters.length === 0) {
|
|
411
|
+
return files;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// The scope grammar is written with forward slashes (`desktop:build/runner`)
|
|
415
|
+
// on every platform; path.relative answers with the OS separator, so on
|
|
416
|
+
// Windows `build\runner.test.js` never matched `build/runner` and every
|
|
417
|
+
// scoped run reported "No test files found" ([#337](https://github.com/Omega-JS-Stack/omega/issues/337)).
|
|
418
|
+
// Both sides are compared in slash form.
|
|
419
|
+
return files.filter((file) => {
|
|
420
|
+
const rel = toPosix(relativizePath(file, source));
|
|
421
|
+
const relNoExt = rel.replace(/\.js$/, '').replace(/\.test$/, '');
|
|
422
|
+
return filters.some((rawPart) => {
|
|
423
|
+
const pathPart = toPosix(rawPart);
|
|
424
|
+
const partNoExt = pathPart.replace(/\.js$/, '').replace(/\.test$/, '');
|
|
425
|
+
return rel.startsWith(pathPart)
|
|
426
|
+
|| relNoExt === partNoExt
|
|
427
|
+
|| relNoExt.startsWith(`${partNoExt}/`)
|
|
428
|
+
|| rel.includes(pathPart);
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
function discoverTestFiles(target) {
|
|
434
|
+
|
|
435
|
+
const framework = [];
|
|
436
|
+
const project = [];
|
|
437
|
+
|
|
438
|
+
// Detect whether we're running the framework's own self-tests, vs a consumer
|
|
439
|
+
// who installed it and is running their own tests. Used below to filter the
|
|
440
|
+
// boot/ layer of framework suites — those target the framework's internal
|
|
441
|
+
// fixture consumer, so they only make sense when the framework tests itself.
|
|
442
|
+
const isFrameworkSelfTest = (() => {
|
|
443
|
+
try {
|
|
444
|
+
const cwdPkg = require(path.join(process.cwd(), 'package.json'));
|
|
445
|
+
return cwdPkg.name === config.packageName;
|
|
446
|
+
} catch (_) { return false; }
|
|
447
|
+
})();
|
|
448
|
+
|
|
449
|
+
// Framework default suites. For consumers, we exclude boot/ — those suites
|
|
450
|
+
// assert on the framework's own fixture consumer and would fail noisily when
|
|
451
|
+
// run against a real consumer's build. Consumers write their own boot tests
|
|
452
|
+
// under <cwd>/test/boot/.
|
|
453
|
+
if (jetpack.exists(config.suitesDir)) {
|
|
454
|
+
const ignore = [...DISCOVERY_IGNORE];
|
|
455
|
+
if (!isFrameworkSelfTest) ignore.push('boot/**');
|
|
456
|
+
glob('**/*.js', { cwd: config.suitesDir, ignore }).sort().forEach((rel) => {
|
|
457
|
+
framework.push(path.join(config.suitesDir, rel));
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// Consumer project suites — CWD/test/**/*.js. Skip when running from inside the
|
|
462
|
+
// framework's own dist tree (where consumer-tests-dir === framework-tests-parent).
|
|
463
|
+
// Excludes `_`-prefixed files and directories (see DISCOVERY_IGNORE).
|
|
464
|
+
const projectTestsDir = path.join(process.cwd(), 'test');
|
|
465
|
+
if (jetpack.exists(projectTestsDir) && projectTestsDir !== path.dirname(config.suitesDir)) {
|
|
466
|
+
glob('**/*.js', { cwd: projectTestsDir, ignore: [...DISCOVERY_IGNORE] }).sort().forEach((rel) => {
|
|
467
|
+
project.push(path.join(projectTestsDir, rel));
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// C5 scoping: bare/`project:`/`brand:` = project tests only,
|
|
472
|
+
// `framework:`/`omega:`/`mgr:`/`<targetAlias>:` = the framework suite,
|
|
473
|
+
// `full:` = both; framework self context defaults to the framework suite.
|
|
474
|
+
const scope = parseTestScope(target ? [target] : [], {
|
|
475
|
+
frameworkAliases: config.frameworkAliases || [config.targetAlias],
|
|
476
|
+
selfTest: isFrameworkSelfTest,
|
|
477
|
+
});
|
|
478
|
+
for (const bad of scope.invalid) {
|
|
479
|
+
console.log(chalk.yellow(` ⚠ Unknown test scope prefix ignored: ${bad}`));
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
return {
|
|
483
|
+
framework: filterBySource('framework', framework, scope),
|
|
484
|
+
project: filterBySource('project', project, scope),
|
|
485
|
+
scope,
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
function relativizePath(file, source) {
|
|
490
|
+
if (source === 'framework') {
|
|
491
|
+
return path.relative(config.suitesDir, file);
|
|
492
|
+
}
|
|
493
|
+
return path.relative(path.join(process.cwd(), 'test'), file);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
// ---------------------------------------------------------------------------
|
|
497
|
+
// test/_init.js — pre-test lifecycle hook (setup only)
|
|
498
|
+
//
|
|
499
|
+
// Mirrors the backend framework's hook so all frameworks share one shape.
|
|
500
|
+
// A project may add `<cwd>/test/_init.js` exporting a FUNCTION —
|
|
501
|
+
// `module.exports = (ctx) => ({ setup })` — called with `{ projectRoot }` and
|
|
502
|
+
// returning an object with an async `setup({ projectRoot })` that runs ONCE
|
|
503
|
+
// before any suite (e.g. to scaffold a fixture file the boot layer needs).
|
|
504
|
+
// There is no `cleanup` hook: tests clean up after themselves.
|
|
505
|
+
// ---------------------------------------------------------------------------
|
|
506
|
+
|
|
507
|
+
function loadInit(testDir, label) {
|
|
508
|
+
const initPath = path.join(testDir, '_init.js');
|
|
509
|
+
|
|
510
|
+
if (!jetpack.exists(initPath)) {
|
|
511
|
+
return {};
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
try {
|
|
515
|
+
const fn = require(initPath);
|
|
516
|
+
|
|
517
|
+
if (typeof fn !== 'function') {
|
|
518
|
+
console.log(chalk.red(` ✗ ${label} test/_init.js must export a function: module.exports = (ctx) => ({ ... })`));
|
|
519
|
+
return {};
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
const mod = fn({ projectRoot: process.cwd() });
|
|
523
|
+
return mod && typeof mod === 'object' ? mod : {};
|
|
524
|
+
} catch (e) {
|
|
525
|
+
console.log(chalk.red(` ✗ Failed to load ${label} test/_init.js: ${e.message}`));
|
|
526
|
+
return {};
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
async function runInitSetups() {
|
|
531
|
+
const projectTestsDir = path.join(process.cwd(), 'test');
|
|
532
|
+
|
|
533
|
+
const hooks = [
|
|
534
|
+
loadInit(config.frameworkTestDir, 'framework'),
|
|
535
|
+
loadInit(projectTestsDir, 'project'),
|
|
536
|
+
];
|
|
537
|
+
|
|
538
|
+
const setups = hooks.filter((h) => typeof h.setup === 'function').map((h) => h.setup);
|
|
539
|
+
|
|
540
|
+
for (const setup of setups) {
|
|
541
|
+
process.stdout.write(chalk.gray(' Running test/_init.js setup... '));
|
|
542
|
+
try {
|
|
543
|
+
await setup({ projectRoot: process.cwd() });
|
|
544
|
+
console.log(chalk.green('✓'));
|
|
545
|
+
} catch (e) {
|
|
546
|
+
console.log(chalk.red(`✗ (${e.message})`));
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
return { run, relativizePath };
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
module.exports = { createRunner, SkipError, DISCOVERY_IGNORE, expect };
|