@teleporthq/teleport-plugin-next-workflows 0.44.11 → 0.44.17
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,655 @@
|
|
|
1
|
+
// Export-time guards for the place-order workflow's money statements.
|
|
2
|
+
//
|
|
3
|
+
// The editor bakes the checkout's SQL into `data-raw-query` nodes
|
|
4
|
+
// (apps/gui/.../builders/ecommerce/order-redemption-helper.ts). Two of those
|
|
5
|
+
// statements decide what a buyer gets for what they paid, and both are
|
|
6
|
+
// re-baked here from the store's CURRENT settings on every export, the way
|
|
7
|
+
// the stock chain is (see ./parameterized-stock-chain.ts):
|
|
8
|
+
//
|
|
9
|
+
// 1. THE SETTLE WRITE ("Mark Order As Settled") confirms an order that no
|
|
10
|
+
// payment provider collects: cash on delivery, a total discounted to zero,
|
|
11
|
+
// or an order a gift card paid in full. Which branch runs is decided in the
|
|
12
|
+
// browser, and every server segment is a route of its own, so a crafted
|
|
13
|
+
// request can call this one for any order it just placed. On a store that
|
|
14
|
+
// does not take cash on delivery, the statement now confirms only an order
|
|
15
|
+
// with nothing left to collect, decided from the order row and the card's
|
|
16
|
+
// ledger. Any other order stays `pending`, which is what an unpaid order is.
|
|
17
|
+
// On a store that takes cash on delivery but prices delivery by shipping
|
|
18
|
+
// zone, cash on delivery is each zone's choice (`teleport_shipping_zones.
|
|
19
|
+
// cod_enabled`, edited live in the admin): an order DELIVERED to a zone
|
|
20
|
+
// that does not take it is confirmed only with nothing left to collect.
|
|
21
|
+
// The zone is the one the order records (`shipping_zone_name`, written
|
|
22
|
+
// from the server's own quote for its address), read against the zone
|
|
23
|
+
// rows at the moment of settling.
|
|
24
|
+
//
|
|
25
|
+
// 2. THE REDEMPTION STATEMENT ("Redeem Voucher And Gift Card") runs right
|
|
26
|
+
// after the order row is written. It locks what it spends, decides `ok`
|
|
27
|
+
// before writing anything, and a `false` verdict cancels the order on the
|
|
28
|
+
// server (the gate after it runs on the server too). With stock managed and
|
|
29
|
+
// backorders off, it now also reserves the order's stock in that same
|
|
30
|
+
// statement: the product and variant rows are locked (`FOR UPDATE`), any
|
|
31
|
+
// line the stock cannot cover makes `ok` false, and the decrement is
|
|
32
|
+
// conditional on `ok`. Of two orders racing for the last unit, the second
|
|
33
|
+
// waits for the first, sees what it left and is refused. Nothing is written
|
|
34
|
+
// for a refused order. The units are the ones the server priced
|
|
35
|
+
// (`cart-price-order`'s `stockDeltas`), never anything the browser sends.
|
|
36
|
+
// The later "Decrement Product Stock After Order" step is then re-baked to
|
|
37
|
+
// take nothing (see `buildParameterizedStockDecrementQuery`).
|
|
38
|
+
//
|
|
39
|
+
// Each statement is recognised by its shape. A statement that has drifted from
|
|
40
|
+
// it is left alone. If the stock cannot be reserved safely (no server pricing
|
|
41
|
+
// step, a decrement this module cannot neutralise), the checkout keeps the
|
|
42
|
+
// decrement it had, and a warning says so.
|
|
43
|
+
import { isParameterizedDecrementChainRewritable, isParameterizedStockDecrementQuery, } from './parameterized-stock-chain';
|
|
44
|
+
import { classifyStockWriteSite } from './stock-decrement';
|
|
45
|
+
// ────────────────────────────────────────────────────────────────────
|
|
46
|
+
// The settle write
|
|
47
|
+
// ────────────────────────────────────────────────────────────────────
|
|
48
|
+
const SETTLE_RETURNING = 'RETURNING o.id, o.payment_status, o.payment_method';
|
|
49
|
+
/** Confirms only an order with nothing left to collect: the row's total, less what its own redemption debited. */
|
|
50
|
+
export const SETTLE_NOTHING_DUE_GUARD = ' AND o.total_amount IS NOT NULL AND o.total_amount - (SELECT debited FROM tender) <= 0';
|
|
51
|
+
export const looksLikeSettleOrderStatement = (query) => typeof query === 'string' &&
|
|
52
|
+
/^\s*WITH\s+tender\s+AS\s*\(/i.test(query) &&
|
|
53
|
+
/\bUPDATE\s+teleport_orders\s+o\s+SET\s+status\s*=\s*'confirmed'/i.test(query) &&
|
|
54
|
+
query.indexOf("ELSE 'cash_on_delivery' END") !== -1 &&
|
|
55
|
+
/\bAND\s+o\.status\s*=\s*'pending'/i.test(query) &&
|
|
56
|
+
query.trim().endsWith(SETTLE_RETURNING);
|
|
57
|
+
/**
|
|
58
|
+
* Confirms an order with money still due only when it is not delivered to an
|
|
59
|
+
* active shipping zone that refuses cash on delivery. Every column is read
|
|
60
|
+
* through `to_jsonb`, the way the zone rule reads them (`cod_enabled` and
|
|
61
|
+
* `is_active` default to true).
|
|
62
|
+
*/
|
|
63
|
+
export const SETTLE_ZONE_COD_GUARD = [
|
|
64
|
+
' AND (o.total_amount IS NOT NULL AND o.total_amount - (SELECT debited FROM tender) <= 0',
|
|
65
|
+
" OR NOT (COALESCE(to_jsonb(o) ->> 'fulfillment_method', '') = 'delivery'",
|
|
66
|
+
' AND EXISTS (SELECT 1 FROM teleport_shipping_zones z',
|
|
67
|
+
" WHERE z.name = (to_jsonb(o) ->> 'shipping_zone_name')",
|
|
68
|
+
" AND LOWER(COALESCE(to_jsonb(z) ->> 'is_active', 'true')) NOT IN ('false', 'f', '0', 'no')",
|
|
69
|
+
" AND LOWER(COALESCE(to_jsonb(z) ->> 'cod_enabled', 'true')) IN ('false', 'f', '0', 'no'))))",
|
|
70
|
+
].join('\n');
|
|
71
|
+
/** The settle write for the store's cash-on-delivery rules; unchanged when they allow every order. */
|
|
72
|
+
export const guardSettleOrderStatement = (query, settings) => {
|
|
73
|
+
const guard = !settings.cashOnDelivery
|
|
74
|
+
? SETTLE_NOTHING_DUE_GUARD
|
|
75
|
+
: settings.codByShippingZone
|
|
76
|
+
? SETTLE_ZONE_COD_GUARD
|
|
77
|
+
: '';
|
|
78
|
+
if (!guard ||
|
|
79
|
+
!looksLikeSettleOrderStatement(query) ||
|
|
80
|
+
query.indexOf(SETTLE_NOTHING_DUE_GUARD) !== -1 ||
|
|
81
|
+
query.indexOf(SETTLE_ZONE_COD_GUARD) !== -1) {
|
|
82
|
+
return query;
|
|
83
|
+
}
|
|
84
|
+
const at = query.lastIndexOf(SETTLE_RETURNING);
|
|
85
|
+
return query.slice(0, at).replace(/\s*$/, '') + '\n' + guard + '\n' + query.slice(at);
|
|
86
|
+
};
|
|
87
|
+
// ────────────────────────────────────────────────────────────────────
|
|
88
|
+
// The redemption statement
|
|
89
|
+
// ────────────────────────────────────────────────────────────────────
|
|
90
|
+
const REDEMPTION_OK_LINE = 'ok AS (SELECT voucher_ok AND gift_card_ok AS ok FROM verdict),';
|
|
91
|
+
const RESERVED_OK_LINE = 'ok AS (SELECT voucher_ok AND gift_card_ok AND stock_ok AS ok FROM verdict),';
|
|
92
|
+
const VERDICT_START = '\nverdict AS (';
|
|
93
|
+
const VERDICT_END = ')) AS gift_card_ok\n),';
|
|
94
|
+
const LAST_COLUMN = '(SELECT COUNT(*) FROM ledger) AS gift_card_debited';
|
|
95
|
+
/** The redemption statement takes 9 parameters; the reservation appends $10..$13. */
|
|
96
|
+
const REDEMPTION_PARAM_COUNT = 9;
|
|
97
|
+
// $10/$11 product ids and units (variantless lines), $12/$13 variant ids and
|
|
98
|
+
// units. Locked first, so a concurrent order is waited out and its result read,
|
|
99
|
+
// and in id order (as the release and the late-payment retake lock them), so
|
|
100
|
+
// two statements needing the same rows never wait on each other in a cycle.
|
|
101
|
+
const STOCK_LOCKS = [
|
|
102
|
+
'stock_lines AS (',
|
|
103
|
+
" SELECT 'product'::text AS kind, d.id, d.qty FROM unnest($10::text[], $11::int[]) AS d(id, qty)",
|
|
104
|
+
' UNION ALL',
|
|
105
|
+
" SELECT 'variant'::text AS kind, d.id, d.qty FROM unnest($12::text[], $13::int[]) AS d(id, qty)",
|
|
106
|
+
'),',
|
|
107
|
+
'locked_products AS (',
|
|
108
|
+
' SELECT p.id::text AS id, p.quantity',
|
|
109
|
+
' FROM teleport_products p',
|
|
110
|
+
' WHERE p.quantity IS NOT NULL AND p.id::text = ANY($10::text[])',
|
|
111
|
+
' ORDER BY p.id',
|
|
112
|
+
' FOR UPDATE',
|
|
113
|
+
'),',
|
|
114
|
+
'locked_variants AS (',
|
|
115
|
+
' SELECT v.id::text AS id, v.quantity',
|
|
116
|
+
' FROM teleport_product_variants v',
|
|
117
|
+
' WHERE v.quantity IS NOT NULL AND v.id::text = ANY($12::text[])',
|
|
118
|
+
' ORDER BY v.id',
|
|
119
|
+
' FOR UPDATE',
|
|
120
|
+
'),',
|
|
121
|
+
'stock_short AS (',
|
|
122
|
+
" SELECT lp.id FROM locked_products lp JOIN stock_lines s ON s.kind = 'product' AND s.id = lp.id WHERE lp.quantity < s.qty",
|
|
123
|
+
' UNION ALL',
|
|
124
|
+
" SELECT lv.id FROM locked_variants lv JOIN stock_lines s ON s.kind = 'variant' AND s.id = lv.id WHERE lv.quantity < s.qty",
|
|
125
|
+
'),',
|
|
126
|
+
].join('\n');
|
|
127
|
+
// Missing or mismatched arrays refuse the order: a NULL unit count would turn
|
|
128
|
+
// a tracked quantity into NULL ("unlimited").
|
|
129
|
+
const STOCK_OK_COLUMN = [
|
|
130
|
+
' ($10::text[] IS NOT NULL AND $11::int[] IS NOT NULL AND $12::text[] IS NOT NULL AND $13::int[] IS NOT NULL',
|
|
131
|
+
' AND cardinality($10::text[]) = cardinality($11::int[])',
|
|
132
|
+
' AND cardinality($12::text[]) = cardinality($13::int[])',
|
|
133
|
+
' AND NOT EXISTS (SELECT 1 FROM stock_lines WHERE qty IS NULL OR qty < 1)',
|
|
134
|
+
' AND NOT EXISTS (SELECT 1 FROM stock_short)) AS stock_ok',
|
|
135
|
+
].join('\n');
|
|
136
|
+
// Written only when everything the order spends could be spent.
|
|
137
|
+
const STOCK_RESERVATIONS = [
|
|
138
|
+
'reserved_products AS (',
|
|
139
|
+
' UPDATE teleport_products AS p SET quantity = p.quantity - d.qty, updated_at = NOW()',
|
|
140
|
+
' FROM unnest($10::text[], $11::int[]) AS d(id, qty)',
|
|
141
|
+
' WHERE (SELECT ok FROM ok) AND p.quantity IS NOT NULL AND p.id::text = d.id AND p.quantity >= d.qty',
|
|
142
|
+
' RETURNING p.id',
|
|
143
|
+
'),',
|
|
144
|
+
'reserved_variants AS (',
|
|
145
|
+
' UPDATE teleport_product_variants AS v SET quantity = v.quantity - d.qty, updated_at = NOW()',
|
|
146
|
+
' FROM unnest($12::text[], $13::int[]) AS d(id, qty)',
|
|
147
|
+
' WHERE (SELECT ok FROM ok) AND v.quantity IS NOT NULL AND v.id::text = d.id AND v.quantity >= d.qty',
|
|
148
|
+
' RETURNING v.id',
|
|
149
|
+
'),',
|
|
150
|
+
].join('\n');
|
|
151
|
+
// What this statement actually took (tracked rows only), for the record below.
|
|
152
|
+
const STOCK_RESERVED_LINES = [
|
|
153
|
+
'stock_reserved_lines AS (',
|
|
154
|
+
" SELECT s.kind, s.id, s.qty FROM stock_lines s JOIN reserved_products rp ON s.kind = 'product' AND rp.id::text = s.id",
|
|
155
|
+
' UNION ALL',
|
|
156
|
+
" SELECT s.kind, s.id, s.qty FROM stock_lines s JOIN reserved_variants rv ON s.kind = 'variant' AND rv.id::text = s.id",
|
|
157
|
+
'),',
|
|
158
|
+
].join('\n');
|
|
159
|
+
// The editor's gift-card write onto the order row, word for word. A statement
|
|
160
|
+
// may update a row once, so the reservation record joins it in one UPDATE.
|
|
161
|
+
const ORDER_UPDATE_CTE = [
|
|
162
|
+
'order_update AS (',
|
|
163
|
+
' UPDATE teleport_orders o',
|
|
164
|
+
' SET gift_card_amount = $9::numeric, gift_card_id = debit.id, gift_card_last4 = debit.last4, updated_at = NOW()',
|
|
165
|
+
' FROM debit',
|
|
166
|
+
' WHERE o.id = ($2::text)::uuid',
|
|
167
|
+
' RETURNING o.id',
|
|
168
|
+
')',
|
|
169
|
+
].join('\n');
|
|
170
|
+
/**
|
|
171
|
+
* The order row's one update: the gift-card tender as before, and the units
|
|
172
|
+
* this statement reserved, recorded in the order's `metadata` (TEXT JSON) as
|
|
173
|
+
* `stockReservation: [{ kind, id, qty }]`. An order stopped before its items
|
|
174
|
+
* are written still says what it holds, and the cancel / expiry paths restore
|
|
175
|
+
* from it when the order has no items (`STOCK_RESERVATION_RESTORE_LINES`).
|
|
176
|
+
* Beside it, the products the voucher was redeemed against
|
|
177
|
+
* (`voucherItemProductIds`, the redemption's `item_product_ids`): a cancel
|
|
178
|
+
* deletes the redemption row, and a late payment that confirms the order
|
|
179
|
+
* writes it again with them.
|
|
180
|
+
*/
|
|
181
|
+
export const STOCK_RESERVATION_KEY = 'stockReservation';
|
|
182
|
+
export const VOUCHER_ITEM_PRODUCT_IDS_KEY = 'voucherItemProductIds';
|
|
183
|
+
const RESERVING_ORDER_UPDATE_CTE = [
|
|
184
|
+
'order_update AS (',
|
|
185
|
+
' UPDATE teleport_orders o',
|
|
186
|
+
' SET gift_card_amount = CASE WHEN d.id IS NULL THEN o.gift_card_amount ELSE $9::numeric END,',
|
|
187
|
+
' gift_card_id = CASE WHEN d.id IS NULL THEN o.gift_card_id ELSE d.id END,',
|
|
188
|
+
' gift_card_last4 = CASE WHEN d.id IS NULL THEN o.gift_card_last4 ELSE d.last4 END,',
|
|
189
|
+
' metadata = CASE WHEN EXISTS (SELECT 1 FROM stock_reserved_lines)',
|
|
190
|
+
" THEN ((CASE WHEN o.metadata ~ '^\\s*\\{' THEN o.metadata::jsonb ELSE '{}'::jsonb END)",
|
|
191
|
+
` || jsonb_build_object('${STOCK_RESERVATION_KEY}', (SELECT jsonb_agg(jsonb_build_object('kind', r.kind, 'id', r.id, 'qty', r.qty)) FROM stock_reserved_lines r),`,
|
|
192
|
+
` '${VOUCHER_ITEM_PRODUCT_IDS_KEY}', NULLIF($7::text, '')))::text`,
|
|
193
|
+
' ELSE o.metadata END,',
|
|
194
|
+
' updated_at = NOW()',
|
|
195
|
+
' FROM (SELECT 1 AS one) AS base LEFT JOIN debit d ON true',
|
|
196
|
+
' WHERE o.id = ($2::text)::uuid AND (d.id IS NOT NULL OR EXISTS (SELECT 1 FROM stock_reserved_lines))',
|
|
197
|
+
' RETURNING o.id',
|
|
198
|
+
')',
|
|
199
|
+
].join('\n');
|
|
200
|
+
const STOCK_RESERVED_COLUMN = '(SELECT COUNT(*) FROM reserved_products) + (SELECT COUNT(*) FROM reserved_variants) AS stock_reserved';
|
|
201
|
+
// Whether the stock could be had, apart from the voucher and the card: a
|
|
202
|
+
// refusal that is the stock's says so (the verdict can tell the buyer).
|
|
203
|
+
const STOCK_OK_RESULT_COLUMN = '(SELECT stock_ok FROM verdict) AS stock_ok';
|
|
204
|
+
const occursOnce = (text, part) => {
|
|
205
|
+
const at = text.indexOf(part);
|
|
206
|
+
return at !== -1 && text.indexOf(part, at + 1) === -1;
|
|
207
|
+
};
|
|
208
|
+
export const looksLikeOrderRedemptionStatement = (query) => typeof query === 'string' &&
|
|
209
|
+
/^\s*WITH\s+locked_voucher\s+AS\s*\(/.test(query) &&
|
|
210
|
+
query.indexOf('\nlocked_card AS (') !== -1 &&
|
|
211
|
+
occursOnce(query, VERDICT_START) &&
|
|
212
|
+
(occursOnce(query, REDEMPTION_OK_LINE) || occursOnce(query, RESERVED_OK_LINE)) &&
|
|
213
|
+
occursOnce(query, LAST_COLUMN);
|
|
214
|
+
/** The redemption statement that also reserves the order's stock; unchanged when it drifted or already does. */
|
|
215
|
+
export const reserveStockInRedemptionStatement = (query) => {
|
|
216
|
+
if (!looksLikeOrderRedemptionStatement(query) || query.indexOf(RESERVED_OK_LINE) !== -1) {
|
|
217
|
+
return query;
|
|
218
|
+
}
|
|
219
|
+
if (!occursOnce(query, VERDICT_END) ||
|
|
220
|
+
!occursOnce(query, ORDER_UPDATE_CTE) ||
|
|
221
|
+
!query.trim().endsWith(LAST_COLUMN)) {
|
|
222
|
+
return query;
|
|
223
|
+
}
|
|
224
|
+
return query
|
|
225
|
+
.replace(VERDICT_START, '\n' + STOCK_LOCKS + VERDICT_START)
|
|
226
|
+
.replace(VERDICT_END, ')) AS gift_card_ok,\n' + STOCK_OK_COLUMN + '\n),')
|
|
227
|
+
.replace(REDEMPTION_OK_LINE, RESERVED_OK_LINE + '\n' + STOCK_RESERVATIONS + '\n' + STOCK_RESERVED_LINES)
|
|
228
|
+
.replace(ORDER_UPDATE_CTE, () => RESERVING_ORDER_UPDATE_CTE)
|
|
229
|
+
.replace(LAST_COLUMN, () => LAST_COLUMN + ',\n ' + STOCK_RESERVED_COLUMN + ',\n ' + STOCK_OK_RESULT_COLUMN);
|
|
230
|
+
};
|
|
231
|
+
// ────────────────────────────────────────────────────────────────────
|
|
232
|
+
// Restoring a reservation an order holds without items
|
|
233
|
+
// ────────────────────────────────────────────────────────────────────
|
|
234
|
+
// The units a cancelled unpaid order puts back, as the editor's "Settle
|
|
235
|
+
// Unpaid Order" statement reads them: its order items. Word for word.
|
|
236
|
+
const SETTLE_UNPAID_LINES_CTE = [
|
|
237
|
+
'lines AS (',
|
|
238
|
+
" SELECT oi.product_id::text AS product_id, NULLIF(COALESCE(oi.variant_id::text, ''), '') AS variant_id, oi.quantity",
|
|
239
|
+
' FROM teleport_order_items oi JOIN released r ON oi.order_id = r.id',
|
|
240
|
+
' WHERE oi.quantity > 0',
|
|
241
|
+
'),',
|
|
242
|
+
].join('\n');
|
|
243
|
+
/**
|
|
244
|
+
* The same lines, plus, for a released order with NO items, the units its
|
|
245
|
+
* reservation record says it holds: an order stopped between the reservation
|
|
246
|
+
* and its items gives its stock back when it is cancelled. A malformed record
|
|
247
|
+
* reads as none. `parseOnly` names the orders whose metadata may be parsed at
|
|
248
|
+
* all (the statement's own), so the planner can never cast another row's.
|
|
249
|
+
*/
|
|
250
|
+
const reservationRestoreLines = (withOrderId, parseOnly) => [
|
|
251
|
+
'lines AS (',
|
|
252
|
+
" SELECT oi.product_id::text AS product_id, NULLIF(COALESCE(oi.variant_id::text, ''), '') AS variant_id, oi.quantity" +
|
|
253
|
+
(withOrderId ? ', oi.order_id' : ''),
|
|
254
|
+
' FROM teleport_order_items oi JOIN released r ON oi.order_id = r.id',
|
|
255
|
+
' WHERE oi.quantity > 0',
|
|
256
|
+
' UNION ALL',
|
|
257
|
+
" SELECT CASE WHEN x.kind = 'product' THEN x.id END, CASE WHEN x.kind = 'variant' THEN x.id END, x.qty" +
|
|
258
|
+
(withOrderId ? ', ro.id' : ''),
|
|
259
|
+
' FROM teleport_orders ro JOIN released r ON ro.id = r.id',
|
|
260
|
+
// Nested CASE: the JSON is parsed only once it looks like an object.
|
|
261
|
+
` CROSS JOIN LATERAL jsonb_to_recordset(CASE WHEN ${parseOnly} AND ro.metadata ~ '^\\s*\\{'`,
|
|
262
|
+
` THEN (CASE WHEN jsonb_typeof(ro.metadata::jsonb -> '${STOCK_RESERVATION_KEY}') = 'array'`,
|
|
263
|
+
` THEN ro.metadata::jsonb -> '${STOCK_RESERVATION_KEY}' ELSE '[]'::jsonb END)`,
|
|
264
|
+
" ELSE '[]'::jsonb END) AS x(kind text, id text, qty int)",
|
|
265
|
+
' WHERE x.qty > 0 AND NOT EXISTS (SELECT 1 FROM teleport_order_items oi WHERE oi.order_id = ro.id)',
|
|
266
|
+
'),',
|
|
267
|
+
].join('\n');
|
|
268
|
+
/** For "Settle Unpaid Order", whose `$1` is the one order it settles. */
|
|
269
|
+
export const STOCK_RESERVATION_RESTORE_LINES = reservationRestoreLines(false, 'ro.id::text = $1::text');
|
|
270
|
+
/**
|
|
271
|
+
* The same lines, each naming its order (the release logs one line per order),
|
|
272
|
+
* for the release, whose `$1` lists the orders whose metadata the checkout read.
|
|
273
|
+
*/
|
|
274
|
+
export const STOCK_RESERVATION_RESTORE_LINES_BY_ORDER = reservationRestoreLines(true, 'ro.id::text = ANY($1::text[])');
|
|
275
|
+
/**
|
|
276
|
+
* Whether an order's TEXT `metadata` holds the reservation record, read as
|
|
277
|
+
* JSON (a buyer-typed billing value of the same text is not the record). The
|
|
278
|
+
* text test runs first, so only a row that may hold the key is parsed.
|
|
279
|
+
*/
|
|
280
|
+
export const hasReservationRecordSql = (column) => `(CASE WHEN COALESCE(${column}, '') LIKE '%"${STOCK_RESERVATION_KEY}"%' AND ${column} ~ '^\\s*\\{'` +
|
|
281
|
+
` THEN jsonb_typeof(${column}::jsonb -> '${STOCK_RESERVATION_KEY}') = 'array' ELSE false END)`;
|
|
282
|
+
export const looksLikeSettleUnpaidOrderStatement = (query) => typeof query === 'string' &&
|
|
283
|
+
/^\s*WITH\s+target\s+AS\s*\(/.test(query) &&
|
|
284
|
+
query.indexOf('\nreleased AS (') !== -1 &&
|
|
285
|
+
query.indexOf('\nproduct_restore AS (') !== -1 &&
|
|
286
|
+
(occursOnce(query, SETTLE_UNPAID_LINES_CTE) || occursOnce(query, STOCK_RESERVATION_RESTORE_LINES));
|
|
287
|
+
/** The "Settle Unpaid Order" statement that also restores a reservation without items. */
|
|
288
|
+
export const restoreReservationsInSettleUnpaidStatement = (query) => looksLikeSettleUnpaidOrderStatement(query) && occursOnce(query, SETTLE_UNPAID_LINES_CTE)
|
|
289
|
+
? query.replace(SETTLE_UNPAID_LINES_CTE, () => STOCK_RESERVATION_RESTORE_LINES)
|
|
290
|
+
: query;
|
|
291
|
+
// The editor's "Settle Unpaid Order" stock writes, word for word: they lock
|
|
292
|
+
// the rows in scan order.
|
|
293
|
+
const SETTLE_UNPAID_RESTORES = [
|
|
294
|
+
'product_restore AS (',
|
|
295
|
+
' UPDATE teleport_products p SET quantity = p.quantity + d.qty, updated_at = NOW()',
|
|
296
|
+
' FROM (SELECT product_id AS id, SUM(quantity)::int AS qty FROM lines',
|
|
297
|
+
' WHERE variant_id IS NULL AND product_id IS NOT NULL GROUP BY product_id) d',
|
|
298
|
+
' WHERE p.quantity IS NOT NULL AND p.id::text = d.id',
|
|
299
|
+
' RETURNING p.id',
|
|
300
|
+
'),',
|
|
301
|
+
'variant_restore AS (',
|
|
302
|
+
' UPDATE teleport_product_variants v SET quantity = v.quantity + d.qty, updated_at = NOW()',
|
|
303
|
+
' FROM (SELECT variant_id AS id, SUM(quantity)::int AS qty FROM lines',
|
|
304
|
+
' WHERE variant_id IS NOT NULL GROUP BY variant_id) d',
|
|
305
|
+
' WHERE v.quantity IS NOT NULL AND v.id::text = d.id',
|
|
306
|
+
' RETURNING v.id',
|
|
307
|
+
')',
|
|
308
|
+
].join('\n');
|
|
309
|
+
// The same writes from rows locked first, products then variants, each in id
|
|
310
|
+
// order: the order the reservation, the release and the late-payment retake
|
|
311
|
+
// take them in (the order row is locked first by all of them, and the
|
|
312
|
+
// voucher and gift card this statement does not touch).
|
|
313
|
+
const SETTLE_UNPAID_SORTED_RESTORES = [
|
|
314
|
+
'product_need AS (',
|
|
315
|
+
' SELECT product_id AS id, SUM(quantity)::int AS qty FROM lines',
|
|
316
|
+
' WHERE variant_id IS NULL AND product_id IS NOT NULL GROUP BY product_id',
|
|
317
|
+
'),',
|
|
318
|
+
'variant_need AS (',
|
|
319
|
+
' SELECT variant_id AS id, SUM(quantity)::int AS qty FROM lines',
|
|
320
|
+
' WHERE variant_id IS NOT NULL GROUP BY variant_id',
|
|
321
|
+
'),',
|
|
322
|
+
'product_locks AS (',
|
|
323
|
+
' SELECT p.id, n.qty FROM teleport_products p JOIN product_need n ON p.id::text = n.id',
|
|
324
|
+
' WHERE p.quantity IS NOT NULL',
|
|
325
|
+
' ORDER BY p.id FOR UPDATE OF p',
|
|
326
|
+
'),',
|
|
327
|
+
'variant_locks AS (',
|
|
328
|
+
' SELECT v.id, n.qty FROM teleport_product_variants v JOIN variant_need n ON v.id::text = n.id',
|
|
329
|
+
' WHERE v.quantity IS NOT NULL AND (SELECT COUNT(*) FROM product_locks) >= 0',
|
|
330
|
+
' ORDER BY v.id FOR UPDATE OF v',
|
|
331
|
+
'),',
|
|
332
|
+
'product_restore AS (',
|
|
333
|
+
' UPDATE teleport_products p SET quantity = p.quantity + l.qty, updated_at = NOW()',
|
|
334
|
+
' FROM product_locks l WHERE p.id = l.id',
|
|
335
|
+
' RETURNING p.id',
|
|
336
|
+
'),',
|
|
337
|
+
'variant_restore AS (',
|
|
338
|
+
' UPDATE teleport_product_variants v SET quantity = v.quantity + l.qty, updated_at = NOW()',
|
|
339
|
+
' FROM variant_locks l WHERE v.id = l.id',
|
|
340
|
+
' RETURNING v.id',
|
|
341
|
+
')',
|
|
342
|
+
].join('\n');
|
|
343
|
+
/** The "Settle Unpaid Order" statement restoring from rows locked in id order; unchanged when drifted or done. */
|
|
344
|
+
export const lockSettleUnpaidRestoresInIdOrder = (query) => looksLikeSettleUnpaidOrderStatement(query) && occursOnce(query, SETTLE_UNPAID_RESTORES)
|
|
345
|
+
? query.replace(SETTLE_UNPAID_RESTORES, () => SETTLE_UNPAID_SORTED_RESTORES)
|
|
346
|
+
: query;
|
|
347
|
+
// ────────────────────────────────────────────────────────────────────
|
|
348
|
+
// Releasing reservations whose checkout never reached a payment page
|
|
349
|
+
// ────────────────────────────────────────────────────────────────────
|
|
350
|
+
/**
|
|
351
|
+
* How long a reserving order may wait for a payment page, how many one pass
|
|
352
|
+
* releases, and how long after its last write (the checkout stamps the order
|
|
353
|
+
* right before it asks the provider for a page) it is left alone, so a page
|
|
354
|
+
* whose record is still on its way is never released under the buyer.
|
|
355
|
+
*/
|
|
356
|
+
export const STALLED_RESERVATION_RELEASE = {
|
|
357
|
+
holdMinutes: 30,
|
|
358
|
+
batchSize: 10,
|
|
359
|
+
quietMinutes: 2,
|
|
360
|
+
/** How many candidates the checkout reads per pass, so unreadable rows never fill a batch. */
|
|
361
|
+
candidateLimit: 50,
|
|
362
|
+
};
|
|
363
|
+
// Which orders a pass may release, apart from the reservation record itself:
|
|
364
|
+
// pending and unpaid, no payment session (no attempt reference, no payment
|
|
365
|
+
// reference) on a table that can record one, not a store-billed renewal,
|
|
366
|
+
// placed `holdMinutes` ago and written to in none of the last `quietMinutes`.
|
|
367
|
+
const stalledOrderConditions = (holdMinutes) => [
|
|
368
|
+
" WHERE LOWER(COALESCE(o.status, '')) = 'pending'",
|
|
369
|
+
" AND LOWER(COALESCE(o.payment_status, '')) IN ('', 'unpaid', 'pending')",
|
|
370
|
+
" AND COALESCE(o.payment_intent_id, '') = ''",
|
|
371
|
+
" AND COALESCE(to_jsonb(o) ->> 'payment_attempt_ref', '') = ''",
|
|
372
|
+
// A store whose table predates the column records no checkout, so an
|
|
373
|
+
// order there may have one open: it is never released here.
|
|
374
|
+
" AND (to_jsonb(o) -> 'payment_attempt_ref') IS NOT NULL",
|
|
375
|
+
" AND COALESCE(to_jsonb(o) ->> 'provider_invoice_id', '') NOT LIKE 'store:%'",
|
|
376
|
+
` AND o.created_at < NOW() - make_interval(mins => ${Math.max(1, Math.floor(holdMinutes))})`,
|
|
377
|
+
` AND (o.updated_at IS NULL OR o.updated_at < NOW() - make_interval(mins => ${STALLED_RESERVATION_RELEASE.quietMinutes}))`,
|
|
378
|
+
" AND o.created_at > NOW() - INTERVAL '30 days'",
|
|
379
|
+
];
|
|
380
|
+
/**
|
|
381
|
+
* The orders a pass may release, with their metadata as text, oldest first,
|
|
382
|
+
* nothing parsed and nothing locked. The checkout parses each one's metadata
|
|
383
|
+
* itself (a malformed row would otherwise fail the whole release on Postgres
|
|
384
|
+
* versions without a safe JSON test) and releases only the readable ones.
|
|
385
|
+
*/
|
|
386
|
+
export const buildStalledReservationCandidatesQuery = (holdMinutes = STALLED_RESERVATION_RELEASE.holdMinutes) => [
|
|
387
|
+
'SELECT o.id::text AS id, o.metadata',
|
|
388
|
+
' FROM teleport_orders o',
|
|
389
|
+
...stalledOrderConditions(holdMinutes),
|
|
390
|
+
` AND COALESCE(o.metadata, '') LIKE '%"${STOCK_RESERVATION_KEY}"%'`,
|
|
391
|
+
' ORDER BY o.created_at ASC',
|
|
392
|
+
` LIMIT ${STALLED_RESERVATION_RELEASE.candidateLimit}`,
|
|
393
|
+
].join('\n');
|
|
394
|
+
// One system "order-cancelled" line per released order, keyed as the shared
|
|
395
|
+
// writer keys an order's cancellation (`order-cancelled:<order id>`, the key
|
|
396
|
+
// "Settle Unpaid Order" writes too): its units were put back when any tracked
|
|
397
|
+
// row took them, which the editor reads before it restocks or accepts a late
|
|
398
|
+
// payment for the order.
|
|
399
|
+
const releasedLogLines = (log) => {
|
|
400
|
+
if (log === 'none') {
|
|
401
|
+
return [];
|
|
402
|
+
}
|
|
403
|
+
const columns = log === 'entity'
|
|
404
|
+
? 'event_type, dedupe_key, order_id, entity_type, entity_id, payload, actor_type, status'
|
|
405
|
+
: 'event_type, dedupe_key, order_id, payload, actor_type, status';
|
|
406
|
+
const entity = log === 'entity' ? " 'order', r.id::text," : '';
|
|
407
|
+
return [
|
|
408
|
+
',',
|
|
409
|
+
'logged AS (',
|
|
410
|
+
` INSERT INTO teleport_events (${columns})`,
|
|
411
|
+
` SELECT 'order-cancelled', 'order-cancelled:' || r.id::text, r.id,${entity}`,
|
|
412
|
+
" json_build_object('reason', 'expired',",
|
|
413
|
+
" 'restocked', CASE WHEN EXISTS (SELECT 1 FROM lines l JOIN product_locks pl ON l.variant_id IS NULL AND pl.id::text = l.product_id WHERE l.order_id = r.id)",
|
|
414
|
+
' OR EXISTS (SELECT 1 FROM lines l JOIN variant_locks vl ON vl.id::text = l.variant_id WHERE l.order_id = r.id)',
|
|
415
|
+
" THEN 'true' ELSE 'false' END,",
|
|
416
|
+
" 'unitCount', (SELECT COALESCE(SUM(l.quantity), 0) FROM lines l WHERE l.order_id = r.id)::text)::text,",
|
|
417
|
+
" 'system', 'recorded'",
|
|
418
|
+
' FROM released r',
|
|
419
|
+
' ON CONFLICT (dedupe_key) DO NOTHING',
|
|
420
|
+
' RETURNING id',
|
|
421
|
+
')',
|
|
422
|
+
];
|
|
423
|
+
};
|
|
424
|
+
/**
|
|
425
|
+
* Cancels the `pending` orders that reserved stock (they carry the record)
|
|
426
|
+
* but never opened a payment session (no attempt reference, no payment
|
|
427
|
+
* reference) `holdMinutes` after they were placed, and gives back, in the
|
|
428
|
+
* same statement and per order, what each one held: its stock (from its items,
|
|
429
|
+
* or from the record when it has none), its voucher redemption and its
|
|
430
|
+
* gift-card tender, and writes each one's cancellation line (`log`). A
|
|
431
|
+
* store-billed renewal is left to the billing run, a store whose order table
|
|
432
|
+
* cannot record a checkout is left alone, and so is an order written in the
|
|
433
|
+
* last `quietMinutes` (its payment page may be opening). Rows another
|
|
434
|
+
* transaction holds are skipped, so a checkout in flight, or another pass, is
|
|
435
|
+
* never waited on. A checkout recorded for the order first keeps it pending,
|
|
436
|
+
* and one opened after the release is never recorded, so it is closed and
|
|
437
|
+
* never shown. An order cancelled here that is paid after all has its stock
|
|
438
|
+
* taken again by "Process Payment Webhook" when it is still there, and is
|
|
439
|
+
* otherwise recorded as a late payment for the merchant.
|
|
440
|
+
*
|
|
441
|
+
* Locks, after the orders: vouchers, gift cards, products, variants, each in
|
|
442
|
+
* id order — the order the checkout's reservation takes them in — so the two
|
|
443
|
+
* never deadlock.
|
|
444
|
+
*
|
|
445
|
+
* The provider's own events and the scheduled "Release Abandoned Checkouts"
|
|
446
|
+
* run settle orders that DID open a payment page; nothing triggers for one
|
|
447
|
+
* that did not, so the checkout runs this pass itself (`cart-price-order`).
|
|
448
|
+
*/
|
|
449
|
+
export const buildStalledReservationReleaseQuery = (holdMinutes = STALLED_RESERVATION_RELEASE.holdMinutes, batchSize = STALLED_RESERVATION_RELEASE.batchSize, log = 'entity') => [
|
|
450
|
+
'WITH stale AS (',
|
|
451
|
+
' SELECT o.id',
|
|
452
|
+
' FROM teleport_orders o',
|
|
453
|
+
...stalledOrderConditions(holdMinutes),
|
|
454
|
+
// `$1`: the orders whose metadata the checkout read as JSON. Only theirs
|
|
455
|
+
// is parsed here, whatever order the planner evaluates the rest in.
|
|
456
|
+
' AND o.id::text = ANY($1::text[])',
|
|
457
|
+
` AND (CASE WHEN o.id::text = ANY($1::text[]) THEN ${hasReservationRecordSql('o.metadata')} ELSE false END)`,
|
|
458
|
+
' ORDER BY o.created_at ASC',
|
|
459
|
+
` LIMIT ${Math.max(1, Math.floor(batchSize))}`,
|
|
460
|
+
' FOR UPDATE SKIP LOCKED',
|
|
461
|
+
'),',
|
|
462
|
+
'released AS (',
|
|
463
|
+
' UPDATE teleport_orders o',
|
|
464
|
+
" SET status = 'cancelled', payment_status = 'failed', updated_at = NOW()",
|
|
465
|
+
' FROM stale s',
|
|
466
|
+
' WHERE o.id = s.id',
|
|
467
|
+
" RETURNING o.id, COALESCE(NULLIF(to_jsonb(o) ->> 'order_number', ''), o.id::text) AS order_ref,",
|
|
468
|
+
" to_jsonb(o) ->> 'gift_card_id' AS gift_card_id,",
|
|
469
|
+
" COALESCE((to_jsonb(o) ->> 'gift_card_amount')::numeric, 0) AS gift_card_amount,",
|
|
470
|
+
" UPPER(COALESCE(o.currency, '')) AS currency",
|
|
471
|
+
'),',
|
|
472
|
+
STOCK_RESERVATION_RESTORE_LINES_BY_ORDER,
|
|
473
|
+
'product_need AS (',
|
|
474
|
+
' SELECT product_id AS id, SUM(quantity)::int AS qty FROM lines',
|
|
475
|
+
' WHERE variant_id IS NULL AND product_id IS NOT NULL GROUP BY product_id',
|
|
476
|
+
'),',
|
|
477
|
+
'variant_need AS (',
|
|
478
|
+
' SELECT variant_id AS id, SUM(quantity)::int AS qty FROM lines',
|
|
479
|
+
' WHERE variant_id IS NOT NULL GROUP BY variant_id',
|
|
480
|
+
'),',
|
|
481
|
+
'voucher_dropped AS (',
|
|
482
|
+
' DELETE FROM teleport_voucher_redemptions vr USING released r WHERE vr.order_id = r.id',
|
|
483
|
+
' RETURNING vr.voucher_id',
|
|
484
|
+
'),',
|
|
485
|
+
'held_vouchers AS (',
|
|
486
|
+
' SELECT v.id FROM teleport_vouchers v',
|
|
487
|
+
' WHERE v.id IN (SELECT voucher_id FROM voucher_dropped)',
|
|
488
|
+
' ORDER BY v.id FOR UPDATE',
|
|
489
|
+
'),',
|
|
490
|
+
'card AS (',
|
|
491
|
+
' SELECT g.id, g.balance, r.gift_card_amount AS amount, r.id AS order_id, r.order_ref',
|
|
492
|
+
' FROM teleport_gift_cards g JOIN released r ON g.id::text = r.gift_card_id',
|
|
493
|
+
" WHERE r.gift_card_amount > 0 AND g.status = 'active'",
|
|
494
|
+
' AND (g.expires_at IS NULL OR g.expires_at > NOW())',
|
|
495
|
+
" AND (r.currency = '' OR UPPER(g.currency) = r.currency)",
|
|
496
|
+
' AND (SELECT COUNT(*) FROM held_vouchers) >= 0',
|
|
497
|
+
' ORDER BY g.id FOR UPDATE OF g',
|
|
498
|
+
'),',
|
|
499
|
+
'product_locks AS (',
|
|
500
|
+
' SELECT p.id, n.qty FROM teleport_products p JOIN product_need n ON p.id::text = n.id',
|
|
501
|
+
' WHERE p.quantity IS NOT NULL AND (SELECT COUNT(*) FROM card) >= 0',
|
|
502
|
+
' ORDER BY p.id FOR UPDATE OF p',
|
|
503
|
+
'),',
|
|
504
|
+
'variant_locks AS (',
|
|
505
|
+
' SELECT v.id, n.qty FROM teleport_product_variants v JOIN variant_need n ON v.id::text = n.id',
|
|
506
|
+
' WHERE v.quantity IS NOT NULL AND (SELECT COUNT(*) FROM product_locks) >= 0',
|
|
507
|
+
' ORDER BY v.id FOR UPDATE OF v',
|
|
508
|
+
'),',
|
|
509
|
+
'product_restore AS (',
|
|
510
|
+
' UPDATE teleport_products p SET quantity = p.quantity + l.qty, updated_at = NOW()',
|
|
511
|
+
' FROM product_locks l WHERE p.id = l.id',
|
|
512
|
+
' RETURNING p.id',
|
|
513
|
+
'),',
|
|
514
|
+
'variant_restore AS (',
|
|
515
|
+
' UPDATE teleport_product_variants v SET quantity = v.quantity + l.qty, updated_at = NOW()',
|
|
516
|
+
' FROM variant_locks l WHERE v.id = l.id',
|
|
517
|
+
' RETURNING v.id',
|
|
518
|
+
'),',
|
|
519
|
+
'voucher_restored AS (',
|
|
520
|
+
' UPDATE teleport_vouchers v',
|
|
521
|
+
' SET usage_count = GREATEST(COALESCE(v.usage_count, 0) - d.n, 0), updated_at = NOW()',
|
|
522
|
+
' FROM (SELECT voucher_id, COUNT(*)::int AS n FROM voucher_dropped GROUP BY voucher_id) d',
|
|
523
|
+
' JOIN held_vouchers h ON h.id = d.voucher_id',
|
|
524
|
+
' WHERE v.id = d.voucher_id',
|
|
525
|
+
' RETURNING v.id',
|
|
526
|
+
'),',
|
|
527
|
+
'card_ledger AS (',
|
|
528
|
+
' INSERT INTO teleport_gift_card_transactions',
|
|
529
|
+
' (gift_card_id, order_id, type, amount, balance_after, dedupe_key, note)',
|
|
530
|
+
" SELECT card.id, card.order_id, 'release', card.amount, card.balance + card.amount,",
|
|
531
|
+
" 'release:' || card.order_id::text, 'Released from unpaid order ' || card.order_ref",
|
|
532
|
+
' FROM card',
|
|
533
|
+
' ON CONFLICT (dedupe_key) DO NOTHING',
|
|
534
|
+
' RETURNING gift_card_id, amount',
|
|
535
|
+
'),',
|
|
536
|
+
'card_credited AS (',
|
|
537
|
+
' UPDATE teleport_gift_cards g SET balance = g.balance + c.amount, updated_at = NOW()',
|
|
538
|
+
' FROM (SELECT gift_card_id, SUM(amount) AS amount FROM card_ledger GROUP BY gift_card_id) c',
|
|
539
|
+
' WHERE g.id = c.gift_card_id',
|
|
540
|
+
' RETURNING g.id',
|
|
541
|
+
')' + releasedLogLines(log).join('\n'),
|
|
542
|
+
'SELECT',
|
|
543
|
+
' (SELECT COUNT(*) FROM released) AS released,',
|
|
544
|
+
' (SELECT COALESCE(SUM(quantity), 0) FROM lines) AS units,',
|
|
545
|
+
' (SELECT COUNT(*) FROM product_restore) + (SELECT COUNT(*) FROM variant_restore) AS restocked_rows,',
|
|
546
|
+
' (SELECT COUNT(*) FROM voucher_dropped) AS vouchers_released,',
|
|
547
|
+
' (SELECT COUNT(*) FROM card_credited) AS gift_cards_released' +
|
|
548
|
+
// The data API wakes the automations only for a pass that logged a line.
|
|
549
|
+
(log === 'none' ? '' : ',\n (SELECT COUNT(*) FROM logged) AS claimed'),
|
|
550
|
+
].join('\n');
|
|
551
|
+
/** The forms the checkout tries, in order: a ledger with the record columns, an older one, none. */
|
|
552
|
+
export const buildStalledReservationReleaseQueries = () => ['entity', 'plain', 'none'].map((log) => buildStalledReservationReleaseQuery(STALLED_RESERVATION_RELEASE.holdMinutes, STALLED_RESERVATION_RELEASE.batchSize, log));
|
|
553
|
+
const stockDeltaParam = (priceNodeId, key) => ({
|
|
554
|
+
path: [priceNodeId, 'stockDeltas', key],
|
|
555
|
+
type: 'workflowContext',
|
|
556
|
+
nodeId: priceNodeId,
|
|
557
|
+
});
|
|
558
|
+
/**
|
|
559
|
+
* The stock can be reserved with the order only when the order's units are
|
|
560
|
+
* known on the server and the workflow's own decrement can be stopped from
|
|
561
|
+
* taking them a second time: every order decrement in it is the parameterised
|
|
562
|
+
* chain step (re-baked by `rewriteParameterizedStockChainInNodes`).
|
|
563
|
+
*/
|
|
564
|
+
const canReserveStock = (nodes) => {
|
|
565
|
+
if (!isParameterizedDecrementChainRewritable(nodes)) {
|
|
566
|
+
return false;
|
|
567
|
+
}
|
|
568
|
+
return nodes.every((node) => {
|
|
569
|
+
var _a, _b;
|
|
570
|
+
if (!node || (node.type !== 'data-raw-query' && node.type !== 'general-custom-js')) {
|
|
571
|
+
return true;
|
|
572
|
+
}
|
|
573
|
+
if (node.type === 'data-raw-query' && looksLikeOrderRedemptionStatement((_a = node.config) === null || _a === void 0 ? void 0 : _a.query)) {
|
|
574
|
+
return true;
|
|
575
|
+
}
|
|
576
|
+
const { category } = classifyStockWriteSite('Place Order', node);
|
|
577
|
+
if (category !== 'order-decrement') {
|
|
578
|
+
return true;
|
|
579
|
+
}
|
|
580
|
+
return node.type === 'data-raw-query' && isParameterizedStockDecrementQuery((_b = node.config) === null || _b === void 0 ? void 0 : _b.query);
|
|
581
|
+
});
|
|
582
|
+
};
|
|
583
|
+
/**
|
|
584
|
+
* Re-bakes the settle write and the redemption statement of one workflow (or
|
|
585
|
+
* custom node) in place. Returns whether the redemption statement now
|
|
586
|
+
* reserves the order's stock, which the stock chain rewrite needs to know.
|
|
587
|
+
*/
|
|
588
|
+
export const guardPlaceOrderStatementsInNodes = (nodes, ownerName, options, summary) => {
|
|
589
|
+
if (!Array.isArray(nodes)) {
|
|
590
|
+
return { stockReserved: false };
|
|
591
|
+
}
|
|
592
|
+
const list = nodes;
|
|
593
|
+
const priceNode = list.find((node) => node && node.type === 'cart-price-order' && typeof node.id === 'string' && node.id);
|
|
594
|
+
let stockReserved = false;
|
|
595
|
+
for (const node of list) {
|
|
596
|
+
if (!node || node.type !== 'data-raw-query' || !node.config) {
|
|
597
|
+
continue;
|
|
598
|
+
}
|
|
599
|
+
const query = node.config.query;
|
|
600
|
+
if (looksLikeSettleOrderStatement(query)) {
|
|
601
|
+
const guarded = guardSettleOrderStatement(query, options);
|
|
602
|
+
if (guarded !== query) {
|
|
603
|
+
node.config.query = guarded;
|
|
604
|
+
summary.settleGuards++;
|
|
605
|
+
}
|
|
606
|
+
continue;
|
|
607
|
+
}
|
|
608
|
+
if (looksLikeSettleUnpaidOrderStatement(query)) {
|
|
609
|
+
const restoring = options.reserveStock
|
|
610
|
+
? restoreReservationsInSettleUnpaidStatement(query)
|
|
611
|
+
: query;
|
|
612
|
+
if (restoring !== query) {
|
|
613
|
+
summary.reservationRestores++;
|
|
614
|
+
}
|
|
615
|
+
// Whatever the stock settings: its rows are locked in the order every
|
|
616
|
+
// other stock statement takes them in.
|
|
617
|
+
const sorted = lockSettleUnpaidRestoresInIdOrder(restoring);
|
|
618
|
+
if (sorted !== restoring) {
|
|
619
|
+
summary.restoreLockOrders++;
|
|
620
|
+
}
|
|
621
|
+
node.config.query = sorted;
|
|
622
|
+
continue;
|
|
623
|
+
}
|
|
624
|
+
if (!options.reserveStock || !looksLikeOrderRedemptionStatement(query)) {
|
|
625
|
+
continue;
|
|
626
|
+
}
|
|
627
|
+
const params = node.config.params;
|
|
628
|
+
const reserved = reserveStockInRedemptionStatement(query);
|
|
629
|
+
if (!priceNode ||
|
|
630
|
+
!Array.isArray(params) ||
|
|
631
|
+
params.length !== REDEMPTION_PARAM_COUNT ||
|
|
632
|
+
reserved === query ||
|
|
633
|
+
!canReserveStock(list)) {
|
|
634
|
+
summary.skippedReservations++;
|
|
635
|
+
// eslint-disable-next-line no-console
|
|
636
|
+
console.warn('[teleport] place-order guards: "' +
|
|
637
|
+
ownerName +
|
|
638
|
+
'" keeps its stock decrement after the order (its stock cannot be reserved with the order: ' +
|
|
639
|
+
'no server pricing step, or a redemption or decrement step that has drifted).');
|
|
640
|
+
continue;
|
|
641
|
+
}
|
|
642
|
+
node.config.query = reserved;
|
|
643
|
+
node.config.params = [
|
|
644
|
+
...params,
|
|
645
|
+
stockDeltaParam(priceNode.id, 'productIds'),
|
|
646
|
+
stockDeltaParam(priceNode.id, 'productQtys'),
|
|
647
|
+
stockDeltaParam(priceNode.id, 'variantIds'),
|
|
648
|
+
stockDeltaParam(priceNode.id, 'variantQtys'),
|
|
649
|
+
];
|
|
650
|
+
summary.stockReservations++;
|
|
651
|
+
stockReserved = true;
|
|
652
|
+
}
|
|
653
|
+
return { stockReserved };
|
|
654
|
+
};
|
|
655
|
+
//# sourceMappingURL=place-order-guards.js.map
|