@teleporthq/teleport-plugin-next-workflows 0.43.59 → 0.43.60

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.
Files changed (59) hide show
  1. package/__tests__/ai-chat-tool-dispatch-segments.test.ts +110 -0
  2. package/__tests__/ai-custom-prompt-json-mode.test.ts +78 -0
  3. package/__tests__/cart-get-total-storefront-tax.test.ts +5 -0
  4. package/__tests__/controlled-select-plugin.test.ts +170 -0
  5. package/__tests__/controlled-select.ts +215 -0
  6. package/dist/cjs/controlled-select.d.ts +23 -0
  7. package/dist/cjs/controlled-select.d.ts.map +1 -0
  8. package/dist/cjs/controlled-select.js +169 -0
  9. package/dist/cjs/controlled-select.js.map +1 -0
  10. package/dist/cjs/invoice/api-routes-code.d.ts.map +1 -1
  11. package/dist/cjs/invoice/api-routes-code.js +19 -5
  12. package/dist/cjs/invoice/api-routes-code.js.map +1 -1
  13. package/dist/cjs/nodes/ai/ai-custom-prompt.d.ts.map +1 -1
  14. package/dist/cjs/nodes/ai/ai-custom-prompt.js +4 -1
  15. package/dist/cjs/nodes/ai/ai-custom-prompt.js.map +1 -1
  16. package/dist/cjs/nodes/cart/cart-add-item.d.ts.map +1 -1
  17. package/dist/cjs/nodes/cart/cart-add-item.js +18 -0
  18. package/dist/cjs/nodes/cart/cart-add-item.js.map +1 -1
  19. package/dist/cjs/nodes/cart/cart-clear.d.ts.map +1 -1
  20. package/dist/cjs/nodes/cart/cart-clear.js +4 -0
  21. package/dist/cjs/nodes/cart/cart-clear.js.map +1 -1
  22. package/dist/cjs/nodes/cart/cart-get-total.d.ts.map +1 -1
  23. package/dist/cjs/nodes/cart/cart-get-total.js +36 -0
  24. package/dist/cjs/nodes/cart/cart-get-total.js.map +1 -1
  25. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  26. package/dist/cjs/workflow-component-plugin.d.ts.map +1 -1
  27. package/dist/cjs/workflow-component-plugin.js +5 -0
  28. package/dist/cjs/workflow-component-plugin.js.map +1 -1
  29. package/dist/esm/controlled-select.d.ts +23 -0
  30. package/dist/esm/controlled-select.d.ts.map +1 -0
  31. package/dist/esm/controlled-select.js +140 -0
  32. package/dist/esm/controlled-select.js.map +1 -0
  33. package/dist/esm/invoice/api-routes-code.d.ts.map +1 -1
  34. package/dist/esm/invoice/api-routes-code.js +19 -5
  35. package/dist/esm/invoice/api-routes-code.js.map +1 -1
  36. package/dist/esm/nodes/ai/ai-custom-prompt.d.ts.map +1 -1
  37. package/dist/esm/nodes/ai/ai-custom-prompt.js +4 -1
  38. package/dist/esm/nodes/ai/ai-custom-prompt.js.map +1 -1
  39. package/dist/esm/nodes/cart/cart-add-item.d.ts.map +1 -1
  40. package/dist/esm/nodes/cart/cart-add-item.js +18 -0
  41. package/dist/esm/nodes/cart/cart-add-item.js.map +1 -1
  42. package/dist/esm/nodes/cart/cart-clear.d.ts.map +1 -1
  43. package/dist/esm/nodes/cart/cart-clear.js +4 -0
  44. package/dist/esm/nodes/cart/cart-clear.js.map +1 -1
  45. package/dist/esm/nodes/cart/cart-get-total.d.ts.map +1 -1
  46. package/dist/esm/nodes/cart/cart-get-total.js +36 -0
  47. package/dist/esm/nodes/cart/cart-get-total.js.map +1 -1
  48. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  49. package/dist/esm/workflow-component-plugin.d.ts.map +1 -1
  50. package/dist/esm/workflow-component-plugin.js +5 -0
  51. package/dist/esm/workflow-component-plugin.js.map +1 -1
  52. package/package.json +4 -4
  53. package/src/controlled-select.ts +167 -0
  54. package/src/invoice/api-routes-code.ts +19 -5
  55. package/src/nodes/ai/ai-custom-prompt.ts +4 -1
  56. package/src/nodes/cart/cart-add-item.ts +18 -0
  57. package/src/nodes/cart/cart-clear.ts +4 -0
  58. package/src/nodes/cart/cart-get-total.ts +35 -0
  59. package/src/workflow-component-plugin.ts +9 -0
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.restoreControlledSelectValue = exports.readBoundStateName = exports.collectWrittenStateProperties = void 0;
27
+ const types = __importStar(require("@babel/types"));
28
+ /**
29
+ * Restoring `value=` on a `<select>` whose only change handler comes from a
30
+ * workflow.
31
+ *
32
+ * ## The defect
33
+ *
34
+ * `makeControlUncontrolledWhenNoChangeHandler` (teleport-plugin-common's
35
+ * node-to-jsx pass) demotes `value` → `defaultValue` on any form control that
36
+ * carries no change handler. That is right for an entity-bound display field,
37
+ * which React would otherwise FREEZE. But it runs while the JSX is generated,
38
+ * and workflow triggers are attached afterwards, by this plugin — so a control
39
+ * whose handler comes from a workflow was demoted no matter how legitimately
40
+ * controlled it is. (The helper's own contract says it "must run AFTER all
41
+ * attributes and event handlers have been added to the tag"; nothing was
42
+ * enforcing that across the plugin boundary.)
43
+ *
44
+ * `defaultValue` is read once, at mount. The bound state then has no route to
45
+ * the DOM, so a `<select>` whose state is established AFTER hydration — from a
46
+ * URL search param, say — keeps showing whatever the server rendered while the
47
+ * rest of the page follows the real value. The products-list sort shipped that
48
+ * way: `/products?sortBy=price-asc` listed products by the discounted price
49
+ * under a dropdown still reading "Name (A-Z)".
50
+ *
51
+ * ## Why only `<select>`, and only with proof
52
+ *
53
+ * A controlled control is frozen unless its handler writes the state its value
54
+ * reads. Two conditions make that safe here, and both are checked:
55
+ *
56
+ * 1. **It is a `<select>`.** A select changes in discrete, deliberate steps, so
57
+ * a controlled one survives the workflow being async — a late state write
58
+ * costs at most a frame. A text `<input>`/`<textarea>` accumulates one
59
+ * keystroke at a time and needs the state written back SYNCHRONOUSLY on
60
+ * every one; a workflow is an async pipeline and cannot promise that, and a
61
+ * controlled input whose state lags drops characters and jumps the caret.
62
+ * That is a far worse defect than a stale initial value, so text controls
63
+ * stay uncontrolled. `checked` is left alone for the same reason: a checkbox
64
+ * that bounces back before an async handler resolves reads as broken.
65
+ *
66
+ * 2. **The handler demonstrably writes that state.** The bound value has to be
67
+ * a bare identifier (a state name — `value={props.item?.category}` is an
68
+ * entity field with no state behind it), and one of the workflows on this
69
+ * element's `onChange` has to carry a state-update node targeting it. A
70
+ * select whose change handler does something unrelated keeps `defaultValue`
71
+ * and stays uncontrolled, exactly as before.
72
+ */
73
+ /** The prop that makes a `<select>` controllable. */
74
+ const CHANGE_PROP = 'onChange';
75
+ /**
76
+ * Node types that write a page/global state property.
77
+ *
78
+ * `state-batch-update` keeps its targets in `config.updates[].key` rather than
79
+ * `config.property`, so both shapes are read.
80
+ */
81
+ const STATE_WRITE_NODE_TYPES = new Set([
82
+ 'state-update-local-state',
83
+ 'state-update-global-state',
84
+ 'state-batch-update',
85
+ ]);
86
+ const readAttribute = (openingElement, name) => {
87
+ const index = openingElement.attributes.findIndex((attr) => types.isJSXAttribute(attr) && types.isJSXIdentifier(attr.name) && attr.name.name === name);
88
+ return index === -1
89
+ ? null
90
+ : { attr: openingElement.attributes[index], index };
91
+ };
92
+ /** Every state property a workflow's graph writes. */
93
+ const collectWrittenStateProperties = (workflow) => {
94
+ const written = new Set();
95
+ const nodes = Array.isArray(workflow === null || workflow === void 0 ? void 0 : workflow.nodes) ? workflow.nodes : [];
96
+ for (const node of nodes) {
97
+ if (!node || !STATE_WRITE_NODE_TYPES.has(node.type)) {
98
+ continue;
99
+ }
100
+ const config = (node.config || {});
101
+ if (typeof config.property === 'string' && config.property.length > 0) {
102
+ written.add(config.property);
103
+ }
104
+ const updates = config.updates;
105
+ if (Array.isArray(updates)) {
106
+ for (const update of updates) {
107
+ const key = update === null || update === void 0 ? void 0 : update.key;
108
+ if (typeof key === 'string' && key.length > 0) {
109
+ written.add(key);
110
+ }
111
+ }
112
+ }
113
+ }
114
+ return written;
115
+ };
116
+ exports.collectWrittenStateProperties = collectWrittenStateProperties;
117
+ /**
118
+ * The state name a `defaultValue` binding reads, or `null` when it is not a
119
+ * plain state reference.
120
+ *
121
+ * Only a bare identifier counts. `defaultValue={props.item?.category}` is an
122
+ * entity column with no state mirror — the very case the demotion exists for —
123
+ * and a member expression can never be matched against a state-update target
124
+ * with any confidence.
125
+ */
126
+ const readBoundStateName = (attr) => {
127
+ if (!attr.value || !types.isJSXExpressionContainer(attr.value)) {
128
+ return null;
129
+ }
130
+ const expression = attr.value.expression;
131
+ return types.isIdentifier(expression) ? expression.name : null;
132
+ };
133
+ exports.readBoundStateName = readBoundStateName;
134
+ /**
135
+ * Turns `defaultValue` back into `value` on a `<select>` that a workflow makes
136
+ * genuinely controlled. Mutates the opening element in place; idempotent, and a
137
+ * no-op for every element that does not meet BOTH conditions above.
138
+ *
139
+ * @param workflows The workflows wired to this element's `onChange`.
140
+ */
141
+ const restoreControlledSelectValue = (openingElement, workflows) => {
142
+ if (!types.isJSXIdentifier(openingElement.name) || openingElement.name.name !== 'select') {
143
+ return;
144
+ }
145
+ if (!readAttribute(openingElement, CHANGE_PROP)) {
146
+ return;
147
+ }
148
+ const defaultValue = readAttribute(openingElement, 'defaultValue');
149
+ if (!defaultValue) {
150
+ return;
151
+ }
152
+ // Already controlled: drop the stale `defaultValue` rather than shipping both,
153
+ // which React warns about and resolves unpredictably.
154
+ if (readAttribute(openingElement, 'value')) {
155
+ openingElement.attributes.splice(defaultValue.index, 1);
156
+ return;
157
+ }
158
+ const stateName = (0, exports.readBoundStateName)(defaultValue.attr);
159
+ if (!stateName) {
160
+ return;
161
+ }
162
+ const writesTheBoundState = workflows.some((workflow) => (0, exports.collectWrittenStateProperties)(workflow).has(stateName));
163
+ if (!writesTheBoundState) {
164
+ return;
165
+ }
166
+ defaultValue.attr.name = types.jsxIdentifier('value');
167
+ };
168
+ exports.restoreControlledSelectValue = restoreControlledSelectValue;
169
+ //# sourceMappingURL=controlled-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controlled-select.js","sourceRoot":"","sources":["../../src/controlled-select.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"api-routes-code.d.ts","sourceRoot":"","sources":["../../../src/invoice/api-routes-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE,eAAO,MAAM,gCAAgC,aAAc,mBAAmB,KAAG,MAsmBhF,CAAA;AAED,eAAO,MAAM,2BAA2B,QAAO,MAsD9C,CAAA"}
1
+ {"version":3,"file":"api-routes-code.d.ts","sourceRoot":"","sources":["../../../src/invoice/api-routes-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE,eAAO,MAAM,gCAAgC,aAAc,mBAAmB,KAAG,MAonBhF,CAAA;AAED,eAAO,MAAM,2BAA2B,QAAO,MAsD9C,CAAA"}
@@ -316,16 +316,30 @@ module.exports = async function handler(req, res) {
316
316
  grossLineSum += itemTotal;
317
317
  }
318
318
 
319
- var discountAmount = 0;
320
- if (SHOW_DISCOUNT && body.discountAmount) {
321
- discountAmount = Number(body.discountAmount) || 0;
322
- }
323
-
324
319
  // Hydrated order row (or \`{}\` for a fully body-driven call), read before the
325
320
  // totals below need it. \`orderRow\` further down is the same object under a
326
321
  // name the customer/payment fallbacks use.
327
322
  var orderShippingSource = hydratedOrder || {};
328
323
 
324
+ // Voucher discount.
325
+ //
326
+ // A discount STORED ON THE ORDER is money the buyer was not charged, so it
327
+ // is subtracted whatever \`SHOW_DISCOUNT\` says — that flag governs whether
328
+ // the template renders a discount ROW, and honouring it here would print a
329
+ // total larger than the card was debited. \`SHOW_DISCOUNT\` still gates a
330
+ // BODY-supplied amount, which is the manual/ad-hoc path a merchant opts
331
+ // into.
332
+ //
333
+ // The payment webhook calls this route with just an \`orderId\`, so the
334
+ // order row — not the body — is the usual source.
335
+ var discountAmount = 0;
336
+ if (SHOW_DISCOUNT && body.discountAmount != null && body.discountAmount !== '') {
337
+ discountAmount = Number(body.discountAmount) || 0;
338
+ } else if (orderShippingSource.discount_amount != null) {
339
+ discountAmount = Number(orderShippingSource.discount_amount) || 0;
340
+ }
341
+ if (!(discountAmount > 0)) { discountAmount = 0; }
342
+
329
343
  var taxRate = body.taxRate != null ? Number(body.taxRate) : DEFAULT_TAX_RATE;
330
344
  var subtotal;
331
345
  var taxAmount = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"api-routes-code.js","sourceRoot":"","sources":["../../../src/invoice/api-routes-code.ts"],"names":[],"mappings":";;;AAEO,MAAM,gCAAgC,GAAG,CAAC,QAA6B,EAAU,EAAE;;IACxF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,IAAI,MAAM,CAAA;IAC/C,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,IAAI,CAAC,CAAA;IACnD,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,KAAK,IAAI,CAAA;IACnD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,KAAK,IAAI,CAAA;IAC/D,MAAM,YAAY,GAAG,QAAQ,CAAC,qBAAqB,KAAK,KAAK,CAAA;IAC7D,MAAM,YAAY,GAAG,CAAA,MAAA,QAAQ,CAAC,aAAa,0CAAE,OAAO,MAAK,IAAI,CAAA;IAC7D,MAAM,oBAAoB,GAAG,CAAA,MAAA,QAAQ,CAAC,QAAQ,0CAAE,QAAQ;QACtD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC5C,CAAC,CAAC,MAAM,CAAA;IAEV,OAAO;;;;;;;;;EASP,YAAY,CAAC,CAAC,CAAC,oEAAoE,CAAC,CAAC,CAAC,EAAE;;uBAEnE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;yBACpB,cAAc;;sBAEjB,YAAY;8BACJ,kBAAkB;0BACtB,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAohB5C,YAAY;QACV,CAAC,CAAC;;;;;;;;;;;;;;;CAeL;QACG,CAAC,CAAC;;CAGN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCC,CAAA;AACD,CAAC,CAAA;AAtmBY,QAAA,gCAAgC,oCAsmB5C;AAEM,MAAM,2BAA2B,GAAG,GAAW,EAAE;IACtD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDR,CAAA;AACD,CAAC,CAAA;AAtDY,QAAA,2BAA2B,+BAsDvC"}
