@teleporthq/teleport-plugin-next-workflows 0.44.11 → 0.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__tests__/_helpers/fake-fetch.ts +75 -0
- package/__tests__/_helpers/gui-place-order-statements.ts +17 -0
- package/__tests__/_helpers/inserted-lines.ts +22 -0
- package/__tests__/_helpers/invoice-store.ts +10 -1
- package/__tests__/_helpers/load-security-runtime.ts +45 -0
- package/__tests__/_helpers/load-server-runtime.ts +26 -3
- package/__tests__/_helpers/run-account-delete-route.ts +3 -1
- package/__tests__/_helpers/run-generated-middleware.ts +7 -2
- package/__tests__/account-delete-owned-rows.test.ts +3 -1
- package/__tests__/adopted-element-trigger-code.test.ts +128 -0
- package/__tests__/analytics-track-outcome.test.ts +145 -0
- package/__tests__/auth-password-change-ends-sessions.test.ts +8 -1
- package/__tests__/auth-password-security.test.ts +2275 -0
- package/__tests__/auth-session-cost.test.ts +31 -0
- package/__tests__/auth-signup-route.test.ts +960 -0
- package/__tests__/authored-code-every-path.test.ts +247 -0
- package/__tests__/automations-bus.test.ts +3820 -0
- package/__tests__/automations-catalog-drift.test.ts +97 -0
- package/__tests__/booking-calendar-feed-route.test.ts +20 -3
- package/__tests__/cart-price-order.test.ts +336 -1
- package/__tests__/code-lookup-rate-limit-route.test.ts +189 -0
- package/__tests__/cost-bearing-node-types.test.ts +119 -0
- package/__tests__/credential-columns-reply.test.ts +9 -0
- package/__tests__/credential-result-reply.test.ts +19 -5
- package/__tests__/cron-route-loop-templateparams.test.ts +6 -3
- package/__tests__/custom-js-authored-code.test.ts +304 -0
- package/__tests__/custom-node-custom-code-gate.test.ts +136 -0
- package/__tests__/custom-node-step-handlers.test.ts +251 -0
- package/__tests__/custom-node-step-reach.test.ts +63 -0
- package/__tests__/data-api-anon-user-id-fallback.test.ts +7 -2
- package/__tests__/data-api-browser-reads.test.ts +7 -0
- package/__tests__/data-api-business-events.test.ts +403 -0
- package/__tests__/data-api-invalid-body.test.ts +7 -0
- package/__tests__/data-api-low-stock-autofire.test.ts +30 -4
- package/__tests__/data-api-optional-feature-columns.test.ts +44 -0
- package/__tests__/data-api-owner-scope-credentials.test.ts +1324 -0
- package/__tests__/data-api-protected-tables.test.ts +48 -15
- package/__tests__/data-api-retired-table-and-account-fields.test.ts +208 -0
- package/__tests__/email-locale-senders.test.ts +5 -3
- package/__tests__/expression-injection.test.ts +343 -0
- package/__tests__/fixtures/admin-file-workflows.json +242 -0
- package/__tests__/form-confirmation-email-template.test.ts +44 -0
- package/__tests__/internal-request-headers.test.ts +25 -0
- package/__tests__/invoice-pdf-service-project-header.test.ts +120 -0
- package/__tests__/invoice-self-call-origin.test.ts +57 -1
- package/__tests__/legacy-webhook-self-calls.test.ts +86 -1
- package/__tests__/middleware-home-route-protection.test.ts +3 -1
- package/__tests__/middleware-subscriber-access.test.ts +1 -1
- package/__tests__/newsletter-admin-route.test.ts +649 -0
- package/__tests__/newsletter-plugin.test.ts +1248 -0
- package/__tests__/outbound-nodes-security.test.ts +1929 -0
- package/__tests__/page-access-guard.test.ts +217 -0
- package/__tests__/page-access-route-table.test.ts +231 -0
- package/__tests__/payment-drivers-module.test.ts +23 -0
- package/__tests__/payment-legacy-webhook-routes.test.ts +100 -5
- package/__tests__/payment-webhook-route.test.ts +4 -1
- package/__tests__/paypal-webhook-signature-verification.test.ts +44 -0
- package/__tests__/place-order-guards.test.ts +506 -0
- package/__tests__/public-step-guards.test.ts +310 -0
- package/__tests__/publish-refusals.test.ts +505 -0
- package/__tests__/realtime-identity-routes.test.ts +492 -0
- package/__tests__/record-event-writer-server-only.test.ts +975 -0
- package/__tests__/resolve-config-template-params.test.ts +3 -3
- package/__tests__/runtime-storage-upload-access.test.ts +280 -17
- package/__tests__/security-integration-env-names.test.ts +74 -0
- package/__tests__/security-lists-parity.test.ts +245 -0
- package/__tests__/security-runtime-shadow.test.ts +224 -1
- package/__tests__/security-runtime.test.ts +893 -0
- package/__tests__/segment-rate-limit-error-branch.test.ts +284 -0
- package/__tests__/segment-route-abuse-gate.test.ts +309 -0
- package/__tests__/server-job-hops-real-data-api.test.ts +669 -0
- package/__tests__/server-session-identity.test.ts +522 -0
- package/__tests__/server-step-chain.test.ts +222 -0
- package/__tests__/server-step-signing.test.ts +107 -2
- package/__tests__/session-cookie-resolver.test.ts +62 -106
- package/__tests__/signup-event.test.ts +649 -0
- package/__tests__/signup-reply-identical.test.ts +144 -0
- package/__tests__/slack-message-escaping.test.ts +123 -0
- package/__tests__/visitor-step-limits.test.ts +318 -0
- package/__tests__/webhook-delivery-lease.test.ts +4 -1
- package/__tests__/webpack-safe-handlers.test.ts +57 -8
- package/__tests__/workflow-auth-guard.test.ts +9 -1
- package/dist/cjs/account-delete-route-generator.d.ts +1 -0
- package/dist/cjs/account-delete-route-generator.d.ts.map +1 -1
- package/dist/cjs/account-delete-route-generator.js +18 -3
- package/dist/cjs/account-delete-route-generator.js.map +1 -1
- package/dist/cjs/api-route-generator.d.ts +52 -3
- package/dist/cjs/api-route-generator.d.ts.map +1 -1
- package/dist/cjs/api-route-generator.js +600 -145
- package/dist/cjs/api-route-generator.js.map +1 -1
- package/dist/cjs/auth-generator.d.ts +126 -3
- package/dist/cjs/auth-generator.d.ts.map +1 -1
- package/dist/cjs/auth-generator.js +1353 -139
- package/dist/cjs/auth-generator.js.map +1 -1
- package/dist/cjs/automations/activity-kicks.d.ts +12 -0
- package/dist/cjs/automations/activity-kicks.d.ts.map +1 -0
- package/dist/cjs/automations/activity-kicks.js +123 -0
- package/dist/cjs/automations/activity-kicks.js.map +1 -0
- package/dist/cjs/automations/app-events-source.d.ts +33 -0
- package/dist/cjs/automations/app-events-source.d.ts.map +1 -0
- package/dist/cjs/automations/app-events-source.js +109 -0
- package/dist/cjs/automations/app-events-source.js.map +1 -0
- package/dist/cjs/automations/automations-project-plugin.d.ts +21 -0
- package/dist/cjs/automations/automations-project-plugin.d.ts.map +1 -0
- package/dist/cjs/automations/automations-project-plugin.js +102 -0
- package/dist/cjs/automations/automations-project-plugin.js.map +1 -0
- package/dist/cjs/automations/automations-scope.d.ts +104 -0
- package/dist/cjs/automations/automations-scope.d.ts.map +1 -0
- package/dist/cjs/automations/automations-scope.js +176 -0
- package/dist/cjs/automations/automations-scope.js.map +1 -0
- package/dist/cjs/automations/dispatcher-source.d.ts +72 -0
- package/dist/cjs/automations/dispatcher-source.d.ts.map +1 -0
- package/dist/cjs/automations/dispatcher-source.js +1008 -0
- package/dist/cjs/automations/dispatcher-source.js.map +1 -0
- package/dist/cjs/automations/event-bus-source.d.ts +44 -0
- package/dist/cjs/automations/event-bus-source.d.ts.map +1 -0
- package/dist/cjs/automations/event-bus-source.js +427 -0
- package/dist/cjs/automations/event-bus-source.js.map +1 -0
- package/dist/cjs/automations/handler-module-generator.d.ts +25 -0
- package/dist/cjs/automations/handler-module-generator.d.ts.map +1 -0
- package/dist/cjs/automations/handler-module-generator.js +78 -0
- package/dist/cjs/automations/handler-module-generator.js.map +1 -0
- package/dist/cjs/automations/hydrators-source.d.ts +33 -0
- package/dist/cjs/automations/hydrators-source.d.ts.map +1 -0
- package/dist/cjs/automations/hydrators-source.js +571 -0
- package/dist/cjs/automations/hydrators-source.js.map +1 -0
- package/dist/cjs/booking-calendar-feed-route-generator.d.ts.map +1 -1
- package/dist/cjs/booking-calendar-feed-route-generator.js +8 -0
- package/dist/cjs/booking-calendar-feed-route-generator.js.map +1 -1
- package/dist/cjs/configured-nextauth-url.d.ts +17 -0
- package/dist/cjs/configured-nextauth-url.d.ts.map +1 -0
- package/dist/cjs/configured-nextauth-url.js +20 -0
- package/dist/cjs/configured-nextauth-url.js.map +1 -0
- package/dist/cjs/cron-request-verification.d.ts +22 -1
- package/dist/cjs/cron-request-verification.d.ts.map +1 -1
- package/dist/cjs/cron-request-verification.js +50 -6
- package/dist/cjs/cron-request-verification.js.map +1 -1
- package/dist/cjs/data-api-route-generator.d.ts +19 -0
- package/dist/cjs/data-api-route-generator.d.ts.map +1 -1
- package/dist/cjs/data-api-route-generator.js +711 -43
- package/dist/cjs/data-api-route-generator.js.map +1 -1
- package/dist/cjs/ecommerce/parameterized-stock-chain.d.ts +3 -1
- package/dist/cjs/ecommerce/parameterized-stock-chain.d.ts.map +1 -1
- package/dist/cjs/ecommerce/parameterized-stock-chain.js +45 -5
- package/dist/cjs/ecommerce/parameterized-stock-chain.js.map +1 -1
- package/dist/cjs/ecommerce/place-order-guards.d.ts +126 -0
- package/dist/cjs/ecommerce/place-order-guards.d.ts.map +1 -0
- package/dist/cjs/ecommerce/place-order-guards.js +670 -0
- package/dist/cjs/ecommerce/place-order-guards.js.map +1 -0
- package/dist/cjs/ecommerce-customhandler-rewriter.d.ts +2 -0
- package/dist/cjs/ecommerce-customhandler-rewriter.d.ts.map +1 -1
- package/dist/cjs/ecommerce-customhandler-rewriter.js +38 -2
- package/dist/cjs/ecommerce-customhandler-rewriter.js.map +1 -1
- package/dist/cjs/executor-generator.d.ts.map +1 -1
- package/dist/cjs/executor-generator.js +368 -60
- package/dist/cjs/executor-generator.js.map +1 -1
- package/dist/cjs/graph-utils.d.ts +9 -0
- package/dist/cjs/graph-utils.d.ts.map +1 -1
- package/dist/cjs/graph-utils.js +32 -1
- package/dist/cjs/graph-utils.js.map +1 -1
- package/dist/cjs/index.d.ts +20 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +72 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/invoice/api-routes-code.d.ts +9 -3
- package/dist/cjs/invoice/api-routes-code.d.ts.map +1 -1
- package/dist/cjs/invoice/api-routes-code.js +9 -7
- package/dist/cjs/invoice/api-routes-code.js.map +1 -1
- package/dist/cjs/invoice/index.d.ts.map +1 -1
- package/dist/cjs/invoice/index.js +12 -7
- package/dist/cjs/invoice/index.js.map +1 -1
- package/dist/cjs/invoice/invoice-assembly-code.d.ts.map +1 -1
- package/dist/cjs/invoice/invoice-assembly-code.js +8 -3
- package/dist/cjs/invoice/invoice-assembly-code.js.map +1 -1
- package/dist/cjs/invoice/pdf-generator-code.d.ts.map +1 -1
- package/dist/cjs/invoice/pdf-generator-code.js +2 -1
- package/dist/cjs/invoice/pdf-generator-code.js.map +1 -1
- package/dist/cjs/invoice/pdf-service-client-code.d.ts.map +1 -1
- package/dist/cjs/invoice/pdf-service-client-code.js +15 -7
- package/dist/cjs/invoice/pdf-service-client-code.js.map +1 -1
- package/dist/cjs/newsletter/admin-route-code.d.ts +60 -0
- package/dist/cjs/newsletter/admin-route-code.d.ts.map +1 -0
- package/dist/cjs/newsletter/admin-route-code.js +300 -0
- package/dist/cjs/newsletter/admin-route-code.js.map +1 -0
- package/dist/cjs/newsletter/helper-code.d.ts +109 -0
- package/dist/cjs/newsletter/helper-code.d.ts.map +1 -0
- package/dist/cjs/newsletter/helper-code.js +662 -0
- package/dist/cjs/newsletter/helper-code.js.map +1 -0
- package/dist/cjs/newsletter/newsletter-scope.d.ts +65 -0
- package/dist/cjs/newsletter/newsletter-scope.d.ts.map +1 -0
- package/dist/cjs/newsletter/newsletter-scope.js +103 -0
- package/dist/cjs/newsletter/newsletter-scope.js.map +1 -0
- package/dist/cjs/newsletter/project-plugin.d.ts +18 -0
- package/dist/cjs/newsletter/project-plugin.d.ts.map +1 -0
- package/dist/cjs/newsletter/project-plugin.js +97 -0
- package/dist/cjs/newsletter/project-plugin.js.map +1 -0
- package/dist/cjs/newsletter/routes-code.d.ts +6 -0
- package/dist/cjs/newsletter/routes-code.d.ts.map +1 -0
- package/dist/cjs/newsletter/routes-code.js +181 -0
- package/dist/cjs/newsletter/routes-code.js.map +1 -0
- package/dist/cjs/nodes/account/account-compare-passwords.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-compare-passwords.js +16 -6
- package/dist/cjs/nodes/account/account-compare-passwords.js.map +1 -1
- package/dist/cjs/nodes/account/account-delete-current.js +1 -1
- package/dist/cjs/nodes/account/account-get-current.js +1 -1
- package/dist/cjs/nodes/account/account-hash-password.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-hash-password.js +15 -3
- package/dist/cjs/nodes/account/account-hash-password.js.map +1 -1
- package/dist/cjs/nodes/account/account-login.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-login.js +23 -6
- package/dist/cjs/nodes/account/account-login.js.map +1 -1
- package/dist/cjs/nodes/account/account-logout.js +1 -1
- package/dist/cjs/nodes/account/account-refresh-session.js +1 -1
- package/dist/cjs/nodes/account/account-request-password-reset.d.ts +3 -0
- package/dist/cjs/nodes/account/account-request-password-reset.d.ts.map +1 -0
- package/dist/cjs/nodes/account/account-request-password-reset.js +46 -0
- package/dist/cjs/nodes/account/account-request-password-reset.js.map +1 -0
- package/dist/cjs/nodes/account/account-reset-password.d.ts +3 -0
- package/dist/cjs/nodes/account/account-reset-password.d.ts.map +1 -0
- package/dist/cjs/nodes/account/account-reset-password.js +44 -0
- package/dist/cjs/nodes/account/account-reset-password.js.map +1 -0
- package/dist/cjs/nodes/account/account-signup.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-signup.js +82 -19
- package/dist/cjs/nodes/account/account-signup.js.map +1 -1
- package/dist/cjs/nodes/account/account-social-login.js +1 -1
- package/dist/cjs/nodes/ai/ai-custom-prompt.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-custom-prompt.js +20 -5
- package/dist/cjs/nodes/ai/ai-custom-prompt.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-detect-language.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-detect-language.js +20 -5
- package/dist/cjs/nodes/ai/ai-detect-language.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-generate-text-embedding.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-generate-text-embedding.js +10 -2
- package/dist/cjs/nodes/ai/ai-generate-text-embedding.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-provider-utils-sources.generated.js +2 -2
- package/dist/cjs/nodes/ai/ai-provider-utils-sources.generated.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-provider-utils.d.ts +31 -2
- package/dist/cjs/nodes/ai/ai-provider-utils.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-provider-utils.js +125 -11
- package/dist/cjs/nodes/ai/ai-provider-utils.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-select-database-data.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-select-database-data.js +6 -2
- package/dist/cjs/nodes/ai/ai-select-database-data.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-sentiment-analysis.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-sentiment-analysis.js +20 -5
- package/dist/cjs/nodes/ai/ai-sentiment-analysis.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-summarization.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-summarization.js +20 -5
- package/dist/cjs/nodes/ai/ai-summarization.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-text-classifier.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-text-classifier.js +20 -5
- package/dist/cjs/nodes/ai/ai-text-classifier.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-text-transform.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-text-transform.js +20 -5
- package/dist/cjs/nodes/ai/ai-text-transform.js.map +1 -1
- package/dist/cjs/nodes/analytics/analytics-track-outcome.d.ts +3 -0
- package/dist/cjs/nodes/analytics/analytics-track-outcome.d.ts.map +1 -0
- package/dist/cjs/nodes/analytics/analytics-track-outcome.js +110 -0
- package/dist/cjs/nodes/analytics/analytics-track-outcome.js.map +1 -0
- package/dist/cjs/nodes/cart/cart-price-order.d.ts.map +1 -1
- package/dist/cjs/nodes/cart/cart-price-order.js +161 -2
- package/dist/cjs/nodes/cart/cart-price-order.js.map +1 -1
- package/dist/cjs/nodes/cost-bearing-node-types.d.ts +4 -0
- package/dist/cjs/nodes/cost-bearing-node-types.d.ts.map +1 -0
- package/dist/cjs/nodes/cost-bearing-node-types.js +43 -0
- package/dist/cjs/nodes/cost-bearing-node-types.js.map +1 -0
- package/dist/cjs/nodes/data/data-select.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-select.js +12 -2
- package/dist/cjs/nodes/data/data-select.js.map +1 -1
- package/dist/cjs/nodes/email/email-mailersend.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-mailersend.js +15 -11
- package/dist/cjs/nodes/email/email-mailersend.js.map +1 -1
- package/dist/cjs/nodes/email/email-mailgun.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-mailgun.js +15 -15
- package/dist/cjs/nodes/email/email-mailgun.js.map +1 -1
- package/dist/cjs/nodes/email/email-postmark.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-postmark.js +15 -15
- package/dist/cjs/nodes/email/email-postmark.js.map +1 -1
- package/dist/cjs/nodes/email/email-resend.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-resend.js +15 -15
- package/dist/cjs/nodes/email/email-resend.js.map +1 -1
- package/dist/cjs/nodes/email/email-sendgrid.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-sendgrid.js +15 -15
- package/dist/cjs/nodes/email/email-sendgrid.js.map +1 -1
- package/dist/cjs/nodes/email/html-escape-code.d.ts +3 -0
- package/dist/cjs/nodes/email/html-escape-code.d.ts.map +1 -0
- package/dist/cjs/nodes/email/html-escape-code.js +23 -0
- package/dist/cjs/nodes/email/html-escape-code.js.map +1 -0
- package/dist/cjs/nodes/email/message-trust.d.ts +40 -0
- package/dist/cjs/nodes/email/message-trust.d.ts.map +1 -0
- package/dist/cjs/nodes/email/message-trust.js +167 -0
- package/dist/cjs/nodes/email/message-trust.js.map +1 -0
- package/dist/cjs/nodes/email/outbound-message-guard.d.ts +113 -0
- package/dist/cjs/nodes/email/outbound-message-guard.d.ts.map +1 -0
- package/dist/cjs/nodes/email/outbound-message-guard.js +460 -0
- package/dist/cjs/nodes/email/outbound-message-guard.js.map +1 -0
- package/dist/cjs/nodes/email/trusted-html-code.d.ts +22 -0
- package/dist/cjs/nodes/email/trusted-html-code.d.ts.map +1 -0
- package/dist/cjs/nodes/email/trusted-html-code.js +52 -0
- package/dist/cjs/nodes/email/trusted-html-code.js.map +1 -0
- package/dist/cjs/nodes/general/general-custom-js.d.ts.map +1 -1
- package/dist/cjs/nodes/general/general-custom-js.js +44 -7
- package/dist/cjs/nodes/general/general-custom-js.js.map +1 -1
- package/dist/cjs/nodes/general/general-http-request.d.ts.map +1 -1
- package/dist/cjs/nodes/general/general-http-request.js +431 -45
- package/dist/cjs/nodes/general/general-http-request.js.map +1 -1
- package/dist/cjs/nodes/general/general-rate-limiter.d.ts.map +1 -1
- package/dist/cjs/nodes/general/general-rate-limiter.js +46 -78
- package/dist/cjs/nodes/general/general-rate-limiter.js.map +1 -1
- package/dist/cjs/nodes/general/general-wait.d.ts +3 -0
- package/dist/cjs/nodes/general/general-wait.d.ts.map +1 -0
- package/dist/cjs/nodes/general/general-wait.js +81 -0
- package/dist/cjs/nodes/general/general-wait.js.map +1 -0
- package/dist/cjs/nodes/general/visitor-request.d.ts +44 -0
- package/dist/cjs/nodes/general/visitor-request.d.ts.map +1 -0
- package/dist/cjs/nodes/general/visitor-request.js +72 -0
- package/dist/cjs/nodes/general/visitor-request.js.map +1 -0
- package/dist/cjs/nodes/index.d.ts.map +1 -1
- package/dist/cjs/nodes/index.js +7 -1
- package/dist/cjs/nodes/index.js.map +1 -1
- package/dist/cjs/nodes/integrations/integration-slack.d.ts.map +1 -1
- package/dist/cjs/nodes/integrations/integration-slack.js +17 -6
- package/dist/cjs/nodes/integrations/integration-slack.js.map +1 -1
- package/dist/cjs/nodes/newsletter/newsletter-confirm.d.ts +3 -0
- package/dist/cjs/nodes/newsletter/newsletter-confirm.d.ts.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-confirm.js +41 -0
- package/dist/cjs/nodes/newsletter/newsletter-confirm.js.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-subscribe.d.ts +7 -0
- package/dist/cjs/nodes/newsletter/newsletter-subscribe.d.ts.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-subscribe.js +69 -0
- package/dist/cjs/nodes/newsletter/newsletter-subscribe.js.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.d.ts +3 -0
- package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.d.ts.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.js +42 -0
- package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.js.map +1 -0
- package/dist/cjs/nodes/realtime/realtime-join-channel.d.ts.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-join-channel.js +5 -4
- package/dist/cjs/nodes/realtime/realtime-join-channel.js.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-send-channel-event.d.ts.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-send-channel-event.js +11 -2
- package/dist/cjs/nodes/realtime/realtime-send-channel-event.js.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-send-channel-message.d.ts.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-send-channel-message.js +11 -2
- package/dist/cjs/nodes/realtime/realtime-send-channel-message.js.map +1 -1
- package/dist/cjs/nodes/sms/sms-infobip.d.ts.map +1 -1
- package/dist/cjs/nodes/sms/sms-infobip.js +11 -8
- package/dist/cjs/nodes/sms/sms-infobip.js.map +1 -1
- package/dist/cjs/nodes/sms/sms-smsapi.d.ts.map +1 -1
- package/dist/cjs/nodes/sms/sms-smsapi.js +11 -8
- package/dist/cjs/nodes/sms/sms-smsapi.js.map +1 -1
- package/dist/cjs/nodes/sms/sms-textmagic.d.ts.map +1 -1
- package/dist/cjs/nodes/sms/sms-textmagic.js +11 -8
- package/dist/cjs/nodes/sms/sms-textmagic.js.map +1 -1
- package/dist/cjs/nodes/sms/sms-twilio.d.ts.map +1 -1
- package/dist/cjs/nodes/sms/sms-twilio.js +12 -10
- package/dist/cjs/nodes/sms/sms-twilio.js.map +1 -1
- package/dist/cjs/nodes/types.d.ts +8 -1
- package/dist/cjs/nodes/types.d.ts.map +1 -1
- package/dist/cjs/nodes/utility/utility-similarity-scoring.d.ts.map +1 -1
- package/dist/cjs/nodes/utility/utility-similarity-scoring.js +29 -10
- package/dist/cjs/nodes/utility/utility-similarity-scoring.js.map +1 -1
- package/dist/cjs/page-access-guard-generator.d.ts +23 -0
- package/dist/cjs/page-access-guard-generator.d.ts.map +1 -0
- package/dist/cjs/page-access-guard-generator.js +135 -0
- package/dist/cjs/page-access-guard-generator.js.map +1 -0
- package/dist/cjs/password-reset-route-generator.d.ts +119 -0
- package/dist/cjs/password-reset-route-generator.d.ts.map +1 -0
- package/dist/cjs/password-reset-route-generator.js +460 -0
- package/dist/cjs/password-reset-route-generator.js.map +1 -0
- package/dist/cjs/payments/payment-core-code.d.ts.map +1 -1
- package/dist/cjs/payments/payment-core-code.js +12 -7
- package/dist/cjs/payments/payment-core-code.js.map +1 -1
- package/dist/cjs/project-code-scanner.d.ts +11 -0
- package/dist/cjs/project-code-scanner.d.ts.map +1 -0
- package/dist/cjs/project-code-scanner.js +80 -0
- package/dist/cjs/project-code-scanner.js.map +1 -0
- package/dist/cjs/public-step-guards.d.ts +122 -0
- package/dist/cjs/public-step-guards.d.ts.map +1 -0
- package/dist/cjs/public-step-guards.js +288 -0
- package/dist/cjs/public-step-guards.js.map +1 -0
- package/dist/cjs/publish-refusals.d.ts +66 -0
- package/dist/cjs/publish-refusals.d.ts.map +1 -0
- package/dist/cjs/publish-refusals.js +278 -0
- package/dist/cjs/publish-refusals.js.map +1 -0
- package/dist/cjs/realtime-generator.d.ts +63 -1
- package/dist/cjs/realtime-generator.d.ts.map +1 -1
- package/dist/cjs/realtime-generator.js +404 -230
- package/dist/cjs/realtime-generator.js.map +1 -1
- package/dist/cjs/runtime-storage-generator.d.ts +32 -1
- package/dist/cjs/runtime-storage-generator.d.ts.map +1 -1
- package/dist/cjs/runtime-storage-generator.js +265 -12
- package/dist/cjs/runtime-storage-generator.js.map +1 -1
- package/dist/cjs/security-runtime/index.d.ts +14 -0
- package/dist/cjs/security-runtime/index.d.ts.map +1 -0
- package/dist/cjs/security-runtime/index.js +48 -0
- package/dist/cjs/security-runtime/index.js.map +1 -0
- package/dist/cjs/security-runtime/security-runtime-code.d.ts +53 -0
- package/dist/cjs/security-runtime/security-runtime-code.d.ts.map +1 -0
- package/dist/cjs/security-runtime/security-runtime-code.js +580 -0
- package/dist/cjs/security-runtime/security-runtime-code.js.map +1 -0
- package/dist/cjs/security-scanner.d.ts +72 -3
- package/dist/cjs/security-scanner.d.ts.map +1 -1
- package/dist/cjs/security-scanner.js +220 -8
- package/dist/cjs/security-scanner.js.map +1 -1
- package/dist/cjs/segment-splitter.d.ts.map +1 -1
- package/dist/cjs/segment-splitter.js +10 -2
- package/dist/cjs/segment-splitter.js.map +1 -1
- package/dist/cjs/segment-trust.d.ts +36 -0
- package/dist/cjs/segment-trust.d.ts.map +1 -1
- package/dist/cjs/segment-trust.js +147 -3
- package/dist/cjs/segment-trust.js.map +1 -1
- package/dist/cjs/self-call-headers.d.ts +31 -0
- package/dist/cjs/self-call-headers.d.ts.map +1 -0
- package/dist/cjs/self-call-headers.js +48 -0
- package/dist/cjs/self-call-headers.js.map +1 -0
- package/dist/cjs/sent-email-log/index.d.ts +7 -0
- package/dist/cjs/sent-email-log/index.d.ts.map +1 -1
- package/dist/cjs/sent-email-log/index.js +17 -1
- package/dist/cjs/sent-email-log/index.js.map +1 -1
- package/dist/cjs/sent-email-log/sent-email-log-code.d.ts +7 -0
- package/dist/cjs/sent-email-log/sent-email-log-code.d.ts.map +1 -1
- package/dist/cjs/sent-email-log/sent-email-log-code.js +17 -3
- package/dist/cjs/sent-email-log/sent-email-log-code.js.map +1 -1
- package/dist/cjs/server-custom-node-call.d.ts +79 -0
- package/dist/cjs/server-custom-node-call.d.ts.map +1 -0
- package/dist/cjs/server-custom-node-call.js +285 -0
- package/dist/cjs/server-custom-node-call.js.map +1 -0
- package/dist/cjs/server-runtime-code.d.ts +39 -12
- package/dist/cjs/server-runtime-code.d.ts.map +1 -1
- package/dist/cjs/server-runtime-code.js +484 -41
- package/dist/cjs/server-runtime-code.js.map +1 -1
- package/dist/cjs/session-cookie-resolver.d.ts +3 -1
- package/dist/cjs/session-cookie-resolver.d.ts.map +1 -1
- package/dist/cjs/session-revocation-generator.d.ts +39 -0
- package/dist/cjs/session-revocation-generator.d.ts.map +1 -0
- package/dist/cjs/session-revocation-generator.js +177 -0
- package/dist/cjs/session-revocation-generator.js.map +1 -0
- package/dist/cjs/slack-message-values.d.ts +6 -0
- package/dist/cjs/slack-message-values.d.ts.map +1 -0
- package/dist/cjs/slack-message-values.js +73 -0
- package/dist/cjs/slack-message-values.js.map +1 -0
- package/dist/cjs/transactional-email-code.d.ts +11 -0
- package/dist/cjs/transactional-email-code.d.ts.map +1 -1
- package/dist/cjs/transactional-email-code.js +29 -5
- package/dist/cjs/transactional-email-code.js.map +1 -1
- package/dist/cjs/trigger-generator.d.ts +2 -0
- package/dist/cjs/trigger-generator.d.ts.map +1 -1
- package/dist/cjs/trigger-generator.js +17 -4
- package/dist/cjs/trigger-generator.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/visitor-step-limits.d.ts +66 -0
- package/dist/cjs/visitor-step-limits.d.ts.map +1 -0
- package/dist/cjs/visitor-step-limits.js +187 -0
- package/dist/cjs/visitor-step-limits.js.map +1 -0
- package/dist/cjs/webhook-generator.d.ts.map +1 -1
- package/dist/cjs/webhook-generator.js +93 -15
- package/dist/cjs/webhook-generator.js.map +1 -1
- package/dist/cjs/webhook-signature-verification.d.ts.map +1 -1
- package/dist/cjs/webhook-signature-verification.js +13 -3
- package/dist/cjs/webhook-signature-verification.js.map +1 -1
- package/dist/cjs/workflow-auth-generator.d.ts +4 -1
- package/dist/cjs/workflow-auth-generator.d.ts.map +1 -1
- package/dist/cjs/workflow-auth-generator.js +8 -3
- package/dist/cjs/workflow-auth-generator.js.map +1 -1
- package/dist/cjs/workflow-component-plugin.js +11 -3
- package/dist/cjs/workflow-component-plugin.js.map +1 -1
- package/dist/cjs/workflow-project-plugin.d.ts.map +1 -1
- package/dist/cjs/workflow-project-plugin.js +302 -56
- package/dist/cjs/workflow-project-plugin.js.map +1 -1
- package/dist/cjs/workflow-scope.d.ts.map +1 -1
- package/dist/cjs/workflow-scope.js +5 -0
- package/dist/cjs/workflow-scope.js.map +1 -1
- package/dist/esm/account-delete-route-generator.d.ts +1 -0
- package/dist/esm/account-delete-route-generator.d.ts.map +1 -1
- package/dist/esm/account-delete-route-generator.js +18 -3
- package/dist/esm/account-delete-route-generator.js.map +1 -1
- package/dist/esm/api-route-generator.d.ts +52 -3
- package/dist/esm/api-route-generator.d.ts.map +1 -1
- package/dist/esm/api-route-generator.js +595 -142
- package/dist/esm/api-route-generator.js.map +1 -1
- package/dist/esm/auth-generator.d.ts +126 -3
- package/dist/esm/auth-generator.d.ts.map +1 -1
- package/dist/esm/auth-generator.js +1350 -140
- package/dist/esm/auth-generator.js.map +1 -1
- package/dist/esm/automations/activity-kicks.d.ts +12 -0
- package/dist/esm/automations/activity-kicks.d.ts.map +1 -0
- package/dist/esm/automations/activity-kicks.js +118 -0
- package/dist/esm/automations/activity-kicks.js.map +1 -0
- package/dist/esm/automations/app-events-source.d.ts +33 -0
- package/dist/esm/automations/app-events-source.d.ts.map +1 -0
- package/dist/esm/automations/app-events-source.js +104 -0
- package/dist/esm/automations/app-events-source.js.map +1 -0
- package/dist/esm/automations/automations-project-plugin.d.ts +21 -0
- package/dist/esm/automations/automations-project-plugin.d.ts.map +1 -0
- package/dist/esm/automations/automations-project-plugin.js +98 -0
- package/dist/esm/automations/automations-project-plugin.js.map +1 -0
- package/dist/esm/automations/automations-scope.d.ts +104 -0
- package/dist/esm/automations/automations-scope.d.ts.map +1 -0
- package/dist/esm/automations/automations-scope.js +165 -0
- package/dist/esm/automations/automations-scope.js.map +1 -0
- package/dist/esm/automations/dispatcher-source.d.ts +72 -0
- package/dist/esm/automations/dispatcher-source.d.ts.map +1 -0
- package/dist/esm/automations/dispatcher-source.js +999 -0
- package/dist/esm/automations/dispatcher-source.js.map +1 -0
- package/dist/esm/automations/event-bus-source.d.ts +44 -0
- package/dist/esm/automations/event-bus-source.d.ts.map +1 -0
- package/dist/esm/automations/event-bus-source.js +421 -0
- package/dist/esm/automations/event-bus-source.js.map +1 -0
- package/dist/esm/automations/handler-module-generator.d.ts +25 -0
- package/dist/esm/automations/handler-module-generator.d.ts.map +1 -0
- package/dist/esm/automations/handler-module-generator.js +71 -0
- package/dist/esm/automations/handler-module-generator.js.map +1 -0
- package/dist/esm/automations/hydrators-source.d.ts +33 -0
- package/dist/esm/automations/hydrators-source.d.ts.map +1 -0
- package/dist/esm/automations/hydrators-source.js +567 -0
- package/dist/esm/automations/hydrators-source.js.map +1 -0
- package/dist/esm/booking-calendar-feed-route-generator.d.ts.map +1 -1
- package/dist/esm/booking-calendar-feed-route-generator.js +8 -0
- package/dist/esm/booking-calendar-feed-route-generator.js.map +1 -1
- package/dist/esm/configured-nextauth-url.d.ts +17 -0
- package/dist/esm/configured-nextauth-url.d.ts.map +1 -0
- package/dist/esm/configured-nextauth-url.js +17 -0
- package/dist/esm/configured-nextauth-url.js.map +1 -0
- package/dist/esm/cron-request-verification.d.ts +22 -1
- package/dist/esm/cron-request-verification.d.ts.map +1 -1
- package/dist/esm/cron-request-verification.js +48 -5
- package/dist/esm/cron-request-verification.js.map +1 -1
- package/dist/esm/data-api-route-generator.d.ts +19 -0
- package/dist/esm/data-api-route-generator.d.ts.map +1 -1
- package/dist/esm/data-api-route-generator.js +710 -43
- package/dist/esm/data-api-route-generator.js.map +1 -1
- package/dist/esm/ecommerce/parameterized-stock-chain.d.ts +3 -1
- package/dist/esm/ecommerce/parameterized-stock-chain.d.ts.map +1 -1
- package/dist/esm/ecommerce/parameterized-stock-chain.js +43 -4
- package/dist/esm/ecommerce/parameterized-stock-chain.js.map +1 -1
- package/dist/esm/ecommerce/place-order-guards.d.ts +126 -0
- package/dist/esm/ecommerce/place-order-guards.d.ts.map +1 -0
- package/dist/esm/ecommerce/place-order-guards.js +655 -0
- package/dist/esm/ecommerce/place-order-guards.js.map +1 -0
- package/dist/esm/ecommerce-customhandler-rewriter.d.ts +2 -0
- package/dist/esm/ecommerce-customhandler-rewriter.d.ts.map +1 -1
- package/dist/esm/ecommerce-customhandler-rewriter.js +38 -2
- package/dist/esm/ecommerce-customhandler-rewriter.js.map +1 -1
- package/dist/esm/executor-generator.d.ts.map +1 -1
- package/dist/esm/executor-generator.js +368 -60
- package/dist/esm/executor-generator.js.map +1 -1
- package/dist/esm/graph-utils.d.ts +9 -0
- package/dist/esm/graph-utils.d.ts.map +1 -1
- package/dist/esm/graph-utils.js +30 -0
- package/dist/esm/graph-utils.js.map +1 -1
- package/dist/esm/index.d.ts +20 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +27 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/invoice/api-routes-code.d.ts +9 -3
- package/dist/esm/invoice/api-routes-code.d.ts.map +1 -1
- package/dist/esm/invoice/api-routes-code.js +9 -7
- package/dist/esm/invoice/api-routes-code.js.map +1 -1
- package/dist/esm/invoice/index.d.ts.map +1 -1
- package/dist/esm/invoice/index.js +12 -7
- package/dist/esm/invoice/index.js.map +1 -1
- package/dist/esm/invoice/invoice-assembly-code.d.ts.map +1 -1
- package/dist/esm/invoice/invoice-assembly-code.js +8 -3
- package/dist/esm/invoice/invoice-assembly-code.js.map +1 -1
- package/dist/esm/invoice/pdf-generator-code.d.ts.map +1 -1
- package/dist/esm/invoice/pdf-generator-code.js +2 -1
- package/dist/esm/invoice/pdf-generator-code.js.map +1 -1
- package/dist/esm/invoice/pdf-service-client-code.d.ts.map +1 -1
- package/dist/esm/invoice/pdf-service-client-code.js +15 -7
- package/dist/esm/invoice/pdf-service-client-code.js.map +1 -1
- package/dist/esm/newsletter/admin-route-code.d.ts +60 -0
- package/dist/esm/newsletter/admin-route-code.d.ts.map +1 -0
- package/dist/esm/newsletter/admin-route-code.js +295 -0
- package/dist/esm/newsletter/admin-route-code.js.map +1 -0
- package/dist/esm/newsletter/helper-code.d.ts +109 -0
- package/dist/esm/newsletter/helper-code.d.ts.map +1 -0
- package/dist/esm/newsletter/helper-code.js +656 -0
- package/dist/esm/newsletter/helper-code.js.map +1 -0
- package/dist/esm/newsletter/newsletter-scope.d.ts +65 -0
- package/dist/esm/newsletter/newsletter-scope.d.ts.map +1 -0
- package/dist/esm/newsletter/newsletter-scope.js +97 -0
- package/dist/esm/newsletter/newsletter-scope.js.map +1 -0
- package/dist/esm/newsletter/project-plugin.d.ts +18 -0
- package/dist/esm/newsletter/project-plugin.d.ts.map +1 -0
- package/dist/esm/newsletter/project-plugin.js +93 -0
- package/dist/esm/newsletter/project-plugin.js.map +1 -0
- package/dist/esm/newsletter/routes-code.d.ts +6 -0
- package/dist/esm/newsletter/routes-code.d.ts.map +1 -0
- package/dist/esm/newsletter/routes-code.js +175 -0
- package/dist/esm/newsletter/routes-code.js.map +1 -0
- package/dist/esm/nodes/account/account-compare-passwords.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-compare-passwords.js +16 -6
- package/dist/esm/nodes/account/account-compare-passwords.js.map +1 -1
- package/dist/esm/nodes/account/account-delete-current.js +1 -1
- package/dist/esm/nodes/account/account-get-current.js +1 -1
- package/dist/esm/nodes/account/account-hash-password.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-hash-password.js +15 -3
- package/dist/esm/nodes/account/account-hash-password.js.map +1 -1
- package/dist/esm/nodes/account/account-login.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-login.js +23 -6
- package/dist/esm/nodes/account/account-login.js.map +1 -1
- package/dist/esm/nodes/account/account-logout.js +1 -1
- package/dist/esm/nodes/account/account-refresh-session.js +1 -1
- package/dist/esm/nodes/account/account-request-password-reset.d.ts +3 -0
- package/dist/esm/nodes/account/account-request-password-reset.d.ts.map +1 -0
- package/dist/esm/nodes/account/account-request-password-reset.js +43 -0
- package/dist/esm/nodes/account/account-request-password-reset.js.map +1 -0
- package/dist/esm/nodes/account/account-reset-password.d.ts +3 -0
- package/dist/esm/nodes/account/account-reset-password.d.ts.map +1 -0
- package/dist/esm/nodes/account/account-reset-password.js +41 -0
- package/dist/esm/nodes/account/account-reset-password.js.map +1 -0
- package/dist/esm/nodes/account/account-signup.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-signup.js +82 -19
- package/dist/esm/nodes/account/account-signup.js.map +1 -1
- package/dist/esm/nodes/account/account-social-login.js +1 -1
- package/dist/esm/nodes/ai/ai-custom-prompt.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-custom-prompt.js +20 -5
- package/dist/esm/nodes/ai/ai-custom-prompt.js.map +1 -1
- package/dist/esm/nodes/ai/ai-detect-language.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-detect-language.js +20 -5
- package/dist/esm/nodes/ai/ai-detect-language.js.map +1 -1
- package/dist/esm/nodes/ai/ai-generate-text-embedding.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-generate-text-embedding.js +10 -2
- package/dist/esm/nodes/ai/ai-generate-text-embedding.js.map +1 -1
- package/dist/esm/nodes/ai/ai-provider-utils-sources.generated.js +2 -2
- package/dist/esm/nodes/ai/ai-provider-utils-sources.generated.js.map +1 -1
- package/dist/esm/nodes/ai/ai-provider-utils.d.ts +31 -2
- package/dist/esm/nodes/ai/ai-provider-utils.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-provider-utils.js +124 -10
- package/dist/esm/nodes/ai/ai-provider-utils.js.map +1 -1
- package/dist/esm/nodes/ai/ai-select-database-data.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-select-database-data.js +6 -2
- package/dist/esm/nodes/ai/ai-select-database-data.js.map +1 -1
- package/dist/esm/nodes/ai/ai-sentiment-analysis.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-sentiment-analysis.js +20 -5
- package/dist/esm/nodes/ai/ai-sentiment-analysis.js.map +1 -1
- package/dist/esm/nodes/ai/ai-summarization.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-summarization.js +20 -5
- package/dist/esm/nodes/ai/ai-summarization.js.map +1 -1
- package/dist/esm/nodes/ai/ai-text-classifier.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-text-classifier.js +20 -5
- package/dist/esm/nodes/ai/ai-text-classifier.js.map +1 -1
- package/dist/esm/nodes/ai/ai-text-transform.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-text-transform.js +20 -5
- package/dist/esm/nodes/ai/ai-text-transform.js.map +1 -1
- package/dist/esm/nodes/analytics/analytics-track-outcome.d.ts +3 -0
- package/dist/esm/nodes/analytics/analytics-track-outcome.d.ts.map +1 -0
- package/dist/esm/nodes/analytics/analytics-track-outcome.js +107 -0
- package/dist/esm/nodes/analytics/analytics-track-outcome.js.map +1 -0
- package/dist/esm/nodes/cart/cart-price-order.d.ts.map +1 -1
- package/dist/esm/nodes/cart/cart-price-order.js +161 -2
- package/dist/esm/nodes/cart/cart-price-order.js.map +1 -1
- package/dist/esm/nodes/cost-bearing-node-types.d.ts +4 -0
- package/dist/esm/nodes/cost-bearing-node-types.d.ts.map +1 -0
- package/dist/esm/nodes/cost-bearing-node-types.js +39 -0
- package/dist/esm/nodes/cost-bearing-node-types.js.map +1 -0
- package/dist/esm/nodes/data/data-select.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-select.js +12 -2
- package/dist/esm/nodes/data/data-select.js.map +1 -1
- package/dist/esm/nodes/email/email-mailersend.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-mailersend.js +15 -11
- package/dist/esm/nodes/email/email-mailersend.js.map +1 -1
- package/dist/esm/nodes/email/email-mailgun.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-mailgun.js +15 -15
- package/dist/esm/nodes/email/email-mailgun.js.map +1 -1
- package/dist/esm/nodes/email/email-postmark.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-postmark.js +15 -15
- package/dist/esm/nodes/email/email-postmark.js.map +1 -1
- package/dist/esm/nodes/email/email-resend.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-resend.js +15 -15
- package/dist/esm/nodes/email/email-resend.js.map +1 -1
- package/dist/esm/nodes/email/email-sendgrid.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-sendgrid.js +15 -15
- package/dist/esm/nodes/email/email-sendgrid.js.map +1 -1
- package/dist/esm/nodes/email/html-escape-code.d.ts +3 -0
- package/dist/esm/nodes/email/html-escape-code.d.ts.map +1 -0
- package/dist/esm/nodes/email/html-escape-code.js +18 -0
- package/dist/esm/nodes/email/html-escape-code.js.map +1 -0
- package/dist/esm/nodes/email/message-trust.d.ts +40 -0
- package/dist/esm/nodes/email/message-trust.d.ts.map +1 -0
- package/dist/esm/nodes/email/message-trust.js +161 -0
- package/dist/esm/nodes/email/message-trust.js.map +1 -0
- package/dist/esm/nodes/email/outbound-message-guard.d.ts +113 -0
- package/dist/esm/nodes/email/outbound-message-guard.d.ts.map +1 -0
- package/dist/esm/nodes/email/outbound-message-guard.js +452 -0
- package/dist/esm/nodes/email/outbound-message-guard.js.map +1 -0
- package/dist/esm/nodes/email/trusted-html-code.d.ts +22 -0
- package/dist/esm/nodes/email/trusted-html-code.d.ts.map +1 -0
- package/dist/esm/nodes/email/trusted-html-code.js +49 -0
- package/dist/esm/nodes/email/trusted-html-code.js.map +1 -0
- package/dist/esm/nodes/general/general-custom-js.d.ts.map +1 -1
- package/dist/esm/nodes/general/general-custom-js.js +44 -7
- package/dist/esm/nodes/general/general-custom-js.js.map +1 -1
- package/dist/esm/nodes/general/general-http-request.d.ts.map +1 -1
- package/dist/esm/nodes/general/general-http-request.js +431 -45
- package/dist/esm/nodes/general/general-http-request.js.map +1 -1
- package/dist/esm/nodes/general/general-rate-limiter.d.ts.map +1 -1
- package/dist/esm/nodes/general/general-rate-limiter.js +46 -78
- package/dist/esm/nodes/general/general-rate-limiter.js.map +1 -1
- package/dist/esm/nodes/general/general-wait.d.ts +3 -0
- package/dist/esm/nodes/general/general-wait.d.ts.map +1 -0
- package/dist/esm/nodes/general/general-wait.js +78 -0
- package/dist/esm/nodes/general/general-wait.js.map +1 -0
- package/dist/esm/nodes/general/visitor-request.d.ts +44 -0
- package/dist/esm/nodes/general/visitor-request.d.ts.map +1 -0
- package/dist/esm/nodes/general/visitor-request.js +65 -0
- package/dist/esm/nodes/general/visitor-request.js.map +1 -0
- package/dist/esm/nodes/index.d.ts.map +1 -1
- package/dist/esm/nodes/index.js +7 -1
- package/dist/esm/nodes/index.js.map +1 -1
- package/dist/esm/nodes/integrations/integration-slack.d.ts.map +1 -1
- package/dist/esm/nodes/integrations/integration-slack.js +17 -6
- package/dist/esm/nodes/integrations/integration-slack.js.map +1 -1
- package/dist/esm/nodes/newsletter/newsletter-confirm.d.ts +3 -0
- package/dist/esm/nodes/newsletter/newsletter-confirm.d.ts.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-confirm.js +38 -0
- package/dist/esm/nodes/newsletter/newsletter-confirm.js.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-subscribe.d.ts +7 -0
- package/dist/esm/nodes/newsletter/newsletter-subscribe.d.ts.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-subscribe.js +66 -0
- package/dist/esm/nodes/newsletter/newsletter-subscribe.js.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-unsubscribe.d.ts +3 -0
- package/dist/esm/nodes/newsletter/newsletter-unsubscribe.d.ts.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-unsubscribe.js +39 -0
- package/dist/esm/nodes/newsletter/newsletter-unsubscribe.js.map +1 -0
- package/dist/esm/nodes/realtime/realtime-join-channel.d.ts.map +1 -1
- package/dist/esm/nodes/realtime/realtime-join-channel.js +5 -4
- package/dist/esm/nodes/realtime/realtime-join-channel.js.map +1 -1
- package/dist/esm/nodes/realtime/realtime-send-channel-event.d.ts.map +1 -1
- package/dist/esm/nodes/realtime/realtime-send-channel-event.js +11 -2
- package/dist/esm/nodes/realtime/realtime-send-channel-event.js.map +1 -1
- package/dist/esm/nodes/realtime/realtime-send-channel-message.d.ts.map +1 -1
- package/dist/esm/nodes/realtime/realtime-send-channel-message.js +11 -2
- package/dist/esm/nodes/realtime/realtime-send-channel-message.js.map +1 -1
- package/dist/esm/nodes/sms/sms-infobip.d.ts.map +1 -1
- package/dist/esm/nodes/sms/sms-infobip.js +11 -8
- package/dist/esm/nodes/sms/sms-infobip.js.map +1 -1
- package/dist/esm/nodes/sms/sms-smsapi.d.ts.map +1 -1
- package/dist/esm/nodes/sms/sms-smsapi.js +11 -8
- package/dist/esm/nodes/sms/sms-smsapi.js.map +1 -1
- package/dist/esm/nodes/sms/sms-textmagic.d.ts.map +1 -1
- package/dist/esm/nodes/sms/sms-textmagic.js +11 -8
- package/dist/esm/nodes/sms/sms-textmagic.js.map +1 -1
- package/dist/esm/nodes/sms/sms-twilio.d.ts.map +1 -1
- package/dist/esm/nodes/sms/sms-twilio.js +12 -10
- package/dist/esm/nodes/sms/sms-twilio.js.map +1 -1
- package/dist/esm/nodes/types.d.ts +8 -1
- package/dist/esm/nodes/types.d.ts.map +1 -1
- package/dist/esm/nodes/utility/utility-similarity-scoring.d.ts.map +1 -1
- package/dist/esm/nodes/utility/utility-similarity-scoring.js +29 -10
- package/dist/esm/nodes/utility/utility-similarity-scoring.js.map +1 -1
- package/dist/esm/page-access-guard-generator.d.ts +23 -0
- package/dist/esm/page-access-guard-generator.d.ts.map +1 -0
- package/dist/esm/page-access-guard-generator.js +131 -0
- package/dist/esm/page-access-guard-generator.js.map +1 -0
- package/dist/esm/password-reset-route-generator.d.ts +119 -0
- package/dist/esm/password-reset-route-generator.d.ts.map +1 -0
- package/dist/esm/password-reset-route-generator.js +448 -0
- package/dist/esm/password-reset-route-generator.js.map +1 -0
- package/dist/esm/payments/payment-core-code.d.ts.map +1 -1
- package/dist/esm/payments/payment-core-code.js +12 -7
- package/dist/esm/payments/payment-core-code.js.map +1 -1
- package/dist/esm/project-code-scanner.d.ts +11 -0
- package/dist/esm/project-code-scanner.d.ts.map +1 -0
- package/dist/esm/project-code-scanner.js +75 -0
- package/dist/esm/project-code-scanner.js.map +1 -0
- package/dist/esm/public-step-guards.d.ts +122 -0
- package/dist/esm/public-step-guards.d.ts.map +1 -0
- package/dist/esm/public-step-guards.js +280 -0
- package/dist/esm/public-step-guards.js.map +1 -0
- package/dist/esm/publish-refusals.d.ts +66 -0
- package/dist/esm/publish-refusals.d.ts.map +1 -0
- package/dist/esm/publish-refusals.js +271 -0
- package/dist/esm/publish-refusals.js.map +1 -0
- package/dist/esm/realtime-generator.d.ts +63 -1
- package/dist/esm/realtime-generator.d.ts.map +1 -1
- package/dist/esm/realtime-generator.js +401 -229
- package/dist/esm/realtime-generator.js.map +1 -1
- package/dist/esm/runtime-storage-generator.d.ts +32 -1
- package/dist/esm/runtime-storage-generator.d.ts.map +1 -1
- package/dist/esm/runtime-storage-generator.js +264 -11
- package/dist/esm/runtime-storage-generator.js.map +1 -1
- package/dist/esm/security-runtime/index.d.ts +14 -0
- package/dist/esm/security-runtime/index.d.ts.map +1 -0
- package/dist/esm/security-runtime/index.js +37 -0
- package/dist/esm/security-runtime/index.js.map +1 -0
- package/dist/esm/security-runtime/security-runtime-code.d.ts +53 -0
- package/dist/esm/security-runtime/security-runtime-code.d.ts.map +1 -0
- package/dist/esm/security-runtime/security-runtime-code.js +575 -0
- package/dist/esm/security-runtime/security-runtime-code.js.map +1 -0
- package/dist/esm/security-scanner.d.ts +72 -3
- package/dist/esm/security-scanner.d.ts.map +1 -1
- package/dist/esm/security-scanner.js +217 -8
- package/dist/esm/security-scanner.js.map +1 -1
- package/dist/esm/segment-splitter.d.ts.map +1 -1
- package/dist/esm/segment-splitter.js +10 -2
- package/dist/esm/segment-splitter.js.map +1 -1
- package/dist/esm/segment-trust.d.ts +36 -0
- package/dist/esm/segment-trust.d.ts.map +1 -1
- package/dist/esm/segment-trust.js +146 -2
- package/dist/esm/segment-trust.js.map +1 -1
- package/dist/esm/self-call-headers.d.ts +31 -0
- package/dist/esm/self-call-headers.d.ts.map +1 -0
- package/dist/esm/self-call-headers.js +43 -0
- package/dist/esm/self-call-headers.js.map +1 -0
- package/dist/esm/sent-email-log/index.d.ts +7 -0
- package/dist/esm/sent-email-log/index.d.ts.map +1 -1
- package/dist/esm/sent-email-log/index.js +15 -0
- package/dist/esm/sent-email-log/index.js.map +1 -1
- package/dist/esm/sent-email-log/sent-email-log-code.d.ts +7 -0
- package/dist/esm/sent-email-log/sent-email-log-code.d.ts.map +1 -1
- package/dist/esm/sent-email-log/sent-email-log-code.js +17 -3
- package/dist/esm/sent-email-log/sent-email-log-code.js.map +1 -1
- package/dist/esm/server-custom-node-call.d.ts +79 -0
- package/dist/esm/server-custom-node-call.d.ts.map +1 -0
- package/dist/esm/server-custom-node-call.js +278 -0
- package/dist/esm/server-custom-node-call.js.map +1 -0
- package/dist/esm/server-runtime-code.d.ts +39 -12
- package/dist/esm/server-runtime-code.d.ts.map +1 -1
- package/dist/esm/server-runtime-code.js +483 -40
- package/dist/esm/server-runtime-code.js.map +1 -1
- package/dist/esm/session-cookie-resolver.d.ts +3 -1
- package/dist/esm/session-cookie-resolver.d.ts.map +1 -1
- package/dist/esm/session-revocation-generator.d.ts +39 -0
- package/dist/esm/session-revocation-generator.d.ts.map +1 -0
- package/dist/esm/session-revocation-generator.js +172 -0
- package/dist/esm/session-revocation-generator.js.map +1 -0
- package/dist/esm/slack-message-values.d.ts +6 -0
- package/dist/esm/slack-message-values.d.ts.map +1 -0
- package/dist/esm/slack-message-values.js +68 -0
- package/dist/esm/slack-message-values.js.map +1 -0
- package/dist/esm/transactional-email-code.d.ts +11 -0
- package/dist/esm/transactional-email-code.d.ts.map +1 -1
- package/dist/esm/transactional-email-code.js +28 -4
- package/dist/esm/transactional-email-code.js.map +1 -1
- package/dist/esm/trigger-generator.d.ts +2 -0
- package/dist/esm/trigger-generator.d.ts.map +1 -1
- package/dist/esm/trigger-generator.js +15 -3
- package/dist/esm/trigger-generator.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/visitor-step-limits.d.ts +66 -0
- package/dist/esm/visitor-step-limits.d.ts.map +1 -0
- package/dist/esm/visitor-step-limits.js +181 -0
- package/dist/esm/visitor-step-limits.js.map +1 -0
- package/dist/esm/webhook-generator.d.ts.map +1 -1
- package/dist/esm/webhook-generator.js +93 -15
- package/dist/esm/webhook-generator.js.map +1 -1
- package/dist/esm/webhook-signature-verification.d.ts.map +1 -1
- package/dist/esm/webhook-signature-verification.js +13 -3
- package/dist/esm/webhook-signature-verification.js.map +1 -1
- package/dist/esm/workflow-auth-generator.d.ts +4 -1
- package/dist/esm/workflow-auth-generator.d.ts.map +1 -1
- package/dist/esm/workflow-auth-generator.js +8 -3
- package/dist/esm/workflow-auth-generator.js.map +1 -1
- package/dist/esm/workflow-component-plugin.js +12 -4
- package/dist/esm/workflow-component-plugin.js.map +1 -1
- package/dist/esm/workflow-project-plugin.d.ts.map +1 -1
- package/dist/esm/workflow-project-plugin.js +306 -60
- package/dist/esm/workflow-project-plugin.js.map +1 -1
- package/dist/esm/workflow-scope.d.ts.map +1 -1
- package/dist/esm/workflow-scope.js +5 -0
- package/dist/esm/workflow-scope.js.map +1 -1
- package/package.json +4 -4
- package/src/account-delete-route-generator.ts +28 -4
- package/src/api-route-generator.ts +712 -134
- package/src/auth-generator.ts +1471 -142
- package/src/automations/activity-kicks.ts +139 -0
- package/src/automations/app-events-source.ts +117 -0
- package/src/automations/automations-project-plugin.ts +202 -0
- package/src/automations/automations-scope.ts +196 -0
- package/src/automations/dispatcher-source.ts +1072 -0
- package/src/automations/event-bus-source.ts +428 -0
- package/src/automations/handler-module-generator.ts +107 -0
- package/src/automations/hydrators-source.ts +647 -0
- package/src/booking-calendar-feed-route-generator.ts +8 -0
- package/src/configured-nextauth-url.ts +17 -0
- package/src/cron-request-verification.ts +55 -5
- package/src/data-api-route-generator.ts +780 -43
- package/src/ecommerce/parameterized-stock-chain.ts +52 -5
- package/src/ecommerce/place-order-guards.ts +785 -0
- package/src/ecommerce-customhandler-rewriter.ts +55 -2
- package/src/executor-generator.ts +372 -60
- package/src/graph-utils.ts +33 -0
- package/src/index.ts +70 -0
- package/src/invoice/api-routes-code.ts +20 -7
- package/src/invoice/index.ts +11 -6
- package/src/invoice/invoice-assembly-code.ts +8 -3
- package/src/invoice/pdf-generator-code.ts +2 -1
- package/src/invoice/pdf-service-client-code.ts +15 -7
- package/src/newsletter/admin-route-code.ts +319 -0
- package/src/newsletter/helper-code.ts +748 -0
- package/src/newsletter/newsletter-scope.ts +116 -0
- package/src/newsletter/project-plugin.ts +119 -0
- package/src/newsletter/routes-code.ts +186 -0
- package/src/nodes/account/account-compare-passwords.ts +17 -6
- package/src/nodes/account/account-delete-current.ts +1 -1
- package/src/nodes/account/account-get-current.ts +1 -1
- package/src/nodes/account/account-hash-password.ts +19 -3
- package/src/nodes/account/account-login.ts +24 -7
- package/src/nodes/account/account-logout.ts +1 -1
- package/src/nodes/account/account-refresh-session.ts +1 -1
- package/src/nodes/account/account-request-password-reset.ts +47 -0
- package/src/nodes/account/account-reset-password.ts +45 -0
- package/src/nodes/account/account-signup.ts +86 -20
- package/src/nodes/account/account-social-login.ts +1 -1
- package/src/nodes/ai/ai-custom-prompt.ts +25 -6
- package/src/nodes/ai/ai-detect-language.ts +25 -6
- package/src/nodes/ai/ai-generate-text-embedding.ts +16 -3
- package/src/nodes/ai/ai-provider-utils-sources.generated.ts +2 -2
- package/src/nodes/ai/ai-provider-utils.ts +135 -10
- package/src/nodes/ai/ai-select-database-data.ts +8 -3
- package/src/nodes/ai/ai-sentiment-analysis.ts +25 -6
- package/src/nodes/ai/ai-summarization.ts +25 -6
- package/src/nodes/ai/ai-text-classifier.ts +25 -6
- package/src/nodes/ai/ai-text-transform.ts +25 -6
- package/src/nodes/analytics/analytics-track-outcome.ts +111 -0
- package/src/nodes/cart/cart-price-order.ts +200 -2
- package/src/nodes/cost-bearing-node-types.ts +45 -0
- package/src/nodes/data/data-select.ts +11 -2
- package/src/nodes/email/email-mailersend.ts +16 -8
- package/src/nodes/email/email-mailgun.ts +17 -12
- package/src/nodes/email/email-postmark.ts +17 -12
- package/src/nodes/email/email-resend.ts +17 -12
- package/src/nodes/email/email-sendgrid.ts +17 -12
- package/src/nodes/email/html-escape-code.ts +21 -0
- package/src/nodes/email/message-trust.ts +198 -0
- package/src/nodes/email/outbound-message-guard.ts +572 -0
- package/src/nodes/email/trusted-html-code.ts +49 -0
- package/src/nodes/general/general-custom-js.ts +46 -7
- package/src/nodes/general/general-http-request.ts +449 -46
- package/src/nodes/general/general-rate-limiter.ts +54 -81
- package/src/nodes/general/general-wait.ts +80 -0
- package/src/nodes/general/visitor-request.ts +79 -0
- package/src/nodes/index.ts +12 -0
- package/src/nodes/integrations/integration-slack.ts +21 -6
- package/src/nodes/newsletter/newsletter-confirm.ts +44 -0
- package/src/nodes/newsletter/newsletter-subscribe.ts +78 -0
- package/src/nodes/newsletter/newsletter-unsubscribe.ts +43 -0
- package/src/nodes/realtime/realtime-join-channel.ts +5 -4
- package/src/nodes/realtime/realtime-send-channel-event.ts +13 -2
- package/src/nodes/realtime/realtime-send-channel-message.ts +13 -2
- package/src/nodes/sms/sms-infobip.ts +14 -4
- package/src/nodes/sms/sms-smsapi.ts +14 -4
- package/src/nodes/sms/sms-textmagic.ts +14 -4
- package/src/nodes/sms/sms-twilio.ts +14 -4
- package/src/nodes/types.ts +9 -1
- package/src/nodes/utility/utility-similarity-scoring.ts +33 -12
- package/src/page-access-guard-generator.ts +154 -0
- package/src/password-reset-route-generator.ts +531 -0
- package/src/payments/payment-core-code.ts +12 -7
- package/src/project-code-scanner.ts +98 -0
- package/src/public-step-guards.ts +448 -0
- package/src/publish-refusals.ts +459 -0
- package/src/realtime-generator.ts +457 -234
- package/src/runtime-storage-generator.ts +270 -11
- package/src/security-runtime/index.ts +53 -0
- package/src/security-runtime/security-runtime-code.ts +579 -0
- package/src/security-scanner.ts +253 -10
- package/src/segment-splitter.ts +10 -2
- package/src/segment-trust.ts +205 -2
- package/src/self-call-headers.ts +46 -0
- package/src/sent-email-log/index.ts +16 -0
- package/src/sent-email-log/sent-email-log-code.ts +30 -4
- package/src/server-custom-node-call.ts +331 -0
- package/src/server-runtime-code.ts +488 -40
- package/src/session-revocation-generator.ts +177 -0
- package/src/slack-message-values.ts +84 -0
- package/src/transactional-email-code.ts +30 -4
- package/src/trigger-generator.ts +19 -3
- package/src/visitor-step-limits.ts +228 -0
- package/src/webhook-generator.ts +94 -14
- package/src/webhook-signature-verification.ts +13 -3
- package/src/workflow-auth-generator.ts +9 -4
- package/src/workflow-component-plugin.ts +14 -4
- package/src/workflow-project-plugin.ts +374 -61
- package/src/workflow-scope.ts +6 -0
|
@@ -12,7 +12,11 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { generateSqlValidatorCode } from './sql-validator';
|
|
14
14
|
import { generateCommonJsSessionTokenResolverCode } from './session-cookie-resolver';
|
|
15
|
-
import { ContentTables, TableAccess } from '@teleporthq/teleport-shared';
|
|
15
|
+
import { AccountFields, ContentTables, DataExposure, TableAccess, } from '@teleporthq/teleport-shared';
|
|
16
|
+
import { AUTOMATIONS_PATH } from './automations/automations-scope';
|
|
17
|
+
import { APP_EVENTS_FILE_NAME, APP_EVENTS_PATH } from './automations/app-events-source';
|
|
18
|
+
import { CONFIGURED_NEXTAUTH_URL_EXPRESSION } from './configured-nextauth-url';
|
|
19
|
+
import { generateSelfCallHeadersCode } from './self-call-headers';
|
|
16
20
|
export const DATA_NODE_TYPES = new Set([
|
|
17
21
|
'data-select',
|
|
18
22
|
'data-create-item',
|
|
@@ -33,6 +37,192 @@ export const needsDataAPIRoute = (usedNodeTypes) => {
|
|
|
33
37
|
}
|
|
34
38
|
return false;
|
|
35
39
|
};
|
|
40
|
+
/** What the data API needs of the exposure: who reads each table, not how many rows. */
|
|
41
|
+
const browserExposureTables = (exposure, managedDataSourceIds) => {
|
|
42
|
+
const out = {};
|
|
43
|
+
Object.entries((exposure && exposure.tables) || {}).forEach(([key, entry]) => {
|
|
44
|
+
// This route reads the managed database only: another source's table of the
|
|
45
|
+
// same name is that source's route's to admit.
|
|
46
|
+
const source = key.slice(0, key.lastIndexOf(':'));
|
|
47
|
+
if (source !== '*' && managedDataSourceIds.indexOf(source) === -1) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const admits = entry.public ||
|
|
51
|
+
entry.anySession ||
|
|
52
|
+
entry.roles.length > 0 ||
|
|
53
|
+
(entry.subscriberRules || []).length > 0;
|
|
54
|
+
if (admits) {
|
|
55
|
+
out[key] = Object.assign({ public: entry.public, anySession: entry.anySession, roles: entry.roles }, (entry.subscriberRules && { subscriberRules: entry.subscriberRules }));
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
return out;
|
|
59
|
+
};
|
|
60
|
+
/** From `pages/api/data/[...params].js` to the project root. */
|
|
61
|
+
const DATA_ROUTE_ROOT = '../../..';
|
|
62
|
+
/**
|
|
63
|
+
* The row window of a BROWSER read through the data API (the storefront's own
|
|
64
|
+
* reads: products, the discount feed, the regional pricing tables). The largest
|
|
65
|
+
* count the generated storefront asks for is 1000 (the regional pricing rows),
|
|
66
|
+
* so that is the most a browser read gets; a read naming no count gets 100.
|
|
67
|
+
*/
|
|
68
|
+
export const DATA_API_BROWSER_DEFAULT_LIMIT = 100;
|
|
69
|
+
export const DATA_API_BROWSER_MAX_LIMIT = 1000;
|
|
70
|
+
export const DATA_API_BROWSER_MAX_OFFSET = 1000000;
|
|
71
|
+
/**
|
|
72
|
+
* The columns that key a GUEST's own rows in a customer table (a favourite, a
|
|
73
|
+
* cart, a conversation kept by the browser's session id): a read that names
|
|
74
|
+
* one, for a visitor without a session, finds the rows no account owns.
|
|
75
|
+
*/
|
|
76
|
+
const GUEST_KEY_COLUMNS = [
|
|
77
|
+
'session_id',
|
|
78
|
+
'anonymous_id',
|
|
79
|
+
'anon_id',
|
|
80
|
+
'visitor_id',
|
|
81
|
+
'guest_id',
|
|
82
|
+
'device_id',
|
|
83
|
+
'browser_id',
|
|
84
|
+
'cart_id',
|
|
85
|
+
'cart_token',
|
|
86
|
+
'basket_id',
|
|
87
|
+
];
|
|
88
|
+
/**
|
|
89
|
+
* Whether the route requires `utils/app-events.js` (`ensureAppEventsModule`):
|
|
90
|
+
* it records the low-stock events through it.
|
|
91
|
+
*/
|
|
92
|
+
export const dataAPIRouteRecordsLowStock = (options) => !!options.withAutomations && !!options.lowStockAlertsEnabled;
|
|
93
|
+
/**
|
|
94
|
+
* The wake-up and the low-stock events, for a project with automations. The
|
|
95
|
+
* regex finds an INSERT into the ledger in a raw query, however the table is
|
|
96
|
+
* written (`public.`, quoted, any case), the order event claims'
|
|
97
|
+
* `WITH claim AS (INSERT INTO teleport_events (…` included.
|
|
98
|
+
*/
|
|
99
|
+
const generateBusinessEventsCode = (recordsLowStock) => `// The project has automations. A new teleport_events row wakes their queue
|
|
100
|
+
// (the in-app event bus, lib/automations/event-bus.js) off the request path,
|
|
101
|
+
// once the write has succeeded: a create into the table, or a raw query that
|
|
102
|
+
// inserts into it (the order event claims). A claim row is inserted BEFORE the
|
|
103
|
+
// step it gates, so a dispatch may start while that step is still running;
|
|
104
|
+
// that is harmless, the dispatcher runs off the request and reads every record
|
|
105
|
+
// afresh. A node that writes the ledger straight to the database, not through
|
|
106
|
+
// this route, bypasses the wake-up.
|
|
107
|
+
var BUSINESS_EVENTS_TABLE = 'teleport_events';
|
|
108
|
+
var BUSINESS_EVENT_INSERT_RE = /\\binsert\\s+into\\s+(?:"?public"?\\s*\\.\\s*)?"?teleport_events"?(?![\\w$])/i;
|
|
109
|
+
|
|
110
|
+
// How many rows each request's raw query touched (handleRawQuery notes it):
|
|
111
|
+
// an insert that wrote none — a row ON CONFLICT DO NOTHING skipped, an error
|
|
112
|
+
// answered as an empty result — wakes nothing.
|
|
113
|
+
var RAW_QUERY_ROW_COUNTS = new WeakMap();
|
|
114
|
+
|
|
115
|
+
// An order event claim answers whether it took its row (its claimed column); a claim
|
|
116
|
+
// that lost to an earlier one wrote nothing.
|
|
117
|
+
function answersUnclaimed(result) {
|
|
118
|
+
var rows = result && Array.isArray(result.rows) ? result.rows : [];
|
|
119
|
+
return rows.length > 0 && rows.every(function (row) {
|
|
120
|
+
if (!row || !Object.prototype.hasOwnProperty.call(row, 'claimed')) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
var flag = row.claimed;
|
|
124
|
+
return !(flag === true || flag === 'true' || Number(flag) > 0);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function wroteBusinessEvent(operation, body, result, req) {
|
|
129
|
+
if (!body || typeof body !== 'object') {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
if (operation === 'create') {
|
|
133
|
+
return __dataPublicTable(body.tableName) === BUSINESS_EVENTS_TABLE && !!(result && result.item);
|
|
134
|
+
}
|
|
135
|
+
if (operation === 'raw-query') {
|
|
136
|
+
return (
|
|
137
|
+
typeof body.query === 'string' &&
|
|
138
|
+
BUSINESS_EVENT_INSERT_RE.test(body.query) &&
|
|
139
|
+
RAW_QUERY_ROW_COUNTS.get(req) > 0 &&
|
|
140
|
+
!answersUnclaimed(result)
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Site activity: due automation work (a Wait, a retry) starts off the request
|
|
147
|
+
// (lib/automations/due-check.js checks at most once a minute).
|
|
148
|
+
function kickDueAutomations(req) {
|
|
149
|
+
try {
|
|
150
|
+
require('${DATA_ROUTE_ROOT}/${AUTOMATIONS_PATH.join('/')}/due-check').kickWhenDue(req);
|
|
151
|
+
} catch (error) {
|
|
152
|
+
console.warn('[data-api] could not check for due automations: ' + (error && error.message ? error.message : String(error)));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function wakeAutomations(req) {
|
|
157
|
+
try {
|
|
158
|
+
require('${DATA_ROUTE_ROOT}/${AUTOMATIONS_PATH.join('/')}/event-bus').scheduleDispatch(req);
|
|
159
|
+
} catch (error) {
|
|
160
|
+
console.warn('[data-api] could not wake the automations: ' + (error && error.message ? error.message : String(error)));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
${recordsLowStock
|
|
164
|
+
? `
|
|
165
|
+
// Each product a low-stock scan finds is a product-low-stock event: one per
|
|
166
|
+
// product and stock level reached, so a scan that finds the same level again
|
|
167
|
+
// records nothing new. Written on a connection of its own and never awaited by
|
|
168
|
+
// the request, like the alert email; on Vercel the platform keeps it alive
|
|
169
|
+
// until it is done.
|
|
170
|
+
function lowStockLevel(row) {
|
|
171
|
+
var raw = row.stock !== undefined && row.stock !== null ? row.stock : row.quantity;
|
|
172
|
+
if (raw === undefined || raw === null || raw === '') {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
var level = Number(raw);
|
|
176
|
+
return isFinite(level) ? level : null;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function recordLowStockEvents(req, rows, threshold) {
|
|
180
|
+
var work = (async function () {
|
|
181
|
+
var eventClient = getClient();
|
|
182
|
+
try {
|
|
183
|
+
var appEvents = require('${DATA_ROUTE_ROOT}/${APP_EVENTS_PATH.join('/')}/${APP_EVENTS_FILE_NAME}');
|
|
184
|
+
await eventClient.connect();
|
|
185
|
+
for (var i = 0; i < rows.length; i++) {
|
|
186
|
+
var row = rows[i] || {};
|
|
187
|
+
if (row.id === undefined || row.id === null || row.id === '') {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
var id = String(row.id);
|
|
191
|
+
var stock = lowStockLevel(row);
|
|
192
|
+
var product = {
|
|
193
|
+
id: id,
|
|
194
|
+
name: row.name !== undefined && row.name !== null ? String(row.name) : '',
|
|
195
|
+
stock: stock,
|
|
196
|
+
threshold: threshold,
|
|
197
|
+
};
|
|
198
|
+
if (row.sku !== undefined && row.sku !== null && row.sku !== '') {
|
|
199
|
+
product.sku = String(row.sku);
|
|
200
|
+
}
|
|
201
|
+
await appEvents.recordAppEvent(eventClient, {
|
|
202
|
+
type: 'product-low-stock',
|
|
203
|
+
entityType: 'product',
|
|
204
|
+
entityId: id,
|
|
205
|
+
payload: { product: product },
|
|
206
|
+
actorType: 'system',
|
|
207
|
+
dedupeKey: 'low-stock:' + id + ':' + String(stock),
|
|
208
|
+
}, req);
|
|
209
|
+
}
|
|
210
|
+
} catch (error) {
|
|
211
|
+
console.error('[data-api] could not record the low-stock events: ' + (error && error.message ? error.message : String(error)));
|
|
212
|
+
} finally {
|
|
213
|
+
try { await eventClient.end(); } catch (_e) {}
|
|
214
|
+
}
|
|
215
|
+
})();
|
|
216
|
+
try {
|
|
217
|
+
var keepAlive = require('${DATA_ROUTE_ROOT}/${AUTOMATIONS_PATH.join('/')}/wait-until').waitUntil;
|
|
218
|
+
if (typeof keepAlive === 'function') {
|
|
219
|
+
keepAlive(work);
|
|
220
|
+
}
|
|
221
|
+
} catch (_e) {}
|
|
222
|
+
}
|
|
223
|
+
`
|
|
224
|
+
: ''}
|
|
225
|
+
`;
|
|
36
226
|
/**
|
|
37
227
|
* The only tables a BROWSER reads through this route, in an app whose server
|
|
38
228
|
* code identifies itself with the app secret (see `__taBrowserIsReadOnly`).
|
|
@@ -73,6 +263,16 @@ export const generateDataAPIRoute = (options = {}) => {
|
|
|
73
263
|
const lowStockThreshold = typeof options.lowStockThreshold === 'number' && options.lowStockThreshold >= 0
|
|
74
264
|
? options.lowStockThreshold
|
|
75
265
|
: 5;
|
|
266
|
+
const withAutomations = !!options.withAutomations;
|
|
267
|
+
const managedDataSourceIds = Array.isArray(options.managedDataSourceIds)
|
|
268
|
+
? Array.from(new Set(options.managedDataSourceIds.filter((id) => typeof id === 'string'))).sort()
|
|
269
|
+
: [];
|
|
270
|
+
const exposureTables = browserExposureTables(options.dataExposure, managedDataSourceIds);
|
|
271
|
+
const hasSubscriberRules = Object.values(exposureTables).some((entry) => (entry.subscriberRules || []).length > 0);
|
|
272
|
+
const staffRoles = Array.isArray(options.staffRoles) && options.staffRoles.length > 0
|
|
273
|
+
? Array.from(new Set(options.staffRoles.filter((role) => typeof role === 'string'))).sort()
|
|
274
|
+
: [TableAccess.ADMIN_ROLE];
|
|
275
|
+
const recordsLowStock = dataAPIRouteRecordsLowStock(options);
|
|
76
276
|
return `const { Client, types: pgTypes } = require('pg');
|
|
77
277
|
// A DATE stays the day it names, whatever the server's time zone: node-pg would read it as
|
|
78
278
|
// local midnight, which a server east of UTC sends as the day before.
|
|
@@ -140,10 +340,12 @@ const getClient = () => {
|
|
|
140
340
|
if (ssl === false && connStr) {
|
|
141
341
|
connStr = stripSslQueryParamsFromConnectionString(connStr);
|
|
142
342
|
}
|
|
343
|
+
// No query waits on the database longer than this (enforced by the client:
|
|
344
|
+
// a server-side statement_timeout does not survive a pooler).
|
|
143
345
|
if (connStr) {
|
|
144
346
|
return new Client(
|
|
145
347
|
Object.assign(
|
|
146
|
-
{ connectionString: connStr },
|
|
348
|
+
{ connectionString: connStr, query_timeout: ${DataExposure.READ_QUERY_TIMEOUT_MS} },
|
|
147
349
|
ssl !== undefined ? { ssl: ssl } : {}
|
|
148
350
|
)
|
|
149
351
|
);
|
|
@@ -156,6 +358,7 @@ const getClient = () => {
|
|
|
156
358
|
user: process.env.TELEPORT_DB_USER,
|
|
157
359
|
password: process.env.TELEPORT_DB_PASSWORD,
|
|
158
360
|
database: process.env.TELEPORT_DB_NAME,
|
|
361
|
+
query_timeout: ${DataExposure.READ_QUERY_TIMEOUT_MS},
|
|
159
362
|
},
|
|
160
363
|
ssl !== undefined ? { ssl: ssl } : {}
|
|
161
364
|
)
|
|
@@ -252,6 +455,11 @@ function buildWhereClause(filters, queryParams, startIndex, options) {
|
|
|
252
455
|
var paramIndex = startIndex;
|
|
253
456
|
var skipOptionalEmpty = !!(options && options.skipOptionalEmpty);
|
|
254
457
|
var strict = !!(options && options.strict);
|
|
458
|
+
var ownerScope = (options && options.ownerScope) || null;
|
|
459
|
+
// A read already bound to the visitor — an owner filter that is the
|
|
460
|
+
// session's own id or email, or a guest's own browser key — may drop a
|
|
461
|
+
// wildcard on another key: that only widens it within the visitor's own rows.
|
|
462
|
+
var visitorScoped = !!ownerScope && __dataReadIsBoundToVisitor(ownerScope, filters);
|
|
255
463
|
|
|
256
464
|
if (!filters || !Array.isArray(filters) || filters.length === 0) {
|
|
257
465
|
return { clause: '', paramIndex: paramIndex };
|
|
@@ -269,6 +477,27 @@ function buildWhereClause(filters, queryParams, startIndex, options) {
|
|
|
269
477
|
var value = f.destination !== undefined ? f.destination : f.value;
|
|
270
478
|
var operand = f.operand || f.operator || '=';
|
|
271
479
|
|
|
480
|
+
// A read of a customer table for a visitor: the filter on whose record it
|
|
481
|
+
// is never widens the read, and names only the visitor's own (see
|
|
482
|
+
// __dataOwnerScope).
|
|
483
|
+
if (ownerScope && __dataIsOwnerColumn(ownerScope, field)) {
|
|
484
|
+
var ownerClause = __dataOwnerClause(ownerScope, field, value, operand, f, filters);
|
|
485
|
+
if (ownerClause !== null) {
|
|
486
|
+
conditions.push(ownerClause);
|
|
487
|
+
continue;
|
|
488
|
+
}
|
|
489
|
+
} else if (ownerScope && !visitorScoped && __dataIsWideningValue(value, f)) {
|
|
490
|
+
// A customer table read for a visitor: an empty, "all" or wildcard value
|
|
491
|
+
// on ANY key matches nothing — it never drops the condition and widens
|
|
492
|
+
// the read to every customer's rows.
|
|
493
|
+
conditions.push('FALSE');
|
|
494
|
+
continue;
|
|
495
|
+
} else if (!strict && f.__skippable === true) {
|
|
496
|
+
// The data-select node keeps every filter it would have left out, for the
|
|
497
|
+
// scope above; anywhere else it is left out, as the node always did.
|
|
498
|
+
continue;
|
|
499
|
+
}
|
|
500
|
+
|
|
272
501
|
if (strict && isMissingFilterValue(value)) throw refuseUnscopedWrite(field);
|
|
273
502
|
if (value === undefined) continue;
|
|
274
503
|
if (skipOptionalEmpty && (isSkippableFilterValue(value) || isAllSentinelFilterValue(value, f))) continue;
|
|
@@ -369,6 +598,9 @@ async function handleSelect(client, body, req) {
|
|
|
369
598
|
__taAssertFeedFields(tableName, feed, filters.map(function(f) { return f && (f.source || f.field); }));
|
|
370
599
|
__taAssertFeedFields(tableName, feed, sorts.map(function(s) { return s && s.field; }));
|
|
371
600
|
}
|
|
601
|
+
// A browser never filters, sorts or selects by a credential column.
|
|
602
|
+
__dataAssertNoCredentialFields(req, tableName, filters.map(function(f) { return f && (f.source || f.field); })
|
|
603
|
+
.concat(sorts.map(function(s) { return s && s.field; }), selectedColumns));
|
|
372
604
|
// A browser reads a published table's public rows, and never names a hidden
|
|
373
605
|
// column — to read it, filter by it or sort by it.
|
|
374
606
|
var rowPolicy = __dataRowPolicy(req, tableName);
|
|
@@ -378,12 +610,20 @@ async function handleSelect(client, body, req) {
|
|
|
378
610
|
__dataAssertVisibleFields(rowPolicy, selectedColumns);
|
|
379
611
|
}
|
|
380
612
|
|
|
613
|
+
// A browser reads a bounded page of rows, of whole numbers (see
|
|
614
|
+
// __dataReadWindow); the app's own server code reads what it names.
|
|
615
|
+
var rowWindow = __dataReadWindow(req, limit, skip);
|
|
616
|
+
limit = rowWindow.limit;
|
|
617
|
+
skip = rowWindow.skip;
|
|
618
|
+
var ownerScope = await __dataOwnerScope(req, tableName);
|
|
619
|
+
|
|
381
620
|
var queryParams = [];
|
|
382
621
|
var cols = selectedColumns.length > 0 ? selectedColumns.join(', ') : '*';
|
|
383
622
|
if (feed) cols = feed.columns.join(', ');
|
|
384
623
|
var sql = 'SELECT ' + cols + ' FROM ' + tableName;
|
|
385
624
|
|
|
386
|
-
var where = buildWhereClause(filters, queryParams, 1, { skipOptionalEmpty: true });
|
|
625
|
+
var where = buildWhereClause(filters, queryParams, 1, { skipOptionalEmpty: true, ownerScope: ownerScope });
|
|
626
|
+
if (!rawQueryUserPart) where = await __dataWithPrivateScope(client, ownerScope, filters, queryParams, where);
|
|
387
627
|
sql += where.clause;
|
|
388
628
|
if (feed) sql += (where.clause ? ' AND ' : ' WHERE ') + feed.predicate;
|
|
389
629
|
if (rowPolicy) sql += (where.clause || feed ? ' AND ' : ' WHERE ') + '(' + rowPolicy.predicate + ')';
|
|
@@ -399,11 +639,11 @@ async function handleSelect(client, body, req) {
|
|
|
399
639
|
}
|
|
400
640
|
}
|
|
401
641
|
|
|
402
|
-
if (limit !== undefined
|
|
403
|
-
sql += ' LIMIT ' +
|
|
642
|
+
if (limit !== undefined) {
|
|
643
|
+
sql += ' LIMIT ' + limit;
|
|
404
644
|
}
|
|
405
|
-
if (skip !== undefined
|
|
406
|
-
sql += ' OFFSET ' +
|
|
645
|
+
if (skip !== undefined) {
|
|
646
|
+
sql += ' OFFSET ' + skip;
|
|
407
647
|
}
|
|
408
648
|
|
|
409
649
|
if (rawQueryUserPart) {
|
|
@@ -422,13 +662,18 @@ async function handleSelect(client, body, req) {
|
|
|
422
662
|
|
|
423
663
|
var result = await safeQuery(client, sql, queryParams, 'select');
|
|
424
664
|
var rows = Array.isArray(result.rows) ? result.rows : [];
|
|
425
|
-
//
|
|
426
|
-
|
|
665
|
+
// No credential column leaves in a row — a server segment relays its rows
|
|
666
|
+
// to the browser. Only a server-side caller that names one in its own
|
|
667
|
+
// projection (a check that compares a hash on the server) gets it.
|
|
668
|
+
rows = rawQueryUserPart
|
|
669
|
+
? __taWithoutCredentials(rows, null, isAuthLayerCall(req) ? __taCredentialsNamedBy(rawQueryUserPart, rows) : [])
|
|
670
|
+
: __taWithoutCredentials(rows, tableName, isAuthLayerCall(req) ? selectedColumns : []);
|
|
427
671
|
if (rowPolicy) rows = __dataWithoutHidden(rowPolicy, rows);
|
|
428
672
|
|
|
429
673
|
var countSql = 'SELECT COUNT(*) FROM ' + tableName;
|
|
430
674
|
var countParams = [];
|
|
431
|
-
var countWhere = buildWhereClause(filters, countParams, 1, { skipOptionalEmpty: true });
|
|
675
|
+
var countWhere = buildWhereClause(filters, countParams, 1, { skipOptionalEmpty: true, ownerScope: ownerScope });
|
|
676
|
+
countWhere = await __dataWithPrivateScope(client, ownerScope, filters, countParams, countWhere);
|
|
432
677
|
countSql += countWhere.clause;
|
|
433
678
|
if (feed) countSql += (countWhere.clause ? ' AND ' : ' WHERE ') + feed.predicate;
|
|
434
679
|
if (rowPolicy) countSql += (countWhere.clause || feed ? ' AND ' : ' WHERE ') + '(' + rowPolicy.predicate + ')';
|
|
@@ -449,13 +694,16 @@ async function handleCount(client, body, req) {
|
|
|
449
694
|
if (feed) {
|
|
450
695
|
__taAssertFeedFields(tableName, feed, filters.map(function(f) { return f && (f.source || f.field); }));
|
|
451
696
|
}
|
|
697
|
+
__dataAssertNoCredentialFields(req, tableName, filters.map(function(f) { return f && (f.source || f.field); }));
|
|
452
698
|
var rowPolicy = __dataRowPolicy(req, tableName);
|
|
453
699
|
if (rowPolicy) {
|
|
454
700
|
__dataAssertVisibleFields(rowPolicy, filters.map(function(f) { return f && (f.source || f.field); }));
|
|
455
701
|
}
|
|
702
|
+
var ownerScope = await __dataOwnerScope(req, tableName);
|
|
456
703
|
var queryParams = [];
|
|
457
704
|
var sql = 'SELECT COUNT(*) FROM ' + tableName;
|
|
458
|
-
var where = buildWhereClause(filters, queryParams, 1, { skipOptionalEmpty: true });
|
|
705
|
+
var where = buildWhereClause(filters, queryParams, 1, { skipOptionalEmpty: true, ownerScope: ownerScope });
|
|
706
|
+
where = await __dataWithPrivateScope(client, ownerScope, filters, queryParams, where);
|
|
459
707
|
sql += where.clause;
|
|
460
708
|
if (feed) sql += (where.clause ? ' AND ' : ' WHERE ') + feed.predicate;
|
|
461
709
|
if (rowPolicy) sql += (where.clause || feed ? ' AND ' : ' WHERE ') + '(' + rowPolicy.predicate + ')';
|
|
@@ -621,7 +869,8 @@ function stampRequestLocale(tableName, entries, colTypes, requestLocale) {
|
|
|
621
869
|
}
|
|
622
870
|
|
|
623
871
|
// Columns a feature added after stores were provisioned: product options
|
|
624
|
-
// (the definitions on the product, the chosen configuration on an order line)
|
|
872
|
+
// (the definitions on the product, the chosen configuration on an order line)
|
|
873
|
+
// and the record an activity-log line is about (its entity).
|
|
625
874
|
// A write naming one on a store whose table never gained it drops that column
|
|
626
875
|
// instead of failing the whole statement — an order must never lose its lines
|
|
627
876
|
// over a column that was not added. Only when the table's columns are known:
|
|
@@ -629,6 +878,7 @@ function stampRequestLocale(tableName, entries, colTypes, requestLocale) {
|
|
|
629
878
|
var OPTIONAL_FEATURE_COLUMNS = {
|
|
630
879
|
teleport_products: ['option_groups', 'product_page'],
|
|
631
880
|
teleport_order_items: ['configuration', 'configuration_label'],
|
|
881
|
+
teleport_events: ['entity_type', 'entity_id', 'claimed_at'],
|
|
632
882
|
};
|
|
633
883
|
|
|
634
884
|
function dropMissingOptionalColumns(tableName, entries, colTypes) {
|
|
@@ -650,18 +900,14 @@ function dropMissingOptionalColumns(tableName, entries, colTypes) {
|
|
|
650
900
|
// The row a create or update answers with, whoever asked, without the auth
|
|
651
901
|
// users table's credentials (the columns a browser read is served without):
|
|
652
902
|
// a server-side caller hands that answer on to the browser as its result.
|
|
653
|
-
function
|
|
654
|
-
return row ? __taWithoutCredentials([row], tableName)[0] : row;
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
async function handleCreate(client, body) {
|
|
903
|
+
async function handleCreate(client, body, req) {
|
|
658
904
|
var tableName = body.tableName;
|
|
659
905
|
var columnMappings = body.columnMappings || {};
|
|
660
906
|
// Optional fallback passed by the data-create-item workflow handler
|
|
661
907
|
// when the workflow context carries a resolve-user output. See
|
|
662
908
|
// coerceUuidColumnValue for why ownership columns get this special
|
|
663
909
|
// treatment instead of being NULL'd outright.
|
|
664
|
-
var anonymousUserIdFallback = body.__anonymousUserId;
|
|
910
|
+
var anonymousUserIdFallback = await __dataGuestFallback(client, req, body.__anonymousUserId);
|
|
665
911
|
|
|
666
912
|
// Validate table name
|
|
667
913
|
assertIdentifierSafe(tableName, 'table name');
|
|
@@ -728,14 +974,15 @@ async function handleCreate(client, body) {
|
|
|
728
974
|
var item = result.rows && result.rows[0] ? result.rows[0] : null;
|
|
729
975
|
var idIdx = columns.indexOf('id');
|
|
730
976
|
var resolvedId = item ? (item.id || null) : (idIdx >= 0 ? values[idIdx] : null);
|
|
731
|
-
|
|
977
|
+
// The written row goes back to a segment that relays it: never its credentials.
|
|
978
|
+
return { item: __dataWithoutItemCredentials(item, tableName), id: resolvedId };
|
|
732
979
|
}
|
|
733
980
|
|
|
734
|
-
async function handleUpdate(client, body) {
|
|
981
|
+
async function handleUpdate(client, body, req) {
|
|
735
982
|
var tableName = body.tableName;
|
|
736
983
|
var filters = body.filters || [];
|
|
737
984
|
var columnMappings = body.columnMappings || {};
|
|
738
|
-
var anonymousUserIdFallback = body.__anonymousUserId;
|
|
985
|
+
var anonymousUserIdFallback = await __dataGuestFallback(client, req, body.__anonymousUserId);
|
|
739
986
|
|
|
740
987
|
// Validate table name
|
|
741
988
|
assertIdentifierSafe(tableName, 'table name');
|
|
@@ -781,7 +1028,11 @@ async function handleUpdate(client, body) {
|
|
|
781
1028
|
|
|
782
1029
|
var result = await safeQuery(client, sql, queryParams, 'update');
|
|
783
1030
|
var updated = result.rows[0] || null;
|
|
784
|
-
return {
|
|
1031
|
+
return {
|
|
1032
|
+
updatedCount: result.rowCount || 0,
|
|
1033
|
+
item: __dataWithoutItemCredentials(updated, tableName),
|
|
1034
|
+
id: (updated && updated.id) || null,
|
|
1035
|
+
};
|
|
785
1036
|
}
|
|
786
1037
|
|
|
787
1038
|
async function handleDelete(client, body) {
|
|
@@ -859,7 +1110,9 @@ function extractThresholdFromQuery(query) {
|
|
|
859
1110
|
// local server on another port than a local NEXTAUTH_URL keeps its own
|
|
860
1111
|
// loopback address (NEXTAUTH_URL stuck at :3000 while the dev server runs on
|
|
861
1112
|
// :3001). Env vars are tried as fallbacks for the rare serverless
|
|
862
|
-
// background-work case where the request context isn't visible.
|
|
1113
|
+
// background-work case where the request context isn't visible. NEXTAUTH_URL
|
|
1114
|
+
// is read as configured, never as the auth route rewrote it from a request
|
|
1115
|
+
// (configured-nextauth-url.ts).
|
|
863
1116
|
function isLoopbackHost(host) {
|
|
864
1117
|
var name = String(host || '').replace(/:[0-9]+$/, '').toLowerCase();
|
|
865
1118
|
return name === 'localhost' || name === '127.0.0.1' || name === '[::1]';
|
|
@@ -871,18 +1124,20 @@ function resolveSelfBaseUrl(req) {
|
|
|
871
1124
|
var proto = (req && req.headers && req.headers['x-forwarded-proto']) || (isLoopbackHost(host) ? 'http' : 'https');
|
|
872
1125
|
var requestOrigin = String(proto).split(',')[0].trim() + '://' + host;
|
|
873
1126
|
if (process.env.VERCEL) return requestOrigin;
|
|
874
|
-
var configured = String(
|
|
1127
|
+
var configured = String(${CONFIGURED_NEXTAUTH_URL_EXPRESSION} || '').trim();
|
|
875
1128
|
if (!configured) return requestOrigin;
|
|
876
1129
|
var origin;
|
|
877
1130
|
try { origin = new URL(configured).origin; } catch (e) { return requestOrigin; }
|
|
878
1131
|
if (isLoopbackHost(host) && isLoopbackHost(new URL(origin).host)) return requestOrigin;
|
|
879
1132
|
return origin;
|
|
880
1133
|
}
|
|
881
|
-
if (
|
|
1134
|
+
if (${CONFIGURED_NEXTAUTH_URL_EXPRESSION}) return String(${CONFIGURED_NEXTAUTH_URL_EXPRESSION}).replace(/\\/+$/, '');
|
|
882
1135
|
if (process.env.VERCEL_URL) return 'https://' + String(process.env.VERCEL_URL).replace(/\\/+$/, '');
|
|
883
1136
|
return '';
|
|
884
1137
|
}
|
|
885
1138
|
|
|
1139
|
+
${generateSelfCallHeadersCode()}
|
|
1140
|
+
|
|
886
1141
|
// Fire-and-forget POST to /api/ecommerce/low-stock-alert. Errors
|
|
887
1142
|
// are swallowed because the merchant must never see a failed alert
|
|
888
1143
|
// surface as a failed checkout — the worst case is a missed email,
|
|
@@ -913,7 +1168,7 @@ function fireAndForgetLowStockAlert(req, rows, threshold) {
|
|
|
913
1168
|
method: 'POST',
|
|
914
1169
|
// The alert route emails the merchant only for the store's own server
|
|
915
1170
|
// code, which presents the app secret.
|
|
916
|
-
headers: { 'Content-Type': 'application/json'
|
|
1171
|
+
headers: __selfCallHeaders({ 'Content-Type': 'application/json' }),
|
|
917
1172
|
body: JSON.stringify(payload),
|
|
918
1173
|
}).catch(function(err) {
|
|
919
1174
|
console.error('[data-api] low-stock alert POST failed: ' + (err && err.message ? err.message : String(err)));
|
|
@@ -923,7 +1178,7 @@ function fireAndForgetLowStockAlert(req, rows, threshold) {
|
|
|
923
1178
|
}
|
|
924
1179
|
}
|
|
925
1180
|
|
|
926
|
-
async function handleRawQuery(client, body, req) {
|
|
1181
|
+
${withAutomations ? generateBusinessEventsCode(recordsLowStock) : ''}async function handleRawQuery(client, body, req) {
|
|
927
1182
|
var query = body.query;
|
|
928
1183
|
if (!query || typeof query !== 'string') {
|
|
929
1184
|
return { rows: [], error: 'No query provided' };
|
|
@@ -947,7 +1202,13 @@ async function handleRawQuery(client, body, req) {
|
|
|
947
1202
|
}
|
|
948
1203
|
|
|
949
1204
|
var result = await safeQuery(client, query, params, 'raw-query');
|
|
1205
|
+
// No credential column comes back to a segment a visitor's request runs: its
|
|
1206
|
+
// results are relayed to the browser. A server job (a cron's calendar sync)
|
|
1207
|
+
// and the auth layer get the credential columns the statement names itself
|
|
1208
|
+
// (see __taCredentialsNamedBy); a SELECT * over the users table brings none.
|
|
950
1209
|
var rows = Array.isArray(result.rows) ? result.rows : [];
|
|
1210
|
+
var namedCredentials = __dataIsServerJob(req) || isAuthLayerCall(req) ? __taCredentialsNamedBy(query, rows) : [];
|
|
1211
|
+
rows = __taWithoutCredentials(rows, null, namedCredentials);
|
|
951
1212
|
|
|
952
1213
|
// Auto-fire the low-stock alert when the workflow runs the post-
|
|
953
1214
|
// stock-decrement SELECT and gets back a non-empty list. The
|
|
@@ -956,8 +1217,10 @@ async function handleRawQuery(client, body, req) {
|
|
|
956
1217
|
// that gap without requiring the AI to wire an email-send node.
|
|
957
1218
|
if (LOW_STOCK_ALERTS_ENABLED && rows.length > 0 && looksLikeLowStockProductSelect(query)) {
|
|
958
1219
|
fireAndForgetLowStockAlert(req, rows, extractThresholdFromQuery(query));
|
|
959
|
-
}
|
|
960
|
-
|
|
1220
|
+
${recordsLowStock ? ' recordLowStockEvents(req, rows, extractThresholdFromQuery(query));\n' : ''} }
|
|
1221
|
+
${withAutomations
|
|
1222
|
+
? " RAW_QUERY_ROW_COUNTS.set(req, typeof result.rowCount === 'number' ? result.rowCount : rows.length);\n"
|
|
1223
|
+
: ''}
|
|
961
1224
|
return { rows: rows };
|
|
962
1225
|
}
|
|
963
1226
|
|
|
@@ -969,6 +1232,338 @@ function isInternalDataRequest(req) {
|
|
|
969
1232
|
return __taIsInternalRequest(req);
|
|
970
1233
|
}
|
|
971
1234
|
|
|
1235
|
+
// A server job — a cron, a webhook or an automation run, which runs no
|
|
1236
|
+
// visitor's request — flags its data calls (the runners put x-tq-server-job in
|
|
1237
|
+
// the run's __internalHeaders) and presents the app secret; the flag counts
|
|
1238
|
+
// only with it. Every other internal call is a segment a visitor's request
|
|
1239
|
+
// runs: its reads of customer records are the visitor's (__dataOwnerScope), and
|
|
1240
|
+
// its raw results carry no credential.
|
|
1241
|
+
function __dataIsServerJob(req) {
|
|
1242
|
+
if (!isInternalDataRequest(req)) return false;
|
|
1243
|
+
var flag = req && req.headers && req.headers['x-tq-server-job'];
|
|
1244
|
+
return (Array.isArray(flag) ? flag[0] : flag) === '1';
|
|
1245
|
+
}
|
|
1246
|
+
|
|
1247
|
+
// The auth layer's own in-process call (a property, never a header, so nothing
|
|
1248
|
+
// on the wire can claim it): the only caller a credential column it names in
|
|
1249
|
+
// its projection is returned to. Every other caller — every workflow segment —
|
|
1250
|
+
// gets the row without its credentials.
|
|
1251
|
+
function isAuthLayerCall(req) {
|
|
1252
|
+
return !!(req && req.__tqAuthLayerCall === true && req.__tqServerCall === true);
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1255
|
+
function __dataAssertNoCredentialFields(req, tableName, fields) {
|
|
1256
|
+
if (isInternalDataRequest(req)) return;
|
|
1257
|
+
for (var i = 0; i < fields.length; i++) {
|
|
1258
|
+
if (!fields[i]) continue;
|
|
1259
|
+
var name = __taNormalizeTable(fields[i]);
|
|
1260
|
+
if (__taIsCredentialColumn(name) || (__taIsCredentialTable(tableName) && __TA_CREDENTIAL_COLUMNS.indexOf(name) !== -1)) {
|
|
1261
|
+
var err = new Error('Invalid field');
|
|
1262
|
+
err.status = 400;
|
|
1263
|
+
throw err;
|
|
1264
|
+
}
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
// Who reads which table from a browser beyond the storefront's own tables:
|
|
1269
|
+
// the pages that bind it decide (DataExposure in teleport-shared), as on the
|
|
1270
|
+
// per-table read routes — anyone for a public page's table, a session the
|
|
1271
|
+
// binding pages admit otherwise (with the entitlement on a subscriber-only
|
|
1272
|
+
// page). A row-owned page's table is read on its own route, never here.
|
|
1273
|
+
var DATA_EXPOSURE_TABLES = ${JSON.stringify(exposureTables)};
|
|
1274
|
+
${hasSubscriberRules ? DataExposure.generateEntitlementCheckCode() : ''}
|
|
1275
|
+
var MANAGED_DATA_SOURCE_IDS = ${JSON.stringify(managedDataSourceIds)};
|
|
1276
|
+
async function __dataBrowserMayRead(req, dataSourceId, tableName) {
|
|
1277
|
+
// This route reads the managed database whatever id the path names: a browser
|
|
1278
|
+
// names one of its sources, never another's whose table has the same name.
|
|
1279
|
+
if (MANAGED_DATA_SOURCE_IDS.indexOf(dataSourceId) === -1) return false;
|
|
1280
|
+
var bare = __dataPublicTable(tableName);
|
|
1281
|
+
if (!bare) return false;
|
|
1282
|
+
var entry = DATA_EXPOSURE_TABLES[dataSourceId + ':' + bare] || DATA_EXPOSURE_TABLES['*:' + bare];
|
|
1283
|
+
if (!entry) return false;
|
|
1284
|
+
if (entry.public) return true;
|
|
1285
|
+
var token = await __dataSession(req);
|
|
1286
|
+
if (!token) return false;
|
|
1287
|
+
if (entry.anySession) return true;
|
|
1288
|
+
var role = __taRoleOf(token);
|
|
1289
|
+
if (role && entry.roles.indexOf(role) !== -1) return true;
|
|
1290
|
+
var rules = entry.subscriberRules || [];
|
|
1291
|
+
var products = null;
|
|
1292
|
+
for (var i = 0; i < rules.length; i++) {
|
|
1293
|
+
if (rules[i].roles.length > 0 && (!role || rules[i].roles.indexOf(role) === -1)) continue;
|
|
1294
|
+
products = rules[i].productIds.length === 0 || (products && products.length === 0)
|
|
1295
|
+
? []
|
|
1296
|
+
: (products || []).concat(rules[i].productIds);
|
|
1297
|
+
}
|
|
1298
|
+
return !!products && (await __dxEntitled(token, products));
|
|
1299
|
+
}
|
|
1300
|
+
|
|
1301
|
+
function __dataWithoutItemCredentials(item, tableName) {
|
|
1302
|
+
if (!item || typeof item !== 'object') return item;
|
|
1303
|
+
return __taWithoutCredentials([item], tableName)[0];
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
// The id a guest's row may be filed under when its owner column got no id of
|
|
1307
|
+
// its own (see coerceUuidColumnValue): an ANONYMOUS id only. With a session it
|
|
1308
|
+
// must be the session's own id; without one it must not be a registered
|
|
1309
|
+
// account's id — any users row but the guest's own anonymous one
|
|
1310
|
+
// (<uuid>${TableAccess.ANONYMOUS_GUEST_EMAIL_SUFFIX}, written by "Resolve Current User"
|
|
1311
|
+
// before the checkout's insert; see TableAccess.registeredAccountEmailSql) — a
|
|
1312
|
+
// request never files a row under someone else's account. Any doubt (no users
|
|
1313
|
+
// table, a failed check) drops it.
|
|
1314
|
+
async function __dataGuestFallback(client, req, value) {
|
|
1315
|
+
if (typeof value !== 'string' || !UUID_RE.test(value)) return undefined;
|
|
1316
|
+
var token = await __dataSession(req);
|
|
1317
|
+
if (token) {
|
|
1318
|
+
var own = token.id || token.sub;
|
|
1319
|
+
return own && String(own) === value ? value : undefined;
|
|
1320
|
+
}
|
|
1321
|
+
try {
|
|
1322
|
+
var registered = await client.query(
|
|
1323
|
+
'SELECT 1 FROM ' + GUEST_FALLBACK_USERS_TABLE + " WHERE id::text = $1 AND ${TableAccess.registeredAccountEmailSql('email')} LIMIT 1",
|
|
1324
|
+
[value]
|
|
1325
|
+
);
|
|
1326
|
+
return registered && registered.rows && registered.rows.length > 0 ? undefined : value;
|
|
1327
|
+
} catch (e) {
|
|
1328
|
+
return undefined;
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
// How many rows a read gets. A browser (the storefront's own reads) gets
|
|
1333
|
+
// BROWSER_DEFAULT_LIMIT rows when it names no count, never more than
|
|
1334
|
+
// BROWSER_MAX_LIMIT, starts no further in than BROWSER_MAX_OFFSET, and a count
|
|
1335
|
+
// that is not a whole number is refused. The app's own server code reads what
|
|
1336
|
+
// it names (a count it cannot read is left out, as before).
|
|
1337
|
+
var BROWSER_DEFAULT_LIMIT = ${DATA_API_BROWSER_DEFAULT_LIMIT};
|
|
1338
|
+
var BROWSER_MAX_LIMIT = ${DATA_API_BROWSER_MAX_LIMIT};
|
|
1339
|
+
var BROWSER_MAX_OFFSET = ${DATA_API_BROWSER_MAX_OFFSET};
|
|
1340
|
+
|
|
1341
|
+
function __dataRowCount(value, label, strict) {
|
|
1342
|
+
if (value === undefined || value === null || value === '') return undefined;
|
|
1343
|
+
var text = String(value).trim();
|
|
1344
|
+
if (/^[0-9]{1,15}$/.test(text)) return parseInt(text, 10);
|
|
1345
|
+
if (strict) {
|
|
1346
|
+
var err = new Error('Invalid ' + label);
|
|
1347
|
+
err.status = 400;
|
|
1348
|
+
throw err;
|
|
1349
|
+
}
|
|
1350
|
+
var parsed = parseInt(text, 10);
|
|
1351
|
+
return isNaN(parsed) || parsed < 0 ? undefined : parsed;
|
|
1352
|
+
}
|
|
1353
|
+
|
|
1354
|
+
function __dataReadWindow(req, limit, skip) {
|
|
1355
|
+
if (isInternalDataRequest(req)) {
|
|
1356
|
+
return { limit: __dataRowCount(limit, 'limit', false), skip: __dataRowCount(skip, 'skip', false) };
|
|
1357
|
+
}
|
|
1358
|
+
var browserLimit = __dataRowCount(limit, 'limit', true);
|
|
1359
|
+
var browserSkip = __dataRowCount(skip, 'skip', true);
|
|
1360
|
+
return {
|
|
1361
|
+
limit: Math.min(browserLimit === undefined ? BROWSER_DEFAULT_LIMIT : browserLimit, BROWSER_MAX_LIMIT),
|
|
1362
|
+
skip: browserSkip === undefined ? undefined : Math.min(browserSkip, BROWSER_MAX_OFFSET),
|
|
1363
|
+
};
|
|
1364
|
+
}
|
|
1365
|
+
|
|
1366
|
+
// Whose record a customer-table row is (see TableAccess.OWNER_* in
|
|
1367
|
+
// teleport-shared). A server segment reads these tables for a visitor with the
|
|
1368
|
+
// app secret, so the browser's session reaches here only as the cookie the
|
|
1369
|
+
// segment forwards — and the filter values only as the context the browser
|
|
1370
|
+
// sent. So for a visitor who is not staff — a guest, an ordinary account, a
|
|
1371
|
+
// customer role such as a subscription's member — a filter on an owner column:
|
|
1372
|
+
// - never widens the read: an empty or "all" value, a negation or a pattern
|
|
1373
|
+
// matches nothing — a guest's own rows, found by the guest key the same read
|
|
1374
|
+
// names (session_id …), are the ones no account owns;
|
|
1375
|
+
// - names only the visitor: for a signed-in visitor the value must be the
|
|
1376
|
+
// session's own id (or email), never one the browser chose.
|
|
1377
|
+
// A staff role (STAFF_ROLES: the admin panel's roles and admin) reads every
|
|
1378
|
+
// customer's records.
|
|
1379
|
+
var OWNER_SCOPED_TABLES = ${JSON.stringify(TableAccess.CUSTOMER_RECORD_TABLES)};
|
|
1380
|
+
var OWNER_ID_COLUMNS = ${JSON.stringify(TableAccess.OWNER_ID_COLUMNS)};
|
|
1381
|
+
var OWNER_EMAIL_COLUMNS = ${JSON.stringify(TableAccess.OWNER_EMAIL_COLUMNS)};
|
|
1382
|
+
var OWNER_COLUMNS_BY_TABLE = ${JSON.stringify(TableAccess.OWNER_COLUMNS_BY_TABLE)};
|
|
1383
|
+
// The private customer records (TableAccess.PRIVATE_CUSTOMER_RECORD_TABLES): a
|
|
1384
|
+
// visitor's read of one is always the visitor's own rows, whatever its filters
|
|
1385
|
+
// name (__dataWithPrivateScope).
|
|
1386
|
+
var PRIVATE_RECORD_TABLES = ${JSON.stringify(TableAccess.PRIVATE_CUSTOMER_RECORD_TABLES)};
|
|
1387
|
+
var PRIVATE_RECORD_PARENTS = ${JSON.stringify(TableAccess.PRIVATE_RECORD_PARENTS)};
|
|
1388
|
+
var GUEST_KEY_COLUMNS = ${JSON.stringify(GUEST_KEY_COLUMNS)};
|
|
1389
|
+
// The accounts table a guest's fallback id is checked against.
|
|
1390
|
+
var GUEST_FALLBACK_USERS_TABLE = ${JSON.stringify(authUsersTable && /^[A-Za-z_][A-Za-z0-9_]*$/.test(authUsersTable) ? authUsersTable : 'users')};
|
|
1391
|
+
var STAFF_ROLES = ${JSON.stringify(staffRoles)};
|
|
1392
|
+
|
|
1393
|
+
async function __dataSession(req) {
|
|
1394
|
+
if (typeof __tqSessionToken !== 'function') return null;
|
|
1395
|
+
try {
|
|
1396
|
+
return (await __tqSessionToken(req)) || null;
|
|
1397
|
+
} catch (e) {
|
|
1398
|
+
return null;
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
|
|
1402
|
+
// The visitor a read of \`tableName\` is scoped to, or null when it is not
|
|
1403
|
+
// scoped: not a customer table, a browser (which reads none of them here), or
|
|
1404
|
+
// a staff role.
|
|
1405
|
+
async function __dataOwnerScope(req, tableName) {
|
|
1406
|
+
if (!isInternalDataRequest(req)) return null;
|
|
1407
|
+
// Every segment a visitor's request runs is scoped; only a server job (a
|
|
1408
|
+
// cron, a webhook, an automation) reads the customer records as before. An
|
|
1409
|
+
// admin server step runs with a staff session (below).
|
|
1410
|
+
if (__dataIsServerJob(req)) return null;
|
|
1411
|
+
var table = __taNormalizeTable(tableName);
|
|
1412
|
+
if (OWNER_SCOPED_TABLES.indexOf(table) === -1) return null;
|
|
1413
|
+
var token = await __dataSession(req);
|
|
1414
|
+
var role = token ? __taRoleOf(token) : null;
|
|
1415
|
+
if (role && STAFF_ROLES.indexOf(role) !== -1) return null;
|
|
1416
|
+
var own = Object.prototype.hasOwnProperty.call(OWNER_COLUMNS_BY_TABLE, table) ? OWNER_COLUMNS_BY_TABLE[table] : null;
|
|
1417
|
+
return {
|
|
1418
|
+
table: table,
|
|
1419
|
+
ids: own ? own.ids : OWNER_ID_COLUMNS,
|
|
1420
|
+
emails: own ? own.emails : OWNER_EMAIL_COLUMNS,
|
|
1421
|
+
signedIn: !!token,
|
|
1422
|
+
sessionId: token && (token.id || token.sub) ? String(token.id || token.sub) : '',
|
|
1423
|
+
sessionEmail: token && token.email ? String(token.email).trim().toLowerCase() : '',
|
|
1424
|
+
};
|
|
1425
|
+
}
|
|
1426
|
+
|
|
1427
|
+
// A visitor's read of a private record table that its own filters do not bind
|
|
1428
|
+
// to the visitor (__dataReadIsBoundToVisitor) gets the owner condition anyway:
|
|
1429
|
+
// a list built with no owner filter shows only the visitor's rows. A session's
|
|
1430
|
+
// is its id or email on the table's owner columns (or its parent row's, for a
|
|
1431
|
+
// table owned through one); a guest's read of one is its guest key's, or
|
|
1432
|
+
// nothing.
|
|
1433
|
+
async function __dataWithPrivateScope(client, scope, filters, queryParams, where) {
|
|
1434
|
+
if (!scope || PRIVATE_RECORD_TABLES.indexOf(scope.table) === -1) return where;
|
|
1435
|
+
if (__dataReadIsBoundToVisitor(scope, filters)) return where;
|
|
1436
|
+
// A read one of whose conditions is already FALSE finds nothing as it is.
|
|
1437
|
+
if (/(?:^ WHERE | AND )FALSE(?: AND |$)/.test(where.clause || '')) return where;
|
|
1438
|
+
var condition = scope.signedIn
|
|
1439
|
+
? await __dataPrivateOwnerCondition(client, scope, scope.table, queryParams, 0)
|
|
1440
|
+
: 'FALSE';
|
|
1441
|
+
return {
|
|
1442
|
+
clause: (where.clause ? where.clause + ' AND ' : ' WHERE ') + condition,
|
|
1443
|
+
paramIndex: queryParams.length + 1,
|
|
1444
|
+
};
|
|
1445
|
+
}
|
|
1446
|
+
|
|
1447
|
+
// The session's own rows of \`table\`, by the owner columns it has (read from
|
|
1448
|
+
// the schema), or by its parent row's (PRIVATE_RECORD_PARENTS); 'FALSE' when it
|
|
1449
|
+
// has neither, or the session lacks the identity they name.
|
|
1450
|
+
async function __dataPrivateOwnerCondition(client, scope, table, queryParams, depth) {
|
|
1451
|
+
var types = await getColumnTypes(client, table);
|
|
1452
|
+
var columns = Object.keys(types).map(function(name) { return String(name).toLowerCase(); });
|
|
1453
|
+
var own = Object.prototype.hasOwnProperty.call(OWNER_COLUMNS_BY_TABLE, table) ? OWNER_COLUMNS_BY_TABLE[table] : null;
|
|
1454
|
+
var present = function(name) { return columns.indexOf(name) !== -1; };
|
|
1455
|
+
var ids = (own ? own.ids : OWNER_ID_COLUMNS).filter(present);
|
|
1456
|
+
var emails = (own ? own.emails : OWNER_EMAIL_COLUMNS).filter(present);
|
|
1457
|
+
if (ids.length > 0 || emails.length > 0) {
|
|
1458
|
+
var parts = [];
|
|
1459
|
+
if (scope.sessionId) {
|
|
1460
|
+
ids.forEach(function(name) {
|
|
1461
|
+
queryParams.push(scope.sessionId);
|
|
1462
|
+
parts.push(name + '::text = $' + queryParams.length);
|
|
1463
|
+
});
|
|
1464
|
+
}
|
|
1465
|
+
if (scope.sessionEmail) {
|
|
1466
|
+
emails.forEach(function(name) {
|
|
1467
|
+
queryParams.push(scope.sessionEmail);
|
|
1468
|
+
parts.push('LOWER(' + name + '::text) = $' + queryParams.length);
|
|
1469
|
+
});
|
|
1470
|
+
}
|
|
1471
|
+
return parts.length > 0 ? '(' + parts.join(' OR ') + ')' : 'FALSE';
|
|
1472
|
+
}
|
|
1473
|
+
var parent = Object.prototype.hasOwnProperty.call(PRIVATE_RECORD_PARENTS, table) ? PRIVATE_RECORD_PARENTS[table] : null;
|
|
1474
|
+
if (!parent || depth >= 3 || !present(parent.column)) return 'FALSE';
|
|
1475
|
+
var inner = await __dataPrivateOwnerCondition(client, scope, parent.parent, queryParams, depth + 1);
|
|
1476
|
+
if (inner === 'FALSE') return 'FALSE';
|
|
1477
|
+
return parent.column + ' IN (SELECT id FROM ' + parent.parent + ' WHERE ' + inner + ')';
|
|
1478
|
+
}
|
|
1479
|
+
|
|
1480
|
+
function __dataIsOwnerColumn(scope, field) {
|
|
1481
|
+
var column = __taNormalizeTable(field);
|
|
1482
|
+
return scope.ids.indexOf(column) !== -1 || scope.emails.indexOf(column) !== -1;
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
// Whether a filter binds the read to a guest's own browser key: a guest-key
|
|
1486
|
+
// column equal (=, nothing else) to one concrete value. A LIKE, a negation, a
|
|
1487
|
+
// "contains", a list or a value that would drop the condition (empty, "all", a
|
|
1488
|
+
// bare wildcard) binds nothing.
|
|
1489
|
+
function __dataNamesGuestKey(filters) {
|
|
1490
|
+
for (var i = 0; i < filters.length; i++) {
|
|
1491
|
+
var f = filters[i] || {};
|
|
1492
|
+
var column = __taNormalizeTable(f.source || f.field);
|
|
1493
|
+
var value = f.destination !== undefined ? f.destination : f.value;
|
|
1494
|
+
if (
|
|
1495
|
+
GUEST_KEY_COLUMNS.indexOf(column) !== -1 &&
|
|
1496
|
+
typeof value === 'string' &&
|
|
1497
|
+
__dataFilterOperator(f.operand || f.operator || '=', value) === '=' &&
|
|
1498
|
+
!__dataIsWideningValue(value, f)
|
|
1499
|
+
) {
|
|
1500
|
+
return true;
|
|
1501
|
+
}
|
|
1502
|
+
}
|
|
1503
|
+
return false;
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1506
|
+
// The operator buildWhereClause would write for this filter.
|
|
1507
|
+
function __dataFilterOperator(operand, value) {
|
|
1508
|
+
var normalized = String(operand || '=').toLowerCase();
|
|
1509
|
+
if (Array.isArray(value)) return operand === '!=' ? '!=' : '=';
|
|
1510
|
+
if (/^(?:not[_-]?)?contains$|^starts[_-]?with$|^ends[_-]?with$/.test(normalized)) return 'like';
|
|
1511
|
+
var validOps = ['=', '!=', '>', '<', '>=', '<=', 'LIKE', 'ILIKE'];
|
|
1512
|
+
return validOps.indexOf(operand) !== -1 ? operand : '=';
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1515
|
+
// null when the owner filter may run as written, else the clause it becomes.
|
|
1516
|
+
// Whether some filter binds the read to the visitor: for a signed-in visitor an
|
|
1517
|
+
// owner filter whose value is the session's own; for a guest a guest-key filter.
|
|
1518
|
+
function __dataReadIsBoundToVisitor(scope, filters) {
|
|
1519
|
+
if (!Array.isArray(filters)) return false;
|
|
1520
|
+
if (!scope.signedIn) return __dataNamesGuestKey(filters);
|
|
1521
|
+
for (var i = 0; i < filters.length; i++) {
|
|
1522
|
+
var f = filters[i] || {};
|
|
1523
|
+
var field = f.source || f.field;
|
|
1524
|
+
if (!field || !__dataIsOwnerColumn(scope, field)) continue;
|
|
1525
|
+
var value = f.destination !== undefined ? f.destination : f.value;
|
|
1526
|
+
if (__dataOwnerClause(scope, field, value, f.operand || f.operator || '=', f, filters) === null) return true;
|
|
1527
|
+
}
|
|
1528
|
+
return false;
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1531
|
+
// A value that would drop its condition: empty, missing, "all"/wildcard, or one
|
|
1532
|
+
// the data-select node marked as left out.
|
|
1533
|
+
function __dataIsWideningValue(value, filter) {
|
|
1534
|
+
return filter.__skippable === true || isMissingFilterValue(value) || isSkippableFilterValue(value) ||
|
|
1535
|
+
isAllSentinelFilterValue(value, filter) || value === '__TQ_UNRESOLVED_ROUTE_PARAM__' ||
|
|
1536
|
+
(typeof value === 'string' && /^[*%]+$/.test(value.trim()));
|
|
1537
|
+
}
|
|
1538
|
+
|
|
1539
|
+
function __dataOwnerClause(scope, field, value, operand, filter, filters) {
|
|
1540
|
+
var empty = __dataIsWideningValue(value, filter);
|
|
1541
|
+
if (empty) {
|
|
1542
|
+
return !scope.signedIn && __dataNamesGuestKey(filters) ? field + ' IS NULL' : 'FALSE';
|
|
1543
|
+
}
|
|
1544
|
+
if (__dataFilterOperator(operand, value) !== '=') return 'FALSE';
|
|
1545
|
+
var values = Array.isArray(value) ? value : [value];
|
|
1546
|
+
var isEmailColumn = scope.emails.indexOf(__taNormalizeTable(field)) !== -1;
|
|
1547
|
+
for (var i = 0; i < values.length; i++) {
|
|
1548
|
+
var entry = values[i];
|
|
1549
|
+
if (entry === null || entry === undefined || typeof entry === 'object') return 'FALSE';
|
|
1550
|
+
var text = String(entry).trim();
|
|
1551
|
+
if (text === '' || isAllSentinelFilterValue(text, null)) return 'FALSE';
|
|
1552
|
+
// A guest never names whose record to read: only a read bound to the
|
|
1553
|
+
// guest's own browser key (a guest-key filter with a value) may carry one.
|
|
1554
|
+
if (!scope.signedIn) {
|
|
1555
|
+
if (!__dataNamesGuestKey(filters)) return 'FALSE';
|
|
1556
|
+
continue;
|
|
1557
|
+
}
|
|
1558
|
+
var own = isEmailColumn ? scope.sessionEmail : scope.sessionId;
|
|
1559
|
+
if (!own || (isEmailColumn ? text.toLowerCase() !== own : text !== own)) {
|
|
1560
|
+
console.warn('[data-api] refused a read of ' + scope.table + ' by ' + field + ': it names another account than the session');
|
|
1561
|
+
return 'FALSE';
|
|
1562
|
+
}
|
|
1563
|
+
}
|
|
1564
|
+
return null;
|
|
1565
|
+
}
|
|
1566
|
+
|
|
972
1567
|
var WRITE_OPERATIONS = { create: 1, update: 1, delete: 1 };
|
|
973
1568
|
|
|
974
1569
|
// See BROWSER_READABLE_TABLES / BROWSER_ROW_POLICIES in data-api-route-generator.ts.
|
|
@@ -1054,6 +1649,20 @@ function __forbidBrowserOperation(what) {
|
|
|
1054
1649
|
throw err;
|
|
1055
1650
|
}
|
|
1056
1651
|
|
|
1652
|
+
// The retired tables (TableAccess.RETIRED_TABLES: the old password_reset_tokens)
|
|
1653
|
+
// are refused to EVERY caller, the app's own server code and its jobs included,
|
|
1654
|
+
// before anything else runs: by the table a request names, and by any mention
|
|
1655
|
+
// in a raw statement's text.
|
|
1656
|
+
function assertNoRetiredTable(operation, body) {
|
|
1657
|
+
if (!body || typeof body !== 'object') return;
|
|
1658
|
+
var sql = operation === 'raw-query' ? body.query : body.rawQueryUserPart;
|
|
1659
|
+
if (__taRetiredTableNamed(body.tableName, typeof sql === 'string' ? sql : null)) {
|
|
1660
|
+
var err = new Error('Forbidden');
|
|
1661
|
+
err.status = 403;
|
|
1662
|
+
throw err;
|
|
1663
|
+
}
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1057
1666
|
// Refuses a browser's access to the money tables (see the shared table-access
|
|
1058
1667
|
// helper above); a trusted internal call passes untouched. Where the app can
|
|
1059
1668
|
// tell its own server-side calls apart (__taBrowserIsReadOnly), a browser only
|
|
@@ -1064,7 +1673,10 @@ function assertTableAccess(req, operation, body) {
|
|
|
1064
1673
|
if (__taBrowserIsReadOnly(req)) {
|
|
1065
1674
|
if (operation !== 'select' && operation !== 'count') __forbidBrowserOperation('the ' + operation + ' operation');
|
|
1066
1675
|
if (body.rawQueryUserPart) __forbidBrowserOperation('a raw query');
|
|
1067
|
-
if (
|
|
1676
|
+
if (
|
|
1677
|
+
BROWSER_READABLE_TABLES.indexOf(__dataPublicTable(body.tableName)) === -1 &&
|
|
1678
|
+
req.__tqBrowserExposure !== true
|
|
1679
|
+
) {
|
|
1068
1680
|
__forbidBrowserOperation('reading ' + String(body.tableName || 'this table'));
|
|
1069
1681
|
}
|
|
1070
1682
|
}
|
|
@@ -1084,14 +1696,55 @@ function assertTableAccess(req, operation, body) {
|
|
|
1084
1696
|
}
|
|
1085
1697
|
|
|
1086
1698
|
// The columns of the auth users table that decide what a session may DO, not
|
|
1087
|
-
// who it is
|
|
1088
|
-
//
|
|
1089
|
-
//
|
|
1090
|
-
//
|
|
1091
|
-
//
|
|
1092
|
-
//
|
|
1093
|
-
//
|
|
1094
|
-
|
|
1699
|
+
// who it is: a role, an admin or staff flag, a verified email, credit, a plan,
|
|
1700
|
+
// an entitlement, in any spelling (the one shared rule,
|
|
1701
|
+
// AccountFields.isPrivilegedAccountField). The session token carries the role
|
|
1702
|
+
// off the \`users\` row, and the middleware's page gates and the money-table
|
|
1703
|
+
// guard both read it — so a visitor who could write one of these would be
|
|
1704
|
+
// handing themselves the store administrator's reads. A browser never writes
|
|
1705
|
+
// one; a server segment writes one only for staff (STAFF_ROLES) or as the
|
|
1706
|
+
// server's own job (no visitor): a segment acts for the visitor whose cookie
|
|
1707
|
+
// it forwards, and a profile form that maps one of these would let a customer
|
|
1708
|
+
// make themselves the administrator. Everything else on the row stays
|
|
1709
|
+
// writable, and the rule is the ACCOUNT table's only: \`plan\`, \`tier\` or
|
|
1710
|
+
// \`credits\` are ordinary columns of any other table.
|
|
1711
|
+
${AccountFields.generatePrivilegedAccountFieldCode('__dataIsPrivilegedAccountColumn')}
|
|
1712
|
+
|
|
1713
|
+
// The privileged account columns a statement's text names.
|
|
1714
|
+
function __dataPrivilegedColumnsNamed(text) {
|
|
1715
|
+
var words = String(text || '').match(/[A-Za-z_][A-Za-z0-9_$]*/g) || [];
|
|
1716
|
+
return words.filter(__dataIsPrivilegedAccountColumn);
|
|
1717
|
+
}
|
|
1718
|
+
|
|
1719
|
+
function __dataWrittenColumns(body) {
|
|
1720
|
+
var columnMappings = (body && body.columnMappings) || {};
|
|
1721
|
+
return Array.isArray(columnMappings)
|
|
1722
|
+
? columnMappings.map(function(m) { return m && (m.source || m.column); })
|
|
1723
|
+
: Object.keys(columnMappings);
|
|
1724
|
+
}
|
|
1725
|
+
|
|
1726
|
+
async function assertNoPrivilegeWriteForCustomer(req, operation, body) {
|
|
1727
|
+
if (ROLE_SOURCE_TABLES.length === 0 || !isInternalDataRequest(req)) return;
|
|
1728
|
+
if (!body || typeof body !== 'object') return;
|
|
1729
|
+
var sql = operation === 'raw-query' ? body.query : null;
|
|
1730
|
+
var written = [];
|
|
1731
|
+
if (typeof sql === 'string' && sql.length > 0) {
|
|
1732
|
+
var cleaned = __taCleanSql(sql);
|
|
1733
|
+
if (cleaned.ok && !__TA_SQL_WRITE_RE.test(cleaned.text)) return;
|
|
1734
|
+
var mentionsAccounts = ROLE_SOURCE_TABLES.some(function(table) { return __taSqlMentionsTable(sql, table); });
|
|
1735
|
+
if (!mentionsAccounts) return;
|
|
1736
|
+
written = __dataPrivilegedColumnsNamed(cleaned.ok ? cleaned.text : sql);
|
|
1737
|
+
} else if (operation === 'create' || operation === 'update') {
|
|
1738
|
+
if (ROLE_SOURCE_TABLES.indexOf(__taNormalizeTable(body.tableName)) === -1) return;
|
|
1739
|
+
written = __dataWrittenColumns(body).filter(function(column) { return __dataIsPrivilegedAccountColumn(column); });
|
|
1740
|
+
}
|
|
1741
|
+
if (written.length === 0) return;
|
|
1742
|
+
var token = await __dataSession(req);
|
|
1743
|
+
if (!token) return;
|
|
1744
|
+
var role = __taRoleOf(token);
|
|
1745
|
+
if (role && STAFF_ROLES.indexOf(role) !== -1) return;
|
|
1746
|
+
__forbidRoleWrite(written[0]);
|
|
1747
|
+
}
|
|
1095
1748
|
|
|
1096
1749
|
// The identity table this route guards, and \`users\`, which is where the auth
|
|
1097
1750
|
// options read the session's role from whatever the identity table is called.
|
|
@@ -1129,7 +1782,7 @@ function assertNoBrowserRoleWrite(req, operation, body) {
|
|
|
1129
1782
|
? columnMappings.map(function(m) { return m && (m.source || m.column); })
|
|
1130
1783
|
: Object.keys(columnMappings);
|
|
1131
1784
|
for (var i = 0; i < written.length; i++) {
|
|
1132
|
-
if (
|
|
1785
|
+
if (__dataIsPrivilegedAccountColumn(written[i])) __forbidRoleWrite(written[i]);
|
|
1133
1786
|
}
|
|
1134
1787
|
}
|
|
1135
1788
|
|
|
@@ -1182,7 +1835,7 @@ module.exports = async function handler(req, res) {
|
|
|
1182
1835
|
if (req.method !== 'POST') {
|
|
1183
1836
|
return res.status(405).json({ error: 'Method not allowed' });
|
|
1184
1837
|
}
|
|
1185
|
-
|
|
1838
|
+
${withAutomations ? ' kickDueAutomations(req);\n' : ''}
|
|
1186
1839
|
var params = req.query.params;
|
|
1187
1840
|
if (!params || params.length < 2) {
|
|
1188
1841
|
return res.status(400).json({ error: 'Invalid path. Expected /api/data/<dataSourceId>/<operation>' });
|
|
@@ -1201,8 +1854,15 @@ module.exports = async function handler(req, res) {
|
|
|
1201
1854
|
var client = getClient();
|
|
1202
1855
|
|
|
1203
1856
|
try {
|
|
1857
|
+
assertNoRetiredTable(operation, body);
|
|
1858
|
+
// A browser's read of a table the storefront runtime does not read is
|
|
1859
|
+
// admitted the way its per-table route admits it (DATA_EXPOSURE_TABLES).
|
|
1860
|
+
if (!isInternalDataRequest(req) && (operation === 'select' || operation === 'count') && body && body.tableName) {
|
|
1861
|
+
req.__tqBrowserExposure = await __dataBrowserMayRead(req, String(params[0]), body.tableName);
|
|
1862
|
+
}
|
|
1204
1863
|
assertTableAccess(req, operation, body);
|
|
1205
1864
|
assertNoBrowserRoleWrite(req, operation, body);
|
|
1865
|
+
await assertNoPrivilegeWriteForCustomer(req, operation, body);
|
|
1206
1866
|
await assertSessionOwnsUsersRow(req, operation, body);
|
|
1207
1867
|
await client.connect();
|
|
1208
1868
|
var result;
|
|
@@ -1215,10 +1875,10 @@ module.exports = async function handler(req, res) {
|
|
|
1215
1875
|
result = await handleCount(client, body, req);
|
|
1216
1876
|
break;
|
|
1217
1877
|
case 'create':
|
|
1218
|
-
result = await handleCreate(client, body);
|
|
1878
|
+
result = await handleCreate(client, body, req);
|
|
1219
1879
|
break;
|
|
1220
1880
|
case 'update':
|
|
1221
|
-
result = await handleUpdate(client, body);
|
|
1881
|
+
result = await handleUpdate(client, body, req);
|
|
1222
1882
|
break;
|
|
1223
1883
|
case 'delete':
|
|
1224
1884
|
result = await handleDelete(client, body);
|
|
@@ -1233,7 +1893,14 @@ module.exports = async function handler(req, res) {
|
|
|
1233
1893
|
return res.status(400).json({ error: 'Unknown operation: ' + operation });
|
|
1234
1894
|
}
|
|
1235
1895
|
|
|
1236
|
-
|
|
1896
|
+
${withAutomations
|
|
1897
|
+
? ` // The write succeeded: a new business event wakes the automations.
|
|
1898
|
+
if (wroteBusinessEvent(operation, body, result, req)) {
|
|
1899
|
+
wakeAutomations(req);
|
|
1900
|
+
}
|
|
1901
|
+
|
|
1902
|
+
`
|
|
1903
|
+
: ''} return res.status(200).json(result);
|
|
1237
1904
|
} catch (error) {
|
|
1238
1905
|
// Return proper status codes for validation errors
|
|
1239
1906
|
var statusCode = error.status || 500;
|