@omega.js/manager 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/.claude-plugin/marketplace.json +14 -0
- package/LICENSE +98 -0
- package/README.md +165 -0
- package/bin/omega +2 -0
- package/bin/omg +2 -0
- package/claude-plugin/.claude-plugin/plugin.json +11 -0
- package/claude-plugin/.mcp.json +9 -0
- package/claude-plugin/README.md +139 -0
- package/claude-plugin/hooks/gate/mark.sh +58 -0
- package/claude-plugin/hooks/gate/run.sh +97 -0
- package/claude-plugin/hooks/guard/run.sh +249 -0
- package/claude-plugin/hooks/hooks.json +63 -0
- package/claude-plugin/hooks/inject/run.sh +127 -0
- package/claude-plugin/hooks/lib/omega-gate.sh +20 -0
- package/claude-plugin/hooks/lib/omega-scope.sh +41 -0
- package/claude-plugin/hooks/lib/omega-skills.sh +209 -0
- package/claude-plugin/hooks/quality/run.sh +132 -0
- package/claude-plugin/hooks/shape/run.sh +45 -0
- package/claude-plugin/mcp-router-launch.js +29 -0
- package/claude-plugin/skills/README.md +48 -0
- package/claude-plugin/skills/accessibility/SKILL.md +31 -0
- package/claude-plugin/skills/analytics/SKILL.md +30 -0
- package/claude-plugin/skills/backend/SKILL.md +25 -0
- package/claude-plugin/skills/brandcheck/SKILL.md +29 -0
- package/claude-plugin/skills/browser/SKILL.md +64 -0
- package/claude-plugin/skills/client/SKILL.md +24 -0
- package/claude-plugin/skills/desktop/SKILL.md +25 -0
- package/claude-plugin/skills/extension/SKILL.md +25 -0
- package/claude-plugin/skills/main/SKILL.md +54 -0
- package/claude-plugin/skills/manager/SKILL.md +25 -0
- package/claude-plugin/skills/seo/SKILL.md +36 -0
- package/claude-plugin/skills/theme/SKILL.md +33 -0
- package/claude-plugin/skills/web/SKILL.md +29 -0
- package/dist/cli-run.js +34 -0
- package/dist/cli.js +29 -0
- package/dist/commands/build.js +17 -0
- package/dist/commands/clean.js +16 -0
- package/dist/commands/company.js +46 -0
- package/dist/commands/deploy.js +143 -0
- package/dist/commands/dev.js +437 -0
- package/dist/commands/devlog.js +25 -0
- package/dist/commands/help.js +48 -0
- package/dist/commands/manage.js +53 -0
- package/dist/commands/migrate.js +76 -0
- package/dist/commands/onboard.js +31 -0
- package/dist/commands/pipeline.js +319 -0
- package/dist/commands/test.js +380 -0
- package/dist/commands/update.js +128 -0
- package/dist/commands/version.js +8 -0
- package/dist/company-init.js +167 -0
- package/dist/company.js +283 -0
- package/dist/config.js +1359 -0
- package/dist/devlog/index.js +226 -0
- package/dist/devlog/lib/collect-commits.js +136 -0
- package/dist/devlog/lib/generate-post.js +201 -0
- package/dist/devlog/lib/ghostii.js +122 -0
- package/dist/devlog/lib/project-map.js +98 -0
- package/dist/devlog/lib/publish-website.js +88 -0
- package/dist/index.js +45 -0
- package/dist/lib/agents-md.js +201 -0
- package/dist/lib/analytics-secret.js +22 -0
- package/dist/lib/argv.js +21 -0
- package/dist/lib/auth-admin.js +120 -0
- package/dist/lib/automation-client.js +210 -0
- package/dist/lib/backend-marketing.js +49 -0
- package/dist/lib/brand.js +240 -0
- package/dist/lib/bundle-id.js +53 -0
- package/dist/lib/claude-settings.js +125 -0
- package/dist/lib/company-scaffold.js +213 -0
- package/dist/lib/company.js +227 -0
- package/dist/lib/config-flow.js +350 -0
- package/dist/lib/config-write.js +41 -0
- package/dist/lib/custom-target.js +75 -0
- package/dist/lib/domain-utils.js +19 -0
- package/dist/lib/duration.js +39 -0
- package/dist/lib/env-order.js +236 -0
- package/dist/lib/env-secret.js +78 -0
- package/dist/lib/firestore-rest.js +326 -0
- package/dist/lib/framework-bin.js +156 -0
- package/dist/lib/gitignore.js +63 -0
- package/dist/lib/google-auth.js +495 -0
- package/dist/lib/google-token.js +66 -0
- package/dist/lib/jwt.js +31 -0
- package/dist/lib/legacy-oauth.js +59 -0
- package/dist/lib/node-version.js +127 -0
- package/dist/lib/owner-plan.js +78 -0
- package/dist/lib/package-scripts.js +152 -0
- package/dist/lib/preflight.js +470 -0
- package/dist/lib/product-create.js +144 -0
- package/dist/lib/run-command.js +74 -0
- package/dist/lib/run-gates.js +70 -0
- package/dist/lib/run-output.js +42 -0
- package/dist/lib/run-summary.js +384 -0
- package/dist/lib/scaffold.js +427 -0
- package/dist/lib/service-input.js +207 -0
- package/dist/lib/service-runner.js +466 -0
- package/dist/lib/stale.js +24 -0
- package/dist/lib/target-selection.js +155 -0
- package/dist/lib/verb-fanout.js +128 -0
- package/dist/lib/verify-live.js +188 -0
- package/dist/manage.js +311 -0
- package/dist/omega-bin.js +7 -0
- package/dist/onboard.js +532 -0
- package/dist/services/account/ensure/users.js +259 -0
- package/dist/services/account/index.js +97 -0
- package/dist/services/account/lib/backend-client.js +107 -0
- package/dist/services/account/lib/password.js +36 -0
- package/dist/services/account/lib/resolve-password.js +100 -0
- package/dist/services/advertising/ensure/sites.js +101 -0
- package/dist/services/advertising/index.js +101 -0
- package/dist/services/advertising/lib/adsense-api.js +41 -0
- package/dist/services/ai/ensure/keys.js +21 -0
- package/dist/services/ai/index.js +36 -0
- package/dist/services/analytics/ensure/google-firebase-link.js +230 -0
- package/dist/services/analytics/ensure/google-streams.js +256 -0
- package/dist/services/analytics/ensure/meta-pixel.js +22 -0
- package/dist/services/analytics/ensure/tiktok-pixel.js +22 -0
- package/dist/services/analytics/index.js +134 -0
- package/dist/services/analytics/lib/analytics-api.js +156 -0
- package/dist/services/analytics/lib/meta-api.js +83 -0
- package/dist/services/analytics/lib/pixel-account.js +78 -0
- package/dist/services/analytics/lib/pixel-provision.js +152 -0
- package/dist/services/analytics/lib/pixel-specs.js +57 -0
- package/dist/services/analytics/lib/pixel-token.js +88 -0
- package/dist/services/analytics/lib/property-flow.js +77 -0
- package/dist/services/analytics/lib/tiktok-api.js +157 -0
- package/dist/services/analytics/lib/tiktok-auth.js +153 -0
- package/dist/services/assets/ensure/logo-gen.js +68 -0
- package/dist/services/assets/index.js +109 -0
- package/dist/services/assets/lib/assets-config.js +168 -0
- package/dist/services/assets/lib/brandmark-api.js +160 -0
- package/dist/services/assets/lib/derived.js +113 -0
- package/dist/services/assets/lib/font-loader.js +67 -0
- package/dist/services/assets/lib/reconcile.js +122 -0
- package/dist/services/assets/lib/reset.js +118 -0
- package/dist/services/assets/lib/svg-logo-generator.js +154 -0
- package/dist/services/assets/lib/svg-to-black.js +32 -0
- package/dist/services/assets/write/favicons.js +82 -0
- package/dist/services/assets/write/icons.js +64 -0
- package/dist/services/assets/write/process.js +96 -0
- package/dist/services/assets/write/reconcile.js +30 -0
- package/dist/services/assets/write/social-icons.js +108 -0
- package/dist/services/assets/write/templates.js +345 -0
- package/dist/services/bookmark/ensure/sync.js +255 -0
- package/dist/services/bookmark/index.js +17 -0
- package/dist/services/campaigns/ensure/contact-person.js +40 -0
- package/dist/services/campaigns/ensure/custom-fields.js +84 -0
- package/dist/services/campaigns/ensure/domain-auth.js +92 -0
- package/dist/services/campaigns/ensure/event-webhook.js +89 -0
- package/dist/services/campaigns/ensure/link-branding.js +187 -0
- package/dist/services/campaigns/ensure/list.js +50 -0
- package/dist/services/campaigns/ensure/segments.js +109 -0
- package/dist/services/campaigns/ensure/sender-identity.js +153 -0
- package/dist/services/campaigns/ensure/unsubscribe-groups.js +116 -0
- package/dist/services/campaigns/index.js +79 -0
- package/dist/services/campaigns/lib/dns-sync.js +81 -0
- package/dist/services/campaigns/lib/segment-query.js +138 -0
- package/dist/services/campaigns/lib/sendgrid-api.js +287 -0
- package/dist/services/captcha/ensure/site-key.js +83 -0
- package/dist/services/captcha/index.js +78 -0
- package/dist/services/captcha/lib/console-url.js +45 -0
- package/dist/services/captcha/lib/recaptcha-api.js +36 -0
- package/dist/services/certificates/ensure/api-key.js +22 -0
- package/dist/services/certificates/ensure/bundle-ids.js +115 -0
- package/dist/services/certificates/ensure/certificates.js +187 -0
- package/dist/services/certificates/ensure/profiles.js +143 -0
- package/dist/services/certificates/index.js +225 -0
- package/dist/services/certificates/lib/apple-api.js +183 -0
- package/dist/services/certificates/lib/certificate-manager.js +252 -0
- package/dist/services/certificates/lib/identifier-manager.js +107 -0
- package/dist/services/certificates/lib/keychain.js +135 -0
- package/dist/services/certificates/lib/manual-walkthrough.js +165 -0
- package/dist/services/certificates/lib/profile-manager.js +115 -0
- package/dist/services/chat/data/baseline-knowledge.md +96 -0
- package/dist/services/chat/ensure/chat.js +106 -0
- package/dist/services/chat/ensure/user.js +45 -0
- package/dist/services/chat/index.js +139 -0
- package/dist/services/chat/lib/baseline-knowledge.js +137 -0
- package/dist/services/cloud/ensure/authentication.js +267 -0
- package/dist/services/cloud/ensure/billing.js +120 -0
- package/dist/services/cloud/ensure/cloud-messaging.js +105 -0
- package/dist/services/cloud/ensure/database.js +60 -0
- package/dist/services/cloud/ensure/firestore.js +79 -0
- package/dist/services/cloud/ensure/functions.js +49 -0
- package/dist/services/cloud/ensure/hosting.js +398 -0
- package/dist/services/cloud/ensure/oauth-consent.js +248 -0
- package/dist/services/cloud/ensure/project-settings.js +72 -0
- package/dist/services/cloud/ensure/sdk-config.js +95 -0
- package/dist/services/cloud/ensure/service-account.js +152 -0
- package/dist/services/cloud/ensure/services.js +103 -0
- package/dist/services/cloud/ensure/storage.js +47 -0
- package/dist/services/cloud/index.js +130 -0
- package/dist/services/cloud/lib/access-heal.js +130 -0
- package/dist/services/cloud/lib/firebase-api.js +662 -0
- package/dist/services/cloud/lib/project-flow.js +102 -0
- package/dist/services/directory/ensure/entry.js +48 -0
- package/dist/services/directory/index.js +64 -0
- package/dist/services/directory/lib/blocks.js +104 -0
- package/dist/services/disperse/index.js +45 -0
- package/dist/services/disperse/write/certs.js +117 -0
- package/dist/services/domain/ensure/nameservers.js +179 -0
- package/dist/services/domain/index.js +69 -0
- package/dist/services/domain/lib/namecheap-api.js +167 -0
- package/dist/services/domain/lib/registrars.js +46 -0
- package/dist/services/domain/lib/whitelist-walkthrough.js +76 -0
- package/dist/services/edge/ensure/cache-rules.js +105 -0
- package/dist/services/edge/ensure/dns-records.js +304 -0
- package/dist/services/edge/ensure/email-routing.js +292 -0
- package/dist/services/edge/ensure/rules-configuration.js +98 -0
- package/dist/services/edge/ensure/rules-managed-transforms.js +101 -0
- package/dist/services/edge/ensure/rules-redirect.js +107 -0
- package/dist/services/edge/ensure/rules-response-headers.js +90 -0
- package/dist/services/edge/ensure/rules-security.js +142 -0
- package/dist/services/edge/ensure/speed-scheduled-tests.js +98 -0
- package/dist/services/edge/ensure/workers.js +219 -0
- package/dist/services/edge/ensure/zone-settings.js +108 -0
- package/dist/services/edge/ensure/zone.js +183 -0
- package/dist/services/edge/index.js +73 -0
- package/dist/services/edge/lib/cloudflare-api.js +84 -0
- package/dist/services/edge/lib/dns-records-helpers.js +518 -0
- package/dist/services/edge/lib/read-cache.js +16 -0
- package/dist/services/edge/lib/ruleset-helper.js +108 -0
- package/dist/services/edge/workers/omega-api-proxy.js +43 -0
- package/dist/services/email/data/baseline-filter.md +4 -0
- package/dist/services/email/data/baseline-knowledge.md +86 -0
- package/dist/services/email/ensure/agent.js +107 -0
- package/dist/services/email/ensure/user.js +45 -0
- package/dist/services/email/index.js +138 -0
- package/dist/services/email/lib/baseline.js +82 -0
- package/dist/services/email/lib/knowledge-file.js +53 -0
- package/dist/services/forms/ensure/form.js +46 -0
- package/dist/services/forms/ensure/user.js +45 -0
- package/dist/services/forms/index.js +138 -0
- package/dist/services/migrations/ensure/notifications.js +189 -0
- package/dist/services/migrations/ensure/orders.js +34 -0
- package/dist/services/migrations/ensure/payment-provider.js +132 -0
- package/dist/services/migrations/ensure/payments-intents.js +34 -0
- package/dist/services/migrations/ensure/state-retirement.js +266 -0
- package/dist/services/migrations/ensure/targets-rename.js +124 -0
- package/dist/services/migrations/ensure/users.js +1176 -0
- package/dist/services/migrations/index.js +101 -0
- package/dist/services/migrations/lib/attribution-touch.js +64 -0
- package/dist/services/migrations/lib/ensure-metadata.js +144 -0
- package/dist/services/migrations/lib/migration-runner.js +473 -0
- package/dist/services/migrations/lib/sanitize-strings.js +112 -0
- package/dist/services/migrations/lib/schema-validator.js +154 -0
- package/dist/services/monitoring/ensure/dsn.js +54 -0
- package/dist/services/monitoring/ensure/projects.js +135 -0
- package/dist/services/monitoring/index.js +54 -0
- package/dist/services/monitoring/lib/sentry-api.js +94 -0
- package/dist/services/newsletter/ensure/custom-fields.js +90 -0
- package/dist/services/newsletter/ensure/publication.js +94 -0
- package/dist/services/newsletter/ensure/segments.js +140 -0
- package/dist/services/newsletter/ensure/webhook.js +108 -0
- package/dist/services/newsletter/index.js +64 -0
- package/dist/services/newsletter/lib/beehiiv-api.js +124 -0
- package/dist/services/newsletter/lib/segment-automation.js +577 -0
- package/dist/services/payment/ensure/chargebee-account.js +30 -0
- package/dist/services/payment/ensure/chargebee-products.js +359 -0
- package/dist/services/payment/ensure/chargebee-webhook.js +113 -0
- package/dist/services/payment/ensure/paypal-account.js +36 -0
- package/dist/services/payment/ensure/paypal-products.js +374 -0
- package/dist/services/payment/ensure/paypal-webhook.js +128 -0
- package/dist/services/payment/ensure/stripe-account.js +93 -0
- package/dist/services/payment/ensure/stripe-disputes.js +56 -0
- package/dist/services/payment/ensure/stripe-products.js +245 -0
- package/dist/services/payment/ensure/stripe-radar.js +74 -0
- package/dist/services/payment/ensure/stripe-webhook.js +130 -0
- package/dist/services/payment/index.js +163 -0
- package/dist/services/payment/lib/chargebee-api.js +338 -0
- package/dist/services/payment/lib/payment-utils.js +116 -0
- package/dist/services/payment/lib/paypal-api.js +354 -0
- package/dist/services/payment/lib/provider-setup.js +134 -0
- package/dist/services/payment/lib/stripe-api.js +152 -0
- package/dist/services/repo/ensure/org.js +70 -0
- package/dist/services/repo/ensure/pages.js +72 -0
- package/dist/services/repo/ensure/repo.js +90 -0
- package/dist/services/repo/index.js +52 -0
- package/dist/services/repo/lib/github-api.js +196 -0
- package/dist/services/search/ensure/ga-link.js +57 -0
- package/dist/services/search/ensure/property.js +137 -0
- package/dist/services/search/ensure/sitemaps.js +70 -0
- package/dist/services/search/index.js +61 -0
- package/dist/services/search/lib/search-console-api.js +92 -0
- package/dist/services/seo/ensure/github-repos.js +271 -0
- package/dist/services/seo/index.js +55 -0
- package/dist/services/seo/lib/gh-api.js +161 -0
- package/dist/services/seo/templates/developer-tool/.github/workflows/maintenance.yml +25 -0
- package/dist/services/seo/templates/developer-tool/.nvmrc +1 -0
- package/dist/services/seo/templates/developer-tool/_README.md.js +121 -0
- package/dist/services/seo/templates/developer-tool/_package.json.js +33 -0
- package/dist/services/seo/templates/developer-tool/src/index.js +120 -0
- package/dist/services/seo/templates/index.js +57 -0
- package/dist/services/server/ensure/brands.js +63 -0
- package/dist/services/server/index.js +42 -0
- package/dist/services/testing/ensure/target-checks.js +97 -0
- package/dist/services/testing/index.js +11 -0
- package/dist/services/testing/lib/checks.js +467 -0
- package/dist/services/update/index.js +20 -0
- package/dist/services/update/lib/cache.js +59 -0
- package/dist/services/update/lib/fingerprint.js +157 -0
- package/dist/services/update/write/targets.js +206 -0
- package/dist/services/workspace/ensure/agents.js +42 -0
- package/dist/services/workspace/ensure/claude-settings.js +34 -0
- package/dist/services/workspace/ensure/config.js +54 -0
- package/dist/services/workspace/ensure/defaults.js +60 -0
- package/dist/services/workspace/ensure/env-keys.js +55 -0
- package/dist/services/workspace/ensure/env-order.js +66 -0
- package/dist/services/workspace/ensure/env-rules.js +97 -0
- package/dist/services/workspace/ensure/gitignore.js +18 -0
- package/dist/services/workspace/ensure/scripts.js +126 -0
- package/dist/services/workspace/ensure/structure.js +97 -0
- package/dist/services/workspace/ensure/translation-sdk.js +148 -0
- package/dist/services/workspace/ensure/workflows.js +54 -0
- package/dist/services/workspace/index.js +8 -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/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/certs.js +199 -0
- package/dist/vendor/devkit/ci-workflows.js +520 -0
- package/dist/vendor/devkit/cli-router.js +156 -0
- package/dist/vendor/devkit/command-path.js +46 -0
- package/dist/vendor/devkit/deploy-record.js +180 -0
- package/dist/vendor/devkit/flows.js +317 -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/omega-bin.js +345 -0
- package/dist/vendor/devkit/prompt.js +187 -0
- package/dist/vendor/devkit/safe-install.js +18 -0
- package/dist/vendor/devkit/stop-signals.js +28 -0
- package/dist/vendor/devkit/test/scope.js +162 -0
- package/dist/vendor/devkit/translate/cache.js +84 -0
- package/dist/vendor/devkit/translate/engine.js +243 -0
- package/dist/vendor/devkit/translate/index.js +49 -0
- package/dist/vendor/devkit/translate/languages.js +134 -0
- package/dist/vendor/devkit/translate/providers.js +188 -0
- package/dist/vendor/devkit/update.js +569 -0
- package/docs/AGENTS.md +200 -0
- package/docs/account.md +45 -0
- package/docs/advertising.md +46 -0
- package/docs/ai.md +34 -0
- package/docs/analytics.md +69 -0
- package/docs/assets.md +57 -0
- package/docs/bookmark.md +26 -0
- package/docs/brand.md +151 -0
- package/docs/campaigns.md +96 -0
- package/docs/captcha.md +46 -0
- package/docs/certificates.md +68 -0
- package/docs/chat.md +47 -0
- package/docs/cloud.md +110 -0
- package/docs/company.md +64 -0
- package/docs/directory.md +140 -0
- package/docs/disperse.md +46 -0
- package/docs/domain.md +56 -0
- package/docs/edge.md +234 -0
- package/docs/email.md +42 -0
- package/docs/forms.md +48 -0
- package/docs/index.md +109 -0
- package/docs/migration.md +203 -0
- package/docs/migrations.md +56 -0
- package/docs/monitoring.md +41 -0
- package/docs/newsletter.md +48 -0
- package/docs/payment.md +83 -0
- package/docs/repo.md +48 -0
- package/docs/search.md +44 -0
- package/docs/seo.md +34 -0
- package/docs/server.md +37 -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/testing.md +34 -0
- package/docs/update.md +36 -0
- package/docs/workspace.md +64 -0
- package/package.json +88 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @omega.js/config — the single config format for every OMEGA project type.
|
|
3
|
+
*
|
|
4
|
+
* One file, config/omega.json5 (functions/config/omega.json5 for standalone
|
|
5
|
+
* backends), identical shape everywhere: shared sections (brand,
|
|
6
|
+
* cloud, analytics, payment, monitoring, connections, theme) + a `targets`
|
|
7
|
+
* object whose KEY PRESENCE says which targets a brand enables and whose
|
|
8
|
+
* values hold target-scoped settings — any shared key inside a target entry
|
|
9
|
+
* overrides the shared value for that surface (one agnostic deep merge).
|
|
10
|
+
*
|
|
11
|
+
* Replaces the per-framework config zoo (UJM's _config.yml + JSON split,
|
|
12
|
+
* EM's config/electron-manager.json, @omega.js/backend's backend-manager-config.json,
|
|
13
|
+
* BXM's config) with NO dual-read: each framework flips to omega.json5
|
|
14
|
+
* outright and legacy brands migrate their file once (docs/shared/config.md has
|
|
15
|
+
* the mapping tables). omega-manager's disperse enumerates SHARED_SECTIONS
|
|
16
|
+
* instead of hardcoding per-target mapping blocks.
|
|
17
|
+
*
|
|
18
|
+
* Private workspace package — vendored/bundled into the published frameworks
|
|
19
|
+
* at prepare time, never published on its own.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
const { TARGETS, CUSTOM_TARGET_TYPE, isCustomTargetEntry, BACKEND_PROJECT_TYPES, backendProjectType, SHARED_SECTIONS, SHARED_SCHEMA, TARGET_SCHEMAS, BRAND_ID_PATTERN } = require('./schema.js');
|
|
23
|
+
const { deepMerge } = require('./merge.js');
|
|
24
|
+
const { findSecretKeys, SECRET_KEY_PATTERN } = require('./secrets.js');
|
|
25
|
+
const { findRetiredKeys, RETIRED_KEYS, RETIRED_PATHS } = require('./retired-keys.js');
|
|
26
|
+
const { chosenProvider } = require('./providers.js');
|
|
27
|
+
const { validateConfig, runSchema, formatErrors, resolvedBrandHost } = require('./validate.js');
|
|
28
|
+
const { loadConfig, composeTargetConfig, hasOmegaConfig, resolveConfigPath, getEnabledTargets, findBrandRoot, findBrandConfigPath, resolveBrandRoot, FILE_NAME, CONFIG_LOCATIONS } = require('./load.js');
|
|
29
|
+
const { loadEnv, reloadEnv, ENV_ENVIRONMENTS, envEnvironment, resolveEnvChain, envLayerFiles, loadEnvChain, loadEnvRoots, applyDeliverAs, composeTargetEnv, envLine, serializeEnv } = require('./env.js');
|
|
30
|
+
const { ENV_SCHEMA, ENV_GROUPS, DELIVERY_MODES, envFileGroups, envSchemaEntry, envKeysForTarget, generatedEnvKeys, requiredEnvKeys, envKeysByGroup } = require('./env-schema.js');
|
|
31
|
+
const { WORKFLOW_OWNED_KEYS, workflowSecretKeys, bakeKeys, publishSecretKeys, renderSecretsBlock } = require('./env-delivery.js');
|
|
32
|
+
const { checkEnvRules } = require('./env-rules.js');
|
|
33
|
+
const { readCompanyRoot, COMPANY_MARKER } = require('./company.js');
|
|
34
|
+
const { applyConfigEdits, writeConfigValues, applyConfigRemovals, removeConfigValues } = require('./edit.js');
|
|
35
|
+
const { schemaDefaults, missingDefaults, defaultComments } = require('./defaults.js');
|
|
36
|
+
const { applyCanonicalOrder, CANONICAL_TOP_LEVEL_ORDER } = require('./order.js');
|
|
37
|
+
const { resolveSeedMode } = require('./seed.js');
|
|
38
|
+
const { resolveHook, loadHook } = require('./hooks.js');
|
|
39
|
+
const { toSiteGlobal } = require('./site-global.js');
|
|
40
|
+
const { DESKTOP_ARTIFACTS, desktopProductName, sanitizeProductName, desktopArtifactName, desktopArtifactNames } = require('./desktop-artifacts.js');
|
|
41
|
+
const { resolveWinbackOffer, WINBACK_OFFER_DEFAULTS, WINBACK_DURATIONS } = require('./winback.js');
|
|
42
|
+
const { parseRepoSlug, brandRepoName, brandRepoOwner, brandRepo, releasesRepo } = require('./repo.js');
|
|
43
|
+
const { isDemoProject } = require('./demo.js');
|
|
44
|
+
const { CLASSIC_PORTS, CLASSIC_DEV_ORIGIN, isPortFree, resolvePorts, writePortsFile, readPortsFile, clearPortsFile, readSiblingPorts, readSiblingOrigin, envName, portsToEnv, envPort, envPorts } = require('./ports.js');
|
|
45
|
+
const { DIR_TARGETS, TARGET_DIRS, MAIN_INSTANCE, INSTANCE_ID_PATTERN, normalizeTargetInstances, instanceIdFromDirName, instanceTargetDir, targetInstance, resolveInstanceEntry, instancePortOffset, resolveInstanceUrl } = require('./instances.js');
|
|
46
|
+
|
|
47
|
+
module.exports = {
|
|
48
|
+
// Loading
|
|
49
|
+
loadConfig,
|
|
50
|
+
composeTargetConfig,
|
|
51
|
+
hasOmegaConfig,
|
|
52
|
+
resolveConfigPath,
|
|
53
|
+
getEnabledTargets,
|
|
54
|
+
findBrandRoot,
|
|
55
|
+
findBrandConfigPath,
|
|
56
|
+
resolveBrandRoot,
|
|
57
|
+
FILE_NAME,
|
|
58
|
+
CONFIG_LOCATIONS,
|
|
59
|
+
|
|
60
|
+
// .env cascade (shell > local .env > brand .env > company .env), each layer
|
|
61
|
+
// overlaid by its own `.env.<environment>` file (#586)
|
|
62
|
+
loadEnv,
|
|
63
|
+
// The reload half: drops what a file layer owns, then loads again, so an
|
|
64
|
+
// EDITED value lands and the shell still wins (#724)
|
|
65
|
+
reloadEnv,
|
|
66
|
+
resolveEnvChain,
|
|
67
|
+
envLayerFiles,
|
|
68
|
+
loadEnvChain,
|
|
69
|
+
loadEnvRoots,
|
|
70
|
+
|
|
71
|
+
// The ONE environment vocabulary ('development' | 'testing' | 'production') —
|
|
72
|
+
// the overlay's file suffix and every framework's own environment answer
|
|
73
|
+
ENV_ENVIRONMENTS,
|
|
74
|
+
envEnvironment,
|
|
75
|
+
|
|
76
|
+
// The schema's `deliverAs` rename (#678) — the ONE place a brand-level name
|
|
77
|
+
// becomes the name a target's runtime reads
|
|
78
|
+
applyDeliverAs,
|
|
79
|
+
|
|
80
|
+
// The dist/.env composition (#678) — FILES only (company ← brand ← target),
|
|
81
|
+
// schema-filtered per target, written by every verb that stages an artifact
|
|
82
|
+
composeTargetEnv,
|
|
83
|
+
|
|
84
|
+
// The .env serializer SSOT — every writeback renders through these
|
|
85
|
+
envLine,
|
|
86
|
+
serializeEnv,
|
|
87
|
+
|
|
88
|
+
// The env schema (#581) — the ONE inventory of the keys OMEGA needs: the
|
|
89
|
+
// manager's mint and order lanes, every verb's target delivery, and the
|
|
90
|
+
// backend's env reader all derive from it, so a new key is one entry
|
|
91
|
+
ENV_SCHEMA,
|
|
92
|
+
ENV_GROUPS,
|
|
93
|
+
DELIVERY_MODES,
|
|
94
|
+
envFileGroups,
|
|
95
|
+
envSchemaEntry,
|
|
96
|
+
envKeysForTarget,
|
|
97
|
+
generatedEnvKeys,
|
|
98
|
+
requiredEnvKeys,
|
|
99
|
+
envKeysByGroup,
|
|
100
|
+
|
|
101
|
+
// The delivery renderer (#627) — the ONE derivation of how a declared key
|
|
102
|
+
// reaches each target: the generated workflow's secrets block, the build's
|
|
103
|
+
// bake list, and the set a push-secrets publisher sends. No framework keeps
|
|
104
|
+
// a hand-written list, and a secret can never bake into an artifact
|
|
105
|
+
WORKFLOW_OWNED_KEYS,
|
|
106
|
+
workflowSecretKeys,
|
|
107
|
+
bakeKeys,
|
|
108
|
+
publishSecretKeys,
|
|
109
|
+
renderSecretsBlock,
|
|
110
|
+
|
|
111
|
+
// The env presence checker (#626) — the ONE evaluator of `required` and
|
|
112
|
+
// `requiredWhen`; every consumer calls it, none keeps its own if
|
|
113
|
+
checkEnvRules,
|
|
114
|
+
|
|
115
|
+
// Company layer discovery (the .omega/company.json stamp) — shared by the
|
|
116
|
+
// config chain, the .env chain, and owner hooks
|
|
117
|
+
readCompanyRoot,
|
|
118
|
+
COMPANY_MARKER,
|
|
119
|
+
|
|
120
|
+
// Writeback (comment-preserving edits + canonical top-level key order)
|
|
121
|
+
applyConfigEdits,
|
|
122
|
+
writeConfigValues,
|
|
123
|
+
applyConfigRemovals,
|
|
124
|
+
removeConfigValues,
|
|
125
|
+
applyCanonicalOrder,
|
|
126
|
+
CANONICAL_TOP_LEVEL_ORDER,
|
|
127
|
+
|
|
128
|
+
// Schema-derived defaults (#478) — the merge chain's lowest layer, and the
|
|
129
|
+
// heal list the manage walk materializes into a brand's omega.json5
|
|
130
|
+
schemaDefaults,
|
|
131
|
+
missingDefaults,
|
|
132
|
+
defaultComments,
|
|
133
|
+
|
|
134
|
+
// Layer-aware consumer seeding (brand target = no local-layer config at all)
|
|
135
|
+
resolveSeedMode,
|
|
136
|
+
|
|
137
|
+
// Owner hooks (config/hooks/<call-site>.js — brand root, then company root)
|
|
138
|
+
resolveHook,
|
|
139
|
+
loadHook,
|
|
140
|
+
|
|
141
|
+
// Template surface
|
|
142
|
+
toSiteGlobal,
|
|
143
|
+
|
|
144
|
+
// The desktop release assets' versionless names (#620) — @omega.js/desktop
|
|
145
|
+
// packages under them, the site links straight at them
|
|
146
|
+
DESKTOP_ARTIFACTS,
|
|
147
|
+
desktopProductName,
|
|
148
|
+
sanitizeProductName,
|
|
149
|
+
desktopArtifactName,
|
|
150
|
+
desktopArtifactNames,
|
|
151
|
+
|
|
152
|
+
// The cancel-flow save offer (#268) — ONE home for the 50%-off default, read
|
|
153
|
+
// by the backend's apply route and baked into the web client blob at build
|
|
154
|
+
resolveWinbackOffer,
|
|
155
|
+
WINBACK_OFFER_DEFAULTS,
|
|
156
|
+
WINBACK_DURATIONS,
|
|
157
|
+
|
|
158
|
+
// Brand repo derivation from the shared repo.providers.github block, overlaid
|
|
159
|
+
// by a target's own github entry (backend: targets.backend.github.repo slug —
|
|
160
|
+
// "owner/name" or bare name; name → `<brand.id>-omega`, owner → repo.providers.github.org)
|
|
161
|
+
parseRepoSlug,
|
|
162
|
+
// demo-* project ids are emulator-only (Firebase's convention) — cloud
|
|
163
|
+
// surfaces short-circuit on this instead of 403ing at Google
|
|
164
|
+
isDemoProject,
|
|
165
|
+
brandRepoName,
|
|
166
|
+
brandRepoOwner,
|
|
167
|
+
// The finished form a framework hands to consumer code (#290) — owner, name,
|
|
168
|
+
// and the "owner/name" slug — so brands never re-derive the rule
|
|
169
|
+
brandRepo,
|
|
170
|
+
// The brand's ONE public releases repo (#799): `<brand.id>-releases` under the
|
|
171
|
+
// brand repo's owner unless `targets.desktop.releases` names its own, the one
|
|
172
|
+
// home every release reader takes its address from
|
|
173
|
+
releasesRepo,
|
|
174
|
+
|
|
175
|
+
// Validation
|
|
176
|
+
validateConfig,
|
|
177
|
+
runSchema,
|
|
178
|
+
formatErrors,
|
|
179
|
+
|
|
180
|
+
// The brand's own HOST, resolved from an instance `url` or `brand.url` — the
|
|
181
|
+
// ONE derivation of it ([#708](https://github.com/Omega-JS-Stack/omega/issues/708)):
|
|
182
|
+
// authDomain validation, and every lane that composes a test persona's email
|
|
183
|
+
resolvedBrandHost,
|
|
184
|
+
|
|
185
|
+
findSecretKeys,
|
|
186
|
+
SECRET_KEY_PATTERN,
|
|
187
|
+
findRetiredKeys,
|
|
188
|
+
RETIRED_KEYS,
|
|
189
|
+
RETIRED_PATHS,
|
|
190
|
+
|
|
191
|
+
// The one provider shape (#425) — `role.providers.<provider>`, where key
|
|
192
|
+
// presence is the pick and `false` is the deliberate off switch
|
|
193
|
+
chosenProvider,
|
|
194
|
+
|
|
195
|
+
// Merge
|
|
196
|
+
deepMerge,
|
|
197
|
+
|
|
198
|
+
// Port auto-allocation (N7 — dev/emulator only)
|
|
199
|
+
CLASSIC_PORTS,
|
|
200
|
+
CLASSIC_DEV_ORIGIN,
|
|
201
|
+
isPortFree,
|
|
202
|
+
resolvePorts,
|
|
203
|
+
writePortsFile,
|
|
204
|
+
readPortsFile,
|
|
205
|
+
clearPortsFile,
|
|
206
|
+
readSiblingPorts,
|
|
207
|
+
readSiblingOrigin,
|
|
208
|
+
envName,
|
|
209
|
+
portsToEnv,
|
|
210
|
+
envPort,
|
|
211
|
+
envPorts,
|
|
212
|
+
|
|
213
|
+
// Multi-instance targets (_attic/plans/multi-instance-targets.md): normalization
|
|
214
|
+
// is the ONE iteration mechanism — object form = [{ id: 'main', ...entry }]
|
|
215
|
+
DIR_TARGETS,
|
|
216
|
+
TARGET_DIRS,
|
|
217
|
+
MAIN_INSTANCE,
|
|
218
|
+
INSTANCE_ID_PATTERN,
|
|
219
|
+
normalizeTargetInstances,
|
|
220
|
+
instanceIdFromDirName,
|
|
221
|
+
instanceTargetDir,
|
|
222
|
+
targetInstance,
|
|
223
|
+
resolveInstanceEntry,
|
|
224
|
+
instancePortOffset,
|
|
225
|
+
resolveInstanceUrl,
|
|
226
|
+
|
|
227
|
+
// Schema (pure data)
|
|
228
|
+
TARGETS,
|
|
229
|
+
CUSTOM_TARGET_TYPE,
|
|
230
|
+
isCustomTargetEntry,
|
|
231
|
+
BACKEND_PROJECT_TYPES,
|
|
232
|
+
backendProjectType,
|
|
233
|
+
SHARED_SECTIONS,
|
|
234
|
+
SHARED_SCHEMA,
|
|
235
|
+
TARGET_SCHEMAS,
|
|
236
|
+
BRAND_ID_PATTERN,
|
|
237
|
+
};
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-instance targets — the normalization trick and the target-dir mapping
|
|
3
|
+
* (_attic/plans/multi-instance-targets.md, shape ratified by Ian 2026-07-20).
|
|
4
|
+
*
|
|
5
|
+
* `targets.<type>` may be an object (today's single-instance shape) or an
|
|
6
|
+
* ARRAY of id'd instance entries. Normalization is the whole mechanism: a
|
|
7
|
+
* single object normalizes to `[{ id: 'main', ...entry }]` internally, so
|
|
8
|
+
* every consumer of target config iterates instances and the single-instance
|
|
9
|
+
* world is just length 1 — zero breaking change for existing brands.
|
|
10
|
+
*
|
|
11
|
+
* Target-dir mapping: the `main` instance (or the single-object form) lives in
|
|
12
|
+
* `targets/<canonical dir>` (targets/website, unchanged); any other id lives in
|
|
13
|
+
* `targets/<canonical dir>-<id>` (targets/website-admin). The inverse walk resolves
|
|
14
|
+
* WHICH instance a target dir is, and loadConfig/composeTargetConfig use it to
|
|
15
|
+
* pick the instance entry as the target layer of the merge chain.
|
|
16
|
+
*
|
|
17
|
+
* This module is the ONE home for the instance iteration mechanism (mirrored-
|
|
18
|
+
* implementation rule) — frameworks and the manager import it, never copy it.
|
|
19
|
+
* The canonical dir names moved here from the manager's config.js so the
|
|
20
|
+
* mapping and its inverse walk share a single SSOT.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
const path = require('node:path');
|
|
24
|
+
|
|
25
|
+
const { isPlainObject } = require('./merge.js');
|
|
26
|
+
|
|
27
|
+
// targets/<dir> → target mapping when the target dir doesn't declare its target
|
|
28
|
+
// in its own omega.json5. Exact match or `<name>-<id>` suffix (targets/website-admin →
|
|
29
|
+
// web, instance admin). Moved here from @omega.js/manager's config.js (which
|
|
30
|
+
// re-exports it) so the target-dir walk has one home.
|
|
31
|
+
const DIR_TARGETS = {
|
|
32
|
+
website: 'web',
|
|
33
|
+
backend: 'backend',
|
|
34
|
+
desktop: 'desktop',
|
|
35
|
+
extension: 'extension',
|
|
36
|
+
mobile: 'mobile',
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// Inverse: canonical target dir per target (targets/website for web, …)
|
|
40
|
+
const TARGET_DIRS = Object.fromEntries(
|
|
41
|
+
Object.entries(DIR_TARGETS).map(([dir, target]) => [target, dir]),
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
// The conventional primary instance id — the single-object form normalizes
|
|
45
|
+
// to it, and it maps to the canonical (un-suffixed) target dir.
|
|
46
|
+
const MAIN_INSTANCE = 'main';
|
|
47
|
+
|
|
48
|
+
// Instance ids are target-dir suffixes, so they must be dir-safe slugs
|
|
49
|
+
const INSTANCE_ID_PATTERN = /^[a-z][a-z0-9-]*$/;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Normalize a `targets.<type>` entry to the instances array. The whole trick:
|
|
53
|
+
* a single object becomes `[{ id: 'main', ...entry }]` (an authored `id`
|
|
54
|
+
* inside the object wins); an array passes through as-is — the validator, not
|
|
55
|
+
* this function, enforces that array entries carry ids.
|
|
56
|
+
* @param {object|Array|null|undefined} entry - The raw targets.<type> value.
|
|
57
|
+
* @returns {Array<object>} Instance entries (shallow copies); [] when absent.
|
|
58
|
+
*/
|
|
59
|
+
function normalizeTargetInstances(entry) {
|
|
60
|
+
if (entry === undefined || entry === null) return [];
|
|
61
|
+
if (Array.isArray(entry)) return entry.map((instance) => (isPlainObject(instance) ? { ...instance } : instance));
|
|
62
|
+
return [{ id: MAIN_INSTANCE, ...entry }];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Target dir name → instance id for a target. The inverse walk of the mapping:
|
|
67
|
+
* the canonical dir (targets/website) is `main`; a `<canonical>-<id>` suffix
|
|
68
|
+
* names the instance (targets/website-admin → admin). Unconventional dir names
|
|
69
|
+
* resolve to `main` — today's behavior for dirs like targets/api.
|
|
70
|
+
* @param {string} dirName - The target directory basename.
|
|
71
|
+
* @param {string} target - Canonical target name ('web', 'backend', ...).
|
|
72
|
+
* @returns {string} The instance id.
|
|
73
|
+
*/
|
|
74
|
+
function instanceIdFromDirName(dirName, target) {
|
|
75
|
+
const canonical = TARGET_DIRS[target] || target;
|
|
76
|
+
if (dirName.startsWith(`${canonical}-`)) {
|
|
77
|
+
return dirName.slice(canonical.length + 1);
|
|
78
|
+
}
|
|
79
|
+
return MAIN_INSTANCE;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Instance id → its target dir name (`main` → the canonical dir, anything else
|
|
84
|
+
* → `<canonical>-<id>`).
|
|
85
|
+
* @param {string} target - Canonical target name.
|
|
86
|
+
* @param {string} id - Instance id.
|
|
87
|
+
* @returns {string} The target directory basename.
|
|
88
|
+
*/
|
|
89
|
+
function instanceTargetDir(target, id) {
|
|
90
|
+
const canonical = TARGET_DIRS[target] || target;
|
|
91
|
+
return id === MAIN_INSTANCE ? canonical : `${canonical}-${id}`;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Resolve THIS project dir's instance id for a target: TARGET_SUBDIR dirs
|
|
96
|
+
* (functions/, dist/) normalize up to their target root, and only targets inside a
|
|
97
|
+
* brand monorepo resolve through the dir-name walk — a standalone project
|
|
98
|
+
* (whose dir name is arbitrary) is always `main`.
|
|
99
|
+
* @param {string} projectDir - Target root (or one of its TARGET_SUBDIRS).
|
|
100
|
+
* @param {string} target - Canonical target name.
|
|
101
|
+
* @returns {string} The instance id.
|
|
102
|
+
*/
|
|
103
|
+
function targetInstance(projectDir, target) {
|
|
104
|
+
// Local require to avoid a load-time cycle (load.js requires this module)
|
|
105
|
+
const { findBrandRoot, TARGET_SUBDIRS } = require('./load.js');
|
|
106
|
+
|
|
107
|
+
let targetRoot = path.resolve(projectDir);
|
|
108
|
+
if (TARGET_SUBDIRS.includes(path.basename(targetRoot))) {
|
|
109
|
+
targetRoot = path.dirname(targetRoot);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (!findBrandRoot(targetRoot)) return MAIN_INSTANCE;
|
|
113
|
+
return instanceIdFromDirName(path.basename(targetRoot), target);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* The merge-chain layer for one instance: the single-object form applies to
|
|
118
|
+
* EVERY target dir of the type (today's semantics, unchanged); the array form
|
|
119
|
+
* applies only to the exact-id match — no match means no instance layer
|
|
120
|
+
* (shared config alone). The `id` key is bookkeeping, never config — it is
|
|
121
|
+
* stripped from the returned entry.
|
|
122
|
+
* @param {object|Array|null|undefined} entry - The raw targets.<type> value.
|
|
123
|
+
* @param {string} instanceId - The instance to resolve.
|
|
124
|
+
* @returns {object|null} The instance's merge layer, or null.
|
|
125
|
+
*/
|
|
126
|
+
function resolveInstanceEntry(entry, instanceId) {
|
|
127
|
+
if (entry === undefined || entry === null) return null;
|
|
128
|
+
if (!Array.isArray(entry)) return entry;
|
|
129
|
+
|
|
130
|
+
const hit = entry.find((instance) => isPlainObject(instance) && instance.id === instanceId);
|
|
131
|
+
if (!hit) return null;
|
|
132
|
+
|
|
133
|
+
const { id, ...rest } = hit;
|
|
134
|
+
return rest;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Deterministic dev-port offset for an instance: its position in the
|
|
139
|
+
* normalized instances array (main-or-object form = 0), so N instances get N
|
|
140
|
+
* side-by-side ports off the same classic base. Unknown ids offset 0 — the
|
|
141
|
+
* N7 bump-if-taken allocator still guarantees a free port.
|
|
142
|
+
* @param {object|Array|null|undefined} entry - The raw targets.<type> value.
|
|
143
|
+
* @param {string} instanceId - The instance id.
|
|
144
|
+
* @returns {number} Zero-based offset.
|
|
145
|
+
*/
|
|
146
|
+
function instancePortOffset(entry, instanceId) {
|
|
147
|
+
const index = normalizeTargetInstances(entry).findIndex((instance) => isPlainObject(instance) && instance.id === instanceId);
|
|
148
|
+
return index > 0 ? index : 0;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* The host `brand.url` names, EXACTLY as it states it: a `www.` label is kept
|
|
153
|
+
* (a www brand is a www brand), any path is dropped, a port survives. A
|
|
154
|
+
* scheme-less value is read as https.
|
|
155
|
+
* @param {string} url - A brand URL.
|
|
156
|
+
* @returns {string} The host, or '' when the value is not a URL.
|
|
157
|
+
*/
|
|
158
|
+
function brandHost(url) {
|
|
159
|
+
try {
|
|
160
|
+
return new URL(url.includes('://') ? url : `https://${url}`).host;
|
|
161
|
+
} catch {
|
|
162
|
+
return '';
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* The live URL of an instance: its entry's `url` (the spec's per-instance
|
|
168
|
+
* key), an instance-scoped `brand.url` override, then, for every id but
|
|
169
|
+
* `main`, the id AS A SUBDOMAIN of the brand host (#588), and the
|
|
170
|
+
* brand-shared brand.url for `main`. The manager's per-instance live checks,
|
|
171
|
+
* the resolved config's top-level `url` and site-global all read this.
|
|
172
|
+
*
|
|
173
|
+
* The id-is-the-subdomain default is what makes `web: [{ id: 'main' },
|
|
174
|
+
* { id: 'admin' }]` a complete declaration; an explicit `url` overrides it for
|
|
175
|
+
* a custom host (`{ id: 'store', url: 'https://shop.acme.com' }`). Nothing is
|
|
176
|
+
* half-derived: no usable brand.url means null for every id, never
|
|
177
|
+
* `https://admin.`.
|
|
178
|
+
* @param {object|Array|null|undefined} entry - The raw targets.<type> value.
|
|
179
|
+
* @param {string} instanceId - The instance id.
|
|
180
|
+
* @param {object} config - The (resolved) config carrying brand.url.
|
|
181
|
+
* @returns {string|null} The instance's URL, or null when none is known.
|
|
182
|
+
*/
|
|
183
|
+
function resolveInstanceUrl(entry, instanceId, config) {
|
|
184
|
+
const instance = resolveInstanceEntry(entry, instanceId);
|
|
185
|
+
if (instance?.url) return instance.url;
|
|
186
|
+
if (instance?.brand?.url) return instance.brand.url;
|
|
187
|
+
|
|
188
|
+
const brandUrl = config?.brand?.url;
|
|
189
|
+
if (!brandUrl) return null;
|
|
190
|
+
if (instanceId === MAIN_INSTANCE) return brandUrl;
|
|
191
|
+
|
|
192
|
+
const host = brandHost(brandUrl);
|
|
193
|
+
return host ? `https://${instanceId}.${host}` : null;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
module.exports = {
|
|
197
|
+
DIR_TARGETS,
|
|
198
|
+
TARGET_DIRS,
|
|
199
|
+
MAIN_INSTANCE,
|
|
200
|
+
INSTANCE_ID_PATTERN,
|
|
201
|
+
normalizeTargetInstances,
|
|
202
|
+
instanceIdFromDirName,
|
|
203
|
+
instanceTargetDir,
|
|
204
|
+
targetInstance,
|
|
205
|
+
resolveInstanceEntry,
|
|
206
|
+
instancePortOffset,
|
|
207
|
+
resolveInstanceUrl,
|
|
208
|
+
};
|