@teleporthq/teleport-plugin-next-workflows 0.43.65 → 0.43.67
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/bind-workflow-utils.ts +30 -0
- package/__tests__/_helpers/run-generated-middleware.ts +11 -2
- package/__tests__/admin-form-row-hydration.test.ts +55 -0
- package/__tests__/cart-clear-db-mirror.test.ts +12 -0
- package/__tests__/cart-get-total-regional-pricing.test.ts +166 -0
- package/__tests__/client-config-redaction.test.ts +53 -0
- package/__tests__/continue-on-error.test.ts +119 -0
- package/__tests__/email-locale-module.test.ts +323 -0
- package/__tests__/email-locale-senders.test.ts +268 -0
- package/__tests__/invoice-delivery-fee.test.ts +104 -0
- package/__tests__/invoice-regional-tax.test.ts +126 -0
- package/__tests__/locale-aware-redirects.test.ts +355 -0
- package/__tests__/navigation-go-to-page.test.ts +43 -0
- package/__tests__/node-handler-file-inline-map.test.ts +29 -3
- package/__tests__/payment-redirect-and-order-notification.test.ts +6 -0
- package/__tests__/paypal-webhook-order-notification.test.ts +41 -0
- package/__tests__/resolve-config-localized-templates.test.ts +262 -0
- package/__tests__/sent-email-log-module.test.ts +381 -0
- package/__tests__/sent-email-log-wiring.test.ts +267 -0
- package/dist/cjs/account-delete-route-generator.d.ts +20 -0
- package/dist/cjs/account-delete-route-generator.d.ts.map +1 -1
- package/dist/cjs/account-delete-route-generator.js +29 -26
- package/dist/cjs/account-delete-route-generator.js.map +1 -1
- package/dist/cjs/api-route-generator.d.ts.map +1 -1
- package/dist/cjs/api-route-generator.js +57 -11
- package/dist/cjs/api-route-generator.js.map +1 -1
- package/dist/cjs/auth-generator.d.ts +2 -1
- package/dist/cjs/auth-generator.d.ts.map +1 -1
- package/dist/cjs/auth-generator.js +55 -18
- package/dist/cjs/auth-generator.js.map +1 -1
- package/dist/cjs/data-api-route-generator.d.ts.map +1 -1
- package/dist/cjs/data-api-route-generator.js +19 -0
- package/dist/cjs/data-api-route-generator.js.map +1 -1
- package/dist/cjs/email-locale/email-locale-code.d.ts +25 -0
- package/dist/cjs/email-locale/email-locale-code.d.ts.map +1 -0
- package/dist/cjs/email-locale/email-locale-code.js +228 -0
- package/dist/cjs/email-locale/email-locale-code.js.map +1 -0
- package/dist/cjs/email-locale/email-locale-scope.d.ts +46 -0
- package/dist/cjs/email-locale/email-locale-scope.d.ts.map +1 -0
- package/dist/cjs/email-locale/email-locale-scope.js +51 -0
- package/dist/cjs/email-locale/email-locale-scope.js.map +1 -0
- package/dist/cjs/email-locale/index.d.ts +11 -0
- package/dist/cjs/email-locale/index.d.ts.map +1 -0
- package/dist/cjs/email-locale/index.js +40 -0
- package/dist/cjs/email-locale/index.js.map +1 -0
- package/dist/cjs/executor-generator.d.ts +11 -1
- package/dist/cjs/executor-generator.d.ts.map +1 -1
- package/dist/cjs/executor-generator.js +49 -7
- package/dist/cjs/executor-generator.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +9 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/invoice/api-routes-code.d.ts.map +1 -1
- package/dist/cjs/invoice/api-routes-code.js +55 -6
- package/dist/cjs/invoice/api-routes-code.js.map +1 -1
- package/dist/cjs/invoice/email-sender-code.d.ts.map +1 -1
- package/dist/cjs/invoice/email-sender-code.js +72 -31
- package/dist/cjs/invoice/email-sender-code.js.map +1 -1
- package/dist/cjs/invoice/index.d.ts +1 -4
- package/dist/cjs/invoice/index.d.ts.map +1 -1
- package/dist/cjs/invoice/index.js +8 -19
- package/dist/cjs/invoice/index.js.map +1 -1
- package/dist/cjs/invoice/invoice-html-code.d.ts.map +1 -1
- package/dist/cjs/invoice/invoice-html-code.js +31 -8
- package/dist/cjs/invoice/invoice-html-code.js.map +1 -1
- package/dist/cjs/invoice/regional-invoice-tax-code.d.ts +25 -0
- package/dist/cjs/invoice/regional-invoice-tax-code.d.ts.map +1 -0
- package/dist/cjs/invoice/regional-invoice-tax-code.js +116 -0
- package/dist/cjs/invoice/regional-invoice-tax-code.js.map +1 -0
- package/dist/cjs/invoice/resolve-data-source.d.ts +6 -0
- package/dist/cjs/invoice/resolve-data-source.d.ts.map +1 -0
- package/dist/cjs/invoice/resolve-data-source.js +23 -0
- package/dist/cjs/invoice/resolve-data-source.js.map +1 -0
- package/dist/cjs/nodes/account/account-delete-current.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-delete-current.js +10 -3
- package/dist/cjs/nodes/account/account-delete-current.js.map +1 -1
- package/dist/cjs/nodes/account/account-login.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-login.js +3 -1
- package/dist/cjs/nodes/account/account-login.js.map +1 -1
- package/dist/cjs/nodes/account/account-logout.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-logout.js +4 -2
- package/dist/cjs/nodes/account/account-logout.js.map +1 -1
- package/dist/cjs/nodes/account/account-signup.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-signup.js +12 -2
- package/dist/cjs/nodes/account/account-signup.js.map +1 -1
- package/dist/cjs/nodes/account/account-social-login.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-social-login.js +4 -2
- package/dist/cjs/nodes/account/account-social-login.js.map +1 -1
- package/dist/cjs/nodes/cart/cart-clear.d.ts.map +1 -1
- package/dist/cjs/nodes/cart/cart-clear.js +6 -0
- package/dist/cjs/nodes/cart/cart-clear.js.map +1 -1
- package/dist/cjs/nodes/cart/cart-get-total.d.ts.map +1 -1
- package/dist/cjs/nodes/cart/cart-get-total.js +81 -5
- package/dist/cjs/nodes/cart/cart-get-total.js.map +1 -1
- package/dist/cjs/nodes/data/data-create-item.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-create-item.js +16 -0
- package/dist/cjs/nodes/data/data-create-item.js.map +1 -1
- package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.d.ts.map +1 -1
- package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.js +6 -0
- package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.js.map +1 -1
- package/dist/cjs/nodes/navigation/navigation-go-to-page.d.ts.map +1 -1
- package/dist/cjs/nodes/navigation/navigation-go-to-page.js +4 -1
- package/dist/cjs/nodes/navigation/navigation-go-to-page.js.map +1 -1
- package/dist/cjs/nodes/navigation/navigation-navigate-to-url.d.ts.map +1 -1
- package/dist/cjs/nodes/navigation/navigation-navigate-to-url.js +5 -2
- package/dist/cjs/nodes/navigation/navigation-navigate-to-url.js.map +1 -1
- package/dist/cjs/nodes/payment/payment-charge-user.d.ts.map +1 -1
- package/dist/cjs/nodes/payment/payment-charge-user.js +7 -2
- package/dist/cjs/nodes/payment/payment-charge-user.js.map +1 -1
- package/dist/cjs/segment-splitter.d.ts +1 -1
- package/dist/cjs/segment-splitter.d.ts.map +1 -1
- package/dist/cjs/segment-splitter.js +29 -2
- package/dist/cjs/segment-splitter.js.map +1 -1
- package/dist/cjs/sent-email-log/index.d.ts +16 -0
- package/dist/cjs/sent-email-log/index.d.ts.map +1 -0
- package/dist/cjs/sent-email-log/index.js +53 -0
- package/dist/cjs/sent-email-log/index.js.map +1 -0
- package/dist/cjs/sent-email-log/sent-email-log-code.d.ts +4 -0
- package/dist/cjs/sent-email-log/sent-email-log-code.d.ts.map +1 -0
- package/dist/cjs/sent-email-log/sent-email-log-code.js +415 -0
- package/dist/cjs/sent-email-log/sent-email-log-code.js.map +1 -0
- package/dist/cjs/sent-email-log/sent-email-log-scope.d.ts +21 -0
- package/dist/cjs/sent-email-log/sent-email-log-scope.d.ts.map +1 -0
- package/dist/cjs/sent-email-log/sent-email-log-scope.js +36 -0
- package/dist/cjs/sent-email-log/sent-email-log-scope.js.map +1 -0
- package/dist/cjs/transactional-email-code.d.ts +39 -1
- package/dist/cjs/transactional-email-code.d.ts.map +1 -1
- package/dist/cjs/transactional-email-code.js +86 -12
- package/dist/cjs/transactional-email-code.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/webhook-generator.d.ts.map +1 -1
- package/dist/cjs/webhook-generator.js +9 -2
- package/dist/cjs/webhook-generator.js.map +1 -1
- package/dist/cjs/workflow-component-plugin.js +4 -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 +31 -3
- package/dist/cjs/workflow-project-plugin.js.map +1 -1
- package/dist/cjs/workflow-utils-alias.d.ts +21 -0
- package/dist/cjs/workflow-utils-alias.d.ts.map +1 -0
- package/dist/cjs/workflow-utils-alias.js +27 -0
- package/dist/cjs/workflow-utils-alias.js.map +1 -0
- package/dist/esm/account-delete-route-generator.d.ts +20 -0
- package/dist/esm/account-delete-route-generator.d.ts.map +1 -1
- package/dist/esm/account-delete-route-generator.js +30 -27
- package/dist/esm/account-delete-route-generator.js.map +1 -1
- package/dist/esm/api-route-generator.d.ts.map +1 -1
- package/dist/esm/api-route-generator.js +57 -11
- package/dist/esm/api-route-generator.js.map +1 -1
- package/dist/esm/auth-generator.d.ts +2 -1
- package/dist/esm/auth-generator.d.ts.map +1 -1
- package/dist/esm/auth-generator.js +56 -19
- package/dist/esm/auth-generator.js.map +1 -1
- package/dist/esm/data-api-route-generator.d.ts.map +1 -1
- package/dist/esm/data-api-route-generator.js +19 -0
- package/dist/esm/data-api-route-generator.js.map +1 -1
- package/dist/esm/email-locale/email-locale-code.d.ts +25 -0
- package/dist/esm/email-locale/email-locale-code.d.ts.map +1 -0
- package/dist/esm/email-locale/email-locale-code.js +222 -0
- package/dist/esm/email-locale/email-locale-code.js.map +1 -0
- package/dist/esm/email-locale/email-locale-scope.d.ts +46 -0
- package/dist/esm/email-locale/email-locale-scope.d.ts.map +1 -0
- package/dist/esm/email-locale/email-locale-scope.js +47 -0
- package/dist/esm/email-locale/email-locale-scope.js.map +1 -0
- package/dist/esm/email-locale/index.d.ts +11 -0
- package/dist/esm/email-locale/index.d.ts.map +1 -0
- package/dist/esm/email-locale/index.js +28 -0
- package/dist/esm/email-locale/index.js.map +1 -0
- package/dist/esm/executor-generator.d.ts +11 -1
- package/dist/esm/executor-generator.d.ts.map +1 -1
- package/dist/esm/executor-generator.js +49 -7
- package/dist/esm/executor-generator.js.map +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/invoice/api-routes-code.d.ts.map +1 -1
- package/dist/esm/invoice/api-routes-code.js +55 -6
- package/dist/esm/invoice/api-routes-code.js.map +1 -1
- package/dist/esm/invoice/email-sender-code.d.ts.map +1 -1
- package/dist/esm/invoice/email-sender-code.js +72 -31
- package/dist/esm/invoice/email-sender-code.js.map +1 -1
- package/dist/esm/invoice/index.d.ts +1 -4
- package/dist/esm/invoice/index.d.ts.map +1 -1
- package/dist/esm/invoice/index.js +7 -18
- package/dist/esm/invoice/index.js.map +1 -1
- package/dist/esm/invoice/invoice-html-code.d.ts.map +1 -1
- package/dist/esm/invoice/invoice-html-code.js +31 -8
- package/dist/esm/invoice/invoice-html-code.js.map +1 -1
- package/dist/esm/invoice/regional-invoice-tax-code.d.ts +25 -0
- package/dist/esm/invoice/regional-invoice-tax-code.d.ts.map +1 -0
- package/dist/esm/invoice/regional-invoice-tax-code.js +113 -0
- package/dist/esm/invoice/regional-invoice-tax-code.js.map +1 -0
- package/dist/esm/invoice/resolve-data-source.d.ts +6 -0
- package/dist/esm/invoice/resolve-data-source.d.ts.map +1 -0
- package/dist/esm/invoice/resolve-data-source.js +19 -0
- package/dist/esm/invoice/resolve-data-source.js.map +1 -0
- package/dist/esm/nodes/account/account-delete-current.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-delete-current.js +10 -3
- package/dist/esm/nodes/account/account-delete-current.js.map +1 -1
- package/dist/esm/nodes/account/account-login.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-login.js +3 -1
- package/dist/esm/nodes/account/account-login.js.map +1 -1
- package/dist/esm/nodes/account/account-logout.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-logout.js +4 -2
- package/dist/esm/nodes/account/account-logout.js.map +1 -1
- package/dist/esm/nodes/account/account-signup.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-signup.js +12 -2
- package/dist/esm/nodes/account/account-signup.js.map +1 -1
- package/dist/esm/nodes/account/account-social-login.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-social-login.js +4 -2
- package/dist/esm/nodes/account/account-social-login.js.map +1 -1
- package/dist/esm/nodes/cart/cart-clear.d.ts.map +1 -1
- package/dist/esm/nodes/cart/cart-clear.js +6 -0
- package/dist/esm/nodes/cart/cart-clear.js.map +1 -1
- package/dist/esm/nodes/cart/cart-get-total.d.ts.map +1 -1
- package/dist/esm/nodes/cart/cart-get-total.js +81 -5
- package/dist/esm/nodes/cart/cart-get-total.js.map +1 -1
- package/dist/esm/nodes/data/data-create-item.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-create-item.js +16 -0
- package/dist/esm/nodes/data/data-create-item.js.map +1 -1
- package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.d.ts.map +1 -1
- package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.js +6 -0
- package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.js.map +1 -1
- package/dist/esm/nodes/navigation/navigation-go-to-page.d.ts.map +1 -1
- package/dist/esm/nodes/navigation/navigation-go-to-page.js +4 -1
- package/dist/esm/nodes/navigation/navigation-go-to-page.js.map +1 -1
- package/dist/esm/nodes/navigation/navigation-navigate-to-url.d.ts.map +1 -1
- package/dist/esm/nodes/navigation/navigation-navigate-to-url.js +5 -2
- package/dist/esm/nodes/navigation/navigation-navigate-to-url.js.map +1 -1
- package/dist/esm/nodes/payment/payment-charge-user.d.ts.map +1 -1
- package/dist/esm/nodes/payment/payment-charge-user.js +7 -2
- package/dist/esm/nodes/payment/payment-charge-user.js.map +1 -1
- package/dist/esm/segment-splitter.d.ts +1 -1
- package/dist/esm/segment-splitter.d.ts.map +1 -1
- package/dist/esm/segment-splitter.js +29 -2
- package/dist/esm/segment-splitter.js.map +1 -1
- package/dist/esm/sent-email-log/index.d.ts +16 -0
- package/dist/esm/sent-email-log/index.d.ts.map +1 -0
- package/dist/esm/sent-email-log/index.js +45 -0
- package/dist/esm/sent-email-log/index.js.map +1 -0
- package/dist/esm/sent-email-log/sent-email-log-code.d.ts +4 -0
- package/dist/esm/sent-email-log/sent-email-log-code.d.ts.map +1 -0
- package/dist/esm/sent-email-log/sent-email-log-code.js +411 -0
- package/dist/esm/sent-email-log/sent-email-log-code.js.map +1 -0
- package/dist/esm/sent-email-log/sent-email-log-scope.d.ts +21 -0
- package/dist/esm/sent-email-log/sent-email-log-scope.d.ts.map +1 -0
- package/dist/esm/sent-email-log/sent-email-log-scope.js +31 -0
- package/dist/esm/sent-email-log/sent-email-log-scope.js.map +1 -0
- package/dist/esm/transactional-email-code.d.ts +39 -1
- package/dist/esm/transactional-email-code.d.ts.map +1 -1
- package/dist/esm/transactional-email-code.js +81 -10
- package/dist/esm/transactional-email-code.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/webhook-generator.d.ts.map +1 -1
- package/dist/esm/webhook-generator.js +9 -2
- package/dist/esm/webhook-generator.js.map +1 -1
- package/dist/esm/workflow-component-plugin.js +4 -3
- 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 +32 -4
- package/dist/esm/workflow-project-plugin.js.map +1 -1
- package/dist/esm/workflow-utils-alias.d.ts +21 -0
- package/dist/esm/workflow-utils-alias.d.ts.map +1 -0
- package/dist/esm/workflow-utils-alias.js +21 -0
- package/dist/esm/workflow-utils-alias.js.map +1 -0
- package/package.json +4 -4
- package/src/account-delete-route-generator.ts +36 -7
- package/src/api-route-generator.ts +64 -11
- package/src/auth-generator.ts +63 -18
- package/src/data-api-route-generator.ts +19 -0
- package/src/email-locale/email-locale-code.ts +239 -0
- package/src/email-locale/email-locale-scope.ts +65 -0
- package/src/email-locale/index.ts +46 -0
- package/src/executor-generator.ts +65 -7
- package/src/index.ts +8 -0
- package/src/invoice/api-routes-code.ts +65 -6
- package/src/invoice/email-sender-code.ts +72 -31
- package/src/invoice/index.ts +7 -23
- package/src/invoice/invoice-html-code.ts +31 -8
- package/src/invoice/regional-invoice-tax-code.ts +112 -0
- package/src/invoice/resolve-data-source.ts +25 -0
- package/src/nodes/account/account-delete-current.ts +10 -3
- package/src/nodes/account/account-login.ts +3 -1
- package/src/nodes/account/account-logout.ts +4 -2
- package/src/nodes/account/account-signup.ts +12 -2
- package/src/nodes/account/account-social-login.ts +7 -2
- package/src/nodes/cart/cart-clear.ts +6 -0
- package/src/nodes/cart/cart-get-total.ts +94 -5
- package/src/nodes/data/data-create-item.ts +16 -0
- package/src/nodes/ecommerce/ecommerce-generate-invoice.ts +6 -0
- package/src/nodes/navigation/navigation-go-to-page.ts +5 -1
- package/src/nodes/navigation/navigation-navigate-to-url.ts +6 -2
- package/src/nodes/payment/payment-charge-user.ts +13 -2
- package/src/nodes/workflow-utils-global.d.ts +12 -0
- package/src/segment-splitter.ts +33 -2
- package/src/sent-email-log/index.ts +57 -0
- package/src/sent-email-log/sent-email-log-code.ts +419 -0
- package/src/sent-email-log/sent-email-log-scope.ts +36 -0
- package/src/transactional-email-code.ts +112 -4
- package/src/webhook-generator.ts +11 -2
- package/src/workflow-component-plugin.ts +4 -3
- package/src/workflow-project-plugin.ts +36 -4
- package/src/workflow-utils-alias.ts +26 -0
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { NextWorkflowProjectPlugin } from '../src/workflow-project-plugin'
|
|
2
2
|
import { nodeRegistry } from '../src/nodes'
|
|
3
|
+
import { workflowUtilsRequireLine } from '../src/workflow-utils-alias'
|
|
4
|
+
|
|
5
|
+
// The handler file binds the shared runtime before its map (see
|
|
6
|
+
// workflow-utils-alias.ts); module-eval here resolves that one require to a
|
|
7
|
+
// stand-in, exactly like the module-eval simulation resolves nothing else.
|
|
8
|
+
const requireStub = (specifier: string): Record<string, unknown> => {
|
|
9
|
+
if (specifier !== './runtime-utils') {
|
|
10
|
+
throw new Error(`unexpected require: ${specifier}`)
|
|
11
|
+
}
|
|
12
|
+
return {}
|
|
13
|
+
}
|
|
3
14
|
|
|
4
15
|
/**
|
|
5
16
|
* Regression (Vercel "ReferenceError: state_update_local_state is not defined" at
|
|
@@ -42,12 +53,19 @@ describe('generateNodeHandlerFile — inline handler map (dangling-proof)', () =
|
|
|
42
53
|
expect(dangling).toEqual([])
|
|
43
54
|
})
|
|
44
55
|
|
|
56
|
+
it('binds the shared runtime before the map so handlers can reach its helpers', () => {
|
|
57
|
+
expect(code.indexOf(workflowUtilsRequireLine('./runtime-utils'))).toBeGreaterThan(-1)
|
|
58
|
+
expect(code.indexOf(workflowUtilsRequireLine('./runtime-utils'))).toBeLessThan(
|
|
59
|
+
code.indexOf('module.exports = {')
|
|
60
|
+
)
|
|
61
|
+
})
|
|
62
|
+
|
|
45
63
|
it('evaluates as a CommonJS module without ReferenceError and exposes callable handlers', () => {
|
|
46
64
|
const moduleObj = { exports: {} as Record<string, unknown> }
|
|
47
65
|
// Simulate Next.js module-eval (the "Collecting page data" require). If a map
|
|
48
66
|
// value referenced an undefined identifier this would throw ReferenceError.
|
|
49
67
|
// eslint-disable-next-line no-new-func
|
|
50
|
-
new Function('module', 'exports', code)(moduleObj, moduleObj.exports)
|
|
68
|
+
new Function('module', 'exports', 'require', code)(moduleObj, moduleObj.exports, requireStub)
|
|
51
69
|
expect(typeof moduleObj.exports['state-update-local-state']).toBe('function')
|
|
52
70
|
expect(typeof moduleObj.exports['toast-show']).toBe('function')
|
|
53
71
|
expect(typeof moduleObj.exports['general-extract-form-data']).toBe('function')
|
|
@@ -80,7 +98,11 @@ describe('generateNodeHandlerFile — every registry node type is eval-safe in b
|
|
|
80
98
|
const moduleObj = { exports: {} as Record<string, unknown> }
|
|
81
99
|
expect(() => {
|
|
82
100
|
// eslint-disable-next-line no-new-func
|
|
83
|
-
new Function('module', 'exports', code)(
|
|
101
|
+
new Function('module', 'exports', 'require', code)(
|
|
102
|
+
moduleObj,
|
|
103
|
+
moduleObj.exports,
|
|
104
|
+
requireStub
|
|
105
|
+
)
|
|
84
106
|
}).not.toThrow()
|
|
85
107
|
|
|
86
108
|
// Each emitted map value must resolve to a callable handler (the IIFE
|
|
@@ -100,7 +122,11 @@ describe('generateNodeHandlerFile — every registry node type is eval-safe in b
|
|
|
100
122
|
try {
|
|
101
123
|
const moduleObj = { exports: {} as Record<string, unknown> }
|
|
102
124
|
// eslint-disable-next-line no-new-func
|
|
103
|
-
new Function('module', 'exports', code)(
|
|
125
|
+
new Function('module', 'exports', 'require', code)(
|
|
126
|
+
moduleObj,
|
|
127
|
+
moduleObj.exports,
|
|
128
|
+
requireStub
|
|
129
|
+
)
|
|
104
130
|
if (typeof moduleObj.exports[type] !== 'function') {
|
|
105
131
|
offenders.push(`${type} (value not callable)`)
|
|
106
132
|
}
|
|
@@ -93,6 +93,12 @@ describe('data-create-item auto-fires order-notification for teleport_orders ins
|
|
|
93
93
|
expect(src).toContain('paymentMethod: item.payment_method')
|
|
94
94
|
})
|
|
95
95
|
|
|
96
|
+
it("sends the order's tax breakdown and each line's product ids, so the route prices lines at their rate", () => {
|
|
97
|
+
expect(src).toContain('taxBreakdown: item.tax_breakdown || null')
|
|
98
|
+
expect(src).toContain("product_id: it.productId || it.product_id || ''")
|
|
99
|
+
expect(src).toContain("variant_id: it.variantId || it.variant_id || ''")
|
|
100
|
+
})
|
|
101
|
+
|
|
96
102
|
it('fires-and-forgets — does NOT await the notification call', () => {
|
|
97
103
|
// Awaiting an email provider that times out would block the
|
|
98
104
|
// workflow's success response back to the buyer, leaving the
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { generatePaypalWebhookCode } from '../src/webhook-generator'
|
|
2
|
+
import type { UIDLEcommerceSettings, UIDLInvoiceSettings } from '@teleporthq/teleport-types'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The PayPal webhook tells the order-notification route which order was paid.
|
|
6
|
+
* The capture resource's own id is a PayPal id — it matches no `teleport_orders`
|
|
7
|
+
* row, so a notification keyed on it reached the merchant with no lines at all.
|
|
8
|
+
* The internal id travels in `custom_id`, and the helper that reads it must be
|
|
9
|
+
* emitted whenever notifications are on, not only when invoices are.
|
|
10
|
+
*/
|
|
11
|
+
const ecommerce = (orderNotifications: boolean): UIDLEcommerceSettings =>
|
|
12
|
+
({ orderNotifications } as unknown as UIDLEcommerceSettings)
|
|
13
|
+
|
|
14
|
+
const invoices = (enabled: boolean): UIDLInvoiceSettings =>
|
|
15
|
+
({ enabled, autoGenerateOnPayment: enabled } as unknown as UIDLInvoiceSettings)
|
|
16
|
+
|
|
17
|
+
describe('PayPal webhook — order notification order id', () => {
|
|
18
|
+
it('sends the internal order id, falling back to the capture id', () => {
|
|
19
|
+
const source = generatePaypalWebhookCode(invoices(false), ecommerce(true))
|
|
20
|
+
expect(source).toContain("orderId: __extractInternalOrderId(resource) || resource.id || ''")
|
|
21
|
+
expect(source).toContain('function __extractInternalOrderId(resource)')
|
|
22
|
+
// Invoices are off: their handler is not emitted, only the id helper both share.
|
|
23
|
+
expect(source).not.toContain('async function handlePaypalInvoiceGeneration')
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it('emits the helper for invoices alone too, and both handlers when both are on', () => {
|
|
27
|
+
const invoicesOnly = generatePaypalWebhookCode(invoices(true), ecommerce(false))
|
|
28
|
+
expect(invoicesOnly).toContain('function __extractInternalOrderId(resource)')
|
|
29
|
+
expect(invoicesOnly).toContain('async function handlePaypalInvoiceGeneration')
|
|
30
|
+
expect(invoicesOnly).not.toContain('/api/ecommerce/order-notification')
|
|
31
|
+
|
|
32
|
+
const both = generatePaypalWebhookCode(invoices(true), ecommerce(true))
|
|
33
|
+
expect(both.match(/function __extractInternalOrderId\(resource\)/g)).toHaveLength(1)
|
|
34
|
+
expect(both).toContain('/api/ecommerce/order-notification')
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('emits neither when neither feature is on', () => {
|
|
38
|
+
const source = generatePaypalWebhookCode(invoices(false), ecommerce(false))
|
|
39
|
+
expect(source).not.toContain('__extractInternalOrderId')
|
|
40
|
+
})
|
|
41
|
+
})
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import {
|
|
2
|
+
generateClientRuntimeCode,
|
|
3
|
+
generateSharedRuntimeUtilsCode,
|
|
4
|
+
} from '../src/executor-generator'
|
|
5
|
+
import {
|
|
6
|
+
generateServerSegmentAPIRoute,
|
|
7
|
+
generateStreamingServerSegmentAPIRoute,
|
|
8
|
+
} from '../src/api-route-generator'
|
|
9
|
+
import { nodeRegistry } from '../src'
|
|
10
|
+
import { EMAIL_LOCALE_HEADER } from '../src/email-locale'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A customer email carries one copy per project language on its node config
|
|
14
|
+
* (`localizedTemplates`, written by the editor's UIDL mapper). The runtime has
|
|
15
|
+
* to pick the copy of the language the visitor is browsing in — or, for an
|
|
16
|
+
* email bound to a stored locale (an order's, a cart's), that language — and
|
|
17
|
+
* it has to do so in `resolveConfig`, the one function every execution path
|
|
18
|
+
* funnels a node config through, BEFORE the `{{token}}` fill.
|
|
19
|
+
*
|
|
20
|
+
* Executed, not grepped: what matters is which body a provider handler
|
|
21
|
+
* receives.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
type ResolveConfig = (
|
|
25
|
+
config: Record<string, unknown>,
|
|
26
|
+
context: Record<string, unknown>
|
|
27
|
+
) => Record<string, unknown>
|
|
28
|
+
|
|
29
|
+
interface Runtime {
|
|
30
|
+
resolveConfig: ResolveConfig
|
|
31
|
+
resolveEmailLocale: (config: Record<string, unknown>, context: Record<string, unknown>) => string
|
|
32
|
+
resolveWorkflowLocale: (req: unknown, incomingContext: unknown) => string
|
|
33
|
+
getClientLocale: () => string | null
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function loadRuntime(emailLocales?: { locales: string[]; defaultLocale: string }): Runtime {
|
|
37
|
+
const code = generateSharedRuntimeUtilsCode(emailLocales ? { emailLocales } : {})
|
|
38
|
+
const moduleShim = { exports: {} as Runtime }
|
|
39
|
+
// eslint-disable-next-line no-new-func
|
|
40
|
+
new Function('module', 'exports', 'require', 'process', code)(
|
|
41
|
+
moduleShim,
|
|
42
|
+
moduleShim.exports,
|
|
43
|
+
() => ({}),
|
|
44
|
+
{ env: {} }
|
|
45
|
+
)
|
|
46
|
+
return moduleShim.exports
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const wfCtx = (nodeId: string, path: string[]) => ({
|
|
50
|
+
type: 'workflowContext',
|
|
51
|
+
nodeId,
|
|
52
|
+
path: [nodeId, ...path],
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
const emailConfig = (over: Record<string, unknown> = {}) => ({
|
|
56
|
+
to: 'jane@example.com',
|
|
57
|
+
subject: 'Your order {{orderNumber}} shipped',
|
|
58
|
+
body: '<p>Hi {{customerName}}, order {{orderNumber}} is on its way.</p>',
|
|
59
|
+
localizedTemplates: {
|
|
60
|
+
es: {
|
|
61
|
+
subject: 'Tu pedido {{orderNumber}} ha sido enviado',
|
|
62
|
+
body: '<p>Hola {{customerName}}, el pedido {{orderNumber}} está en camino.</p>',
|
|
63
|
+
},
|
|
64
|
+
fr: { body: '<p>Bonjour {{customerName}}, la commande {{orderNumber}} est en route.</p>' },
|
|
65
|
+
},
|
|
66
|
+
templateParams: [
|
|
67
|
+
{ key: 'customerName', value: wfCtx('tokens', ['customerName']) },
|
|
68
|
+
{ key: 'orderNumber', value: wfCtx('tokens', ['orderNumber']) },
|
|
69
|
+
],
|
|
70
|
+
...over,
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
const tokens = { customerName: 'Jane', orderNumber: 'ORD-42' }
|
|
74
|
+
|
|
75
|
+
describe('resolveConfig picks the localized email copy', () => {
|
|
76
|
+
const runtime = loadRuntime({ locales: ['en', 'es', 'fr'], defaultLocale: 'en' })
|
|
77
|
+
|
|
78
|
+
it('sends the copy of the language the run started in, tokens filled', () => {
|
|
79
|
+
const resolved = runtime.resolveConfig(emailConfig(), { tokens, __locale: 'es' })
|
|
80
|
+
expect(resolved.subject).toBe('Tu pedido ORD-42 ha sido enviado')
|
|
81
|
+
expect(resolved.body).toBe('<p>Hola Jane, el pedido ORD-42 está en camino.</p>')
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
it('keeps the main subject when the language copy has none', () => {
|
|
85
|
+
const resolved = runtime.resolveConfig(emailConfig(), { tokens, __locale: 'fr' })
|
|
86
|
+
expect(resolved.subject).toBe('Your order ORD-42 shipped')
|
|
87
|
+
expect(resolved.body).toBe('<p>Bonjour Jane, la commande ORD-42 est en route.</p>')
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
it('sends the main copy for the default language and for a run without a locale', () => {
|
|
91
|
+
for (const context of [{ tokens, __locale: 'en' }, { tokens }, { tokens, __locale: 'de' }]) {
|
|
92
|
+
const resolved = runtime.resolveConfig(emailConfig(), context)
|
|
93
|
+
expect(resolved.subject).toBe('Your order ORD-42 shipped')
|
|
94
|
+
expect(resolved.body).toBe('<p>Hi Jane, order ORD-42 is on its way.</p>')
|
|
95
|
+
}
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
it('never lets the per-language map reach the provider handler', () => {
|
|
99
|
+
const resolved = runtime.resolveConfig(emailConfig(), { tokens, __locale: 'es' })
|
|
100
|
+
expect(resolved).not.toHaveProperty('localizedTemplates')
|
|
101
|
+
expect(resolved).not.toHaveProperty('emailLocale')
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
it('lets a bound locale (the order’s) override the run’s language', () => {
|
|
105
|
+
const resolved = runtime.resolveConfig(
|
|
106
|
+
emailConfig({ emailLocale: wfCtx('tokens', ['locale']) }),
|
|
107
|
+
{ tokens: { ...tokens, locale: 'es' }, __locale: 'fr' }
|
|
108
|
+
)
|
|
109
|
+
expect(resolved.body).toBe('<p>Hola Jane, el pedido ORD-42 está en camino.</p>')
|
|
110
|
+
expect(resolved).not.toHaveProperty('emailLocale')
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
it('treats an EMPTY bound locale as the default language, never the run’s', () => {
|
|
114
|
+
// An admin shipping an order from the Spanish admin is not the buyer: an
|
|
115
|
+
// order written before the locale column existed must not inherit the
|
|
116
|
+
// admin's language.
|
|
117
|
+
const resolved = runtime.resolveConfig(
|
|
118
|
+
emailConfig({ emailLocale: wfCtx('tokens', ['locale']) }),
|
|
119
|
+
{ tokens: { ...tokens, locale: null }, __locale: 'es' }
|
|
120
|
+
)
|
|
121
|
+
expect(resolved.body).toBe('<p>Hi Jane, order ORD-42 is on its way.</p>')
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
it('resolves a bound locale case-insensitively to the canonical code', () => {
|
|
125
|
+
expect(runtime.resolveEmailLocale({ emailLocale: 'ES' }, { __locale: 'fr' })).toBe('es')
|
|
126
|
+
expect(runtime.resolveEmailLocale({}, { __locale: 'FR' })).toBe('fr')
|
|
127
|
+
expect(runtime.resolveEmailLocale({}, {})).toBe('en')
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
it('leaves a raw-bodied node without copies untouched', () => {
|
|
131
|
+
const resolved = runtime.resolveConfig(
|
|
132
|
+
{ subject: 'Plain', body: '<p>Plain</p>', to: 'a@b.c' },
|
|
133
|
+
{ __locale: 'es' }
|
|
134
|
+
)
|
|
135
|
+
expect(resolved).toEqual({ subject: 'Plain', body: '<p>Plain</p>', to: 'a@b.c' })
|
|
136
|
+
})
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
describe('resolveWorkflowLocale', () => {
|
|
140
|
+
const runtime = loadRuntime({ locales: ['en', 'es'], defaultLocale: 'en' })
|
|
141
|
+
|
|
142
|
+
it('trusts the (validated) locale the client context carried', () => {
|
|
143
|
+
expect(
|
|
144
|
+
runtime.resolveWorkflowLocale(
|
|
145
|
+
{ headers: { [EMAIL_LOCALE_HEADER]: 'en' } },
|
|
146
|
+
{ __locale: 'es' }
|
|
147
|
+
)
|
|
148
|
+
).toBe('es')
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
it('reads the request when the context carries nothing usable', () => {
|
|
152
|
+
expect(
|
|
153
|
+
runtime.resolveWorkflowLocale(
|
|
154
|
+
{ headers: { referer: 'https://x/es/cart' } },
|
|
155
|
+
{ __locale: 'xx' }
|
|
156
|
+
)
|
|
157
|
+
).toBe('es')
|
|
158
|
+
expect(runtime.resolveWorkflowLocale({ headers: {} }, {})).toBe('en')
|
|
159
|
+
})
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
describe('a project without internationalization', () => {
|
|
163
|
+
const runtime = loadRuntime()
|
|
164
|
+
|
|
165
|
+
it('keeps the single template even when a copy map is present', () => {
|
|
166
|
+
const resolved = runtime.resolveConfig(emailConfig(), { tokens, __locale: 'es' })
|
|
167
|
+
expect(resolved.body).toBe('<p>Hi Jane, order ORD-42 is on its way.</p>')
|
|
168
|
+
expect(resolved).not.toHaveProperty('localizedTemplates')
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
it('has no client locale outside a browser', () => {
|
|
172
|
+
expect(runtime.getClientLocale()).toBeNull()
|
|
173
|
+
})
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
describe('server segment routes carry the run locale', () => {
|
|
177
|
+
const segment = {
|
|
178
|
+
id: 'seg-1',
|
|
179
|
+
env: 'server' as const,
|
|
180
|
+
nodes: [
|
|
181
|
+
{
|
|
182
|
+
id: 'email-1',
|
|
183
|
+
type: 'email-resend',
|
|
184
|
+
config: { to: 'a@b.c', subject: 'S', body: 'B' },
|
|
185
|
+
executionEnv: 'server' as const,
|
|
186
|
+
stepNumber: 1,
|
|
187
|
+
label: 'Send',
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
edges: [] as any[],
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
it('sets context.__locale from the client context or the request', () => {
|
|
194
|
+
const code = generateServerSegmentAPIRoute(segment as any, 'wf')
|
|
195
|
+
expect(code).toContain('context.__locale = utils.resolveWorkflowLocale(req, incomingContext);')
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
it('does so in the streaming route too', () => {
|
|
199
|
+
const code = generateStreamingServerSegmentAPIRoute(segment as any, 'wf')
|
|
200
|
+
expect(code).toContain('context.__locale = utils.resolveWorkflowLocale(req, body.context);')
|
|
201
|
+
})
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
describe('account routes receive the page language', () => {
|
|
205
|
+
it('signup and delete handlers send the locale header the routes read', () => {
|
|
206
|
+
for (const nodeType of ['account-signup', 'account-delete-current']) {
|
|
207
|
+
const source = nodeRegistry[nodeType].generateHandler()
|
|
208
|
+
expect(source).toContain(`'${EMAIL_LOCALE_HEADER}'`)
|
|
209
|
+
expect(source).toContain('__locale')
|
|
210
|
+
}
|
|
211
|
+
})
|
|
212
|
+
|
|
213
|
+
it('the signup handler never forwards the per-language copies as user columns', () => {
|
|
214
|
+
expect(nodeRegistry['account-signup'].generateHandler()).toContain('localizedTemplates: true')
|
|
215
|
+
})
|
|
216
|
+
})
|
|
217
|
+
|
|
218
|
+
describe('the client runtime stamps the page language on every run', () => {
|
|
219
|
+
const extractBuildContext = (): ((
|
|
220
|
+
config: unknown,
|
|
221
|
+
trigger: unknown
|
|
222
|
+
) => Record<string, unknown>) => {
|
|
223
|
+
const src = generateClientRuntimeCode()
|
|
224
|
+
const match = src.match(/function buildContext\b[\s\S]*?\n\}/)
|
|
225
|
+
if (!match) {
|
|
226
|
+
throw new Error('buildContext not found in generated runtime')
|
|
227
|
+
}
|
|
228
|
+
// eslint-disable-next-line no-new-func
|
|
229
|
+
return new Function('utils', `${match[0]}\nreturn buildContext;`)(
|
|
230
|
+
loadRuntime({ locales: ['en', 'es'], defaultLocale: 'en' })
|
|
231
|
+
)
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const withWindow = <T>(locale: string | undefined, run: () => T): T => {
|
|
235
|
+
const globalRef = globalThis as { window?: unknown; document?: unknown }
|
|
236
|
+
globalRef.window = { __NEXT_DATA__: { locale } }
|
|
237
|
+
globalRef.document = { documentElement: { lang: '' } }
|
|
238
|
+
try {
|
|
239
|
+
return run()
|
|
240
|
+
} finally {
|
|
241
|
+
delete globalRef.window
|
|
242
|
+
delete globalRef.document
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
it('reads the active Next.js locale into context.__locale', () => {
|
|
247
|
+
const buildContext = extractBuildContext()
|
|
248
|
+
const context = withWindow('es', () => buildContext({ triggerNodeId: 't' }, { clicked: true }))
|
|
249
|
+
expect(context.__locale).toBe('es')
|
|
250
|
+
expect(context.t).toEqual({ clicked: true })
|
|
251
|
+
})
|
|
252
|
+
|
|
253
|
+
it('leaves the context without a locale when the page has none the project knows', () => {
|
|
254
|
+
const buildContext = extractBuildContext()
|
|
255
|
+
expect(
|
|
256
|
+
withWindow(undefined, () => buildContext({ triggerNodeId: 't' }, {}))
|
|
257
|
+
).not.toHaveProperty('__locale')
|
|
258
|
+
expect(withWindow('de', () => buildContext({ triggerNodeId: 't' }, {}))).not.toHaveProperty(
|
|
259
|
+
'__locale'
|
|
260
|
+
)
|
|
261
|
+
})
|
|
262
|
+
})
|