1
+ {"version":3,"file":"api-routes-code.js","sourceRoot":"","sources":["../../../src/invoice/api-routes-code.ts"],"names":[],"mappings":";;;AAEO,MAAM,gCAAgC,GAAG,CAAC,QAA6B,EAAU,EAAE;;IACxF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,IAAI,MAAM,CAAA;IAC/C,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,IAAI,CAAC,CAAA;IACnD,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,KAAK,IAAI,CAAA;IACnD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,KAAK,IAAI,CAAA;IAC/D,MAAM,YAAY,GAAG,QAAQ,CAAC,qBAAqB,KAAK,KAAK,CAAA;IAC7D,MAAM,YAAY,GAAG,CAAA,MAAA,QAAQ,CAAC,aAAa,0CAAE,OAAO,MAAK,IAAI,CAAA;IAC7D,MAAM,oBAAoB,GAAG,CAAA,MAAA,QAAQ,CAAC,QAAQ,0CAAE,QAAQ;QACtD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC5C,CAAC,CAAC,MAAM,CAAA;IAEV,OAAO;;;;;;;;;EASP,YAAY,CAAC,CAAC,CAAC,oEAAoE,CAAC,CAAC,CAAC,EAAE;;uBAEnE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;yBACpB,cAAc;;sBAEjB,YAAY;8BACJ,kBAAkB;0BACtB,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkiB5C,YAAY;QACV,CAAC,CAAC;;;;;;;;;;;;;;;CAeL;QACG,CAAC,CAAC;;CAGN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCC,CAAA;AACD,CAAC,CAAA;AApnBY,QAAA,gCAAgC,oCAonB5C;AAEM,MAAM,2BAA2B,GAAG,GAAW,EAAE;IACtD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDR,CAAA;AACD,CAAC,CAAA;AAtDY,QAAA,2BAA2B,+BAsDvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ai-custom-prompt.d.ts","sourceRoot":"","sources":["../../../../src/nodes/ai/ai-custom-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAiF/C,eAAO,MAAM,cAAc,EAAE,oBAU5B,CAAA"}
1
+ {"version":3,"file":"ai-custom-prompt.d.ts","sourceRoot":"","sources":["../../../../src/nodes/ai/ai-custom-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAoF/C,eAAO,MAAM,cAAc,EAAE,oBAU5B,CAAA"}
@@ -44,7 +44,10 @@ async function ai_custom_prompt(config, context, streamCallback) {
44
44
  }
45
45
  }
46
46
  try {
47
- const result = await __ai_callProvider(Object.assign(Object.assign({}, callParams), { jsonMode: false }));
47
+ // Streaming above never asks for JSON mode: a streamed reply is rendered
48
+ // token by token, and the providers that support the flag reject it
49
+ // together with `stream`.
50
+ const result = await __ai_callProvider(Object.assign(Object.assign({}, callParams), { jsonMode: config.jsonMode === true }));
48
51
  return {
49
52
  response: result.content,
50
53
  model,
@@ -1 +1 @@
1
- {"version":3,"file":"ai-custom-prompt.js","sourceRoot":"","sources":["../../../../src/nodes/ai/ai-custom-prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-custom-prompt.js","sourceRoot":"","sources":["../../../../src/nodes/ai/ai-custom-prompt.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cart-add-item.d.ts","sourceRoot":"","sources":["../../../../src/nodes/cart/cart-add-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AAoGhE,eAAO,MAAM,WAAW,EAAE,oBAMzB,CAAA"}
1
+ {"version":3,"file":"cart-add-item.d.ts","sourceRoot":"","sources":["../../../../src/nodes/cart/cart-add-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AAsHhE,eAAO,MAAM,WAAW,EAAE,oBAMzB,CAAA"}
@@ -14,6 +14,13 @@ async function cart_add_item(config) {
14
14
  const currency = config.currency || null;
15
15
  const currencySymbol = config.currencySymbol || config.currency_symbol || null;
16
16
  const slug = config.slug || null;
17
+ // The per-product discount behind `price`, snapshotted onto the line so the
18
+ // order can record what was given away. `price` is ALREADY the discounted net
19
+ // price, so nothing here takes part in any total.
20
+ const originalPrice = config.originalPrice != null ? Number(config.originalPrice) : null;
21
+ const discountType = config.discountType || null;
22
+ const discountValue = config.discountValue != null ? Number(config.discountValue) : null;
23
+ const discountAmount = config.discountAmount != null ? Number(config.discountAmount) : 0;
17
24
  // Per-product cap is published by `EcommerceProvider` to localStorage so
18
25
  // workflow handlers (which run outside React) can enforce the same limit
19
26
  // as the in-context `addToCart` / `updateItemQuantity` callbacks.
@@ -57,6 +64,13 @@ async function cart_add_item(config) {
57
64
  if (slug) {
58
65
  cart[existingIndex].slug = slug;
59
66
  }
67
+ // Re-stamped unconditionally, unlike the fields above: a discount that has
68
+ // just EXPIRED must clear the line's markdown, and `0` / `null` are the
69
+ // values that say so — a truthiness guard would keep the stale saving.
70
+ cart[existingIndex].originalPrice = originalPrice;
71
+ cart[existingIndex].discountType = discountType;
72
+ cart[existingIndex].discountValue = discountValue;
73
+ cart[existingIndex].discountAmount = discountAmount;
60
74
  localStorage.setItem('workflow_cart', JSON.stringify(cart));
61
75
  if (typeof window !== 'undefined') {
62
76
  window.dispatchEvent(new CustomEvent('teleport:cart-changed'));
@@ -83,6 +97,10 @@ async function cart_add_item(config) {
83
97
  currency,
84
98
  currencySymbol,
85
99
  slug,
100
+ originalPrice,
101
+ discountType,
102
+ discountValue,
103
+ discountAmount,
86
104
  };
87
105
  cart.push(newItem);
88
106
  localStorage.setItem('workflow_cart', JSON.stringify(cart));
@@ -1 +1 @@
1
- {"version":3,"file":"cart-add-item.js","sourceRoot":"","sources":["../../../../src/nodes/cart/cart-add-item.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cart-add-item.js","sourceRoot":"","sources":["../../../../src/nodes/cart/cart-add-item.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cart-clear.d.ts","sourceRoot":"","sources":["../../../../src/nodes/cart/cart-clear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AAqDhE,eAAO,MAAM,SAAS,EAAE,oBAMvB,CAAA"}
1
+ {"version":3,"file":"cart-clear.d.ts","sourceRoot":"","sources":["../../../../src/nodes/cart/cart-clear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AAyDhE,eAAO,MAAM,SAAS,EAAE,oBAMvB,CAAA"}
@@ -36,6 +36,9 @@ async function cart_clear() {
36
36
  // tell "just checked out" apart from "first visit, restore my cart"
37
37
  // and skip re-hydrating while the sync below is still in flight.
38
38
  localStorage.setItem('workflow_cart_cleared_at', String(Date.now()));
39
+ // An applied voucher belongs to the cart that is being emptied — after
40
+ // a completed checkout it must not carry over to the next order.
41
+ localStorage.removeItem('workflow_voucher');
39
42
  const sessionId = localStorage.getItem('workflow_cart_session_id') || null;
40
43
  fetch('/api/cart/sync', {
41
44
  method: 'POST',
@@ -47,6 +50,7 @@ async function cart_clear() {
47
50
  /* localStorage or fetch unavailable — local clear already succeeded */
48
51
  }
49
52
  window.dispatchEvent(new CustomEvent('teleport:cart-changed'));
53
+ window.dispatchEvent(new CustomEvent('teleport:voucher-changed'));
50
54
  }
51
55
  return { success: true };
52
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cart-clear.js","sourceRoot":"","sources":["../../../../src/nodes/cart/cart-clear.ts"],"names":[],"mappings":";;;AAAA,oCAAgE;AAEhE,KAAK,UAAU,UAAU;IACvB,IAAI;QACF,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;QAEzD,wDAAwD;QACxD,EAAE;QACF,iEAAiE;QACjE,6DAA6D;QAC7D,qEAAqE;QACrE,kEAAkE;QAClE,0EAA0E;QAC1E,0EAA0E;QAC1E,wEAAwE;QACxE,uCAAuC;QACvC,EAAE;QACF,0EAA0E;QAC1E,yEAAyE;QACzE,yEAAyE;QACzE,sEAAsE;QACtE,uEAAuE;QACvE,0EAA0E;QAC1E,kEAAkE;QAClE,6BAA6B;QAC7B,EAAE;QACF,wEAAwE;QACxE,2EAA2E;QAC3E,uEAAuE;QACvE,YAAY;QACZ,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;YACjC,IAAI;gBACF,gEAAgE;gBAChE,oEAAoE;gBACpE,oEAAoE;gBACpE,iEAAiE;gBACjE,YAAY,CAAC,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;gBACpE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,0BAA0B,CAAC,IAAI,IAAI,CAAA;gBAC1E,KAAK,CAAC,gBAAgB,EAAE;oBACtB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;iBAC/C,CAAC,CAAC,KAAK,CAAC,cAAa,CAAC,CAAC,CAAA;aACzB;YAAC,OAAO,MAAM,EAAE;gBACf,uEAAuE;aACxE;YACD,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,uBAAuB,CAAC,CAAC,CAAA;SAC/D;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;KACzB;IAAC,OAAO,GAAY,EAAE;QACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAA;KACzD;AACH,CAAC;AACY,QAAA,SAAS,GAAyB;IAC7C,QAAQ,EAAE,YAAY;IACtB,YAAY,EAAE,QAAQ;IACtB,eAAe;QACb,OAAO,IAAA,uBAAe,EAAC,UAAU,CAAC,CAAA;IACpC,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"cart-clear.js","sourceRoot":"","sources":["../../../../src/nodes/cart/cart-clear.ts"],"names":[],"mappings":";;;AAAA,oCAAgE;AAEhE,KAAK,UAAU,UAAU;IACvB,IAAI;QACF,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;QAEzD,wDAAwD;QACxD,EAAE;QACF,iEAAiE;QACjE,6DAA6D;QAC7D,qEAAqE;QACrE,kEAAkE;QAClE,0EAA0E;QAC1E,0EAA0E;QAC1E,wEAAwE;QACxE,uCAAuC;QACvC,EAAE;QACF,0EAA0E;QAC1E,yEAAyE;QACzE,yEAAyE;QACzE,sEAAsE;QACtE,uEAAuE;QACvE,0EAA0E;QAC1E,kEAAkE;QAClE,6BAA6B;QAC7B,EAAE;QACF,wEAAwE;QACxE,2EAA2E;QAC3E,uEAAuE;QACvE,YAAY;QACZ,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;YACjC,IAAI;gBACF,gEAAgE;gBAChE,oEAAoE;gBACpE,oEAAoE;gBACpE,iEAAiE;gBACjE,YAAY,CAAC,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;gBACpE,uEAAuE;gBACvE,iEAAiE;gBACjE,YAAY,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAA;gBAC3C,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,0BAA0B,CAAC,IAAI,IAAI,CAAA;gBAC1E,KAAK,CAAC,gBAAgB,EAAE;oBACtB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;iBAC/C,CAAC,CAAC,KAAK,CAAC,cAAa,CAAC,CAAC,CAAA;aACzB;YAAC,OAAO,MAAM,EAAE;gBACf,uEAAuE;aACxE;YACD,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,uBAAuB,CAAC,CAAC,CAAA;YAC9D,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,0BAA0B,CAAC,CAAC,CAAA;SAClE;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;KACzB;IAAC,OAAO,GAAY,EAAE;QACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAA;KACzD;AACH,CAAC;AACY,QAAA,SAAS,GAAyB;IAC7C,QAAQ,EAAE,YAAY;IACtB,YAAY,EAAE,QAAQ;IACtB,eAAe;QACb,OAAO,IAAA,uBAAe,EAAC,UAAU,CAAC,CAAA;IACpC,CAAC;CACF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"cart-get-total.d.ts","sourceRoot":"","sources":["../../../../src/nodes/cart/cart-get-total.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AAyHhE,eAAO,MAAM,YAAY,EAAE,oBAM1B,CAAA"}
1
+ {"version":3,"file":"cart-get-total.d.ts","sourceRoot":"","sources":["../../../../src/nodes/cart/cart-get-total.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AA4JhE,eAAO,MAAM,YAAY,EAAE,oBAM1B,CAAA"}
@@ -30,6 +30,25 @@ async function cart_get_total() {
30
30
  // storefronts exported before storefront tax existed, which correctly
31
31
  // resolves to "no tax".
32
32
  let storefrontTaxRate = 0;
33
+ // The voucher the shopper applied, mirrored from the same localStorage the
34
+ // storefront provider reads. The place-order workflow uses ONLY its `id`,
35
+ // to re-read the row from the database — this copy is never trusted for
36
+ // pricing, because the merchant can edit or disable a voucher after it was
37
+ // applied. Absent on a storefront exported before vouchers existed, which
38
+ // correctly resolves to "no voucher".
39
+ let voucher = null;
40
+ try {
41
+ const voucherRaw = localStorage.getItem('workflow_voucher');
42
+ if (voucherRaw) {
43
+ const parsedVoucher = JSON.parse(voucherRaw);
44
+ if (parsedVoucher && typeof parsedVoucher === 'object' && parsedVoucher.code) {
45
+ voucher = parsedVoucher;
46
+ }
47
+ }
48
+ }
49
+ catch (_voucherErr) {
50
+ /* ignore — malformed or unavailable storage reads as no voucher */
51
+ }
33
52
  try {
34
53
  const settingsRaw = localStorage.getItem('workflow_cart_settings');
35
54
  if (settingsRaw) {
@@ -65,12 +84,23 @@ async function cart_get_total() {
65
84
  let net = 0;
66
85
  let gross = 0;
67
86
  let itemCount = 0;
87
+ // What the per-product discounts took off this cart, NET. Purely
88
+ // informational: the line prices below are ALREADY marked down, so this is
89
+ // never subtracted from anything — it is what the order row records as
90
+ // `product_discount_amount` for reporting.
91
+ let productDiscount = 0;
68
92
  for (const item of cart) {
69
93
  const qty = item.quantity || 1;
70
94
  const price = item.price || 0;
71
95
  net += qty * price;
72
96
  gross += qty * grossUnitPrice(price);
73
97
  itemCount += qty;
98
+ // Rounded per UNIT before multiplying, matching the order line's own
99
+ // arithmetic so the two agree to the cent.
100
+ const unitDiscount = Number(item.discountAmount);
101
+ if (isFinite(unitDiscount) && unitDiscount > 0) {
102
+ productDiscount += qty * round(unitDiscount);
103
+ }
74
104
  }
75
105
  const roundedGross = round(gross);
76
106
  return {
@@ -95,8 +125,12 @@ async function cart_get_total() {
95
125
  // rounding, same source of truth.
96
126
  total: roundedGross,
97
127
  itemCount,
128
+ // NET sum of the per-product markdowns already reflected in the prices
129
+ // above. Recorded on the order for reporting; never subtracted again.
130
+ productDiscountTotal: round(productDiscount),
98
131
  deliveryConfig,
99
132
  taxConfig: { storefrontTaxRate },
133
+ voucher,
100
134
  };
101
135
  }
102
136
  catch (_err) {
@@ -105,8 +139,10 @@ async function cart_get_total() {
105
139
  tax: 0,
106
140
  total: 0,
107
141
  itemCount: 0,
142
+ productDiscountTotal: 0,
108
143
  deliveryConfig: null,
109
144
  taxConfig: { storefrontTaxRate: 0 },
145
+ voucher: null,
110
146
  };
111
147
  }
112
148
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cart-get-total.js","sourceRoot":"","sources":["../../../../src/nodes/cart/cart-get-total.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cart-get-total.js","sourceRoot":"","sources":["../../../../src/nodes/cart/cart-get-total.ts"],"names":[],"mappings":"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"}