@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,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure @omega.js/backend's segments exist on the Beehiiv publication.
|
|
3
|
+
*
|
|
4
|
+
* Beehiiv has NO segment-create API — the read side lists what exists,
|
|
5
|
+
* and creation happens through the dashboard UI. Interactive runs offer
|
|
6
|
+
* to drive that UI via the companion Chrome extension (trusted-event
|
|
7
|
+
* browser automation; see lib/segment-automation.js) or to open the
|
|
8
|
+
* dashboard for manual creation, then RE-verify against the API so
|
|
9
|
+
* "created" means Beehiiv says so. Non-interactive and dry runs never
|
|
10
|
+
* mutate: missing segments warn with human-readable conditions.
|
|
11
|
+
*/
|
|
12
|
+
const chalk = require('chalk').default;
|
|
13
|
+
const { select } = require('../../../vendor/devkit/prompt.js');
|
|
14
|
+
const { openBrowserAndPoll } = require('../../../vendor/devkit/flows.js');
|
|
15
|
+
const { segmentsFor } = require('../../../lib/backend-marketing.js');
|
|
16
|
+
const { AutomationClient } = require('../../../lib/automation-client.js');
|
|
17
|
+
const { formatCondition, automateCreateSegment } = require('../lib/segment-automation.js');
|
|
18
|
+
const { canPrompt } = require('../../../lib/run-gates.js');
|
|
19
|
+
|
|
20
|
+
const BEEHIIV_SEGMENTS = segmentsFor('beehiiv');
|
|
21
|
+
const SEGMENTS_URL = 'https://app.beehiiv.com/segments';
|
|
22
|
+
|
|
23
|
+
/** Names of the @omega.js/backend segments missing from the publication. */
|
|
24
|
+
async function listMissing(api, publicationId) {
|
|
25
|
+
const existing = await api.getSegments(publicationId);
|
|
26
|
+
const existingByName = new Set(existing.map((s) => s.name));
|
|
27
|
+
return BEEHIIV_SEGMENTS.filter((s) => !existingByName.has(s.name));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
module.exports = async function ensureSegments(context) {
|
|
31
|
+
const { beehiivApi: api, serviceData, options = {} } = context;
|
|
32
|
+
|
|
33
|
+
const publicationId = serviceData.publicationId;
|
|
34
|
+
if (!publicationId) {
|
|
35
|
+
console.log(chalk.dim(' ⊘ No publication yet — nothing to verify segments on'));
|
|
36
|
+
return {};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const missing = await listMissing(api, publicationId);
|
|
40
|
+
|
|
41
|
+
if (missing.length === 0) {
|
|
42
|
+
console.log(` ${chalk.green('✓')} All ${BEEHIIV_SEGMENTS.length} segments exist`);
|
|
43
|
+
return { output: { segments: { total: BEEHIIV_SEGMENTS.length, missing: [] } } };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
console.log(` ${chalk.yellow('⚠')} ${missing.length} segment(s) missing — Beehiiv has no segment-create API:`);
|
|
47
|
+
for (const segment of missing) {
|
|
48
|
+
const joiner = segment.logic === 'or' ? ' OR ' : ' AND ';
|
|
49
|
+
const criteria = segment.conditions.map((c) => formatCondition(c)).join(joiner);
|
|
50
|
+
console.log(` ${chalk.dim('•')} ${chalk.cyan(segment.display)} ${chalk.dim(`(${segment.name})`)}`);
|
|
51
|
+
console.log(` ${chalk.dim('→')} ${criteria}`);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const warned = (created = []) => ({
|
|
55
|
+
status: 'warned',
|
|
56
|
+
reason: `${missing.length} segment(s) missing: ${missing.map((s) => s.name).join(', ')}`,
|
|
57
|
+
output: { segments: { total: BEEHIIV_SEGMENTS.length, missing: missing.map((s) => s.name), ...(created.length ? { created } : {}) } },
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Headless/dry runs stop at the instructions (build them at SEGMENTS_URL)
|
|
61
|
+
if (!canPrompt(options)) {
|
|
62
|
+
console.log(` ${chalk.dim(`→ Build them at ${SEGMENTS_URL}`)}`);
|
|
63
|
+
return warned();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const action = await select({
|
|
67
|
+
message: 'Create missing segments?',
|
|
68
|
+
choices: [
|
|
69
|
+
{ name: 'Automate via extension', value: 'automate' },
|
|
70
|
+
{ name: 'Open dashboard (manual)', value: 'manual' },
|
|
71
|
+
{ name: 'Skip', value: 'skip' },
|
|
72
|
+
],
|
|
73
|
+
default: 'automate',
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
if (action === 'skip') {
|
|
77
|
+
return warned();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const created = [];
|
|
81
|
+
|
|
82
|
+
if (action === 'manual') {
|
|
83
|
+
await openBrowserAndPoll({
|
|
84
|
+
url: SEGMENTS_URL,
|
|
85
|
+
label: 'the Beehiiv segments page',
|
|
86
|
+
promptMessage: `Create ${missing.length} missing segment(s) in Beehiiv`,
|
|
87
|
+
waitMessage: 'Press ENTER when done',
|
|
88
|
+
manualOnly: true,
|
|
89
|
+
});
|
|
90
|
+
} else {
|
|
91
|
+
// Automate via extension — open the dashboard first so the user can
|
|
92
|
+
// select the right publication before the automation drives the UI
|
|
93
|
+
await openBrowserAndPoll({
|
|
94
|
+
url: SEGMENTS_URL,
|
|
95
|
+
label: 'the Beehiiv segments page',
|
|
96
|
+
promptMessage: 'Select the correct publication in Beehiiv, then confirm to start automation',
|
|
97
|
+
waitMessage: 'Press ENTER when ready',
|
|
98
|
+
manualOnly: true,
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
console.log(` ${chalk.dim('Connecting to extension...')}`);
|
|
102
|
+
const client = new AutomationClient();
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
await client.connect();
|
|
106
|
+
console.log(` ${chalk.dim('→')} Extension connected`);
|
|
107
|
+
|
|
108
|
+
for (const segment of missing) {
|
|
109
|
+
try {
|
|
110
|
+
console.log(` ${chalk.dim(`Creating ${segment.display}...`)}`);
|
|
111
|
+
await automateCreateSegment(client, segment);
|
|
112
|
+
console.log(` ${chalk.green('✓')} Created ${chalk.cyan(segment.display)}`);
|
|
113
|
+
created.push(segment.name);
|
|
114
|
+
} catch (e) {
|
|
115
|
+
console.log(` ${chalk.red('✗')} Failed to create ${chalk.cyan(segment.display)}: ${e.message}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
} catch (e) {
|
|
119
|
+
console.log(` ${chalk.red('✗')} Automation failed: ${e.message}`);
|
|
120
|
+
} finally {
|
|
121
|
+
await client.disconnect();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Re-verify — "created" is what Beehiiv reports, not what the automation
|
|
126
|
+
// believes it did
|
|
127
|
+
const remaining = await listMissing(api, publicationId);
|
|
128
|
+
|
|
129
|
+
if (remaining.length === 0) {
|
|
130
|
+
console.log(` ${chalk.green('✓')} All ${BEEHIIV_SEGMENTS.length} segments exist`);
|
|
131
|
+
return { output: { segments: { total: BEEHIIV_SEGMENTS.length, missing: [], ...(created.length ? { created } : {}) } } };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
console.log(` ${chalk.yellow('⚠')} ${remaining.length} segment(s) still missing: ${remaining.map((s) => s.name).join(', ')}`);
|
|
135
|
+
return {
|
|
136
|
+
status: 'warned',
|
|
137
|
+
reason: `${remaining.length} segment(s) still missing: ${remaining.map((s) => s.name).join(', ')}`,
|
|
138
|
+
output: { segments: { total: BEEHIIV_SEGMENTS.length, missing: remaining.map((s) => s.name), ...(created.length ? { created } : {}) } },
|
|
139
|
+
};
|
|
140
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure the publication's webhook delivers subscription events to the
|
|
3
|
+
* parent @omega.js/backend's forwarder.
|
|
4
|
+
*
|
|
5
|
+
* Publications can be shared across sibling brands, so the webhook always
|
|
6
|
+
* points at the parent (`parent` in omega.json5, 'self' for the parent
|
|
7
|
+
* brand) — the parent reads the brands collection and fans each event out.
|
|
8
|
+
* The webhook is matched by its managed description first (stable across
|
|
9
|
+
* parent moves), then by URL; drift in url/event_types/enabled is patched
|
|
10
|
+
* with the minimum diff.
|
|
11
|
+
*/
|
|
12
|
+
const chalk = require('chalk').default;
|
|
13
|
+
const { dryRunPlan } = require('../../../lib/run-gates.js');
|
|
14
|
+
|
|
15
|
+
// Subscription events @omega.js/backend's consent pipeline consumes (they flip
|
|
16
|
+
// consent.marketing.status to 'revoked' and propagate the unsub to SendGrid)
|
|
17
|
+
const DESIRED_EVENT_TYPES = [
|
|
18
|
+
'subscription.unsubscribed',
|
|
19
|
+
'subscription.deleted',
|
|
20
|
+
'subscription.paused',
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const WEBHOOK_DESCRIPTION = '@omega.js/backend consent pipeline (managed by OMEGA — do not edit manually)';
|
|
24
|
+
|
|
25
|
+
module.exports = async function ensureWebhook(context) {
|
|
26
|
+
const { beehiivApi: api, brandConfig, domain, serviceData, options = {} } = context;
|
|
27
|
+
|
|
28
|
+
const publicationId = serviceData.publicationId;
|
|
29
|
+
if (!publicationId) {
|
|
30
|
+
console.log(chalk.dim(' ⊘ No publication yet — nothing to configure a webhook on'));
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const parent = brandConfig.parent;
|
|
35
|
+
if (parent === false) {
|
|
36
|
+
// Tri-state: explicit false = deliberate opt-out, no nudge
|
|
37
|
+
console.log(chalk.dim(' ⊘ parent = false — webhook opted out'));
|
|
38
|
+
return {};
|
|
39
|
+
}
|
|
40
|
+
if (!parent) {
|
|
41
|
+
console.log(chalk.dim(' ⊘ No parent configured — nothing to point the webhook at'));
|
|
42
|
+
console.log(chalk.dim(" → Set parent in omega.json5 ('self' when this brand runs the central backend)"));
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (!process.env.OMEGA_WEBHOOK_KEY) {
|
|
47
|
+
// Unreachable by design (#635): the key is OMEGA's own (`generated:` in
|
|
48
|
+
// the env schema) and the newsletter service's setup mints it through the
|
|
49
|
+
// shared contract before any operation runs. Absent here = broken wiring.
|
|
50
|
+
throw new Error('OMEGA_WEBHOOK_KEY absent after the newsletter setup ran — its REQUIRES entry or its requestServiceInput call is missing');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const parentHost = parent === 'self'
|
|
54
|
+
? domain
|
|
55
|
+
: parent.replace(/^https?:\/\//, '').replace(/\/$/, '');
|
|
56
|
+
const desiredUrl = `https://api.${parentHost}/omega/marketing/webhook/forward?provider=beehiiv&key=${process.env.OMEGA_WEBHOOK_KEY}`;
|
|
57
|
+
|
|
58
|
+
const webhooks = await api.listWebhooks(publicationId);
|
|
59
|
+
|
|
60
|
+
// The managed description is the primary key — it survives URL changes
|
|
61
|
+
// when a brand moves parents
|
|
62
|
+
const existing = webhooks.find((wh) => wh.description === WEBHOOK_DESCRIPTION)
|
|
63
|
+
|| webhooks.find((wh) => wh.url === desiredUrl);
|
|
64
|
+
|
|
65
|
+
if (existing) {
|
|
66
|
+
const patch = {};
|
|
67
|
+
if (existing.url !== desiredUrl) {
|
|
68
|
+
patch.url = desiredUrl;
|
|
69
|
+
}
|
|
70
|
+
const currentEvents = new Set(existing.event_types || []);
|
|
71
|
+
const eventsMatch = DESIRED_EVENT_TYPES.every((e) => currentEvents.has(e))
|
|
72
|
+
&& (existing.event_types || []).every((e) => DESIRED_EVENT_TYPES.includes(e));
|
|
73
|
+
if (!eventsMatch) {
|
|
74
|
+
patch.event_types = DESIRED_EVENT_TYPES;
|
|
75
|
+
}
|
|
76
|
+
if (existing.enabled === false) {
|
|
77
|
+
patch.enabled = true;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (Object.keys(patch).length === 0) {
|
|
81
|
+
console.log(` ${chalk.green('✓')} Webhook up to date ${chalk.dim(`(${existing.id})`)}`);
|
|
82
|
+
return { output: { webhook: { id: existing.id, url: 'converged' } } };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (options.dryRun) {
|
|
86
|
+
return dryRunPlan(`patch: ${Object.keys(patch).join(', ')}`, { output: { webhook: { planned: Object.keys(patch) } } });
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
await api.updateWebhook(publicationId, existing.id, patch);
|
|
90
|
+
console.log(` ${chalk.green('✓')} Webhook updated ${chalk.dim(`(${existing.id})`)}`);
|
|
91
|
+
return { output: { webhook: { id: existing.id, updated: Object.keys(patch) } } };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (options.dryRun) {
|
|
95
|
+
return dryRunPlan('create the consent-pipeline webhook', { output: { webhook: { planned: ['create'] } } });
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const created = await api.createWebhook(publicationId, {
|
|
99
|
+
url: desiredUrl,
|
|
100
|
+
event_types: DESIRED_EVENT_TYPES,
|
|
101
|
+
description: WEBHOOK_DESCRIPTION,
|
|
102
|
+
});
|
|
103
|
+
const newId = created?.data?.id || created?.id || '(unknown id)';
|
|
104
|
+
console.log(` ${chalk.green('✓')} Webhook created ${chalk.dim(`(${newId})`)}`);
|
|
105
|
+
console.log(` ${chalk.dim('→')} ${chalk.dim(`https://api.${parentHost}/omega/marketing/webhook/forward`)}`);
|
|
106
|
+
|
|
107
|
+
return { output: { webhook: { id: newId, created: true } } };
|
|
108
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Newsletter service (Beehiiv provider) — the brand's newsletter publication: access verified (or
|
|
3
|
+
* auto-matched by name), @omega.js/backend's custom fields provisioned, @omega.js/backend's segments
|
|
4
|
+
* ensured (Beehiiv has no segment-create API — missing ones get readable
|
|
5
|
+
* instructions, and interactive runs offer to create them by driving the
|
|
6
|
+
* dashboard UI through the companion Chrome extension), and the
|
|
7
|
+
* publication webhook pointed at the parent @omega.js/backend's forwarder.
|
|
8
|
+
*
|
|
9
|
+
* Publications are created manually in the dashboard (no API) — the service
|
|
10
|
+
* prints the exact values to copy when none matches.
|
|
11
|
+
*
|
|
12
|
+
* Auth: BEEHIIV_API_KEY in the brand .env; the webhook operation
|
|
13
|
+
* additionally needs OMEGA_WEBHOOK_KEY, which the setup MINTS through the
|
|
14
|
+
* shared contract (it is OMEGA's own key, #635). No API key → clean skip.
|
|
15
|
+
*/
|
|
16
|
+
const { chosenProvider } = require('../../vendor/config/index.js');
|
|
17
|
+
|
|
18
|
+
const { serviceInputSpec } = require('../../config.js');
|
|
19
|
+
const { createServiceRunner } = require('../../lib/service-runner.js');
|
|
20
|
+
const { requestServiceInput } = require('../../lib/service-input.js');
|
|
21
|
+
const { BeehiivAPI } = require('./lib/beehiiv-api.js');
|
|
22
|
+
|
|
23
|
+
module.exports.run = createServiceRunner({
|
|
24
|
+
serviceDir: __dirname,
|
|
25
|
+
setup: async (context) => {
|
|
26
|
+
const newsletter = context.brandConfig.marketing?.newsletter || {};
|
|
27
|
+
|
|
28
|
+
if (newsletter.enabled === false) {
|
|
29
|
+
return { skip: true, reason: 'marketing.newsletter.enabled = false' };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// The vendor is a KEY under marketing.newsletter.providers (#425) — no
|
|
33
|
+
// entry means none chosen and this service skips.
|
|
34
|
+
const provider = chosenProvider(newsletter.providers);
|
|
35
|
+
if (!provider) {
|
|
36
|
+
return { skip: true, reason: 'no marketing.newsletter.providers entry' };
|
|
37
|
+
}
|
|
38
|
+
if (provider !== 'beehiiv') {
|
|
39
|
+
return { skip: true, reason: `marketing.newsletter.providers.${provider} is not a known newsletter provider` };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const domain = (context.brandConfig.brand?.url || '').replace(/^https?:\/\//, '').replace(/\/$/, '');
|
|
43
|
+
if (!domain) {
|
|
44
|
+
return { skip: true, reason: 'no brand.url configured' };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (!context.beehiivApi) {
|
|
48
|
+
const gate = await requestServiceInput(context, serviceInputSpec('newsletter', { names: ['BEEHIIV_API_KEY'] }));
|
|
49
|
+
if (gate) return gate;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// The webhook key is OMEGA's OWN (#635): the shared helper mints it in
|
|
53
|
+
// place when this service runs before the workspace one did, so the
|
|
54
|
+
// webhook operation can read it unconditionally.
|
|
55
|
+
const webhookKeyGate = await requestServiceInput(context, serviceInputSpec('newsletter', { names: ['OMEGA_WEBHOOK_KEY'] }));
|
|
56
|
+
if (webhookKeyGate) return webhookKeyGate;
|
|
57
|
+
|
|
58
|
+
// Tests inject a fake client via context.beehiivApi
|
|
59
|
+
return {
|
|
60
|
+
beehiivApi: context.beehiivApi || new BeehiivAPI(),
|
|
61
|
+
domain,
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
});
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Beehiiv v2 API client — publications, custom fields, segments (list-only;
|
|
3
|
+
* Beehiiv has no segment-create API), and per-publication webhooks. Named-
|
|
4
|
+
* method surface so tests can fake it method-for-method.
|
|
5
|
+
*
|
|
6
|
+
* Auth: BEEHIIV_API_KEY in the brand .env.
|
|
7
|
+
*/
|
|
8
|
+
const BEEHIIV_API_BASE = 'https://api.beehiiv.com/v2';
|
|
9
|
+
|
|
10
|
+
class BeehiivAPI {
|
|
11
|
+
constructor(options = {}) {
|
|
12
|
+
this.apiKey = options.apiKey || process.env.BEEHIIV_API_KEY;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async makeRequest(endpoint, options = {}) {
|
|
16
|
+
const response = await fetch(`${BEEHIIV_API_BASE}${endpoint}`, {
|
|
17
|
+
...options,
|
|
18
|
+
headers: {
|
|
19
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
20
|
+
'Content-Type': 'application/json',
|
|
21
|
+
...options.headers,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
if (response.status === 204) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const data = await response.json();
|
|
30
|
+
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
const message = data.message || data.error || response.statusText;
|
|
33
|
+
throw new Error(`Beehiiv API error (${response.status}): ${message}`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return data;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Fetch every page of a paginated collection endpoint. */
|
|
40
|
+
async getAllPages(basePath) {
|
|
41
|
+
const all = [];
|
|
42
|
+
let page = 1;
|
|
43
|
+
|
|
44
|
+
while (true) {
|
|
45
|
+
const data = await this.makeRequest(`${basePath}?page=${page}&limit=100`);
|
|
46
|
+
all.push(...(data.data || []));
|
|
47
|
+
|
|
48
|
+
if (page >= (data.total_pages || 1)) {
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
page += 1;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return all;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ========== Publications ==========
|
|
58
|
+
|
|
59
|
+
async getPublication(publicationId) {
|
|
60
|
+
try {
|
|
61
|
+
const data = await this.makeRequest(`/publications/${publicationId}`);
|
|
62
|
+
return data.data;
|
|
63
|
+
} catch (error) {
|
|
64
|
+
if (error.message.includes('404') || error.message.includes('not found')) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async listPublications() {
|
|
72
|
+
const data = await this.makeRequest('/publications');
|
|
73
|
+
return data.data || [];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ========== Custom fields ==========
|
|
77
|
+
|
|
78
|
+
async getCustomFields(publicationId) {
|
|
79
|
+
return this.getAllPages(`/publications/${publicationId}/custom_fields`);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** kind: 'string' | 'integer' | 'boolean' | 'datetime' */
|
|
83
|
+
async createCustomField(publicationId, name, display, kind) {
|
|
84
|
+
return this.makeRequest(`/publications/${publicationId}/custom_fields`, {
|
|
85
|
+
method: 'POST',
|
|
86
|
+
body: JSON.stringify({ name, display, kind }),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async deleteCustomField(publicationId, fieldId) {
|
|
91
|
+
return this.makeRequest(`/publications/${publicationId}/custom_fields/${fieldId}`, {
|
|
92
|
+
method: 'DELETE',
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ========== Segments (list-only — Beehiiv has no create API) ==========
|
|
97
|
+
|
|
98
|
+
async getSegments(publicationId) {
|
|
99
|
+
return this.getAllPages(`/publications/${publicationId}/segments`);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ========== Webhooks (per-publication) ==========
|
|
103
|
+
|
|
104
|
+
async listWebhooks(publicationId) {
|
|
105
|
+
return this.getAllPages(`/publications/${publicationId}/webhooks`);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** payload: { url, event_types[], description?, http_method? } */
|
|
109
|
+
async createWebhook(publicationId, payload) {
|
|
110
|
+
return this.makeRequest(`/publications/${publicationId}/webhooks`, {
|
|
111
|
+
method: 'POST',
|
|
112
|
+
body: JSON.stringify(payload),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async updateWebhook(publicationId, webhookId, payload) {
|
|
117
|
+
return this.makeRequest(`/publications/${publicationId}/webhooks/${webhookId}`, {
|
|
118
|
+
method: 'PATCH',
|
|
119
|
+
body: JSON.stringify(payload),
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
module.exports = { BeehiivAPI };
|