@teleporthq/teleport-plugin-next-workflows 0.44.11 → 0.45.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/__tests__/_helpers/fake-fetch.ts +75 -0
- package/__tests__/_helpers/gui-place-order-statements.ts +17 -0
- package/__tests__/_helpers/inserted-lines.ts +22 -0
- package/__tests__/_helpers/invoice-store.ts +10 -1
- package/__tests__/_helpers/load-security-runtime.ts +45 -0
- package/__tests__/_helpers/load-server-runtime.ts +26 -3
- package/__tests__/_helpers/run-account-delete-route.ts +3 -1
- package/__tests__/_helpers/run-generated-middleware.ts +7 -2
- package/__tests__/account-delete-owned-rows.test.ts +3 -1
- package/__tests__/adopted-element-trigger-code.test.ts +128 -0
- package/__tests__/analytics-track-outcome.test.ts +145 -0
- package/__tests__/auth-password-change-ends-sessions.test.ts +8 -1
- package/__tests__/auth-password-security.test.ts +2275 -0
- package/__tests__/auth-session-cost.test.ts +31 -0
- package/__tests__/auth-signup-route.test.ts +960 -0
- package/__tests__/authored-code-every-path.test.ts +247 -0
- package/__tests__/automations-bus.test.ts +3820 -0
- package/__tests__/automations-catalog-drift.test.ts +97 -0
- package/__tests__/booking-calendar-feed-route.test.ts +20 -3
- package/__tests__/cart-price-order.test.ts +336 -1
- package/__tests__/code-lookup-rate-limit-route.test.ts +189 -0
- package/__tests__/cost-bearing-node-types.test.ts +119 -0
- package/__tests__/credential-columns-reply.test.ts +9 -0
- package/__tests__/credential-result-reply.test.ts +19 -5
- package/__tests__/cron-route-loop-templateparams.test.ts +6 -3
- package/__tests__/custom-js-authored-code.test.ts +304 -0
- package/__tests__/custom-node-custom-code-gate.test.ts +136 -0
- package/__tests__/custom-node-step-handlers.test.ts +251 -0
- package/__tests__/custom-node-step-reach.test.ts +63 -0
- package/__tests__/data-api-anon-user-id-fallback.test.ts +7 -2
- package/__tests__/data-api-browser-reads.test.ts +7 -0
- package/__tests__/data-api-business-events.test.ts +403 -0
- package/__tests__/data-api-invalid-body.test.ts +7 -0
- package/__tests__/data-api-low-stock-autofire.test.ts +30 -4
- package/__tests__/data-api-optional-feature-columns.test.ts +44 -0
- package/__tests__/data-api-owner-scope-credentials.test.ts +1324 -0
- package/__tests__/data-api-protected-tables.test.ts +48 -15
- package/__tests__/data-api-retired-table-and-account-fields.test.ts +208 -0
- package/__tests__/email-locale-senders.test.ts +5 -3
- package/__tests__/expression-injection.test.ts +343 -0
- package/__tests__/fixtures/admin-file-workflows.json +242 -0
- package/__tests__/form-confirmation-email-template.test.ts +44 -0
- package/__tests__/internal-request-headers.test.ts +25 -0
- package/__tests__/invoice-pdf-service-project-header.test.ts +120 -0
- package/__tests__/invoice-self-call-origin.test.ts +57 -1
- package/__tests__/legacy-webhook-self-calls.test.ts +86 -1
- package/__tests__/middleware-home-route-protection.test.ts +3 -1
- package/__tests__/middleware-subscriber-access.test.ts +1 -1
- package/__tests__/newsletter-admin-route.test.ts +649 -0
- package/__tests__/newsletter-plugin.test.ts +1248 -0
- package/__tests__/outbound-nodes-security.test.ts +1929 -0
- package/__tests__/page-access-guard.test.ts +217 -0
- package/__tests__/page-access-route-table.test.ts +231 -0
- package/__tests__/payment-drivers-module.test.ts +23 -0
- package/__tests__/payment-legacy-webhook-routes.test.ts +100 -5
- package/__tests__/payment-webhook-route.test.ts +4 -1
- package/__tests__/paypal-webhook-signature-verification.test.ts +44 -0
- package/__tests__/place-order-guards.test.ts +506 -0
- package/__tests__/public-step-guards.test.ts +310 -0
- package/__tests__/publish-refusals.test.ts +505 -0
- package/__tests__/realtime-identity-routes.test.ts +492 -0
- package/__tests__/record-event-writer-server-only.test.ts +975 -0
- package/__tests__/resolve-config-template-params.test.ts +3 -3
- package/__tests__/runtime-storage-upload-access.test.ts +280 -17
- package/__tests__/security-integration-env-names.test.ts +74 -0
- package/__tests__/security-lists-parity.test.ts +245 -0
- package/__tests__/security-runtime-shadow.test.ts +224 -1
- package/__tests__/security-runtime.test.ts +893 -0
- package/__tests__/segment-rate-limit-error-branch.test.ts +284 -0
- package/__tests__/segment-route-abuse-gate.test.ts +309 -0
- package/__tests__/server-job-hops-real-data-api.test.ts +669 -0
- package/__tests__/server-session-identity.test.ts +522 -0
- package/__tests__/server-step-chain.test.ts +222 -0
- package/__tests__/server-step-signing.test.ts +107 -2
- package/__tests__/session-cookie-resolver.test.ts +62 -106
- package/__tests__/signup-event.test.ts +649 -0
- package/__tests__/signup-reply-identical.test.ts +144 -0
- package/__tests__/slack-message-escaping.test.ts +123 -0
- package/__tests__/visitor-step-limits.test.ts +318 -0
- package/__tests__/webhook-delivery-lease.test.ts +4 -1
- package/__tests__/webpack-safe-handlers.test.ts +57 -8
- package/__tests__/workflow-auth-guard.test.ts +9 -1
- package/dist/cjs/account-delete-route-generator.d.ts +1 -0
- package/dist/cjs/account-delete-route-generator.d.ts.map +1 -1
- package/dist/cjs/account-delete-route-generator.js +18 -3
- package/dist/cjs/account-delete-route-generator.js.map +1 -1
- package/dist/cjs/api-route-generator.d.ts +52 -3
- package/dist/cjs/api-route-generator.d.ts.map +1 -1
- package/dist/cjs/api-route-generator.js +600 -145
- package/dist/cjs/api-route-generator.js.map +1 -1
- package/dist/cjs/auth-generator.d.ts +126 -3
- package/dist/cjs/auth-generator.d.ts.map +1 -1
- package/dist/cjs/auth-generator.js +1353 -139
- package/dist/cjs/auth-generator.js.map +1 -1
- package/dist/cjs/automations/activity-kicks.d.ts +12 -0
- package/dist/cjs/automations/activity-kicks.d.ts.map +1 -0
- package/dist/cjs/automations/activity-kicks.js +123 -0
- package/dist/cjs/automations/activity-kicks.js.map +1 -0
- package/dist/cjs/automations/app-events-source.d.ts +33 -0
- package/dist/cjs/automations/app-events-source.d.ts.map +1 -0
- package/dist/cjs/automations/app-events-source.js +109 -0
- package/dist/cjs/automations/app-events-source.js.map +1 -0
- package/dist/cjs/automations/automations-project-plugin.d.ts +21 -0
- package/dist/cjs/automations/automations-project-plugin.d.ts.map +1 -0
- package/dist/cjs/automations/automations-project-plugin.js +102 -0
- package/dist/cjs/automations/automations-project-plugin.js.map +1 -0
- package/dist/cjs/automations/automations-scope.d.ts +104 -0
- package/dist/cjs/automations/automations-scope.d.ts.map +1 -0
- package/dist/cjs/automations/automations-scope.js +176 -0
- package/dist/cjs/automations/automations-scope.js.map +1 -0
- package/dist/cjs/automations/dispatcher-source.d.ts +72 -0
- package/dist/cjs/automations/dispatcher-source.d.ts.map +1 -0
- package/dist/cjs/automations/dispatcher-source.js +1008 -0
- package/dist/cjs/automations/dispatcher-source.js.map +1 -0
- package/dist/cjs/automations/event-bus-source.d.ts +44 -0
- package/dist/cjs/automations/event-bus-source.d.ts.map +1 -0
- package/dist/cjs/automations/event-bus-source.js +427 -0
- package/dist/cjs/automations/event-bus-source.js.map +1 -0
- package/dist/cjs/automations/handler-module-generator.d.ts +25 -0
- package/dist/cjs/automations/handler-module-generator.d.ts.map +1 -0
- package/dist/cjs/automations/handler-module-generator.js +78 -0
- package/dist/cjs/automations/handler-module-generator.js.map +1 -0
- package/dist/cjs/automations/hydrators-source.d.ts +33 -0
- package/dist/cjs/automations/hydrators-source.d.ts.map +1 -0
- package/dist/cjs/automations/hydrators-source.js +571 -0
- package/dist/cjs/automations/hydrators-source.js.map +1 -0
- package/dist/cjs/booking-calendar-feed-route-generator.d.ts.map +1 -1
- package/dist/cjs/booking-calendar-feed-route-generator.js +8 -0
- package/dist/cjs/booking-calendar-feed-route-generator.js.map +1 -1
- package/dist/cjs/configured-nextauth-url.d.ts +17 -0
- package/dist/cjs/configured-nextauth-url.d.ts.map +1 -0
- package/dist/cjs/configured-nextauth-url.js +20 -0
- package/dist/cjs/configured-nextauth-url.js.map +1 -0
- package/dist/cjs/cron-request-verification.d.ts +22 -1
- package/dist/cjs/cron-request-verification.d.ts.map +1 -1
- package/dist/cjs/cron-request-verification.js +50 -6
- package/dist/cjs/cron-request-verification.js.map +1 -1
- package/dist/cjs/data-api-route-generator.d.ts +19 -0
- package/dist/cjs/data-api-route-generator.d.ts.map +1 -1
- package/dist/cjs/data-api-route-generator.js +711 -43
- package/dist/cjs/data-api-route-generator.js.map +1 -1
- package/dist/cjs/ecommerce/parameterized-stock-chain.d.ts +3 -1
- package/dist/cjs/ecommerce/parameterized-stock-chain.d.ts.map +1 -1
- package/dist/cjs/ecommerce/parameterized-stock-chain.js +45 -5
- package/dist/cjs/ecommerce/parameterized-stock-chain.js.map +1 -1
- package/dist/cjs/ecommerce/place-order-guards.d.ts +126 -0
- package/dist/cjs/ecommerce/place-order-guards.d.ts.map +1 -0
- package/dist/cjs/ecommerce/place-order-guards.js +670 -0
- package/dist/cjs/ecommerce/place-order-guards.js.map +1 -0
- package/dist/cjs/ecommerce-customhandler-rewriter.d.ts +2 -0
- package/dist/cjs/ecommerce-customhandler-rewriter.d.ts.map +1 -1
- package/dist/cjs/ecommerce-customhandler-rewriter.js +38 -2
- package/dist/cjs/ecommerce-customhandler-rewriter.js.map +1 -1
- package/dist/cjs/executor-generator.d.ts.map +1 -1
- package/dist/cjs/executor-generator.js +368 -60
- package/dist/cjs/executor-generator.js.map +1 -1
- package/dist/cjs/graph-utils.d.ts +9 -0
- package/dist/cjs/graph-utils.d.ts.map +1 -1
- package/dist/cjs/graph-utils.js +32 -1
- package/dist/cjs/graph-utils.js.map +1 -1
- package/dist/cjs/index.d.ts +20 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +72 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/invoice/api-routes-code.d.ts +9 -3
- package/dist/cjs/invoice/api-routes-code.d.ts.map +1 -1
- package/dist/cjs/invoice/api-routes-code.js +9 -7
- package/dist/cjs/invoice/api-routes-code.js.map +1 -1
- package/dist/cjs/invoice/index.d.ts.map +1 -1
- package/dist/cjs/invoice/index.js +12 -7
- package/dist/cjs/invoice/index.js.map +1 -1
- package/dist/cjs/invoice/invoice-assembly-code.d.ts.map +1 -1
- package/dist/cjs/invoice/invoice-assembly-code.js +8 -3
- package/dist/cjs/invoice/invoice-assembly-code.js.map +1 -1
- package/dist/cjs/invoice/pdf-generator-code.d.ts.map +1 -1
- package/dist/cjs/invoice/pdf-generator-code.js +2 -1
- package/dist/cjs/invoice/pdf-generator-code.js.map +1 -1
- package/dist/cjs/invoice/pdf-service-client-code.d.ts.map +1 -1
- package/dist/cjs/invoice/pdf-service-client-code.js +15 -7
- package/dist/cjs/invoice/pdf-service-client-code.js.map +1 -1
- package/dist/cjs/newsletter/admin-route-code.d.ts +60 -0
- package/dist/cjs/newsletter/admin-route-code.d.ts.map +1 -0
- package/dist/cjs/newsletter/admin-route-code.js +300 -0
- package/dist/cjs/newsletter/admin-route-code.js.map +1 -0
- package/dist/cjs/newsletter/helper-code.d.ts +109 -0
- package/dist/cjs/newsletter/helper-code.d.ts.map +1 -0
- package/dist/cjs/newsletter/helper-code.js +662 -0
- package/dist/cjs/newsletter/helper-code.js.map +1 -0
- package/dist/cjs/newsletter/newsletter-scope.d.ts +65 -0
- package/dist/cjs/newsletter/newsletter-scope.d.ts.map +1 -0
- package/dist/cjs/newsletter/newsletter-scope.js +103 -0
- package/dist/cjs/newsletter/newsletter-scope.js.map +1 -0
- package/dist/cjs/newsletter/project-plugin.d.ts +18 -0
- package/dist/cjs/newsletter/project-plugin.d.ts.map +1 -0
- package/dist/cjs/newsletter/project-plugin.js +97 -0
- package/dist/cjs/newsletter/project-plugin.js.map +1 -0
- package/dist/cjs/newsletter/routes-code.d.ts +6 -0
- package/dist/cjs/newsletter/routes-code.d.ts.map +1 -0
- package/dist/cjs/newsletter/routes-code.js +181 -0
- package/dist/cjs/newsletter/routes-code.js.map +1 -0
- package/dist/cjs/nodes/account/account-compare-passwords.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-compare-passwords.js +16 -6
- package/dist/cjs/nodes/account/account-compare-passwords.js.map +1 -1
- package/dist/cjs/nodes/account/account-delete-current.js +1 -1
- package/dist/cjs/nodes/account/account-get-current.js +1 -1
- package/dist/cjs/nodes/account/account-hash-password.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-hash-password.js +15 -3
- package/dist/cjs/nodes/account/account-hash-password.js.map +1 -1
- package/dist/cjs/nodes/account/account-login.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-login.js +23 -6
- package/dist/cjs/nodes/account/account-login.js.map +1 -1
- package/dist/cjs/nodes/account/account-logout.js +1 -1
- package/dist/cjs/nodes/account/account-refresh-session.js +1 -1
- package/dist/cjs/nodes/account/account-request-password-reset.d.ts +3 -0
- package/dist/cjs/nodes/account/account-request-password-reset.d.ts.map +1 -0
- package/dist/cjs/nodes/account/account-request-password-reset.js +46 -0
- package/dist/cjs/nodes/account/account-request-password-reset.js.map +1 -0
- package/dist/cjs/nodes/account/account-reset-password.d.ts +3 -0
- package/dist/cjs/nodes/account/account-reset-password.d.ts.map +1 -0
- package/dist/cjs/nodes/account/account-reset-password.js +44 -0
- package/dist/cjs/nodes/account/account-reset-password.js.map +1 -0
- package/dist/cjs/nodes/account/account-signup.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-signup.js +82 -19
- package/dist/cjs/nodes/account/account-signup.js.map +1 -1
- package/dist/cjs/nodes/account/account-social-login.js +1 -1
- package/dist/cjs/nodes/ai/ai-custom-prompt.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-custom-prompt.js +20 -5
- package/dist/cjs/nodes/ai/ai-custom-prompt.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-detect-language.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-detect-language.js +20 -5
- package/dist/cjs/nodes/ai/ai-detect-language.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-generate-text-embedding.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-generate-text-embedding.js +10 -2
- package/dist/cjs/nodes/ai/ai-generate-text-embedding.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-provider-utils-sources.generated.js +2 -2
- package/dist/cjs/nodes/ai/ai-provider-utils-sources.generated.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-provider-utils.d.ts +31 -2
- package/dist/cjs/nodes/ai/ai-provider-utils.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-provider-utils.js +125 -11
- package/dist/cjs/nodes/ai/ai-provider-utils.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-select-database-data.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-select-database-data.js +6 -2
- package/dist/cjs/nodes/ai/ai-select-database-data.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-sentiment-analysis.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-sentiment-analysis.js +20 -5
- package/dist/cjs/nodes/ai/ai-sentiment-analysis.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-summarization.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-summarization.js +20 -5
- package/dist/cjs/nodes/ai/ai-summarization.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-text-classifier.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-text-classifier.js +20 -5
- package/dist/cjs/nodes/ai/ai-text-classifier.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-text-transform.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-text-transform.js +20 -5
- package/dist/cjs/nodes/ai/ai-text-transform.js.map +1 -1
- package/dist/cjs/nodes/analytics/analytics-track-outcome.d.ts +3 -0
- package/dist/cjs/nodes/analytics/analytics-track-outcome.d.ts.map +1 -0
- package/dist/cjs/nodes/analytics/analytics-track-outcome.js +110 -0
- package/dist/cjs/nodes/analytics/analytics-track-outcome.js.map +1 -0
- package/dist/cjs/nodes/cart/cart-price-order.d.ts.map +1 -1
- package/dist/cjs/nodes/cart/cart-price-order.js +161 -2
- package/dist/cjs/nodes/cart/cart-price-order.js.map +1 -1
- package/dist/cjs/nodes/cost-bearing-node-types.d.ts +4 -0
- package/dist/cjs/nodes/cost-bearing-node-types.d.ts.map +1 -0
- package/dist/cjs/nodes/cost-bearing-node-types.js +43 -0
- package/dist/cjs/nodes/cost-bearing-node-types.js.map +1 -0
- package/dist/cjs/nodes/data/data-select.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-select.js +12 -2
- package/dist/cjs/nodes/data/data-select.js.map +1 -1
- package/dist/cjs/nodes/email/email-mailersend.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-mailersend.js +15 -11
- package/dist/cjs/nodes/email/email-mailersend.js.map +1 -1
- package/dist/cjs/nodes/email/email-mailgun.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-mailgun.js +15 -15
- package/dist/cjs/nodes/email/email-mailgun.js.map +1 -1
- package/dist/cjs/nodes/email/email-postmark.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-postmark.js +15 -15
- package/dist/cjs/nodes/email/email-postmark.js.map +1 -1
- package/dist/cjs/nodes/email/email-resend.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-resend.js +15 -15
- package/dist/cjs/nodes/email/email-resend.js.map +1 -1
- package/dist/cjs/nodes/email/email-sendgrid.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-sendgrid.js +15 -15
- package/dist/cjs/nodes/email/email-sendgrid.js.map +1 -1
- package/dist/cjs/nodes/email/html-escape-code.d.ts +3 -0
- package/dist/cjs/nodes/email/html-escape-code.d.ts.map +1 -0
- package/dist/cjs/nodes/email/html-escape-code.js +23 -0
- package/dist/cjs/nodes/email/html-escape-code.js.map +1 -0
- package/dist/cjs/nodes/email/message-trust.d.ts +40 -0
- package/dist/cjs/nodes/email/message-trust.d.ts.map +1 -0
- package/dist/cjs/nodes/email/message-trust.js +167 -0
- package/dist/cjs/nodes/email/message-trust.js.map +1 -0
- package/dist/cjs/nodes/email/outbound-message-guard.d.ts +113 -0
- package/dist/cjs/nodes/email/outbound-message-guard.d.ts.map +1 -0
- package/dist/cjs/nodes/email/outbound-message-guard.js +460 -0
- package/dist/cjs/nodes/email/outbound-message-guard.js.map +1 -0
- package/dist/cjs/nodes/email/trusted-html-code.d.ts +22 -0
- package/dist/cjs/nodes/email/trusted-html-code.d.ts.map +1 -0
- package/dist/cjs/nodes/email/trusted-html-code.js +52 -0
- package/dist/cjs/nodes/email/trusted-html-code.js.map +1 -0
- package/dist/cjs/nodes/general/general-custom-js.d.ts.map +1 -1
- package/dist/cjs/nodes/general/general-custom-js.js +44 -7
- package/dist/cjs/nodes/general/general-custom-js.js.map +1 -1
- package/dist/cjs/nodes/general/general-http-request.d.ts.map +1 -1
- package/dist/cjs/nodes/general/general-http-request.js +431 -45
- package/dist/cjs/nodes/general/general-http-request.js.map +1 -1
- package/dist/cjs/nodes/general/general-rate-limiter.d.ts.map +1 -1
- package/dist/cjs/nodes/general/general-rate-limiter.js +46 -78
- package/dist/cjs/nodes/general/general-rate-limiter.js.map +1 -1
- package/dist/cjs/nodes/general/general-wait.d.ts +3 -0
- package/dist/cjs/nodes/general/general-wait.d.ts.map +1 -0
- package/dist/cjs/nodes/general/general-wait.js +81 -0
- package/dist/cjs/nodes/general/general-wait.js.map +1 -0
- package/dist/cjs/nodes/general/visitor-request.d.ts +44 -0
- package/dist/cjs/nodes/general/visitor-request.d.ts.map +1 -0
- package/dist/cjs/nodes/general/visitor-request.js +72 -0
- package/dist/cjs/nodes/general/visitor-request.js.map +1 -0
- package/dist/cjs/nodes/index.d.ts.map +1 -1
- package/dist/cjs/nodes/index.js +7 -1
- package/dist/cjs/nodes/index.js.map +1 -1
- package/dist/cjs/nodes/integrations/integration-slack.d.ts.map +1 -1
- package/dist/cjs/nodes/integrations/integration-slack.js +17 -6
- package/dist/cjs/nodes/integrations/integration-slack.js.map +1 -1
- package/dist/cjs/nodes/newsletter/newsletter-confirm.d.ts +3 -0
- package/dist/cjs/nodes/newsletter/newsletter-confirm.d.ts.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-confirm.js +41 -0
- package/dist/cjs/nodes/newsletter/newsletter-confirm.js.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-subscribe.d.ts +7 -0
- package/dist/cjs/nodes/newsletter/newsletter-subscribe.d.ts.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-subscribe.js +69 -0
- package/dist/cjs/nodes/newsletter/newsletter-subscribe.js.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.d.ts +3 -0
- package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.d.ts.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.js +42 -0
- package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.js.map +1 -0
- package/dist/cjs/nodes/realtime/realtime-join-channel.d.ts.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-join-channel.js +5 -4
- package/dist/cjs/nodes/realtime/realtime-join-channel.js.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-send-channel-event.d.ts.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-send-channel-event.js +11 -2
- package/dist/cjs/nodes/realtime/realtime-send-channel-event.js.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-send-channel-message.d.ts.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-send-channel-message.js +11 -2
- package/dist/cjs/nodes/realtime/realtime-send-channel-message.js.map +1 -1
- package/dist/cjs/nodes/sms/sms-infobip.d.ts.map +1 -1
- package/dist/cjs/nodes/sms/sms-infobip.js +11 -8
- package/dist/cjs/nodes/sms/sms-infobip.js.map +1 -1
- package/dist/cjs/nodes/sms/sms-smsapi.d.ts.map +1 -1
- package/dist/cjs/nodes/sms/sms-smsapi.js +11 -8
- package/dist/cjs/nodes/sms/sms-smsapi.js.map +1 -1
- package/dist/cjs/nodes/sms/sms-textmagic.d.ts.map +1 -1
- package/dist/cjs/nodes/sms/sms-textmagic.js +11 -8
- package/dist/cjs/nodes/sms/sms-textmagic.js.map +1 -1
- package/dist/cjs/nodes/sms/sms-twilio.d.ts.map +1 -1
- package/dist/cjs/nodes/sms/sms-twilio.js +12 -10
- package/dist/cjs/nodes/sms/sms-twilio.js.map +1 -1
- package/dist/cjs/nodes/types.d.ts +8 -1
- package/dist/cjs/nodes/types.d.ts.map +1 -1
- package/dist/cjs/nodes/utility/utility-similarity-scoring.d.ts.map +1 -1
- package/dist/cjs/nodes/utility/utility-similarity-scoring.js +29 -10
- package/dist/cjs/nodes/utility/utility-similarity-scoring.js.map +1 -1
- package/dist/cjs/page-access-guard-generator.d.ts +23 -0
- package/dist/cjs/page-access-guard-generator.d.ts.map +1 -0
- package/dist/cjs/page-access-guard-generator.js +135 -0
- package/dist/cjs/page-access-guard-generator.js.map +1 -0
- package/dist/cjs/password-reset-route-generator.d.ts +119 -0
- package/dist/cjs/password-reset-route-generator.d.ts.map +1 -0
- package/dist/cjs/password-reset-route-generator.js +460 -0
- package/dist/cjs/password-reset-route-generator.js.map +1 -0
- package/dist/cjs/payments/payment-core-code.d.ts.map +1 -1
- package/dist/cjs/payments/payment-core-code.js +12 -7
- package/dist/cjs/payments/payment-core-code.js.map +1 -1
- package/dist/cjs/project-code-scanner.d.ts +11 -0
- package/dist/cjs/project-code-scanner.d.ts.map +1 -0
- package/dist/cjs/project-code-scanner.js +80 -0
- package/dist/cjs/project-code-scanner.js.map +1 -0
- package/dist/cjs/public-step-guards.d.ts +122 -0
- package/dist/cjs/public-step-guards.d.ts.map +1 -0
- package/dist/cjs/public-step-guards.js +288 -0
- package/dist/cjs/public-step-guards.js.map +1 -0
- package/dist/cjs/publish-refusals.d.ts +66 -0
- package/dist/cjs/publish-refusals.d.ts.map +1 -0
- package/dist/cjs/publish-refusals.js +278 -0
- package/dist/cjs/publish-refusals.js.map +1 -0
- package/dist/cjs/realtime-generator.d.ts +63 -1
- package/dist/cjs/realtime-generator.d.ts.map +1 -1
- package/dist/cjs/realtime-generator.js +404 -230
- package/dist/cjs/realtime-generator.js.map +1 -1
- package/dist/cjs/runtime-storage-generator.d.ts +32 -1
- package/dist/cjs/runtime-storage-generator.d.ts.map +1 -1
- package/dist/cjs/runtime-storage-generator.js +265 -12
- package/dist/cjs/runtime-storage-generator.js.map +1 -1
- package/dist/cjs/security-runtime/index.d.ts +14 -0
- package/dist/cjs/security-runtime/index.d.ts.map +1 -0
- package/dist/cjs/security-runtime/index.js +48 -0
- package/dist/cjs/security-runtime/index.js.map +1 -0
- package/dist/cjs/security-runtime/security-runtime-code.d.ts +53 -0
- package/dist/cjs/security-runtime/security-runtime-code.d.ts.map +1 -0
- package/dist/cjs/security-runtime/security-runtime-code.js +580 -0
- package/dist/cjs/security-runtime/security-runtime-code.js.map +1 -0
- package/dist/cjs/security-scanner.d.ts +72 -3
- package/dist/cjs/security-scanner.d.ts.map +1 -1
- package/dist/cjs/security-scanner.js +220 -8
- package/dist/cjs/security-scanner.js.map +1 -1
- package/dist/cjs/segment-splitter.d.ts.map +1 -1
- package/dist/cjs/segment-splitter.js +10 -2
- package/dist/cjs/segment-splitter.js.map +1 -1
- package/dist/cjs/segment-trust.d.ts +36 -0
- package/dist/cjs/segment-trust.d.ts.map +1 -1
- package/dist/cjs/segment-trust.js +147 -3
- package/dist/cjs/segment-trust.js.map +1 -1
- package/dist/cjs/self-call-headers.d.ts +31 -0
- package/dist/cjs/self-call-headers.d.ts.map +1 -0
- package/dist/cjs/self-call-headers.js +48 -0
- package/dist/cjs/self-call-headers.js.map +1 -0
- package/dist/cjs/sent-email-log/index.d.ts +7 -0
- package/dist/cjs/sent-email-log/index.d.ts.map +1 -1
- package/dist/cjs/sent-email-log/index.js +17 -1
- package/dist/cjs/sent-email-log/index.js.map +1 -1
- package/dist/cjs/sent-email-log/sent-email-log-code.d.ts +7 -0
- package/dist/cjs/sent-email-log/sent-email-log-code.d.ts.map +1 -1
- package/dist/cjs/sent-email-log/sent-email-log-code.js +17 -3
- package/dist/cjs/sent-email-log/sent-email-log-code.js.map +1 -1
- package/dist/cjs/server-custom-node-call.d.ts +79 -0
- package/dist/cjs/server-custom-node-call.d.ts.map +1 -0
- package/dist/cjs/server-custom-node-call.js +285 -0
- package/dist/cjs/server-custom-node-call.js.map +1 -0
- package/dist/cjs/server-runtime-code.d.ts +39 -12
- package/dist/cjs/server-runtime-code.d.ts.map +1 -1
- package/dist/cjs/server-runtime-code.js +484 -41
- package/dist/cjs/server-runtime-code.js.map +1 -1
- package/dist/cjs/session-cookie-resolver.d.ts +3 -1
- package/dist/cjs/session-cookie-resolver.d.ts.map +1 -1
- package/dist/cjs/session-revocation-generator.d.ts +39 -0
- package/dist/cjs/session-revocation-generator.d.ts.map +1 -0
- package/dist/cjs/session-revocation-generator.js +177 -0
- package/dist/cjs/session-revocation-generator.js.map +1 -0
- package/dist/cjs/slack-message-values.d.ts +6 -0
- package/dist/cjs/slack-message-values.d.ts.map +1 -0
- package/dist/cjs/slack-message-values.js +73 -0
- package/dist/cjs/slack-message-values.js.map +1 -0
- package/dist/cjs/transactional-email-code.d.ts +11 -0
- package/dist/cjs/transactional-email-code.d.ts.map +1 -1
- package/dist/cjs/transactional-email-code.js +29 -5
- package/dist/cjs/transactional-email-code.js.map +1 -1
- package/dist/cjs/trigger-generator.d.ts +2 -0
- package/dist/cjs/trigger-generator.d.ts.map +1 -1
- package/dist/cjs/trigger-generator.js +17 -4
- package/dist/cjs/trigger-generator.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/visitor-step-limits.d.ts +66 -0
- package/dist/cjs/visitor-step-limits.d.ts.map +1 -0
- package/dist/cjs/visitor-step-limits.js +187 -0
- package/dist/cjs/visitor-step-limits.js.map +1 -0
- package/dist/cjs/webhook-generator.d.ts.map +1 -1
- package/dist/cjs/webhook-generator.js +93 -15
- package/dist/cjs/webhook-generator.js.map +1 -1
- package/dist/cjs/webhook-signature-verification.d.ts.map +1 -1
- package/dist/cjs/webhook-signature-verification.js +13 -3
- package/dist/cjs/webhook-signature-verification.js.map +1 -1
- package/dist/cjs/workflow-auth-generator.d.ts +4 -1
- package/dist/cjs/workflow-auth-generator.d.ts.map +1 -1
- package/dist/cjs/workflow-auth-generator.js +8 -3
- package/dist/cjs/workflow-auth-generator.js.map +1 -1
- package/dist/cjs/workflow-component-plugin.js +11 -3
- package/dist/cjs/workflow-component-plugin.js.map +1 -1
- package/dist/cjs/workflow-project-plugin.d.ts.map +1 -1
- package/dist/cjs/workflow-project-plugin.js +302 -56
- package/dist/cjs/workflow-project-plugin.js.map +1 -1
- package/dist/cjs/workflow-scope.d.ts.map +1 -1
- package/dist/cjs/workflow-scope.js +5 -0
- package/dist/cjs/workflow-scope.js.map +1 -1
- package/dist/esm/account-delete-route-generator.d.ts +1 -0
- package/dist/esm/account-delete-route-generator.d.ts.map +1 -1
- package/dist/esm/account-delete-route-generator.js +18 -3
- package/dist/esm/account-delete-route-generator.js.map +1 -1
- package/dist/esm/api-route-generator.d.ts +52 -3
- package/dist/esm/api-route-generator.d.ts.map +1 -1
- package/dist/esm/api-route-generator.js +595 -142
- package/dist/esm/api-route-generator.js.map +1 -1
- package/dist/esm/auth-generator.d.ts +126 -3
- package/dist/esm/auth-generator.d.ts.map +1 -1
- package/dist/esm/auth-generator.js +1350 -140
- package/dist/esm/auth-generator.js.map +1 -1
- package/dist/esm/automations/activity-kicks.d.ts +12 -0
- package/dist/esm/automations/activity-kicks.d.ts.map +1 -0
- package/dist/esm/automations/activity-kicks.js +118 -0
- package/dist/esm/automations/activity-kicks.js.map +1 -0
- package/dist/esm/automations/app-events-source.d.ts +33 -0
- package/dist/esm/automations/app-events-source.d.ts.map +1 -0
- package/dist/esm/automations/app-events-source.js +104 -0
- package/dist/esm/automations/app-events-source.js.map +1 -0
- package/dist/esm/automations/automations-project-plugin.d.ts +21 -0
- package/dist/esm/automations/automations-project-plugin.d.ts.map +1 -0
- package/dist/esm/automations/automations-project-plugin.js +98 -0
- package/dist/esm/automations/automations-project-plugin.js.map +1 -0
- package/dist/esm/automations/automations-scope.d.ts +104 -0
- package/dist/esm/automations/automations-scope.d.ts.map +1 -0
- package/dist/esm/automations/automations-scope.js +165 -0
- package/dist/esm/automations/automations-scope.js.map +1 -0
- package/dist/esm/automations/dispatcher-source.d.ts +72 -0
- package/dist/esm/automations/dispatcher-source.d.ts.map +1 -0
- package/dist/esm/automations/dispatcher-source.js +999 -0
- package/dist/esm/automations/dispatcher-source.js.map +1 -0
- package/dist/esm/automations/event-bus-source.d.ts +44 -0
- package/dist/esm/automations/event-bus-source.d.ts.map +1 -0
- package/dist/esm/automations/event-bus-source.js +421 -0
- package/dist/esm/automations/event-bus-source.js.map +1 -0
- package/dist/esm/automations/handler-module-generator.d.ts +25 -0
- package/dist/esm/automations/handler-module-generator.d.ts.map +1 -0
- package/dist/esm/automations/handler-module-generator.js +71 -0
- package/dist/esm/automations/handler-module-generator.js.map +1 -0
- package/dist/esm/automations/hydrators-source.d.ts +33 -0
- package/dist/esm/automations/hydrators-source.d.ts.map +1 -0
- package/dist/esm/automations/hydrators-source.js +567 -0
- package/dist/esm/automations/hydrators-source.js.map +1 -0
- package/dist/esm/booking-calendar-feed-route-generator.d.ts.map +1 -1
- package/dist/esm/booking-calendar-feed-route-generator.js +8 -0
- package/dist/esm/booking-calendar-feed-route-generator.js.map +1 -1
- package/dist/esm/configured-nextauth-url.d.ts +17 -0
- package/dist/esm/configured-nextauth-url.d.ts.map +1 -0
- package/dist/esm/configured-nextauth-url.js +17 -0
- package/dist/esm/configured-nextauth-url.js.map +1 -0
- package/dist/esm/cron-request-verification.d.ts +22 -1
- package/dist/esm/cron-request-verification.d.ts.map +1 -1
- package/dist/esm/cron-request-verification.js +48 -5
- package/dist/esm/cron-request-verification.js.map +1 -1
- package/dist/esm/data-api-route-generator.d.ts +19 -0
- package/dist/esm/data-api-route-generator.d.ts.map +1 -1
- package/dist/esm/data-api-route-generator.js +710 -43
- package/dist/esm/data-api-route-generator.js.map +1 -1
- package/dist/esm/ecommerce/parameterized-stock-chain.d.ts +3 -1
- package/dist/esm/ecommerce/parameterized-stock-chain.d.ts.map +1 -1
- package/dist/esm/ecommerce/parameterized-stock-chain.js +43 -4
- package/dist/esm/ecommerce/parameterized-stock-chain.js.map +1 -1
- package/dist/esm/ecommerce/place-order-guards.d.ts +126 -0
- package/dist/esm/ecommerce/place-order-guards.d.ts.map +1 -0
- package/dist/esm/ecommerce/place-order-guards.js +655 -0
- package/dist/esm/ecommerce/place-order-guards.js.map +1 -0
- package/dist/esm/ecommerce-customhandler-rewriter.d.ts +2 -0
- package/dist/esm/ecommerce-customhandler-rewriter.d.ts.map +1 -1
- package/dist/esm/ecommerce-customhandler-rewriter.js +38 -2
- package/dist/esm/ecommerce-customhandler-rewriter.js.map +1 -1
- package/dist/esm/executor-generator.d.ts.map +1 -1
- package/dist/esm/executor-generator.js +368 -60
- package/dist/esm/executor-generator.js.map +1 -1
- package/dist/esm/graph-utils.d.ts +9 -0
- package/dist/esm/graph-utils.d.ts.map +1 -1
- package/dist/esm/graph-utils.js +30 -0
- package/dist/esm/graph-utils.js.map +1 -1
- package/dist/esm/index.d.ts +20 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +27 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/invoice/api-routes-code.d.ts +9 -3
- package/dist/esm/invoice/api-routes-code.d.ts.map +1 -1
- package/dist/esm/invoice/api-routes-code.js +9 -7
- package/dist/esm/invoice/api-routes-code.js.map +1 -1
- package/dist/esm/invoice/index.d.ts.map +1 -1
- package/dist/esm/invoice/index.js +12 -7
- package/dist/esm/invoice/index.js.map +1 -1
- package/dist/esm/invoice/invoice-assembly-code.d.ts.map +1 -1
- package/dist/esm/invoice/invoice-assembly-code.js +8 -3
- package/dist/esm/invoice/invoice-assembly-code.js.map +1 -1
- package/dist/esm/invoice/pdf-generator-code.d.ts.map +1 -1
- package/dist/esm/invoice/pdf-generator-code.js +2 -1
- package/dist/esm/invoice/pdf-generator-code.js.map +1 -1
- package/dist/esm/invoice/pdf-service-client-code.d.ts.map +1 -1
- package/dist/esm/invoice/pdf-service-client-code.js +15 -7
- package/dist/esm/invoice/pdf-service-client-code.js.map +1 -1
- package/dist/esm/newsletter/admin-route-code.d.ts +60 -0
- package/dist/esm/newsletter/admin-route-code.d.ts.map +1 -0
- package/dist/esm/newsletter/admin-route-code.js +295 -0
- package/dist/esm/newsletter/admin-route-code.js.map +1 -0
- package/dist/esm/newsletter/helper-code.d.ts +109 -0
- package/dist/esm/newsletter/helper-code.d.ts.map +1 -0
- package/dist/esm/newsletter/helper-code.js +656 -0
- package/dist/esm/newsletter/helper-code.js.map +1 -0
- package/dist/esm/newsletter/newsletter-scope.d.ts +65 -0
- package/dist/esm/newsletter/newsletter-scope.d.ts.map +1 -0
- package/dist/esm/newsletter/newsletter-scope.js +97 -0
- package/dist/esm/newsletter/newsletter-scope.js.map +1 -0
- package/dist/esm/newsletter/project-plugin.d.ts +18 -0
- package/dist/esm/newsletter/project-plugin.d.ts.map +1 -0
- package/dist/esm/newsletter/project-plugin.js +93 -0
- package/dist/esm/newsletter/project-plugin.js.map +1 -0
- package/dist/esm/newsletter/routes-code.d.ts +6 -0
- package/dist/esm/newsletter/routes-code.d.ts.map +1 -0
- package/dist/esm/newsletter/routes-code.js +175 -0
- package/dist/esm/newsletter/routes-code.js.map +1 -0
- package/dist/esm/nodes/account/account-compare-passwords.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-compare-passwords.js +16 -6
- package/dist/esm/nodes/account/account-compare-passwords.js.map +1 -1
- package/dist/esm/nodes/account/account-delete-current.js +1 -1
- package/dist/esm/nodes/account/account-get-current.js +1 -1
- package/dist/esm/nodes/account/account-hash-password.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-hash-password.js +15 -3
- package/dist/esm/nodes/account/account-hash-password.js.map +1 -1
- package/dist/esm/nodes/account/account-login.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-login.js +23 -6
- package/dist/esm/nodes/account/account-login.js.map +1 -1
- package/dist/esm/nodes/account/account-logout.js +1 -1
- package/dist/esm/nodes/account/account-refresh-session.js +1 -1
- package/dist/esm/nodes/account/account-request-password-reset.d.ts +3 -0
- package/dist/esm/nodes/account/account-request-password-reset.d.ts.map +1 -0
- package/dist/esm/nodes/account/account-request-password-reset.js +43 -0
- package/dist/esm/nodes/account/account-request-password-reset.js.map +1 -0
- package/dist/esm/nodes/account/account-reset-password.d.ts +3 -0
- package/dist/esm/nodes/account/account-reset-password.d.ts.map +1 -0
- package/dist/esm/nodes/account/account-reset-password.js +41 -0
- package/dist/esm/nodes/account/account-reset-password.js.map +1 -0
- package/dist/esm/nodes/account/account-signup.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-signup.js +82 -19
- package/dist/esm/nodes/account/account-signup.js.map +1 -1
- package/dist/esm/nodes/account/account-social-login.js +1 -1
- package/dist/esm/nodes/ai/ai-custom-prompt.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-custom-prompt.js +20 -5
- package/dist/esm/nodes/ai/ai-custom-prompt.js.map +1 -1
- package/dist/esm/nodes/ai/ai-detect-language.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-detect-language.js +20 -5
- package/dist/esm/nodes/ai/ai-detect-language.js.map +1 -1
- package/dist/esm/nodes/ai/ai-generate-text-embedding.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-generate-text-embedding.js +10 -2
- package/dist/esm/nodes/ai/ai-generate-text-embedding.js.map +1 -1
- package/dist/esm/nodes/ai/ai-provider-utils-sources.generated.js +2 -2
- package/dist/esm/nodes/ai/ai-provider-utils-sources.generated.js.map +1 -1
- package/dist/esm/nodes/ai/ai-provider-utils.d.ts +31 -2
- package/dist/esm/nodes/ai/ai-provider-utils.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-provider-utils.js +124 -10
- package/dist/esm/nodes/ai/ai-provider-utils.js.map +1 -1
- package/dist/esm/nodes/ai/ai-select-database-data.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-select-database-data.js +6 -2
- package/dist/esm/nodes/ai/ai-select-database-data.js.map +1 -1
- package/dist/esm/nodes/ai/ai-sentiment-analysis.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-sentiment-analysis.js +20 -5
- package/dist/esm/nodes/ai/ai-sentiment-analysis.js.map +1 -1
- package/dist/esm/nodes/ai/ai-summarization.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-summarization.js +20 -5
- package/dist/esm/nodes/ai/ai-summarization.js.map +1 -1
- package/dist/esm/nodes/ai/ai-text-classifier.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-text-classifier.js +20 -5
- package/dist/esm/nodes/ai/ai-text-classifier.js.map +1 -1
- package/dist/esm/nodes/ai/ai-text-transform.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-text-transform.js +20 -5
- package/dist/esm/nodes/ai/ai-text-transform.js.map +1 -1
- package/dist/esm/nodes/analytics/analytics-track-outcome.d.ts +3 -0
- package/dist/esm/nodes/analytics/analytics-track-outcome.d.ts.map +1 -0
- package/dist/esm/nodes/analytics/analytics-track-outcome.js +107 -0
- package/dist/esm/nodes/analytics/analytics-track-outcome.js.map +1 -0
- package/dist/esm/nodes/cart/cart-price-order.d.ts.map +1 -1
- package/dist/esm/nodes/cart/cart-price-order.js +161 -2
- package/dist/esm/nodes/cart/cart-price-order.js.map +1 -1
- package/dist/esm/nodes/cost-bearing-node-types.d.ts +4 -0
- package/dist/esm/nodes/cost-bearing-node-types.d.ts.map +1 -0
- package/dist/esm/nodes/cost-bearing-node-types.js +39 -0
- package/dist/esm/nodes/cost-bearing-node-types.js.map +1 -0
- package/dist/esm/nodes/data/data-select.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-select.js +12 -2
- package/dist/esm/nodes/data/data-select.js.map +1 -1
- package/dist/esm/nodes/email/email-mailersend.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-mailersend.js +15 -11
- package/dist/esm/nodes/email/email-mailersend.js.map +1 -1
- package/dist/esm/nodes/email/email-mailgun.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-mailgun.js +15 -15
- package/dist/esm/nodes/email/email-mailgun.js.map +1 -1
- package/dist/esm/nodes/email/email-postmark.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-postmark.js +15 -15
- package/dist/esm/nodes/email/email-postmark.js.map +1 -1
- package/dist/esm/nodes/email/email-resend.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-resend.js +15 -15
- package/dist/esm/nodes/email/email-resend.js.map +1 -1
- package/dist/esm/nodes/email/email-sendgrid.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-sendgrid.js +15 -15
- package/dist/esm/nodes/email/email-sendgrid.js.map +1 -1
- package/dist/esm/nodes/email/html-escape-code.d.ts +3 -0
- package/dist/esm/nodes/email/html-escape-code.d.ts.map +1 -0
- package/dist/esm/nodes/email/html-escape-code.js +18 -0
- package/dist/esm/nodes/email/html-escape-code.js.map +1 -0
- package/dist/esm/nodes/email/message-trust.d.ts +40 -0
- package/dist/esm/nodes/email/message-trust.d.ts.map +1 -0
- package/dist/esm/nodes/email/message-trust.js +161 -0
- package/dist/esm/nodes/email/message-trust.js.map +1 -0
- package/dist/esm/nodes/email/outbound-message-guard.d.ts +113 -0
- package/dist/esm/nodes/email/outbound-message-guard.d.ts.map +1 -0
- package/dist/esm/nodes/email/outbound-message-guard.js +452 -0
- package/dist/esm/nodes/email/outbound-message-guard.js.map +1 -0
- package/dist/esm/nodes/email/trusted-html-code.d.ts +22 -0
- package/dist/esm/nodes/email/trusted-html-code.d.ts.map +1 -0
- package/dist/esm/nodes/email/trusted-html-code.js +49 -0
- package/dist/esm/nodes/email/trusted-html-code.js.map +1 -0
- package/dist/esm/nodes/general/general-custom-js.d.ts.map +1 -1
- package/dist/esm/nodes/general/general-custom-js.js +44 -7
- package/dist/esm/nodes/general/general-custom-js.js.map +1 -1
- package/dist/esm/nodes/general/general-http-request.d.ts.map +1 -1
- package/dist/esm/nodes/general/general-http-request.js +431 -45
- package/dist/esm/nodes/general/general-http-request.js.map +1 -1
- package/dist/esm/nodes/general/general-rate-limiter.d.ts.map +1 -1
- package/dist/esm/nodes/general/general-rate-limiter.js +46 -78
- package/dist/esm/nodes/general/general-rate-limiter.js.map +1 -1
- package/dist/esm/nodes/general/general-wait.d.ts +3 -0
- package/dist/esm/nodes/general/general-wait.d.ts.map +1 -0
- package/dist/esm/nodes/general/general-wait.js +78 -0
- package/dist/esm/nodes/general/general-wait.js.map +1 -0
- package/dist/esm/nodes/general/visitor-request.d.ts +44 -0
- package/dist/esm/nodes/general/visitor-request.d.ts.map +1 -0
- package/dist/esm/nodes/general/visitor-request.js +65 -0
- package/dist/esm/nodes/general/visitor-request.js.map +1 -0
- package/dist/esm/nodes/index.d.ts.map +1 -1
- package/dist/esm/nodes/index.js +7 -1
- package/dist/esm/nodes/index.js.map +1 -1
- package/dist/esm/nodes/integrations/integration-slack.d.ts.map +1 -1
- package/dist/esm/nodes/integrations/integration-slack.js +17 -6
- package/dist/esm/nodes/integrations/integration-slack.js.map +1 -1
- package/dist/esm/nodes/newsletter/newsletter-confirm.d.ts +3 -0
- package/dist/esm/nodes/newsletter/newsletter-confirm.d.ts.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-confirm.js +38 -0
- package/dist/esm/nodes/newsletter/newsletter-confirm.js.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-subscribe.d.ts +7 -0
- package/dist/esm/nodes/newsletter/newsletter-subscribe.d.ts.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-subscribe.js +66 -0
- package/dist/esm/nodes/newsletter/newsletter-subscribe.js.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-unsubscribe.d.ts +3 -0
- package/dist/esm/nodes/newsletter/newsletter-unsubscribe.d.ts.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-unsubscribe.js +39 -0
- package/dist/esm/nodes/newsletter/newsletter-unsubscribe.js.map +1 -0
- package/dist/esm/nodes/realtime/realtime-join-channel.d.ts.map +1 -1
- package/dist/esm/nodes/realtime/realtime-join-channel.js +5 -4
- package/dist/esm/nodes/realtime/realtime-join-channel.js.map +1 -1
- package/dist/esm/nodes/realtime/realtime-send-channel-event.d.ts.map +1 -1
- package/dist/esm/nodes/realtime/realtime-send-channel-event.js +11 -2
- package/dist/esm/nodes/realtime/realtime-send-channel-event.js.map +1 -1
- package/dist/esm/nodes/realtime/realtime-send-channel-message.d.ts.map +1 -1
- package/dist/esm/nodes/realtime/realtime-send-channel-message.js +11 -2
- package/dist/esm/nodes/realtime/realtime-send-channel-message.js.map +1 -1
- package/dist/esm/nodes/sms/sms-infobip.d.ts.map +1 -1
- package/dist/esm/nodes/sms/sms-infobip.js +11 -8
- package/dist/esm/nodes/sms/sms-infobip.js.map +1 -1
- package/dist/esm/nodes/sms/sms-smsapi.d.ts.map +1 -1
- package/dist/esm/nodes/sms/sms-smsapi.js +11 -8
- package/dist/esm/nodes/sms/sms-smsapi.js.map +1 -1
- package/dist/esm/nodes/sms/sms-textmagic.d.ts.map +1 -1
- package/dist/esm/nodes/sms/sms-textmagic.js +11 -8
- package/dist/esm/nodes/sms/sms-textmagic.js.map +1 -1
- package/dist/esm/nodes/sms/sms-twilio.d.ts.map +1 -1
- package/dist/esm/nodes/sms/sms-twilio.js +12 -10
- package/dist/esm/nodes/sms/sms-twilio.js.map +1 -1
- package/dist/esm/nodes/types.d.ts +8 -1
- package/dist/esm/nodes/types.d.ts.map +1 -1
- package/dist/esm/nodes/utility/utility-similarity-scoring.d.ts.map +1 -1
- package/dist/esm/nodes/utility/utility-similarity-scoring.js +29 -10
- package/dist/esm/nodes/utility/utility-similarity-scoring.js.map +1 -1
- package/dist/esm/page-access-guard-generator.d.ts +23 -0
- package/dist/esm/page-access-guard-generator.d.ts.map +1 -0
- package/dist/esm/page-access-guard-generator.js +131 -0
- package/dist/esm/page-access-guard-generator.js.map +1 -0
- package/dist/esm/password-reset-route-generator.d.ts +119 -0
- package/dist/esm/password-reset-route-generator.d.ts.map +1 -0
- package/dist/esm/password-reset-route-generator.js +448 -0
- package/dist/esm/password-reset-route-generator.js.map +1 -0
- package/dist/esm/payments/payment-core-code.d.ts.map +1 -1
- package/dist/esm/payments/payment-core-code.js +12 -7
- package/dist/esm/payments/payment-core-code.js.map +1 -1
- package/dist/esm/project-code-scanner.d.ts +11 -0
- package/dist/esm/project-code-scanner.d.ts.map +1 -0
- package/dist/esm/project-code-scanner.js +75 -0
- package/dist/esm/project-code-scanner.js.map +1 -0
- package/dist/esm/public-step-guards.d.ts +122 -0
- package/dist/esm/public-step-guards.d.ts.map +1 -0
- package/dist/esm/public-step-guards.js +280 -0
- package/dist/esm/public-step-guards.js.map +1 -0
- package/dist/esm/publish-refusals.d.ts +66 -0
- package/dist/esm/publish-refusals.d.ts.map +1 -0
- package/dist/esm/publish-refusals.js +271 -0
- package/dist/esm/publish-refusals.js.map +1 -0
- package/dist/esm/realtime-generator.d.ts +63 -1
- package/dist/esm/realtime-generator.d.ts.map +1 -1
- package/dist/esm/realtime-generator.js +401 -229
- package/dist/esm/realtime-generator.js.map +1 -1
- package/dist/esm/runtime-storage-generator.d.ts +32 -1
- package/dist/esm/runtime-storage-generator.d.ts.map +1 -1
- package/dist/esm/runtime-storage-generator.js +264 -11
- package/dist/esm/runtime-storage-generator.js.map +1 -1
- package/dist/esm/security-runtime/index.d.ts +14 -0
- package/dist/esm/security-runtime/index.d.ts.map +1 -0
- package/dist/esm/security-runtime/index.js +37 -0
- package/dist/esm/security-runtime/index.js.map +1 -0
- package/dist/esm/security-runtime/security-runtime-code.d.ts +53 -0
- package/dist/esm/security-runtime/security-runtime-code.d.ts.map +1 -0
- package/dist/esm/security-runtime/security-runtime-code.js +575 -0
- package/dist/esm/security-runtime/security-runtime-code.js.map +1 -0
- package/dist/esm/security-scanner.d.ts +72 -3
- package/dist/esm/security-scanner.d.ts.map +1 -1
- package/dist/esm/security-scanner.js +217 -8
- package/dist/esm/security-scanner.js.map +1 -1
- package/dist/esm/segment-splitter.d.ts.map +1 -1
- package/dist/esm/segment-splitter.js +10 -2
- package/dist/esm/segment-splitter.js.map +1 -1
- package/dist/esm/segment-trust.d.ts +36 -0
- package/dist/esm/segment-trust.d.ts.map +1 -1
- package/dist/esm/segment-trust.js +146 -2
- package/dist/esm/segment-trust.js.map +1 -1
- package/dist/esm/self-call-headers.d.ts +31 -0
- package/dist/esm/self-call-headers.d.ts.map +1 -0
- package/dist/esm/self-call-headers.js +43 -0
- package/dist/esm/self-call-headers.js.map +1 -0
- package/dist/esm/sent-email-log/index.d.ts +7 -0
- package/dist/esm/sent-email-log/index.d.ts.map +1 -1
- package/dist/esm/sent-email-log/index.js +15 -0
- package/dist/esm/sent-email-log/index.js.map +1 -1
- package/dist/esm/sent-email-log/sent-email-log-code.d.ts +7 -0
- package/dist/esm/sent-email-log/sent-email-log-code.d.ts.map +1 -1
- package/dist/esm/sent-email-log/sent-email-log-code.js +17 -3
- package/dist/esm/sent-email-log/sent-email-log-code.js.map +1 -1
- package/dist/esm/server-custom-node-call.d.ts +79 -0
- package/dist/esm/server-custom-node-call.d.ts.map +1 -0
- package/dist/esm/server-custom-node-call.js +278 -0
- package/dist/esm/server-custom-node-call.js.map +1 -0
- package/dist/esm/server-runtime-code.d.ts +39 -12
- package/dist/esm/server-runtime-code.d.ts.map +1 -1
- package/dist/esm/server-runtime-code.js +483 -40
- package/dist/esm/server-runtime-code.js.map +1 -1
- package/dist/esm/session-cookie-resolver.d.ts +3 -1
- package/dist/esm/session-cookie-resolver.d.ts.map +1 -1
- package/dist/esm/session-revocation-generator.d.ts +39 -0
- package/dist/esm/session-revocation-generator.d.ts.map +1 -0
- package/dist/esm/session-revocation-generator.js +172 -0
- package/dist/esm/session-revocation-generator.js.map +1 -0
- package/dist/esm/slack-message-values.d.ts +6 -0
- package/dist/esm/slack-message-values.d.ts.map +1 -0
- package/dist/esm/slack-message-values.js +68 -0
- package/dist/esm/slack-message-values.js.map +1 -0
- package/dist/esm/transactional-email-code.d.ts +11 -0
- package/dist/esm/transactional-email-code.d.ts.map +1 -1
- package/dist/esm/transactional-email-code.js +28 -4
- package/dist/esm/transactional-email-code.js.map +1 -1
- package/dist/esm/trigger-generator.d.ts +2 -0
- package/dist/esm/trigger-generator.d.ts.map +1 -1
- package/dist/esm/trigger-generator.js +15 -3
- package/dist/esm/trigger-generator.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/visitor-step-limits.d.ts +66 -0
- package/dist/esm/visitor-step-limits.d.ts.map +1 -0
- package/dist/esm/visitor-step-limits.js +181 -0
- package/dist/esm/visitor-step-limits.js.map +1 -0
- package/dist/esm/webhook-generator.d.ts.map +1 -1
- package/dist/esm/webhook-generator.js +93 -15
- package/dist/esm/webhook-generator.js.map +1 -1
- package/dist/esm/webhook-signature-verification.d.ts.map +1 -1
- package/dist/esm/webhook-signature-verification.js +13 -3
- package/dist/esm/webhook-signature-verification.js.map +1 -1
- package/dist/esm/workflow-auth-generator.d.ts +4 -1
- package/dist/esm/workflow-auth-generator.d.ts.map +1 -1
- package/dist/esm/workflow-auth-generator.js +8 -3
- package/dist/esm/workflow-auth-generator.js.map +1 -1
- package/dist/esm/workflow-component-plugin.js +12 -4
- package/dist/esm/workflow-component-plugin.js.map +1 -1
- package/dist/esm/workflow-project-plugin.d.ts.map +1 -1
- package/dist/esm/workflow-project-plugin.js +306 -60
- package/dist/esm/workflow-project-plugin.js.map +1 -1
- package/dist/esm/workflow-scope.d.ts.map +1 -1
- package/dist/esm/workflow-scope.js +5 -0
- package/dist/esm/workflow-scope.js.map +1 -1
- package/package.json +4 -4
- package/src/account-delete-route-generator.ts +28 -4
- package/src/api-route-generator.ts +712 -134
- package/src/auth-generator.ts +1471 -142
- package/src/automations/activity-kicks.ts +139 -0
- package/src/automations/app-events-source.ts +117 -0
- package/src/automations/automations-project-plugin.ts +202 -0
- package/src/automations/automations-scope.ts +196 -0
- package/src/automations/dispatcher-source.ts +1072 -0
- package/src/automations/event-bus-source.ts +428 -0
- package/src/automations/handler-module-generator.ts +107 -0
- package/src/automations/hydrators-source.ts +647 -0
- package/src/booking-calendar-feed-route-generator.ts +8 -0
- package/src/configured-nextauth-url.ts +17 -0
- package/src/cron-request-verification.ts +55 -5
- package/src/data-api-route-generator.ts +780 -43
- package/src/ecommerce/parameterized-stock-chain.ts +52 -5
- package/src/ecommerce/place-order-guards.ts +785 -0
- package/src/ecommerce-customhandler-rewriter.ts +55 -2
- package/src/executor-generator.ts +372 -60
- package/src/graph-utils.ts +33 -0
- package/src/index.ts +70 -0
- package/src/invoice/api-routes-code.ts +20 -7
- package/src/invoice/index.ts +11 -6
- package/src/invoice/invoice-assembly-code.ts +8 -3
- package/src/invoice/pdf-generator-code.ts +2 -1
- package/src/invoice/pdf-service-client-code.ts +15 -7
- package/src/newsletter/admin-route-code.ts +319 -0
- package/src/newsletter/helper-code.ts +748 -0
- package/src/newsletter/newsletter-scope.ts +116 -0
- package/src/newsletter/project-plugin.ts +119 -0
- package/src/newsletter/routes-code.ts +186 -0
- package/src/nodes/account/account-compare-passwords.ts +17 -6
- package/src/nodes/account/account-delete-current.ts +1 -1
- package/src/nodes/account/account-get-current.ts +1 -1
- package/src/nodes/account/account-hash-password.ts +19 -3
- package/src/nodes/account/account-login.ts +24 -7
- package/src/nodes/account/account-logout.ts +1 -1
- package/src/nodes/account/account-refresh-session.ts +1 -1
- package/src/nodes/account/account-request-password-reset.ts +47 -0
- package/src/nodes/account/account-reset-password.ts +45 -0
- package/src/nodes/account/account-signup.ts +86 -20
- package/src/nodes/account/account-social-login.ts +1 -1
- package/src/nodes/ai/ai-custom-prompt.ts +25 -6
- package/src/nodes/ai/ai-detect-language.ts +25 -6
- package/src/nodes/ai/ai-generate-text-embedding.ts +16 -3
- package/src/nodes/ai/ai-provider-utils-sources.generated.ts +2 -2
- package/src/nodes/ai/ai-provider-utils.ts +135 -10
- package/src/nodes/ai/ai-select-database-data.ts +8 -3
- package/src/nodes/ai/ai-sentiment-analysis.ts +25 -6
- package/src/nodes/ai/ai-summarization.ts +25 -6
- package/src/nodes/ai/ai-text-classifier.ts +25 -6
- package/src/nodes/ai/ai-text-transform.ts +25 -6
- package/src/nodes/analytics/analytics-track-outcome.ts +111 -0
- package/src/nodes/cart/cart-price-order.ts +200 -2
- package/src/nodes/cost-bearing-node-types.ts +45 -0
- package/src/nodes/data/data-select.ts +11 -2
- package/src/nodes/email/email-mailersend.ts +16 -8
- package/src/nodes/email/email-mailgun.ts +17 -12
- package/src/nodes/email/email-postmark.ts +17 -12
- package/src/nodes/email/email-resend.ts +17 -12
- package/src/nodes/email/email-sendgrid.ts +17 -12
- package/src/nodes/email/html-escape-code.ts +21 -0
- package/src/nodes/email/message-trust.ts +198 -0
- package/src/nodes/email/outbound-message-guard.ts +572 -0
- package/src/nodes/email/trusted-html-code.ts +49 -0
- package/src/nodes/general/general-custom-js.ts +46 -7
- package/src/nodes/general/general-http-request.ts +449 -46
- package/src/nodes/general/general-rate-limiter.ts +54 -81
- package/src/nodes/general/general-wait.ts +80 -0
- package/src/nodes/general/visitor-request.ts +79 -0
- package/src/nodes/index.ts +12 -0
- package/src/nodes/integrations/integration-slack.ts +21 -6
- package/src/nodes/newsletter/newsletter-confirm.ts +44 -0
- package/src/nodes/newsletter/newsletter-subscribe.ts +78 -0
- package/src/nodes/newsletter/newsletter-unsubscribe.ts +43 -0
- package/src/nodes/realtime/realtime-join-channel.ts +5 -4
- package/src/nodes/realtime/realtime-send-channel-event.ts +13 -2
- package/src/nodes/realtime/realtime-send-channel-message.ts +13 -2
- package/src/nodes/sms/sms-infobip.ts +14 -4
- package/src/nodes/sms/sms-smsapi.ts +14 -4
- package/src/nodes/sms/sms-textmagic.ts +14 -4
- package/src/nodes/sms/sms-twilio.ts +14 -4
- package/src/nodes/types.ts +9 -1
- package/src/nodes/utility/utility-similarity-scoring.ts +33 -12
- package/src/page-access-guard-generator.ts +154 -0
- package/src/password-reset-route-generator.ts +531 -0
- package/src/payments/payment-core-code.ts +12 -7
- package/src/project-code-scanner.ts +98 -0
- package/src/public-step-guards.ts +448 -0
- package/src/publish-refusals.ts +459 -0
- package/src/realtime-generator.ts +457 -234
- package/src/runtime-storage-generator.ts +270 -11
- package/src/security-runtime/index.ts +53 -0
- package/src/security-runtime/security-runtime-code.ts +579 -0
- package/src/security-scanner.ts +253 -10
- package/src/segment-splitter.ts +10 -2
- package/src/segment-trust.ts +205 -2
- package/src/self-call-headers.ts +46 -0
- package/src/sent-email-log/index.ts +16 -0
- package/src/sent-email-log/sent-email-log-code.ts +30 -4
- package/src/server-custom-node-call.ts +331 -0
- package/src/server-runtime-code.ts +488 -40
- package/src/session-revocation-generator.ts +177 -0
- package/src/slack-message-values.ts +84 -0
- package/src/transactional-email-code.ts +30 -4
- package/src/trigger-generator.ts +19 -3
- package/src/visitor-step-limits.ts +228 -0
- package/src/webhook-generator.ts +94 -14
- package/src/webhook-signature-verification.ts +13 -3
- package/src/workflow-auth-generator.ts +9 -4
- package/src/workflow-component-plugin.ts +14 -4
- package/src/workflow-project-plugin.ts +374 -61
- package/src/workflow-scope.ts +6 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `utils/auth/session-revocation.js`: the one check that ends a session once
|
|
3
|
+
* the account's credentials change, and that hands every server file the
|
|
4
|
+
* account's stored email and role. Emitted for every project with
|
|
5
|
+
* authentication.
|
|
6
|
+
*
|
|
7
|
+
* A session token carries a stamp of the account's password hash (and of its
|
|
8
|
+
* `session_version` column, when the `users` table has one), taken when it was
|
|
9
|
+
* issued. `liveSessionToken` reads the account by the token's id (the key every
|
|
10
|
+
* consumer acts on): a deleted account, a password reset or change, or a bumped
|
|
11
|
+
* `session_version` ("sign out everywhere") ends every token stamped before,
|
|
12
|
+
* and a live token comes back with the row's email and role, so a demotion
|
|
13
|
+
* counts on the next request. A store that cannot be read (an error, or no
|
|
14
|
+
* lookup by id) answers no session: the check fails closed. The shared session
|
|
15
|
+
* reader (`__tqSessionToken`) runs it for every server file; the NextAuth `jwt`
|
|
16
|
+
* callback compares the same stamp on each `/api/auth/session`.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { FileType, ProjectPluginStructure } from '@teleporthq/teleport-types'
|
|
20
|
+
import { SessionCookieResolver } from '@teleporthq/teleport-shared'
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The token claim that carries the stamp. Never copied onto `session.user`.
|
|
24
|
+
* One value with the shared session reader (`__tqSessionToken`), which runs
|
|
25
|
+
* this module's check for every consumer.
|
|
26
|
+
*/
|
|
27
|
+
export const SESSION_STAMP_KEY = SessionCookieResolver.SESSION_STAMP_KEY
|
|
28
|
+
|
|
29
|
+
export const SESSION_REVOCATION_FILE_NAME = 'session-revocation'
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* How long one server instance trusts its last look at an account: a password
|
|
33
|
+
* change, a deletion or a demotion counts on every instance within this.
|
|
34
|
+
*/
|
|
35
|
+
export const SESSION_CHECK_INTERVAL_MS = 10000
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Writes `utils/auth/session-revocation.js` for every project with
|
|
39
|
+
* authentication: the shared session reader requires it from every server
|
|
40
|
+
* file (an OAuth-only project's sessions are never stamped, so its check
|
|
41
|
+
* always passes).
|
|
42
|
+
*/
|
|
43
|
+
export const ensureSessionRevocationModule = (structure: ProjectPluginStructure): void => {
|
|
44
|
+
if (structure.files.has('auth-session-revocation')) {
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
structure.files.set('auth-session-revocation', {
|
|
48
|
+
path: ['utils', 'auth'],
|
|
49
|
+
files: [
|
|
50
|
+
{
|
|
51
|
+
name: SESSION_REVOCATION_FILE_NAME,
|
|
52
|
+
fileType: FileType.JS,
|
|
53
|
+
content: generateSessionRevocationFile(),
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export const generateSessionRevocationFile = (): string => `'use strict';
|
|
60
|
+
|
|
61
|
+
// GENERATED — see generateSessionRevocationFile in
|
|
62
|
+
// @teleporthq/teleport-plugin-next-workflows/src/session-revocation-generator.ts.
|
|
63
|
+
//
|
|
64
|
+
// A session ends when the account's password changes (a reset, a change), its
|
|
65
|
+
// session_version column, when the users table has one, moves ("sign out
|
|
66
|
+
// everywhere"), or the account is gone. The token carries a stamp of both from
|
|
67
|
+
// when it was issued; the account, read by the token's id, is compared with it
|
|
68
|
+
// here. The shared session reader (__tqSessionToken) runs this for every server
|
|
69
|
+
// file, and hands out the token with the account's stored email and role, so a
|
|
70
|
+
// demotion counts at once.
|
|
71
|
+
|
|
72
|
+
var crypto = require('crypto');
|
|
73
|
+
var __security = require('../security-runtime');
|
|
74
|
+
|
|
75
|
+
var SESSION_STAMP_KEY = '${SESSION_STAMP_KEY}';
|
|
76
|
+
// How long one server instance trusts its last look at an account.
|
|
77
|
+
var CHECK_INTERVAL_MS = ${SESSION_CHECK_INTERVAL_MS};
|
|
78
|
+
var CACHE_MAX_ENTRIES = 5000;
|
|
79
|
+
// What the token takes from the stored account.
|
|
80
|
+
var ACCOUNT_FIELDS = ['email', 'role', 'roleName', 'roles'];
|
|
81
|
+
var __checked = new Map();
|
|
82
|
+
|
|
83
|
+
// A keyed digest of what the session depends on: the password hash and the
|
|
84
|
+
// optional session_version. null without the app secret (no token can be
|
|
85
|
+
// issued or decoded without it either).
|
|
86
|
+
function credentialStamp(row) {
|
|
87
|
+
var secret = process.env.NEXTAUTH_SECRET;
|
|
88
|
+
if (!row || typeof row !== 'object' || !secret) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
var material =
|
|
92
|
+
'session-stamp|v1|' +
|
|
93
|
+
String(row.password == null ? '' : row.password) +
|
|
94
|
+
'|' +
|
|
95
|
+
String(row.session_version == null ? '' : row.session_version);
|
|
96
|
+
return crypto.createHmac('sha256', String(secret)).update(material).digest('hex').slice(0, 32);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// 'unstamped' (a token issued before stamps, or with no account of its own),
|
|
100
|
+
// 'current', or 'revoked' — for the token's account as stored now (null: the
|
|
101
|
+
// account is gone, which ends the session too).
|
|
102
|
+
function stampVerdict(token, row) {
|
|
103
|
+
if (!token || typeof token !== 'object' || typeof token[SESSION_STAMP_KEY] !== 'string') {
|
|
104
|
+
return 'unstamped';
|
|
105
|
+
}
|
|
106
|
+
if (!row) {
|
|
107
|
+
return 'revoked';
|
|
108
|
+
}
|
|
109
|
+
var stamp = credentialStamp(row);
|
|
110
|
+
if (!stamp) {
|
|
111
|
+
return 'current';
|
|
112
|
+
}
|
|
113
|
+
return __security.safeEqual(stamp, token[SESSION_STAMP_KEY]) ? 'current' : 'revoked';
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function accountOf(row) {
|
|
117
|
+
var account = {};
|
|
118
|
+
for (var i = 0; i < ACCOUNT_FIELDS.length; i++) {
|
|
119
|
+
if (row[ACCOUNT_FIELDS[i]] !== undefined) {
|
|
120
|
+
account[ACCOUNT_FIELDS[i]] = row[ACCOUNT_FIELDS[i]];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return account;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function withAccount(token, account) {
|
|
127
|
+
var live = Object.assign({}, token);
|
|
128
|
+
var keys = Object.keys(account);
|
|
129
|
+
for (var i = 0; i < keys.length; i++) {
|
|
130
|
+
live[keys[i]] = account[keys[i]];
|
|
131
|
+
}
|
|
132
|
+
return live;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function remember(key, account, now) {
|
|
136
|
+
if (__checked.size >= CACHE_MAX_ENTRIES) {
|
|
137
|
+
__checked.delete(__checked.keys().next().value);
|
|
138
|
+
}
|
|
139
|
+
__checked.set(key, { account: account, at: now });
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// The token as it still counts — carrying the account's stored email and role —
|
|
143
|
+
// or null when its account changed its credentials since the token was
|
|
144
|
+
// stamped, or is gone. An unstamped token is returned as it is. A store that
|
|
145
|
+
// cannot be read REJECTS (and nothing is cached): the reader then counts no
|
|
146
|
+
// session, never the stale one.
|
|
147
|
+
async function liveSessionToken(token) {
|
|
148
|
+
if (!token || typeof token !== 'object' || typeof token[SESSION_STAMP_KEY] !== 'string') {
|
|
149
|
+
return token || null;
|
|
150
|
+
}
|
|
151
|
+
var id = token.id != null ? token.id : token.sub;
|
|
152
|
+
if (id == null || String(id) === '') {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
var key = String(id) + '|' + token[SESSION_STAMP_KEY];
|
|
156
|
+
var now = Date.now();
|
|
157
|
+
var seen = __checked.get(key);
|
|
158
|
+
if (seen && now - seen.at >= 0 && now - seen.at < CHECK_INTERVAL_MS) {
|
|
159
|
+
return seen.account ? withAccount(token, seen.account) : null;
|
|
160
|
+
}
|
|
161
|
+
var authOptions = require('./auth-options');
|
|
162
|
+
if (!authOptions || typeof authOptions.findUserById !== 'function') {
|
|
163
|
+
throw new Error('The account store cannot be read by id');
|
|
164
|
+
}
|
|
165
|
+
var row = await authOptions.findUserById(String(id));
|
|
166
|
+
var account = stampVerdict(token, row || null) === 'current' ? accountOf(row) : null;
|
|
167
|
+
remember(key, account, now);
|
|
168
|
+
return account ? withAccount(token, account) : null;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
module.exports = {
|
|
172
|
+
SESSION_STAMP_KEY: SESSION_STAMP_KEY,
|
|
173
|
+
credentialStamp: credentialStamp,
|
|
174
|
+
stampVerdict: stampVerdict,
|
|
175
|
+
liveSessionToken: liveSessionToken,
|
|
176
|
+
};
|
|
177
|
+
`
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { UIDLWorkflowNode, UIDLWorkflows } from '@teleporthq/teleport-types'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A Slack step's message is mrkdwn, where `<…>` is a link, a mention or
|
|
5
|
+
* `<!channel>`, and the values an automation puts in it come from the event —
|
|
6
|
+
* what a customer typed among them. Each value must reach Slack escaped
|
|
7
|
+
* (`&`, `<`, `>`: the only characters Slack decodes). A value embedded in the
|
|
8
|
+
* message (a context chip) is escaped by the runtime as it is filled in
|
|
9
|
+
* (`resolveRichTextContext`); a message that IS one value (the whole field
|
|
10
|
+
* bound to it) is written here as that same chip, so it is escaped the same
|
|
11
|
+
* way. Every other step is left as it is — in an automation, a page workflow,
|
|
12
|
+
* a webhook or a custom node alike.
|
|
13
|
+
*/
|
|
14
|
+
const SLACK_NODE_TYPE = 'integration-slack'
|
|
15
|
+
const SLACK_MESSAGE_KEYS = ['text']
|
|
16
|
+
|
|
17
|
+
interface ContextReference {
|
|
18
|
+
type: 'workflowContext'
|
|
19
|
+
nodeId: string
|
|
20
|
+
path: string[]
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const isContextReference = (value: unknown): value is ContextReference => {
|
|
24
|
+
const candidate = value as ContextReference | null
|
|
25
|
+
return (
|
|
26
|
+
!!candidate &&
|
|
27
|
+
typeof candidate === 'object' &&
|
|
28
|
+
candidate.type === 'workflowContext' &&
|
|
29
|
+
typeof candidate.nodeId === 'string' &&
|
|
30
|
+
candidate.nodeId.length > 0 &&
|
|
31
|
+
Array.isArray(candidate.path)
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// The chip the editor writes for a value, read back by resolveRichTextContext:
|
|
36
|
+
// the path as JSON in a double-quoted attribute (`"`), with `<`, `>` and
|
|
37
|
+
// `&` written as JSON escapes so nothing in it can end the tag or the entity.
|
|
38
|
+
const asContextChip = (reference: ContextReference): string => {
|
|
39
|
+
const path = JSON.stringify(reference.path)
|
|
40
|
+
.replace(/[<>&]/g, (character) => `\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`)
|
|
41
|
+
.replace(/"/g, '"')
|
|
42
|
+
const nodeId = reference.nodeId.replace(/[^A-Za-z0-9_-]/g, '')
|
|
43
|
+
return `<span class="context-value-inline" data-ctx-node-id="${nodeId}" data-ctx-path="${path}">value</span>`
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const withSlackMessageValuesEscaped = (node: UIDLWorkflowNode): UIDLWorkflowNode => {
|
|
47
|
+
if (node.type !== SLACK_NODE_TYPE || !node.config) {
|
|
48
|
+
return node
|
|
49
|
+
}
|
|
50
|
+
const config = node.config as Record<string, unknown>
|
|
51
|
+
const bound = SLACK_MESSAGE_KEYS.filter((key) => isContextReference(config[key]))
|
|
52
|
+
if (bound.length === 0) {
|
|
53
|
+
return node
|
|
54
|
+
}
|
|
55
|
+
const escaped: Record<string, unknown> = { ...config }
|
|
56
|
+
for (const key of bound) {
|
|
57
|
+
escaped[key] = asContextChip(config[key] as ContextReference)
|
|
58
|
+
}
|
|
59
|
+
return { ...node, config: escaped }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** The nodes with every whole-field Slack message written as a chip; the same array when none is. */
|
|
63
|
+
export const escapeSlackMessageBindings = (nodes: UIDLWorkflowNode[]): UIDLWorkflowNode[] => {
|
|
64
|
+
const escaped = nodes.map(withSlackMessageValuesEscaped)
|
|
65
|
+
return escaped.some((node, index) => node !== nodes[index]) ? escaped : nodes
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Every workflow's and custom node's Slack messages, in place, before any route is written. */
|
|
69
|
+
export const escapeSlackMessageBindingsInWorkflows = (
|
|
70
|
+
workflows: UIDLWorkflows | undefined
|
|
71
|
+
): void => {
|
|
72
|
+
if (!workflows) {
|
|
73
|
+
return
|
|
74
|
+
}
|
|
75
|
+
const graphs = [
|
|
76
|
+
...Object.values(workflows.workflows || {}),
|
|
77
|
+
...Object.values(workflows.customNodes || {}),
|
|
78
|
+
]
|
|
79
|
+
for (const graph of graphs) {
|
|
80
|
+
if (Array.isArray(graph.nodes)) {
|
|
81
|
+
graph.nodes = escapeSlackMessageBindings(graph.nodes)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -8,6 +8,7 @@ import { UIDLLocalizedEmailTemplates } from '@teleporthq/teleport-types'
|
|
|
8
8
|
import { EmailSender } from '@teleporthq/teleport-shared'
|
|
9
9
|
import { getEmailProviderDependencies } from './invoice/email-sender-code'
|
|
10
10
|
import { EMAIL_LOCALE_FILE_NAME, EMAIL_LOCALE_PATH } from './email-locale/email-locale-scope'
|
|
11
|
+
import { escapeHtmlValueJs } from './nodes/email/html-escape-code'
|
|
11
12
|
|
|
12
13
|
export const SUPPORTED_EMAIL_PROVIDERS = new Set([
|
|
13
14
|
'resend',
|
|
@@ -47,6 +48,19 @@ export interface TransactionalEmailLedger {
|
|
|
47
48
|
withoutRecipientDetails?: boolean
|
|
48
49
|
}
|
|
49
50
|
|
|
51
|
+
/**
|
|
52
|
+
* The sent-email purpose (`emailType`) of the link a sign-up mails to an
|
|
53
|
+
* address the site knows without a password (a newsletter subscriber, a
|
|
54
|
+
* checkout guest): "Set your password to finish creating your account".
|
|
55
|
+
*/
|
|
56
|
+
export const SET_PASSWORD_EMAIL = 'set-password'
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The sent-email purpose of the notice a sign-up mails to an address that
|
|
60
|
+
* already has an account: "You already have an account".
|
|
61
|
+
*/
|
|
62
|
+
export const EXISTING_ACCOUNT_EMAIL = 'existing-account'
|
|
63
|
+
|
|
50
64
|
// Provider-specific `__sendProviderEmail({ from, fromName?, to, recordedTo?,
|
|
51
65
|
// subject, html, apiKey, tokenValues?, userId? })`, preceded by the `__emailSender` helper that
|
|
52
66
|
// names the sender. No attachment (unlike the invoice sender). When no provider
|
|
@@ -158,17 +172,29 @@ const generateRawProviderSendFunction = (provider?: string | null): string => {
|
|
|
158
172
|
}
|
|
159
173
|
}
|
|
160
174
|
|
|
161
|
-
// Emits the
|
|
162
|
-
//
|
|
163
|
-
|
|
175
|
+
// Emits the flat `{{key}}` replacers used to fill the email tokens at send
|
|
176
|
+
// time: `fillTemplate(str, values)` for the HTML body, where every value is
|
|
177
|
+
// escaped once (a name typed at signup, a Host header, …; an already escaped
|
|
178
|
+
// value is not escaped again) and only the author's
|
|
179
|
+
// template stays HTML; `fillSubjectTemplate(str, values)` for the subject, a
|
|
180
|
+
// header, where a value loses its line breaks instead.
|
|
181
|
+
export const generateFillTemplateFn = (): string => `function __fillTokens(str, values, encode) {
|
|
164
182
|
if (!str) { return ''; }
|
|
165
183
|
var out = String(str);
|
|
166
184
|
var keys = Object.keys(values);
|
|
167
185
|
for (var i = 0; i < keys.length; i++) {
|
|
168
186
|
var v = values[keys[i]];
|
|
169
|
-
out = out.split('{{' + keys[i] + '}}').join(v == null ? '' : String(v));
|
|
187
|
+
out = out.split('{{' + keys[i] + '}}').join(v == null ? '' : encode(String(v)));
|
|
170
188
|
}
|
|
171
189
|
return out;
|
|
190
|
+
}
|
|
191
|
+
function fillTemplate(str, values) {
|
|
192
|
+
return __fillTokens(str, values, function (text) {
|
|
193
|
+
return ${escapeHtmlValueJs('text')};
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
function fillSubjectTemplate(str, values) {
|
|
197
|
+
return __fillTokens(str, values, function (text) { return text.replace(/[\\r\\n]+/g, ' '); });
|
|
172
198
|
}`
|
|
173
199
|
|
|
174
200
|
/**
|
package/src/trigger-generator.ts
CHANGED
|
@@ -84,8 +84,22 @@ export const generateTriggerCode = (workflow: UIDLWorkflow, workflowVarName: str
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
// Every trigger hands the workflow the analytics ids of the visit (`__tpa`):
|
|
88
|
+
// the session, visitor and page the tracker resolved, so a server segment that
|
|
89
|
+
// reports an outcome can attribute it. Null when the tracker is absent — a
|
|
90
|
+
// project without analytics, or a page it keeps out. A copy, not a mutation:
|
|
91
|
+
// a trigger context may be a custom event's `detail`, which belongs to its
|
|
92
|
+
// dispatcher.
|
|
93
|
+
export const TRACKER_IDS_EXPRESSION =
|
|
94
|
+
"(typeof window !== 'undefined' && window.tpAnalytics && typeof window.tpAnalytics.ids === 'function' ? window.tpAnalytics.ids() : null)"
|
|
95
|
+
|
|
96
|
+
// Reports a sent form to Growth analytics as a `lead` outcome, keyed by the
|
|
97
|
+
// form's id. Guarded: the tracker is absent on a project without analytics.
|
|
98
|
+
export const TRACK_LEAD_SOURCE = (formId: string): string =>
|
|
99
|
+
`if (typeof window !== 'undefined' && window.tpAnalytics && typeof window.tpAnalytics.track === 'function') { window.tpAnalytics.track('lead', { recordId: '${formId}' }); }`
|
|
100
|
+
|
|
87
101
|
const generateExecutionCall = (workflowVarName: string): string => {
|
|
88
|
-
return `${workflowVarName}(triggerContext)`
|
|
102
|
+
return `${workflowVarName}(Object.assign({}, triggerContext, { __tpa: ${TRACKER_IDS_EXPRESSION} }))`
|
|
89
103
|
}
|
|
90
104
|
|
|
91
105
|
const generateElementClickTrigger = (
|
|
@@ -279,7 +293,9 @@ const generateFormSubmittedTrigger = (
|
|
|
279
293
|
// required" for a name that was filled in. The spread comes first so a
|
|
280
294
|
// field named \`formData\`/\`formId\`/\`timestamp\` cannot shadow them.
|
|
281
295
|
const triggerContext = Object.assign({}, formData, { fields: formData, formData: formData, formId: '${formId}', timestamp: Date.now() });
|
|
282
|
-
|
|
296
|
+
// Growth analytics: a form whose workflow finished is a lead. A run
|
|
297
|
+
// that threw never reaches the report.
|
|
298
|
+
Promise.resolve(${executionCall}).then(function() { ${TRACK_LEAD_SOURCE(formId)} });
|
|
283
299
|
};
|
|
284
300
|
form_${safeId}.addEventListener('submit', handler_${safeId});
|
|
285
301
|
return function() { form_${safeId}.removeEventListener('submit', handler_${safeId}); };
|
|
@@ -557,7 +573,7 @@ const generateRealtimePresenceTrigger = (
|
|
|
557
573
|
const pd = presenceMessage.data || {};
|
|
558
574
|
const triggerContext = {
|
|
559
575
|
channelName: '${channelName}',
|
|
560
|
-
userId:
|
|
576
|
+
userId: presenceMessage.clientId || pd.userId || '',
|
|
561
577
|
userName: pd.userName || '',
|
|
562
578
|
userData: pd.userData || null,
|
|
563
579
|
timestamp: presenceMessage.timestamp || Date.now()
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { securityRuntimeSpecifier } from './security-runtime'
|
|
2
|
+
import { WorkflowSegment } from './types'
|
|
3
|
+
import { NEWSLETTER_VISITOR_LIMIT, NEWSLETTER_VISITOR_SCOPE } from './newsletter/newsletter-scope'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A step any visitor may run, but not without end: a guest booking (which
|
|
7
|
+
* takes a place in the calendar and emails a confirmation), a newsletter
|
|
8
|
+
* signup (which adds an address to the merchant's audience). The feature that
|
|
9
|
+
* builds such a step declares how often one visitor may run it, on the step:
|
|
10
|
+
*
|
|
11
|
+
* config.visitorLimit = { limit: 10, windowSeconds: 3600 } // 429 past the limit
|
|
12
|
+
* config.visitorLimit = { limit: 5, windowSeconds: 3600, onLimit: 'skip' } // the step quietly does nothing
|
|
13
|
+
* config.visitorLimit = { …, scope: 'newsletter-signup' } // one budget for every such step
|
|
14
|
+
*
|
|
15
|
+
* Without `scope` the budget is the step's own (`workflow-step:<node id>`).
|
|
16
|
+
* With one, every step that names the same scope shares one budget per
|
|
17
|
+
* visitor (`visitor-limit:<scope>`): two signup blocks, or two booking pages,
|
|
18
|
+
* do not give a visitor twice the signups or bookings.
|
|
19
|
+
*
|
|
20
|
+
* The segment route that runs the step counts every request it answers for
|
|
21
|
+
* the visitor (IPv6 by its /64), in the app's database through the shared
|
|
22
|
+
* security runtime, BEFORE any step of the segment runs — so the count cannot
|
|
23
|
+
* be dodged by calling the route directly or by marking the step skipped.
|
|
24
|
+
* This deployment's own server code (the internal-call token) is not counted.
|
|
25
|
+
*
|
|
26
|
+
* ⛔ So a declared limit holds only in a route a BROWSER calls: a limited step
|
|
27
|
+
* inside a custom node that another server segment runs with the internal
|
|
28
|
+
* token is not counted there. Declare the limit on the step the visitor's
|
|
29
|
+
* request reaches (the feature builders do).
|
|
30
|
+
*
|
|
31
|
+
* `onLimit: 'skip'` is for a step whose visitor must see the same answer either
|
|
32
|
+
* way (a signup thanks a bot and a person alike): past the limit the step, and
|
|
33
|
+
* every step after it in the segment, is skipped and the route answers as it
|
|
34
|
+
* would for a request that changed nothing. A step marked `continueOnError`
|
|
35
|
+
* is optional: past its limit only that step is skipped, and what follows it
|
|
36
|
+
* (a booking's checkout after its newsletter tick) still runs. The skip is logged server-side
|
|
37
|
+
* (the scope only — never the visitor's address or input), so an owner can
|
|
38
|
+
* tell lost signups from no signups: at most one line per scope per minute
|
|
39
|
+
* and per instance, the line saying how many more were skipped since the
|
|
40
|
+
* last one — a bot past its limit does not flood the log.
|
|
41
|
+
*
|
|
42
|
+
* A declaration that cannot be read limits at the defaults (10 per hour): a
|
|
43
|
+
* step that asked for a limit never runs without one.
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
export const VISITOR_LIMIT_CONFIG_KEY = 'visitorLimit'
|
|
47
|
+
|
|
48
|
+
const DEFAULT_LIMIT = 10
|
|
49
|
+
const DEFAULT_WINDOW_SECONDS = 3600
|
|
50
|
+
const MAX_LIMIT = 10000
|
|
51
|
+
const MAX_WINDOW_SECONDS = 7 * 86400
|
|
52
|
+
|
|
53
|
+
export interface VisitorStepLimit {
|
|
54
|
+
nodeId: string
|
|
55
|
+
/** The shared budget the step names, if any. */
|
|
56
|
+
scope?: string
|
|
57
|
+
limit: number
|
|
58
|
+
windowSeconds: number
|
|
59
|
+
onLimit: 'refuse' | 'skip'
|
|
60
|
+
/** What a refused visitor is told (the 429's public `error`), when the step names one. */
|
|
61
|
+
message?: string
|
|
62
|
+
/** The step and every step after it in the same segment (only the step when it is `continueOnError`). */
|
|
63
|
+
skipIds: string[]
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const SCOPE_RE = /^[A-Za-z0-9_-]{1,60}$/
|
|
67
|
+
const MAX_MESSAGE_LENGTH = 200
|
|
68
|
+
|
|
69
|
+
const wholeInRange = (value: unknown, max: number): number | null =>
|
|
70
|
+
typeof value === 'number' && Number.isInteger(value) && value >= 1 && value <= max ? value : null
|
|
71
|
+
|
|
72
|
+
/** The limit a step's config declares, or null when it declares none. */
|
|
73
|
+
export const readVisitorStepLimit = (
|
|
74
|
+
config: Record<string, unknown> | undefined
|
|
75
|
+
): Omit<VisitorStepLimit, 'nodeId' | 'skipIds'> | null => {
|
|
76
|
+
const declared = config ? config[VISITOR_LIMIT_CONFIG_KEY] : undefined
|
|
77
|
+
if (declared === undefined || declared === null || declared === false) {
|
|
78
|
+
return null
|
|
79
|
+
}
|
|
80
|
+
const spec = typeof declared === 'object' ? (declared as Record<string, unknown>) : {}
|
|
81
|
+
return {
|
|
82
|
+
limit: wholeInRange(spec.limit, MAX_LIMIT) ?? DEFAULT_LIMIT,
|
|
83
|
+
windowSeconds: wholeInRange(spec.windowSeconds, MAX_WINDOW_SECONDS) ?? DEFAULT_WINDOW_SECONDS,
|
|
84
|
+
onLimit: spec.onLimit === 'skip' ? 'skip' : 'refuse',
|
|
85
|
+
...(typeof spec.scope === 'string' && SCOPE_RE.test(spec.scope) ? { scope: spec.scope } : {}),
|
|
86
|
+
...(typeof spec.message === 'string' && spec.message.trim()
|
|
87
|
+
? { message: spec.message.trim().slice(0, MAX_MESSAGE_LENGTH) }
|
|
88
|
+
: {}),
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const downstreamInSegment = (segment: WorkflowSegment, startId: string): string[] => {
|
|
93
|
+
const inSegment = new Set(segment.nodes.map((n) => n.id))
|
|
94
|
+
const seen = new Set<string>()
|
|
95
|
+
const queue = [startId]
|
|
96
|
+
while (queue.length > 0) {
|
|
97
|
+
const current = queue.shift() as string
|
|
98
|
+
if (seen.has(current) || !inSegment.has(current)) {
|
|
99
|
+
continue
|
|
100
|
+
}
|
|
101
|
+
seen.add(current)
|
|
102
|
+
for (const edge of segment.edges || []) {
|
|
103
|
+
if (edge.source === current) {
|
|
104
|
+
queue.push(edge.target)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return Array.from(seen)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* The limit a step of these types has when its config declares none: the
|
|
113
|
+
* newsletter sign-up mails through the site's provider for every address a
|
|
114
|
+
* visitor types, so a step from the add-node menu, the AI or an import is
|
|
115
|
+
* held to the public sign-up route's own budget.
|
|
116
|
+
*/
|
|
117
|
+
const DEFAULT_VISITOR_STEP_LIMITS: Record<string, Omit<VisitorStepLimit, 'nodeId' | 'skipIds'>> = {
|
|
118
|
+
'newsletter-subscribe': {
|
|
119
|
+
limit: NEWSLETTER_VISITOR_LIMIT,
|
|
120
|
+
windowSeconds: 3600,
|
|
121
|
+
onLimit: 'skip',
|
|
122
|
+
scope: NEWSLETTER_VISITOR_SCOPE,
|
|
123
|
+
},
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Every declared limit of a segment's steps (or its type's default), in step order. */
|
|
127
|
+
export const collectVisitorStepLimits = (segment: WorkflowSegment): VisitorStepLimit[] =>
|
|
128
|
+
segment.nodes
|
|
129
|
+
.slice()
|
|
130
|
+
.sort((a, b) => (a.stepNumber || 0) - (b.stepNumber || 0))
|
|
131
|
+
.reduce<VisitorStepLimit[]>((limits, node) => {
|
|
132
|
+
const declared =
|
|
133
|
+
readVisitorStepLimit(node.config as Record<string, unknown> | undefined) ||
|
|
134
|
+
DEFAULT_VISITOR_STEP_LIMITS[node.type] ||
|
|
135
|
+
null
|
|
136
|
+
if (declared) {
|
|
137
|
+
// An optional step (continueOnError) past its limit never stops what
|
|
138
|
+
// follows it: only the step itself is skipped.
|
|
139
|
+
const optional =
|
|
140
|
+
(node.config as { continueOnError?: unknown } | undefined)?.continueOnError === true
|
|
141
|
+
limits.push({
|
|
142
|
+
nodeId: node.id,
|
|
143
|
+
...declared,
|
|
144
|
+
skipIds:
|
|
145
|
+
declared.onLimit !== 'skip'
|
|
146
|
+
? []
|
|
147
|
+
: optional
|
|
148
|
+
? [node.id]
|
|
149
|
+
: downstreamInSegment(segment, node.id),
|
|
150
|
+
})
|
|
151
|
+
}
|
|
152
|
+
return limits
|
|
153
|
+
}, [])
|
|
154
|
+
|
|
155
|
+
const SKIP_LOG_INTERVAL_MS = 60000
|
|
156
|
+
|
|
157
|
+
/** One log line per scope per minute (per instance); the rest are counted into the next line. */
|
|
158
|
+
const SKIP_LOG_CODE = `
|
|
159
|
+
const __logStepLimitSkip = function (scope) {
|
|
160
|
+
var log = globalThis.__tqStepLimitSkipLog || (globalThis.__tqStepLimitSkipLog = {});
|
|
161
|
+
var now = Date.now();
|
|
162
|
+
var entry = log[scope];
|
|
163
|
+
if (entry && now - entry.since < ${SKIP_LOG_INTERVAL_MS}) {
|
|
164
|
+
entry.skipped += 1;
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
var more = entry && entry.skipped > 0 ? ' (and ' + entry.skipped + ' more since the last line)' : '';
|
|
168
|
+
console.warn('[workflow-step-limit] skipped past its visitor limit: ' + scope + more);
|
|
169
|
+
log[scope] = { since: now, skipped: 0 };
|
|
170
|
+
};`
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* The route code that counts a segment's declared limits: '' for a segment
|
|
174
|
+
* without one, so every other route is byte-identical. Placed after the
|
|
175
|
+
* request context is claimed and the auth guard has run, before any step.
|
|
176
|
+
* `relativePrefix` leads from the route's folder to the project root.
|
|
177
|
+
*/
|
|
178
|
+
export const buildVisitorStepLimitGuard = (
|
|
179
|
+
segment: WorkflowSegment,
|
|
180
|
+
relativePrefix = '../../..'
|
|
181
|
+
): string => {
|
|
182
|
+
const limits = collectVisitorStepLimits(segment)
|
|
183
|
+
if (limits.length === 0) {
|
|
184
|
+
return ''
|
|
185
|
+
}
|
|
186
|
+
const checks = limits.map((step) => {
|
|
187
|
+
const scope = step.scope ? `visitor-limit:${step.scope}` : `workflow-step:${step.nodeId}`
|
|
188
|
+
const options = JSON.stringify({
|
|
189
|
+
scope,
|
|
190
|
+
limit: step.limit,
|
|
191
|
+
windowSeconds: step.windowSeconds,
|
|
192
|
+
})
|
|
193
|
+
if (step.onLimit === 'skip') {
|
|
194
|
+
// No response object: past the limit the runtime answers nothing itself.
|
|
195
|
+
return `
|
|
196
|
+
if (!(await __stepLimiter.rateLimitRequest(req, null, ${options}))) {
|
|
197
|
+
__logStepLimitSkip(${JSON.stringify(scope)});
|
|
198
|
+
if (!context.__skippedNodes || typeof context.__skippedNodes !== 'object') context.__skippedNodes = {};
|
|
199
|
+
${JSON.stringify(
|
|
200
|
+
step.skipIds
|
|
201
|
+
)}.forEach(function (id) { context.__skippedNodes[id] = true; });
|
|
202
|
+
}`
|
|
203
|
+
}
|
|
204
|
+
if (step.message) {
|
|
205
|
+
// Counted like any refused step; the 429 carries the step's own words.
|
|
206
|
+
return `
|
|
207
|
+
if (!(await __stepLimiter.rateLimitRequest(req, null, ${options}))) {
|
|
208
|
+
var __stepRetry = typeof __stepLimiter.peekRateLimitRequest === 'function' ? await __stepLimiter.peekRateLimitRequest(req, ${options}) : null;
|
|
209
|
+
if (__stepRetry && __stepRetry.retryAfter) res.setHeader('Retry-After', String(__stepRetry.retryAfter));
|
|
210
|
+
return res.status(429).json({ error: ${JSON.stringify(step.message)} });
|
|
211
|
+
}`
|
|
212
|
+
}
|
|
213
|
+
return `
|
|
214
|
+
if (!(await __stepLimiter.rateLimitRequest(req, res, ${options}))) {
|
|
215
|
+
return;
|
|
216
|
+
}`
|
|
217
|
+
})
|
|
218
|
+
return `
|
|
219
|
+
// Steps that declare how often one visitor may run them (a guest booking,
|
|
220
|
+
// a newsletter signup — see visitor-step-limits.ts): counted per visitor in
|
|
221
|
+
// the app's database for every request this route answers, before any step
|
|
222
|
+
// runs. This deployment's own server code is not counted.
|
|
223
|
+
if (!require('${relativePrefix}/utils/workflows/server-runtime').isInternalCall(req)) {
|
|
224
|
+
const __stepLimiter = require('${securityRuntimeSpecifier(relativePrefix)}');${
|
|
225
|
+
limits.some((step) => step.onLimit === 'skip') ? SKIP_LOG_CODE : ''
|
|
226
|
+
}${checks.join('')}
|
|
227
|
+
}`
|
|
228
|
+
}
|