@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,338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chargebee REST API wrapper — HTTP Basic Auth with the API key as username,
|
|
3
|
+
* form-encoded POST bodies, JSON responses wrapped in a type key (e.g.
|
|
4
|
+
* { item: { ... } }). Ported from omega-manager minus the subscription
|
|
5
|
+
* inspection and unused price/plan helpers (they belong to the migrations
|
|
6
|
+
* port).
|
|
7
|
+
*/
|
|
8
|
+
class ChargebeeAPI {
|
|
9
|
+
constructor(site, apiKey) {
|
|
10
|
+
this.site = site;
|
|
11
|
+
this.baseUrl = `https://${site}.chargebee.com/api/v2`;
|
|
12
|
+
this.authHeader = `Basic ${Buffer.from(`${apiKey}:`).toString('base64')}`;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Make an authenticated request to Chargebee API.
|
|
17
|
+
*
|
|
18
|
+
* @param {string} method - HTTP method
|
|
19
|
+
* @param {string} path - API path (e.g. '/items/my-item')
|
|
20
|
+
* @param {Object} [params] - Query params (GET) or form body (POST)
|
|
21
|
+
* @returns {Object} Parsed JSON response
|
|
22
|
+
*/
|
|
23
|
+
async makeRequest(method, path, params = {}) {
|
|
24
|
+
const options = {
|
|
25
|
+
method,
|
|
26
|
+
headers: { 'Authorization': this.authHeader },
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
let url = `${this.baseUrl}${path}`;
|
|
30
|
+
|
|
31
|
+
// Flatten nested params for form encoding: { a: { b: 'c' } } → 'a[b]=c'
|
|
32
|
+
const flat = flattenParams(params);
|
|
33
|
+
|
|
34
|
+
if (method === 'GET') {
|
|
35
|
+
const qs = new URLSearchParams(flat).toString();
|
|
36
|
+
if (qs) {
|
|
37
|
+
url += `?${qs}`;
|
|
38
|
+
}
|
|
39
|
+
} else {
|
|
40
|
+
options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
41
|
+
options.body = new URLSearchParams(flat).toString();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const response = await fetch(url, options);
|
|
45
|
+
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
const text = await response.text();
|
|
48
|
+
throw new Error(`Chargebee API error (${response.status} ${method} ${path}): ${text}`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Some endpoints return 204 No Content
|
|
52
|
+
if (response.status === 204) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return response.json();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Paginate through a Chargebee list endpoint, collecting all items.
|
|
61
|
+
*
|
|
62
|
+
* Chargebee returns { list: [ { item: {...} }, ... ], next_offset: '...' }
|
|
63
|
+
* The unwrapKey extracts the inner object from each list entry.
|
|
64
|
+
*
|
|
65
|
+
* @param {string} path - API path (e.g. '/items')
|
|
66
|
+
* @param {string} unwrapKey - Key to unwrap from each list entry (e.g. 'item')
|
|
67
|
+
* @param {Object} [params] - Additional query params (filters, etc.)
|
|
68
|
+
* @returns {Array} All unwrapped items across all pages
|
|
69
|
+
*/
|
|
70
|
+
async paginate(path, unwrapKey, params = {}) {
|
|
71
|
+
const allItems = [];
|
|
72
|
+
let offset;
|
|
73
|
+
|
|
74
|
+
while (true) {
|
|
75
|
+
const queryParams = { ...params, 'limit': 100 };
|
|
76
|
+
if (offset) {
|
|
77
|
+
queryParams.offset = offset;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const response = await this.makeRequest('GET', path, queryParams);
|
|
81
|
+
const entries = response?.list || [];
|
|
82
|
+
|
|
83
|
+
for (const entry of entries) {
|
|
84
|
+
allItems.push(unwrapKey ? entry[unwrapKey] : entry);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
offset = response?.next_offset;
|
|
88
|
+
if (!offset || entries.length === 0) {
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return allItems;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// Item Families
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Get an item family by ID
|
|
102
|
+
*/
|
|
103
|
+
async getItemFamily(familyId) {
|
|
104
|
+
const data = await this.makeRequest('GET', `/item_families/${familyId}`);
|
|
105
|
+
return data?.item_family;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Create an item family
|
|
110
|
+
*/
|
|
111
|
+
async createItemFamily({ id, name, description }) {
|
|
112
|
+
const params = { id, name };
|
|
113
|
+
if (description) {
|
|
114
|
+
params.description = description;
|
|
115
|
+
}
|
|
116
|
+
const data = await this.makeRequest('POST', '/item_families', params);
|
|
117
|
+
return data?.item_family;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Update an item family
|
|
122
|
+
*/
|
|
123
|
+
async updateItemFamily(familyId, updates) {
|
|
124
|
+
const data = await this.makeRequest('POST', `/item_families/${familyId}`, updates);
|
|
125
|
+
return data?.item_family;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
// Items
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Get an item by ID
|
|
134
|
+
*/
|
|
135
|
+
async getItem(itemId) {
|
|
136
|
+
const data = await this.makeRequest('GET', `/items/${itemId}`);
|
|
137
|
+
return data?.item;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Create an item
|
|
142
|
+
*
|
|
143
|
+
* @param {Object} options
|
|
144
|
+
* @param {string} options.id - Custom item ID (e.g. 'somiibo-plus')
|
|
145
|
+
* @param {string} options.name - Display name
|
|
146
|
+
* @param {string} options.type - 'plan' | 'addon' | 'charge'
|
|
147
|
+
* @param {string} options.itemFamilyId - Parent item family ID
|
|
148
|
+
* @param {string} [options.description] - Item description
|
|
149
|
+
*/
|
|
150
|
+
async createItem({ id, name, type, itemFamilyId, description, externalName, redirectUrl, metadata }) {
|
|
151
|
+
const params = {
|
|
152
|
+
id,
|
|
153
|
+
name,
|
|
154
|
+
type,
|
|
155
|
+
item_family_id: itemFamilyId,
|
|
156
|
+
};
|
|
157
|
+
if (description) {
|
|
158
|
+
params.description = description;
|
|
159
|
+
}
|
|
160
|
+
if (externalName) {
|
|
161
|
+
params.external_name = externalName;
|
|
162
|
+
}
|
|
163
|
+
if (redirectUrl) {
|
|
164
|
+
params.redirect_url = redirectUrl;
|
|
165
|
+
}
|
|
166
|
+
if (metadata) {
|
|
167
|
+
params.metadata = JSON.stringify(metadata);
|
|
168
|
+
}
|
|
169
|
+
const data = await this.makeRequest('POST', '/items', params);
|
|
170
|
+
return data?.item;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Update an item
|
|
175
|
+
*/
|
|
176
|
+
async updateItem(itemId, updates) {
|
|
177
|
+
const data = await this.makeRequest('POST', `/items/${itemId}`, updates);
|
|
178
|
+
return data?.item;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
// Item Prices
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* List item prices for a specific item (paginated)
|
|
187
|
+
*/
|
|
188
|
+
async listItemPricesForItem(itemId) {
|
|
189
|
+
return this.paginate('/item_prices', 'item_price', {
|
|
190
|
+
'item_id[is]': itemId,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Create an item price
|
|
196
|
+
*
|
|
197
|
+
* @param {Object} options
|
|
198
|
+
* @param {string} options.id - Custom price ID (e.g. 'somiibo-plus-monthly')
|
|
199
|
+
* @param {string} options.itemId - Parent item ID
|
|
200
|
+
* @param {string} options.name - Display name
|
|
201
|
+
* @param {string} options.pricingModel - 'flat_fee' | 'per_unit' | etc.
|
|
202
|
+
* @param {number} options.price - Price in cents
|
|
203
|
+
* @param {number} [options.period] - Billing period count (e.g. 1)
|
|
204
|
+
* @param {string} [options.periodUnit] - 'month' | 'year' | 'week' | 'day'
|
|
205
|
+
* @param {number} [options.trialPeriod] - Trial period count
|
|
206
|
+
* @param {string} [options.trialPeriodUnit] - 'day' | 'month'
|
|
207
|
+
* @param {string} [options.currencyCode] - Currency (default: 'USD')
|
|
208
|
+
* @param {string} [options.externalName] - Customer-facing name
|
|
209
|
+
*/
|
|
210
|
+
async createItemPrice({ id, itemId, name, pricingModel = 'flat_fee', price, period, periodUnit, trialPeriod, trialPeriodUnit, currencyCode = 'USD', externalName }) {
|
|
211
|
+
const params = {
|
|
212
|
+
id,
|
|
213
|
+
item_id: itemId,
|
|
214
|
+
name,
|
|
215
|
+
pricing_model: pricingModel,
|
|
216
|
+
price,
|
|
217
|
+
currency_code: currencyCode,
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
if (period) {
|
|
221
|
+
params.period = period;
|
|
222
|
+
}
|
|
223
|
+
if (periodUnit) {
|
|
224
|
+
params.period_unit = periodUnit;
|
|
225
|
+
}
|
|
226
|
+
if (trialPeriod) {
|
|
227
|
+
params.trial_period = trialPeriod;
|
|
228
|
+
}
|
|
229
|
+
if (trialPeriodUnit) {
|
|
230
|
+
params.trial_period_unit = trialPeriodUnit;
|
|
231
|
+
}
|
|
232
|
+
if (externalName) {
|
|
233
|
+
params.external_name = externalName;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const data = await this.makeRequest('POST', '/item_prices', params);
|
|
237
|
+
return data?.item_price;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Update an item price
|
|
242
|
+
*/
|
|
243
|
+
async updateItemPrice(itemPriceId, updates) {
|
|
244
|
+
const data = await this.makeRequest('POST', `/item_prices/${itemPriceId}`, updates);
|
|
245
|
+
return data?.item_price;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
// Legacy Plans (read-only — for reporting existing plan-model data)
|
|
250
|
+
// ---------------------------------------------------------------------------
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Get a plan by ID
|
|
254
|
+
*/
|
|
255
|
+
async getPlan(planId) {
|
|
256
|
+
const data = await this.makeRequest('GET', `/plans/${planId}`);
|
|
257
|
+
return data?.plan;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// ---------------------------------------------------------------------------
|
|
261
|
+
// Webhooks
|
|
262
|
+
// ---------------------------------------------------------------------------
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* List all webhook endpoints
|
|
266
|
+
*/
|
|
267
|
+
async listWebhooks() {
|
|
268
|
+
return this.paginate('/webhook_endpoints', 'webhook_endpoint');
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Create a webhook endpoint
|
|
273
|
+
*
|
|
274
|
+
* @param {Object} options
|
|
275
|
+
* @param {string} options.url - Webhook URL
|
|
276
|
+
* @param {string} [options.name] - Display name
|
|
277
|
+
* @param {string[]} [options.eventTypes] - Array of event type names
|
|
278
|
+
*/
|
|
279
|
+
async createWebhook({ url, name, eventTypes }) {
|
|
280
|
+
const params = { url };
|
|
281
|
+
if (name) {
|
|
282
|
+
params.name = name;
|
|
283
|
+
}
|
|
284
|
+
if (eventTypes?.length) {
|
|
285
|
+
// Chargebee expects enabled_events as JSON array string
|
|
286
|
+
params.enabled_events = JSON.stringify(eventTypes);
|
|
287
|
+
}
|
|
288
|
+
const data = await this.makeRequest('POST', '/webhook_endpoints', params);
|
|
289
|
+
return data?.webhook_endpoint;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Update a webhook endpoint
|
|
294
|
+
*/
|
|
295
|
+
async updateWebhook(webhookId, updates) {
|
|
296
|
+
const data = await this.makeRequest('POST', `/webhook_endpoints/${webhookId}`, updates);
|
|
297
|
+
return data?.webhook_endpoint;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Delete a webhook endpoint
|
|
302
|
+
*/
|
|
303
|
+
async deleteWebhook(webhookId) {
|
|
304
|
+
const data = await this.makeRequest('POST', `/webhook_endpoints/${webhookId}/delete`);
|
|
305
|
+
return data?.webhook_endpoint;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// ---------------------------------------------------------------------------
|
|
310
|
+
// Helpers
|
|
311
|
+
// ---------------------------------------------------------------------------
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Flatten nested object for form-encoding.
|
|
315
|
+
* { a: { b: 'c' } } → { 'a[b]': 'c' }
|
|
316
|
+
* Handles one level of nesting (Chargebee's convention).
|
|
317
|
+
*/
|
|
318
|
+
function flattenParams(obj, prefix = '') {
|
|
319
|
+
const result = {};
|
|
320
|
+
|
|
321
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
322
|
+
if (value === undefined || value === null) {
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
const fullKey = prefix ? `${prefix}[${key}]` : key;
|
|
327
|
+
|
|
328
|
+
if (typeof value === 'object' && !Array.isArray(value)) {
|
|
329
|
+
Object.assign(result, flattenParams(value, fullKey));
|
|
330
|
+
} else {
|
|
331
|
+
result[fullKey] = String(value);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
return result;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
module.exports = { ChargebeeAPI };
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for the payment operations — the paid-product filter, the
|
|
3
|
+
* provider-facing product identity (display name + image), the backend
|
|
4
|
+
* webhook URL, and the event-set diff. omega-manager duplicated these across
|
|
5
|
+
* the stripe/paypal/chargebee handlers (and hardcoded the company CDN for
|
|
6
|
+
* product images — the image is brand.images.brandmark config now).
|
|
7
|
+
*/
|
|
8
|
+
const { absoluteBrandImage } = require('../../../lib/brand.js');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Products the providers manage: priced and not archived. Free tiers have
|
|
12
|
+
* no prices; archived products keep their provider objects but stop being
|
|
13
|
+
* reconciled.
|
|
14
|
+
*
|
|
15
|
+
* @param {Object} brandConfig - Merged brand config
|
|
16
|
+
* @returns {Array} Paid, non-archived products
|
|
17
|
+
*/
|
|
18
|
+
function paidProducts(brandConfig) {
|
|
19
|
+
return (brandConfig.payment?.products || []).filter((p) => p.prices && !p.archived);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The provider-facing product name: "{Brand} - {Product}".
|
|
24
|
+
*
|
|
25
|
+
* @param {Object} brandConfig - Merged brand config
|
|
26
|
+
* @param {Object} product - Product entry from payment.products
|
|
27
|
+
* @returns {string} Display name
|
|
28
|
+
*/
|
|
29
|
+
function productDisplayName(brandConfig, product) {
|
|
30
|
+
return `${brandConfig.brand.name} - ${product.name}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The product image URL — brand.images.brandmark when configured, else null
|
|
35
|
+
* (providers keep whatever image they have; the diff skips images entirely).
|
|
36
|
+
*
|
|
37
|
+
* @param {Object} brandConfig - Merged brand config
|
|
38
|
+
* @returns {string|null} Image URL or null
|
|
39
|
+
*/
|
|
40
|
+
function productImage(brandConfig) {
|
|
41
|
+
return absoluteBrandImage(brandConfig, 'brandmark');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The brand backend's payment webhook URL for a provider.
|
|
46
|
+
* Requires OMEGA_WEBHOOK_KEY in the brand .env.
|
|
47
|
+
*
|
|
48
|
+
* @param {Object} brandConfig - Merged brand config
|
|
49
|
+
* @param {string} provider - 'stripe' | 'paypal' | 'chargebee'
|
|
50
|
+
* @param {string} [brandId] - Included as &brand= (chargebee only)
|
|
51
|
+
* @returns {string} Webhook URL
|
|
52
|
+
*/
|
|
53
|
+
function buildWebhookUrl(brandConfig, provider, brandId) {
|
|
54
|
+
const domain = brandConfig.brand.url.replace(/^https?:\/\//, '');
|
|
55
|
+
const key = process.env.OMEGA_WEBHOOK_KEY;
|
|
56
|
+
const brandParam = brandId ? `&brand=${brandId}` : '';
|
|
57
|
+
|
|
58
|
+
return `https://api.${domain}/omega/payments/webhook?provider=${provider}${brandParam}&key=${key}`;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Webhook URL with the key query param redacted — the ONLY form safe to print
|
|
63
|
+
* (campaigns/newsletter build the same URL and never print it at all).
|
|
64
|
+
*
|
|
65
|
+
* @param {string} url - A buildWebhookUrl() result
|
|
66
|
+
* @returns {string} URL with key=***
|
|
67
|
+
*/
|
|
68
|
+
function redactWebhookUrl(url) {
|
|
69
|
+
return url.replace(/([?&]key=)[^&]*/, '$1***');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* The endpoints on the brand's OWN webhook host that are NOT the desired URL —
|
|
74
|
+
* legacy twins (omega-manager's `?processor=` form, an old key) that keep
|
|
75
|
+
* receiving every event and answering 400. Exactly one endpoint per host
|
|
76
|
+
* survives a manage run; endpoints on other hosts belong to whatever else the
|
|
77
|
+
* account runs and are never touched (#570).
|
|
78
|
+
*
|
|
79
|
+
* @param {Array} endpoints - Provider webhook objects carrying a `url`
|
|
80
|
+
* @param {string} desiredUrl - A buildWebhookUrl() result
|
|
81
|
+
* @returns {Array} The stale endpoints, in list order
|
|
82
|
+
*/
|
|
83
|
+
function staleWebhookEndpoints(endpoints, desiredUrl) {
|
|
84
|
+
const desired = new URL(desiredUrl);
|
|
85
|
+
|
|
86
|
+
return endpoints.filter((endpoint) => {
|
|
87
|
+
if (!endpoint.url || endpoint.url === desiredUrl) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const url = URL.parse(endpoint.url);
|
|
92
|
+
|
|
93
|
+
return !!url && url.host === desired.host && url.pathname === desired.pathname;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Diff current webhook events against desired.
|
|
99
|
+
*
|
|
100
|
+
* @param {string[]} currentEvents - Events on the endpoint now
|
|
101
|
+
* @param {string[]} desiredEvents - Events the backend handles
|
|
102
|
+
* @returns {{ missing: string[], extra: string[] }|null} Diff, or null when converged
|
|
103
|
+
*/
|
|
104
|
+
function diffEventSets(currentEvents, desiredEvents) {
|
|
105
|
+
const currentSet = new Set(currentEvents);
|
|
106
|
+
const desiredSet = new Set(desiredEvents);
|
|
107
|
+
|
|
108
|
+
const missing = desiredEvents.filter((e) => !currentSet.has(e));
|
|
109
|
+
const extra = [...currentSet].filter((e) => !desiredSet.has(e));
|
|
110
|
+
|
|
111
|
+
return (missing.length > 0 || extra.length > 0)
|
|
112
|
+
? { missing, extra }
|
|
113
|
+
: null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
module.exports = { paidProducts, productDisplayName, productImage, buildWebhookUrl, redactWebhookUrl, staleWebhookEndpoints, diffEventSets };
|