@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,572 @@
|
|
|
1
|
+
import {
|
|
2
|
+
UIDLWorkflowEdge,
|
|
3
|
+
UIDLWorkflowNode,
|
|
4
|
+
UIDLWorkflowProtection,
|
|
5
|
+
} from '@teleporthq/teleport-types'
|
|
6
|
+
import type { SegmentTrust } from '../../segment-trust'
|
|
7
|
+
import type { WorkflowSegment } from '../../types'
|
|
8
|
+
import { handlerToString, HandlerFn, NodeHandlerGenerator, ServerHandlerOptions } from '../types'
|
|
9
|
+
import {
|
|
10
|
+
generateSecurityRuntimeVar,
|
|
11
|
+
isOutboundMessageNodeType,
|
|
12
|
+
serverHandlerPrefix,
|
|
13
|
+
VISITOR_KEY_CODE,
|
|
14
|
+
} from '../general/visitor-request'
|
|
15
|
+
import { collectMessageTrust, MessageTrust, stepNameOf } from './message-trust'
|
|
16
|
+
import { escapeHtmlValueJs } from './html-escape-code'
|
|
17
|
+
import { assertHandlerHasNoModuleRefs } from '../analytics/commerce-tracking'
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Email and SMS nodes on a route a visitor can call.
|
|
21
|
+
*
|
|
22
|
+
* - Header fields (addresses, subject) never carry a line break.
|
|
23
|
+
* - A recipient the request can choose — anything but an author literal, the
|
|
24
|
+
* signed-in user's own value read from the session, or a read of the owner's
|
|
25
|
+
* settings (see message-trust) — is allowed (an auto-reply, a guest
|
|
26
|
+
* confirmation), but every such send is counted per visitor, per recipient
|
|
27
|
+
* and per site. A send over a limit is skipped and logged; the visitor's
|
|
28
|
+
* action goes on.
|
|
29
|
+
* - Such a send's body must be the author's template: a body that is only
|
|
30
|
+
* values (one value, or markup around values with no author text; an SMS:
|
|
31
|
+
* its whole message) is refused at generation time, with the reason in the
|
|
32
|
+
* build log. So is a sender (address, name, SMS sender) the request can
|
|
33
|
+
* choose. A refused step never sends.
|
|
34
|
+
* - Every value is escaped where the template is filled (`applyTemplateParams`
|
|
35
|
+
* and the rich-text placeholders in the runtime utils, `fillTemplate` for the
|
|
36
|
+
* account routes); a whole-value body is escaped by the guard. Only the
|
|
37
|
+
* platform's own HTML builders' output is sent as HTML.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
/** Sends to visitor-supplied recipients each visitor may make in an hour. */
|
|
41
|
+
export const VISITOR_SENDS_PER_IP_PER_HOUR = 5
|
|
42
|
+
/** Sends one visitor-supplied recipient may receive in an hour. */
|
|
43
|
+
export const VISITOR_SENDS_PER_RECIPIENT_PER_HOUR = 3
|
|
44
|
+
/** Sends to visitor-supplied recipients the whole site may make in a day, per channel. */
|
|
45
|
+
export const VISITOR_SENDS_PER_SITE_PER_DAY = 500
|
|
46
|
+
|
|
47
|
+
/** What a skipped or refused send answers. */
|
|
48
|
+
export const TOO_MANY_MESSAGES_MESSAGE = 'Too many messages were sent. Try again later.'
|
|
49
|
+
export const MESSAGE_NOT_SENT_MESSAGE = 'The message could not be sent.'
|
|
50
|
+
|
|
51
|
+
/** Baked into a node's config at generation time; read and removed by the guard. */
|
|
52
|
+
export const VISITOR_RECIPIENT_FIELDS_KEY = '__visitorRecipientFields'
|
|
53
|
+
export const ESCAPE_BODY_KEY = '__escapeBody'
|
|
54
|
+
/** Baked when the send must never go out; the value is the reason, logged by the guard. */
|
|
55
|
+
export const REFUSE_SEND_KEY = '__refuseSend'
|
|
56
|
+
/** Baked on a public webhook's sends: its caller is an integration, so no per-visitor count. */
|
|
57
|
+
export const NO_IP_CAP_KEY = '__noIpCap'
|
|
58
|
+
/** Set on this deployment's own call to a custom node made for a public webhook. */
|
|
59
|
+
export const PUBLIC_CALLER_HEADER = 'x-teleport-public-caller'
|
|
60
|
+
|
|
61
|
+
const RECIPIENT_FIELDS: Record<'email' | 'sms', string[]> = {
|
|
62
|
+
email: ['to', 'cc', 'bcc'],
|
|
63
|
+
sms: ['to'],
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const SENDER_FIELDS: Record<'email' | 'sms', string[]> = {
|
|
67
|
+
email: ['from', 'fromName'],
|
|
68
|
+
sms: ['from'],
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const channelOf = (nodeType: string): 'email' | 'sms' =>
|
|
72
|
+
nodeType.startsWith('sms-') ? 'sms' : 'email'
|
|
73
|
+
|
|
74
|
+
const isRecord = (value: unknown): value is Record<string, unknown> =>
|
|
75
|
+
!!value && typeof value === 'object' && !Array.isArray(value)
|
|
76
|
+
|
|
77
|
+
const isSecretRef = (value: Record<string, unknown>): boolean =>
|
|
78
|
+
value.type === 'dynamic' &&
|
|
79
|
+
isRecord(value.content) &&
|
|
80
|
+
(value.content as Record<string, unknown>).referenceType === 'secret'
|
|
81
|
+
|
|
82
|
+
/** A whole `{{Current User.<field>}}` / `{{currentUser.<field>}}` token. */
|
|
83
|
+
const SESSION_USER_TOKEN =
|
|
84
|
+
/^\s*\{\{\s*(?:Current User|currentUser)\.[A-Za-z_$][A-Za-z0-9_$]*\s*\}\}\s*$/
|
|
85
|
+
|
|
86
|
+
const WHOLE_TOKEN = /^\s*\{\{\s*([^{}]+?)\s*\}\}\s*$/
|
|
87
|
+
|
|
88
|
+
/** What a route resolves on the server rather than from the request. */
|
|
89
|
+
interface TrustedSources {
|
|
90
|
+
/** Owner-settings reads and owner-notification builders (message-trust). */
|
|
91
|
+
owner: Set<string>
|
|
92
|
+
/** The platform's HTML builders (message-trust). */
|
|
93
|
+
html: Set<string>
|
|
94
|
+
/** The route fills the visitor's identity from the session cookie. */
|
|
95
|
+
sessionBound: boolean
|
|
96
|
+
/** The current-user readers, whose result the route rebuilds from the session. */
|
|
97
|
+
identityNodeIds: Set<string>
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* A recipient or sender value the request cannot choose: an author literal,
|
|
102
|
+
* a project secret, the signed-in user's own value (a current-user token or
|
|
103
|
+
* reader, where the route binds the session), or an owner read.
|
|
104
|
+
*/
|
|
105
|
+
const isOwnerValue = (value: unknown, sources: TrustedSources): boolean => {
|
|
106
|
+
if (value === undefined || value === null || value === '' || typeof value !== 'object') {
|
|
107
|
+
if (typeof value !== 'string') {
|
|
108
|
+
return true
|
|
109
|
+
}
|
|
110
|
+
if (sources.sessionBound && SESSION_USER_TOKEN.test(value)) {
|
|
111
|
+
return true
|
|
112
|
+
}
|
|
113
|
+
return value.indexOf('{{') === -1 && value.indexOf('context-value-inline') === -1
|
|
114
|
+
}
|
|
115
|
+
if (Array.isArray(value)) {
|
|
116
|
+
return value.every((item) => isOwnerValue(item, sources))
|
|
117
|
+
}
|
|
118
|
+
const record = value as Record<string, unknown>
|
|
119
|
+
if (record.type === 'workflowContext') {
|
|
120
|
+
const id = typeof record.nodeId === 'string' ? record.nodeId : ''
|
|
121
|
+
return sources.owner.has(id) || (sources.sessionBound && sources.identityNodeIds.has(id))
|
|
122
|
+
}
|
|
123
|
+
if (record.type === 'ctx') {
|
|
124
|
+
return false
|
|
125
|
+
}
|
|
126
|
+
if (isSecretRef(record)) {
|
|
127
|
+
return true
|
|
128
|
+
}
|
|
129
|
+
return Object.keys(record).every((key) => isOwnerValue(record[key], sources))
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** A body that is one value (a reference or a whole `{{…}}` token). */
|
|
133
|
+
const isValueBody = (body: unknown): boolean =>
|
|
134
|
+
(isRecord(body) && (body.type === 'workflowContext' || body.type === 'ctx')) ||
|
|
135
|
+
(typeof body === 'string' && WHOLE_TOKEN.test(body))
|
|
136
|
+
|
|
137
|
+
/** A whole `{{key}}` token naming one of the node's `templateParams` is that param's value. */
|
|
138
|
+
const valueSourceOf = (value: unknown, config: Record<string, unknown>): unknown => {
|
|
139
|
+
const token = typeof value === 'string' ? WHOLE_TOKEN.exec(value) : null
|
|
140
|
+
const params = Array.isArray(config.templateParams) ? config.templateParams : []
|
|
141
|
+
const param = token
|
|
142
|
+
? params.find((p) => isRecord(p) && (p as Record<string, unknown>).key === token[1])
|
|
143
|
+
: undefined
|
|
144
|
+
return param ? (param as Record<string, unknown>).value : value
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** The node a rich-text placeholder's opening tag names. */
|
|
148
|
+
const chipRefOf = (openTag: string): { type: 'workflowContext'; nodeId: string } => {
|
|
149
|
+
const id = /data-ctx-node-id=["']([^"']*)["']/.exec(openTag)
|
|
150
|
+
return { type: 'workflowContext', nodeId: id ? id[1] : '' }
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* The values a body is made of when it has no author text — one value, a
|
|
155
|
+
* whole token, or markup around placeholders / `{{tokens}}` only (an SMS:
|
|
156
|
+
* parts that are all values) — or null when the author wrote text.
|
|
157
|
+
*/
|
|
158
|
+
const valueSourcesOfBody = (body: unknown, config: Record<string, unknown>): unknown[] | null => {
|
|
159
|
+
if (isValueBody(body)) {
|
|
160
|
+
return [valueSourceOf(body, config)]
|
|
161
|
+
}
|
|
162
|
+
if (Array.isArray(body)) {
|
|
163
|
+
return body.length > 0 && body.every(isValueBody)
|
|
164
|
+
? body.map((part) => valueSourceOf(part, config))
|
|
165
|
+
: null
|
|
166
|
+
}
|
|
167
|
+
if (typeof body !== 'string') {
|
|
168
|
+
return null
|
|
169
|
+
}
|
|
170
|
+
const sources: unknown[] = []
|
|
171
|
+
let text = ''
|
|
172
|
+
let i = 0
|
|
173
|
+
while (i < body.length) {
|
|
174
|
+
const start = body.indexOf('<span', i)
|
|
175
|
+
const openEnd = start === -1 ? -1 : body.indexOf('>', start)
|
|
176
|
+
if (start === -1 || openEnd === -1) {
|
|
177
|
+
text += body.slice(i)
|
|
178
|
+
break
|
|
179
|
+
}
|
|
180
|
+
const openTag = body.slice(start, openEnd + 1)
|
|
181
|
+
if (openTag.indexOf('context-value-inline') === -1) {
|
|
182
|
+
text += body.slice(i, openEnd + 1)
|
|
183
|
+
i = openEnd + 1
|
|
184
|
+
continue
|
|
185
|
+
}
|
|
186
|
+
text += body.slice(i, start)
|
|
187
|
+
sources.push(chipRefOf(openTag))
|
|
188
|
+
let depth = 1
|
|
189
|
+
let j = openEnd + 1
|
|
190
|
+
while (j < body.length && depth > 0) {
|
|
191
|
+
const nextOpen = body.indexOf('<span', j)
|
|
192
|
+
const nextClose = body.indexOf('</span>', j)
|
|
193
|
+
if (nextClose === -1) {
|
|
194
|
+
j = body.length
|
|
195
|
+
break
|
|
196
|
+
}
|
|
197
|
+
if (nextOpen !== -1 && nextOpen < nextClose) {
|
|
198
|
+
const innerEnd = body.indexOf('>', nextOpen)
|
|
199
|
+
j = innerEnd === -1 ? body.length : innerEnd + 1
|
|
200
|
+
depth++
|
|
201
|
+
} else {
|
|
202
|
+
j = nextClose + '</span>'.length
|
|
203
|
+
depth--
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
i = j
|
|
207
|
+
}
|
|
208
|
+
text = text.replace(/\{\{\s*([^{}]+?)\s*\}\}/g, (token) => {
|
|
209
|
+
sources.push(valueSourceOf(token, config))
|
|
210
|
+
return ''
|
|
211
|
+
})
|
|
212
|
+
const authorText = text
|
|
213
|
+
.replace(/<[^>]*>/g, '')
|
|
214
|
+
.replace(/ | | /gi, '')
|
|
215
|
+
.replace(/\s+/g, '')
|
|
216
|
+
return sources.length > 0 && authorText === '' ? sources : null
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const isTrustedHtmlSource = (source: unknown, sources: TrustedSources): boolean =>
|
|
220
|
+
isRecord(source) &&
|
|
221
|
+
source.type === 'workflowContext' &&
|
|
222
|
+
typeof source.nodeId === 'string' &&
|
|
223
|
+
sources.html.has(source.nodeId)
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Callers that are not visitors: this deployment's own server code
|
|
227
|
+
* (`serverOnly`), or a signed-in role a visitor cannot give itself.
|
|
228
|
+
*
|
|
229
|
+
* INVARIANT: this holds only while no visitor can obtain a role other than
|
|
230
|
+
* `user` by themselves — signup always grants `user` (auth-generator,
|
|
231
|
+
* account-signup). A feature that lets a visitor acquire another role (a
|
|
232
|
+
* purchase that grants one) must make this check name the self-service roles.
|
|
233
|
+
*/
|
|
234
|
+
const isPrivilegedRoute = (protection: UIDLWorkflowProtection | undefined): boolean => {
|
|
235
|
+
if (!protection) {
|
|
236
|
+
return false
|
|
237
|
+
}
|
|
238
|
+
if (protection.serverOnly) {
|
|
239
|
+
return true
|
|
240
|
+
}
|
|
241
|
+
const roles = Array.isArray(protection.allowedRoles) ? protection.allowedRoles : []
|
|
242
|
+
return protection.requiresAuth === true && roles.length > 0 && roles.indexOf('user') === -1
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export interface MessageMarkOptions {
|
|
246
|
+
/** No build-log line for a refused send: the editor's check, which reports it itself. */
|
|
247
|
+
silent?: boolean
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* A refused send in the owner's words: the build log's line, and what the
|
|
252
|
+
* editor shows before a publish (`collectWorkflowPublishRefusals`).
|
|
253
|
+
*/
|
|
254
|
+
export const describeRefusedSend = (
|
|
255
|
+
workflowName: string,
|
|
256
|
+
stepName: string,
|
|
257
|
+
refusal: string
|
|
258
|
+
): string =>
|
|
259
|
+
`Workflow "${workflowName}": the step "${stepName}" ${refusal}, so it will never send. Write the ` +
|
|
260
|
+
"message in the step (place the visitor's values in it), use a fixed sender, and " +
|
|
261
|
+
"put the visitor's address in Reply-To."
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* The segment with every email/SMS node whose recipient the request can
|
|
265
|
+
* choose marked for the guard, every whole-value body marked to be escaped,
|
|
266
|
+
* and every send that must never go out marked refused (with the reason in
|
|
267
|
+
* the build log). Nodes that need no mark — and a segment without such nodes
|
|
268
|
+
* — are returned as they are, so their routes stay byte for byte the same.
|
|
269
|
+
*
|
|
270
|
+
* `trust.messageTrust` (from segment-trust, over the whole graph) names the
|
|
271
|
+
* results the guard may trust; without it only this segment's own owner reads
|
|
272
|
+
* and builders count.
|
|
273
|
+
*/
|
|
274
|
+
export const markVisitorBoundMessageNodes = (
|
|
275
|
+
segment: WorkflowSegment,
|
|
276
|
+
trust: SegmentTrust | undefined,
|
|
277
|
+
protection: UIDLWorkflowProtection | undefined,
|
|
278
|
+
workflowName?: string,
|
|
279
|
+
options: MessageMarkOptions = {}
|
|
280
|
+
): WorkflowSegment => {
|
|
281
|
+
if (!segment.nodes.some((node) => isOutboundMessageNodeType(node.type))) {
|
|
282
|
+
return segment
|
|
283
|
+
}
|
|
284
|
+
if (isPrivilegedRoute(protection)) {
|
|
285
|
+
return segment
|
|
286
|
+
}
|
|
287
|
+
const session = trust && trust.session
|
|
288
|
+
const messageTrust: MessageTrust =
|
|
289
|
+
(trust && trust.messageTrust) ||
|
|
290
|
+
collectMessageTrust({
|
|
291
|
+
nodes: segment.nodes,
|
|
292
|
+
edges: segment.edges,
|
|
293
|
+
serverNodeIds: new Set(segment.nodes.map((node) => node.id)),
|
|
294
|
+
})
|
|
295
|
+
const sources: TrustedSources = {
|
|
296
|
+
owner: new Set(messageTrust.ownerRecipientNodeIds),
|
|
297
|
+
html: new Set(messageTrust.trustedHtmlNodeIds),
|
|
298
|
+
sessionBound: !!session,
|
|
299
|
+
identityNodeIds: new Set(session ? Object.keys(session.identityNodes || {}) : []),
|
|
300
|
+
}
|
|
301
|
+
let changed = false
|
|
302
|
+
const nodes = segment.nodes.map((node): UIDLWorkflowNode => {
|
|
303
|
+
if (!isOutboundMessageNodeType(node.type) || !isRecord(node.config)) {
|
|
304
|
+
return node
|
|
305
|
+
}
|
|
306
|
+
const config = node.config as Record<string, unknown>
|
|
307
|
+
const channel = channelOf(node.type)
|
|
308
|
+
const visitorFields = RECIPIENT_FIELDS[channel].filter(
|
|
309
|
+
(field) => !isOwnerValue(config[field], sources)
|
|
310
|
+
)
|
|
311
|
+
const bodyKey = channel === 'email' ? 'body' : 'message'
|
|
312
|
+
const bodySources = valueSourcesOfBody(config[bodyKey], config)
|
|
313
|
+
const htmlBody =
|
|
314
|
+
bodySources !== null && bodySources.every((source) => isTrustedHtmlSource(source, sources))
|
|
315
|
+
const visitorSender = SENDER_FIELDS[channel].find(
|
|
316
|
+
(field) => !isOwnerValue(config[field], sources)
|
|
317
|
+
)
|
|
318
|
+
let refusal = ''
|
|
319
|
+
if (visitorFields.length > 0 && bodySources !== null && !htmlBody) {
|
|
320
|
+
refusal =
|
|
321
|
+
"sends a message that is only the visitor's input to an address the visitor supplies"
|
|
322
|
+
} else if (visitorSender) {
|
|
323
|
+
refusal = `takes its sender (${visitorSender}) from the visitor`
|
|
324
|
+
}
|
|
325
|
+
const escapeBody = channel === 'email' && isValueBody(config.body) && !htmlBody && !refusal
|
|
326
|
+
if (visitorFields.length === 0 && !escapeBody && !refusal) {
|
|
327
|
+
return node
|
|
328
|
+
}
|
|
329
|
+
if (refusal && !options.silent) {
|
|
330
|
+
// The build log is where a generation refusal reaches the owner.
|
|
331
|
+
// tslint:disable-next-line:no-console
|
|
332
|
+
console.warn(
|
|
333
|
+
`[teleport-plugin-next-workflows] ${describeRefusedSend(
|
|
334
|
+
workflowName || segment.id,
|
|
335
|
+
stepNameOf(node),
|
|
336
|
+
refusal
|
|
337
|
+
)}`
|
|
338
|
+
)
|
|
339
|
+
}
|
|
340
|
+
changed = true
|
|
341
|
+
return {
|
|
342
|
+
...node,
|
|
343
|
+
config: {
|
|
344
|
+
...config,
|
|
345
|
+
...(visitorFields.length > 0 ? { [VISITOR_RECIPIENT_FIELDS_KEY]: visitorFields } : {}),
|
|
346
|
+
...(escapeBody ? { [ESCAPE_BODY_KEY]: true } : {}),
|
|
347
|
+
...(refusal ? { [REFUSE_SEND_KEY]: refusal } : {}),
|
|
348
|
+
},
|
|
349
|
+
} as UIDLWorkflowNode
|
|
350
|
+
})
|
|
351
|
+
return changed ? { ...segment, nodes } : segment
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* A webhook route whose payload no provider signature vouches for is as
|
|
356
|
+
* public as a page's route: its email/SMS nodes are marked the same way, with
|
|
357
|
+
* the webhook's payload (the trigger) as visitor input. Its caller is an
|
|
358
|
+
* integration, not a visitor, so its sends are counted per recipient and per
|
|
359
|
+
* site only. A verified webhook (a payment provider's, or any verified
|
|
360
|
+
* signature scheme) keeps its nodes as they are. `marked` says whether a send
|
|
361
|
+
* counts visitor-supplied recipients.
|
|
362
|
+
*/
|
|
363
|
+
export const markWebhookMessageNodes = (
|
|
364
|
+
workflow: { id: string; name?: string; nodes: UIDLWorkflowNode[]; edges: UIDLWorkflowEdge[] },
|
|
365
|
+
serverNodes: UIDLWorkflowNode[],
|
|
366
|
+
serverEdges: UIDLWorkflowEdge[],
|
|
367
|
+
verified: boolean,
|
|
368
|
+
options: MessageMarkOptions = {}
|
|
369
|
+
): { nodes: UIDLWorkflowNode[]; marked: boolean } => {
|
|
370
|
+
if (verified || !serverNodes.some((node) => isOutboundMessageNodeType(node.type))) {
|
|
371
|
+
return { nodes: serverNodes, marked: false }
|
|
372
|
+
}
|
|
373
|
+
const segment = {
|
|
374
|
+
id: workflow.id,
|
|
375
|
+
env: 'server',
|
|
376
|
+
nodeIds: serverNodes.map((node) => node.id),
|
|
377
|
+
nodes: serverNodes,
|
|
378
|
+
edges: serverEdges,
|
|
379
|
+
} as WorkflowSegment
|
|
380
|
+
const trust = {
|
|
381
|
+
messageTrust: collectMessageTrust({
|
|
382
|
+
nodes: workflow.nodes,
|
|
383
|
+
edges: workflow.edges,
|
|
384
|
+
serverNodeIds: new Set(serverNodes.map((node) => node.id)),
|
|
385
|
+
}),
|
|
386
|
+
} as SegmentTrust
|
|
387
|
+
const result = markVisitorBoundMessageNodes(
|
|
388
|
+
segment,
|
|
389
|
+
trust,
|
|
390
|
+
undefined,
|
|
391
|
+
workflow.name || workflow.id,
|
|
392
|
+
options
|
|
393
|
+
)
|
|
394
|
+
let marked = false
|
|
395
|
+
const nodes = result.nodes.map((node) => {
|
|
396
|
+
if (!isRecord(node.config) || !Array.isArray(node.config[VISITOR_RECIPIENT_FIELDS_KEY])) {
|
|
397
|
+
return node
|
|
398
|
+
}
|
|
399
|
+
marked = true
|
|
400
|
+
return { ...node, config: { ...node.config, [NO_IP_CAP_KEY]: true } } as UIDLWorkflowNode
|
|
401
|
+
})
|
|
402
|
+
return { nodes, marked }
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* The statement an unsigned webhook route adds when it calls a custom node:
|
|
407
|
+
* the custom node's route then counts that call's visitor-supplied sends (per
|
|
408
|
+
* recipient and per site) instead of exempting it as this deployment's own.
|
|
409
|
+
* The header is read only on a call that carries the internal-call token.
|
|
410
|
+
*/
|
|
411
|
+
export const PUBLIC_CALLER_INJECTION = `\n context.__internalHeaders['${PUBLIC_CALLER_HEADER}'] = '1';`
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Emitted before every email/SMS handler: `__outboundMessageGuard(channel,
|
|
415
|
+
* config, context)` resolves `null` when the send may go on, after it has
|
|
416
|
+
* cleaned `config` in place (so the sent-email ledger records what was sent);
|
|
417
|
+
* `{ skipped }` when a limit was reached (the node answers a skipped, non-fatal
|
|
418
|
+
* result: the visitor's action goes on); `{ error }` when the send is refused
|
|
419
|
+
* (refused at generation, or no security runtime: a fatal result). It never
|
|
420
|
+
* throws.
|
|
421
|
+
*
|
|
422
|
+
* Without the security runtime (no `relativePrefix`) a visitor-bound send is
|
|
423
|
+
* refused; every other send only gets its headers cleaned.
|
|
424
|
+
*/
|
|
425
|
+
export const generateOutboundMessageGuardCode = (
|
|
426
|
+
relativePrefix?: string
|
|
427
|
+
): string => `${generateSecurityRuntimeVar('__outboundSecurity', relativePrefix)}
|
|
428
|
+
${VISITOR_KEY_CODE}
|
|
429
|
+
var __outboundMessageGuard = typeof __outboundMessageGuard !== 'undefined' ? __outboundMessageGuard : async function __outboundMessageGuard(channel, config, context) {
|
|
430
|
+
var TOO_MANY = ${JSON.stringify(TOO_MANY_MESSAGES_MESSAGE)};
|
|
431
|
+
var NOT_SENT = ${JSON.stringify(MESSAGE_NOT_SENT_MESSAGE)};
|
|
432
|
+
function withoutLineBreaks(value) {
|
|
433
|
+
if (typeof value === 'string') return value.replace(/[\\r\\n]+/g, ' ');
|
|
434
|
+
if (Array.isArray(value)) return value.map(withoutLineBreaks);
|
|
435
|
+
if (value && typeof value === 'object') {
|
|
436
|
+
var copy = {};
|
|
437
|
+
Object.keys(value).forEach(function (key) { copy[key] = withoutLineBreaks(value[key]); });
|
|
438
|
+
return copy;
|
|
439
|
+
}
|
|
440
|
+
return value;
|
|
441
|
+
}
|
|
442
|
+
function escapeHtml(text) {
|
|
443
|
+
return ${escapeHtmlValueJs('text')};
|
|
444
|
+
}
|
|
445
|
+
// One parameter on purpose: a two-parameter declaration ahead of the node's
|
|
446
|
+
// own entry would be taken for it (see resolveHandlerEntryName).
|
|
447
|
+
var recipients = [];
|
|
448
|
+
function collectRecipients(value) {
|
|
449
|
+
if (Array.isArray(value)) { value.forEach(collectRecipients); return; }
|
|
450
|
+
if (value && typeof value === 'object') { collectRecipients(value.email !== undefined ? value.email : value.to); return; }
|
|
451
|
+
if (value === undefined || value === null) return;
|
|
452
|
+
String(value).split(/[,;]/).forEach(function (part) {
|
|
453
|
+
var address = part.trim();
|
|
454
|
+
if (channel === 'sms') {
|
|
455
|
+
// E.164: one number however it is written (+1 555…, 1555…, 001555…).
|
|
456
|
+
var phone = address.replace(/[^0-9+]/g, '');
|
|
457
|
+
var international = phone.charAt(0) === '+';
|
|
458
|
+
phone = phone.replace(/[+]/g, '');
|
|
459
|
+
if (!international && phone.indexOf('00') === 0) phone = phone.slice(2);
|
|
460
|
+
address = phone ? '+' + phone : '';
|
|
461
|
+
} else {
|
|
462
|
+
// Lower-cased, without a +tag: one mailbox however it is written.
|
|
463
|
+
var bracketed = /<([^<>]+)>/.exec(address);
|
|
464
|
+
address = (bracketed ? bracketed[1] : address).trim().toLowerCase();
|
|
465
|
+
var at = address.lastIndexOf('@');
|
|
466
|
+
var tag = at > 0 ? address.slice(0, at).indexOf('+') : -1;
|
|
467
|
+
if (tag > 0) address = address.slice(0, tag) + address.slice(at);
|
|
468
|
+
// Gmail ignores dots in the mailbox name.
|
|
469
|
+
at = address.lastIndexOf('@');
|
|
470
|
+
var domain = at > 0 ? address.slice(at + 1) : '';
|
|
471
|
+
if (domain === 'gmail.com' || domain === 'googlemail.com') {
|
|
472
|
+
address = address.slice(0, at).replace(/[.]/g, '') + '@gmail.com';
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
if (address && recipients.indexOf(address) === -1) recipients.push(address);
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
try {
|
|
479
|
+
if (!config || typeof config !== 'object') return null;
|
|
480
|
+
var headerFields = channel === 'sms' ? ['from', 'to'] : ['from', 'fromName', 'to', 'cc', 'bcc', 'replyTo', 'subject'];
|
|
481
|
+
headerFields.forEach(function (field) {
|
|
482
|
+
if (config[field] !== undefined) config[field] = withoutLineBreaks(config[field]);
|
|
483
|
+
});
|
|
484
|
+
var refusal = typeof config.${REFUSE_SEND_KEY} === 'string' ? config.${REFUSE_SEND_KEY} : '';
|
|
485
|
+
var escapeBody = config.${ESCAPE_BODY_KEY} === true;
|
|
486
|
+
var fields = Array.isArray(config.${VISITOR_RECIPIENT_FIELDS_KEY}) ? config.${VISITOR_RECIPIENT_FIELDS_KEY} : [];
|
|
487
|
+
var noIpCap = config.${NO_IP_CAP_KEY} === true;
|
|
488
|
+
delete config.${REFUSE_SEND_KEY};
|
|
489
|
+
delete config.${ESCAPE_BODY_KEY};
|
|
490
|
+
delete config.${VISITOR_RECIPIENT_FIELDS_KEY};
|
|
491
|
+
delete config.${NO_IP_CAP_KEY};
|
|
492
|
+
// Refused when the site was generated (the build log names the step).
|
|
493
|
+
if (refusal) {
|
|
494
|
+
console.error('[' + channel + '] send refused: the step ' + refusal);
|
|
495
|
+
return { error: NOT_SENT };
|
|
496
|
+
}
|
|
497
|
+
if (escapeBody && config.body !== undefined && config.body !== null) {
|
|
498
|
+
config.body = escapeHtml(String(config.body));
|
|
499
|
+
}
|
|
500
|
+
if (fields.length === 0) return null;
|
|
501
|
+
var request = context && context.__request;
|
|
502
|
+
// This deployment's own server code (a webhook or cron running a custom
|
|
503
|
+
// node) is not a visitor — unless it calls for a public webhook, whose
|
|
504
|
+
// sends count per recipient and per site (the header is honoured only on
|
|
505
|
+
// a call that carries the internal-call token).
|
|
506
|
+
if (request && request.internal === true) {
|
|
507
|
+
var headers = request.headers && typeof request.headers === 'object' ? request.headers : {};
|
|
508
|
+
if (headers['${PUBLIC_CALLER_HEADER}'] !== '1') return null;
|
|
509
|
+
noIpCap = true;
|
|
510
|
+
}
|
|
511
|
+
fields.forEach(function (field) { collectRecipients(config[field]); });
|
|
512
|
+
if (recipients.length === 0) return null;
|
|
513
|
+
var security = __outboundSecurity;
|
|
514
|
+
if (!security || typeof security.rateLimit !== 'function' || typeof security.clientIp !== 'function') {
|
|
515
|
+
console.error('[' + channel + '] send refused: the security runtime is not available');
|
|
516
|
+
return { error: NOT_SENT };
|
|
517
|
+
}
|
|
518
|
+
var scope = channel + '-visitor-recipient';
|
|
519
|
+
var visitor = __visitorKeyOf(security, request);
|
|
520
|
+
for (var i = 0; i < recipients.length; i++) {
|
|
521
|
+
var checks = [
|
|
522
|
+
{ key: JSON.stringify([scope, 'recipient', recipients[i]]), limit: ${VISITOR_SENDS_PER_RECIPIENT_PER_HOUR}, windowSeconds: 3600 },
|
|
523
|
+
{ key: 'site:' + scope, limit: ${VISITOR_SENDS_PER_SITE_PER_DAY}, windowSeconds: 86400 }
|
|
524
|
+
];
|
|
525
|
+
if (!noIpCap) {
|
|
526
|
+
checks.unshift({ key: JSON.stringify([scope, 'ip', visitor]), limit: ${VISITOR_SENDS_PER_IP_PER_HOUR}, windowSeconds: 3600 });
|
|
527
|
+
}
|
|
528
|
+
for (var c = 0; c < checks.length; c++) {
|
|
529
|
+
var verdict = await security.rateLimit(checks[c]);
|
|
530
|
+
if (!verdict || !verdict.allowed) {
|
|
531
|
+
console.warn('[' + channel + '] send skipped: a limit on visitor-supplied recipients was reached');
|
|
532
|
+
return { skipped: TOO_MANY };
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return null;
|
|
537
|
+
} catch (err) {
|
|
538
|
+
console.error('[' + channel + '] send refused:', err && err.message ? err.message : err);
|
|
539
|
+
return { error: NOT_SENT };
|
|
540
|
+
}
|
|
541
|
+
};`
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* The two sources of an email/SMS node: the guard, then the node. A server
|
|
545
|
+
* route passes where it sits; anything else gets a guard without the runtime.
|
|
546
|
+
*/
|
|
547
|
+
export interface OutboundHandlerSourceOptions {
|
|
548
|
+
/** Helper source appended after the handler (the sender, the recipients). */
|
|
549
|
+
extraSource?: string
|
|
550
|
+
/** When set, the serialized source is refused if it names a module. */
|
|
551
|
+
nodeType?: string
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
export const outboundMessageHandlerSources = (
|
|
555
|
+
handler: HandlerFn,
|
|
556
|
+
options: OutboundHandlerSourceOptions = {}
|
|
557
|
+
): Pick<NodeHandlerGenerator, 'generateHandler' | 'generateServerHandler'> => {
|
|
558
|
+
const extra = options.extraSource ? '\n' + options.extraSource : ''
|
|
559
|
+
const finish = (source: string): string =>
|
|
560
|
+
options.nodeType ? assertHandlerHasNoModuleRefs(source, options.nodeType) : source
|
|
561
|
+
return {
|
|
562
|
+
generateHandler: () =>
|
|
563
|
+
finish(generateOutboundMessageGuardCode() + '\n\n' + handlerToString(handler) + extra),
|
|
564
|
+
generateServerHandler: (serverOptions?: ServerHandlerOptions) =>
|
|
565
|
+
finish(
|
|
566
|
+
generateOutboundMessageGuardCode(serverHandlerPrefix(serverOptions)) +
|
|
567
|
+
'\n\n' +
|
|
568
|
+
handlerToString(handler) +
|
|
569
|
+
extra
|
|
570
|
+
),
|
|
571
|
+
}
|
|
572
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML the generated code builds itself, for an email template to show as
|
|
3
|
+
* HTML — emitted into the runtime utils next to `applyTemplateParams`.
|
|
4
|
+
*
|
|
5
|
+
* Every value an email template is filled with is escaped, so only the
|
|
6
|
+
* author's template is markup. The one kind of value the platform's own
|
|
7
|
+
* templates show as markup is the products list (`{{productsList}}`, a `<ul>`
|
|
8
|
+
* of the lines in the withdrawal, withdrawal-owner and abandoned-cart emails;
|
|
9
|
+
* the low-stock alert fills its own). Its builders hand the email node the
|
|
10
|
+
* structured lines too (`products`), so the list is built HERE, at send time,
|
|
11
|
+
* from those lines, with every field of a line (name, options, quantity)
|
|
12
|
+
* escaped — never taken from the `productsList` value the node was handed,
|
|
13
|
+
* which a browser may have computed.
|
|
14
|
+
*
|
|
15
|
+
* What this code builds is marked trusted (`trustedHtml`, a registry a
|
|
16
|
+
* request cannot reach: a value that arrived as JSON is never in it), and the
|
|
17
|
+
* template fill inserts only marked values unescaped.
|
|
18
|
+
*/
|
|
19
|
+
export const PRODUCTS_LIST_PARAM = 'productsList'
|
|
20
|
+
export const PRODUCTS_ROWS_PARAM = 'products'
|
|
21
|
+
|
|
22
|
+
export const TRUSTED_HTML_RUNTIME_CODE = `// HTML this runtime built itself (see trusted-html-code in the generator).
|
|
23
|
+
var __trustedHtmlValues = typeof WeakSet === 'function' ? new WeakSet() : null;
|
|
24
|
+
|
|
25
|
+
function trustedHtml(html) {
|
|
26
|
+
var value = new String(html == null ? '' : html);
|
|
27
|
+
if (__trustedHtmlValues) __trustedHtmlValues.add(value);
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function isTrustedHtml(value) {
|
|
32
|
+
return !!__trustedHtmlValues && value !== null && typeof value === 'object' && __trustedHtmlValues.has(value);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// The products list of a platform email ({{${PRODUCTS_LIST_PARAM}}}), from its lines.
|
|
36
|
+
function renderProductsListHtml(rows) {
|
|
37
|
+
var html = '<ul style="margin:0;padding-left:18px;">';
|
|
38
|
+
for (var i = 0; i < rows.length; i++) {
|
|
39
|
+
var row = rows[i] && typeof rows[i] === 'object' ? rows[i] : {};
|
|
40
|
+
var name = row.product_name != null ? row.product_name : row.name != null ? row.name : 'Product';
|
|
41
|
+
var quantity = parseInt(row.quantity, 10);
|
|
42
|
+
if (isNaN(quantity) || quantity <= 0) quantity = 1;
|
|
43
|
+
var label = row.configuration_label != null ? String(row.configuration_label) : '';
|
|
44
|
+
html += '<li>' + quantity + '× <strong>' + escapeHtmlText(String(name)) + '</strong>' +
|
|
45
|
+
(label ? ' — ' + escapeHtmlText(label) : '') + '</li>';
|
|
46
|
+
}
|
|
47
|
+
return trustedHtml(html + '</ul>');
|
|
48
|
+
}
|
|
49
|
+
`
|