@teleporthq/teleport-plugin-common 0.43.66 → 0.43.68

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 (46) hide show
  1. package/__tests__/node-handlers/node-to-jsx/cms-list-repeater-ecommerce-source.ts +7 -0
  2. package/__tests__/node-handlers/node-to-jsx/index.ts +32 -0
  3. package/__tests__/node-handlers/node-to-jsx/utils.ts +17 -0
  4. package/__tests__/utils/ast-utils.ts +32 -0
  5. package/dist/cjs/node-handlers/node-to-jsx/index.d.ts.map +1 -1
  6. package/dist/cjs/node-handlers/node-to-jsx/index.js +7 -3
  7. package/dist/cjs/node-handlers/node-to-jsx/index.js.map +1 -1
  8. package/dist/cjs/node-handlers/node-to-jsx/utils.d.ts.map +1 -1
  9. package/dist/cjs/node-handlers/node-to-jsx/utils.js +29 -2
  10. package/dist/cjs/node-handlers/node-to-jsx/utils.js.map +1 -1
  11. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  12. package/dist/cjs/utils/ast-utils.d.ts.map +1 -1
  13. package/dist/cjs/utils/ast-utils.js +16 -2
  14. package/dist/cjs/utils/ast-utils.js.map +1 -1
  15. package/dist/cjs/utils/route-utils.d.ts +19 -0
  16. package/dist/cjs/utils/route-utils.d.ts.map +1 -1
  17. package/dist/cjs/utils/route-utils.js +39 -1
  18. package/dist/cjs/utils/route-utils.js.map +1 -1
  19. package/dist/cjs/utils/url-search-param-sync.d.ts +2 -2
  20. package/dist/cjs/utils/url-search-param-sync.d.ts.map +1 -1
  21. package/dist/cjs/utils/url-search-param-sync.js +40 -8
  22. package/dist/cjs/utils/url-search-param-sync.js.map +1 -1
  23. package/dist/esm/node-handlers/node-to-jsx/index.d.ts.map +1 -1
  24. package/dist/esm/node-handlers/node-to-jsx/index.js +7 -3
  25. package/dist/esm/node-handlers/node-to-jsx/index.js.map +1 -1
  26. package/dist/esm/node-handlers/node-to-jsx/utils.d.ts.map +1 -1
  27. package/dist/esm/node-handlers/node-to-jsx/utils.js +29 -2
  28. package/dist/esm/node-handlers/node-to-jsx/utils.js.map +1 -1
  29. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  30. package/dist/esm/utils/ast-utils.d.ts.map +1 -1
  31. package/dist/esm/utils/ast-utils.js +16 -2
  32. package/dist/esm/utils/ast-utils.js.map +1 -1
  33. package/dist/esm/utils/route-utils.d.ts +19 -0
  34. package/dist/esm/utils/route-utils.d.ts.map +1 -1
  35. package/dist/esm/utils/route-utils.js +38 -1
  36. package/dist/esm/utils/route-utils.js.map +1 -1
  37. package/dist/esm/utils/url-search-param-sync.d.ts +2 -2
  38. package/dist/esm/utils/url-search-param-sync.d.ts.map +1 -1
  39. package/dist/esm/utils/url-search-param-sync.js +40 -8
  40. package/dist/esm/utils/url-search-param-sync.js.map +1 -1
  41. package/package.json +4 -4
  42. package/src/node-handlers/node-to-jsx/index.ts +7 -3
  43. package/src/node-handlers/node-to-jsx/utils.ts +22 -2
  44. package/src/utils/ast-utils.ts +17 -2
  45. package/src/utils/route-utils.ts +42 -1
  46. package/src/utils/url-search-param-sync.ts +39 -2
@@ -7,7 +7,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
7
7
  }
8
8
  return to.concat(ar || Array.prototype.slice.call(from));
9
9
  };
10
- import { RoutePaths } from '@teleporthq/teleport-shared';
10
+ import { RoutePaths, TableAccess } from '@teleporthq/teleport-shared';
11
11
  /**
12
12
  * True when this UIDL component's output route contains a Next.js dynamic
13
13
  * segment (`[id]`, `[slug]`, ...) anywhere in its folder path or file name.
@@ -75,4 +75,41 @@ export var pageHasSameTableMutationWorkflow = function (uidl, workflows) {
75
75
  return wf.nodes.some(function (node) { var _a; return MUTATION_NODE_TYPES.has(node.type) && ((_a = node.config) === null || _a === void 0 ? void 0 : _a.tableName) === tableName; });
76
76
  });
77
77
  };
78
+ var collectResourceTables = function (value, tables, seen) {
79
+ if (!value || typeof value !== 'object' || seen.has(value)) {
80
+ return;
81
+ }
82
+ seen.add(value);
83
+ if (Array.isArray(value)) {
84
+ value.forEach(function (item) { return collectResourceTables(item, tables, seen); });
85
+ return;
86
+ }
87
+ var record = value;
88
+ var definition = record.resourceDefinition;
89
+ if (definition && typeof definition.tableName === 'string') {
90
+ tables.add(definition.tableName.trim().toLowerCase());
91
+ }
92
+ Object.keys(record).forEach(function (key) { return collectResourceTables(record[key], tables, seen); });
93
+ };
94
+ /**
95
+ * True when anything on this page reads a table that holds money, the keys
96
+ * to it, or the customers' own records (`TableAccess.PROTECTED_TABLES`: gift
97
+ * cards, vouchers, their ledgers, orders, accounts). Such a page renders per
98
+ * request. A statically generated one bakes codes, balances and addresses
99
+ * into the build output and keeps serving a balance the checkout has already
100
+ * spent until the next revalidation.
101
+ *
102
+ * Shared by the static-props and static-paths plugins and the page pipeline's
103
+ * getServerSideProps finalizer, which must all reach the same verdict.
104
+ */
105
+ export var pageReadsProtectedTable = function (uidl) {
106
+ var _a, _b;
107
+ var tables = new Set();
108
+ var detailsTable = (_b = (_a = uidl.outputOptions) === null || _a === void 0 ? void 0 : _a.detailsPageInfo) === null || _b === void 0 ? void 0 : _b.tableName;
109
+ if (typeof detailsTable === 'string') {
110
+ tables.add(detailsTable.trim().toLowerCase());
111
+ }
112
+ collectResourceTables(uidl.node, tables, new Set());
113
+ return TableAccess.PROTECTED_TABLES.some(function (table) { return tables.has(table); });
114
+ };
78
115
  //# sourceMappingURL=route-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-utils.js","sourceRoot":"","sources":["../../../src/utils/route-utils.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAExD;;;GAGG;AACH,MAAM,CAAC,IAAM,cAAc,GAAG,UAAC,IAE9B;IACO,IAAA,KAAqC,IAAI,CAAC,aAAa,IAAI,EAAE,EAA3D,kBAAe,EAAf,UAAU,mBAAG,EAAE,KAAA,EAAE,gBAAa,EAAb,QAAQ,mBAAG,EAAE,KAA6B,CAAA;IACnE,OAAO,gCAAI,UAAU,UAAE,QAAQ,UAAE,IAAI,CACnC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAhD,CAAgD,CAC9D,CAAA;AACH,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAS,IAAA,qBAAqB,GAA+B,UAAU,sBAAzC,EAAE,wBAAwB,GAAK,UAAU,yBAAf,CAAe;AAE7E,IAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAA;AAE7E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,IAAM,gCAAgC,GAAG,UAC9C,IAOC,EACD,SAAyB;;IAEzB,IAAM,SAAS,GAAG,MAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,eAAe,0CAAE,SAAS,CAAA;IAChE,IAAI,CAAC,SAAS,IAAI,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,CAAA,EAAE;QACvC,OAAO,KAAK,CAAA;KACb;IAED,IAAM,MAAM,GAAG,CAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,MAAM,MAAI,MAAA,IAAI,CAAC,aAAa,0CAAE,QAAQ,CAAA,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;IAE5F,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAC,EAAE;;QAChD,IAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAA;QAC1B,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE;YACzE,OAAO,KAAK,CAAA;SACb;QAED,wEAAwE;QACxE,yEAAyE;QACzE,0EAA0E;QAC1E,+CAA+C;QAC/C,IAAM,aAAa,GAAG,MAAA,OAAO,CAAC,MAAM,0CAAE,MAA4B,CAAA;QAClE,IAAM,aAAa,GAAG,MAAA,OAAO,CAAC,MAAM,0CAAE,aAAkD,CAAA;QACxF,IAAM,kBAAkB,GACtB,OAAO,CAAC,KAAK,KAAK,MAAM;YACtB,CAAC,CAAC,CAAC,aAAa,IAAI,aAAa,KAAK,MAAM;YAC5C,CAAC,CAAC,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,EAAE,KAAK,MAAM,EAAf,CAAe,CAAC,CAAA;QAEhG,IAAI,CAAC,kBAAkB,EAAE;YACvB,OAAO,KAAK,CAAA;SACb;QAED,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAClB,UAAC,IAAI,YAAK,OAAA,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,SAAS,MAAK,SAAS,CAAA,EAAA,CACrF,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
1
+ {"version":3,"file":"route-utils.js","sourceRoot":"","sources":["../../../src/utils/route-utils.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAErE;;;GAGG;AACH,MAAM,CAAC,IAAM,cAAc,GAAG,UAAC,IAE9B;IACO,IAAA,KAAqC,IAAI,CAAC,aAAa,IAAI,EAAE,EAA3D,kBAAe,EAAf,UAAU,mBAAG,EAAE,KAAA,EAAE,gBAAa,EAAb,QAAQ,mBAAG,EAAE,KAA6B,CAAA;IACnE,OAAO,gCAAI,UAAU,UAAE,QAAQ,UAAE,IAAI,CACnC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAhD,CAAgD,CAC9D,CAAA;AACH,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAS,IAAA,qBAAqB,GAA+B,UAAU,sBAAzC,EAAE,wBAAwB,GAAK,UAAU,yBAAf,CAAe;AAE7E,IAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAA;AAE7E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,IAAM,gCAAgC,GAAG,UAC9C,IAOC,EACD,SAAyB;;IAEzB,IAAM,SAAS,GAAG,MAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,eAAe,0CAAE,SAAS,CAAA;IAChE,IAAI,CAAC,SAAS,IAAI,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,CAAA,EAAE;QACvC,OAAO,KAAK,CAAA;KACb;IAED,IAAM,MAAM,GAAG,CAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,MAAM,MAAI,MAAA,IAAI,CAAC,aAAa,0CAAE,QAAQ,CAAA,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;IAE5F,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAC,EAAE;;QAChD,IAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAA;QAC1B,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE;YACzE,OAAO,KAAK,CAAA;SACb;QAED,wEAAwE;QACxE,yEAAyE;QACzE,0EAA0E;QAC1E,+CAA+C;QAC/C,IAAM,aAAa,GAAG,MAAA,OAAO,CAAC,MAAM,0CAAE,MAA4B,CAAA;QAClE,IAAM,aAAa,GAAG,MAAA,OAAO,CAAC,MAAM,0CAAE,aAAkD,CAAA;QACxF,IAAM,kBAAkB,GACtB,OAAO,CAAC,KAAK,KAAK,MAAM;YACtB,CAAC,CAAC,CAAC,aAAa,IAAI,aAAa,KAAK,MAAM;YAC5C,CAAC,CAAC,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,EAAE,KAAK,MAAM,EAAf,CAAe,CAAC,CAAA;QAEhG,IAAI,CAAC,kBAAkB,EAAE;YACvB,OAAO,KAAK,CAAA;SACb;QAED,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAClB,UAAC,IAAI,YAAK,OAAA,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,SAAS,MAAK,SAAS,CAAA,EAAA,CACrF,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,IAAM,qBAAqB,GAAG,UAAC,KAAc,EAAE,MAAmB,EAAE,IAAkB;IACpF,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAC1D,OAAM;KACP;IACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACf,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACxB,KAAK,CAAC,OAAO,CAAC,UAAC,IAAI,IAAK,OAAA,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAzC,CAAyC,CAAC,CAAA;QAClE,OAAM;KACP;IACD,IAAM,MAAM,GAAG,KAAgC,CAAA;IAC/C,IAAM,UAAU,GAAG,MAAM,CAAC,kBAAyD,CAAA;IACnF,IAAI,UAAU,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ,EAAE;QAC1D,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;KACtD;IACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAC,GAAG,IAAK,OAAA,qBAAqB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAhD,CAAgD,CAAC,CAAA;AACxF,CAAC,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,IAAM,uBAAuB,GAAG,UAAC,IAGvC;;IACC,IAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;IAChC,IAAM,YAAY,GAAG,MAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,eAAe,0CAAE,SAAS,CAAA;IACnE,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;QACpC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;KAC9C;IACD,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;IACnD,OAAO,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAC,KAAK,IAAK,OAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAjB,CAAiB,CAAC,CAAA;AACxE,CAAC,CAAA"}
@@ -1,4 +1,4 @@
1
1
  import * as types from '@babel/types';
2
- export declare const buildUrlWriteBackEffect: (paramKey: string, valueExpr: types.Expression, depExpr: types.Expression, defaultValueExpr?: types.Expression) => types.ExpressionStatement;
3
- export declare const buildUrlReadBackEffect: (paramKey: string, setterName: string, defaultValueExpr?: types.Expression) => types.ExpressionStatement;
2
+ export declare const buildUrlWriteBackEffect: (paramKey: string, valueExpr: types.Expression, depExpr: types.Expression, defaultValueExpr?: types.Expression, adoptedRefName?: string) => types.ExpressionStatement;
3
+ export declare const buildUrlReadBackEffect: (paramKey: string, setterName: string, defaultValueExpr?: types.Expression, adoptedRefName?: string) => types.ExpressionStatement;
4
4
  //# sourceMappingURL=url-search-param-sync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"url-search-param-sync.d.ts","sourceRoot":"","sources":["../../../src/utils/url-search-param-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AA6FrC,eAAO,MAAM,uBAAuB,aACxB,MAAM,aACL,MAAM,UAAU,WAClB,MAAM,UAAU,qBACN,MAAM,UAAU,KAClC,MAAM,mBAiDR,CAAA;AAsCD,eAAO,MAAM,sBAAsB,aACvB,MAAM,cACJ,MAAM,qBACC,MAAM,UAAU,KAClC,MAAM,mBA4ER,CAAA"}
1
+ {"version":3,"file":"url-search-param-sync.d.ts","sourceRoot":"","sources":["../../../src/utils/url-search-param-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAwGrC,eAAO,MAAM,uBAAuB,aACxB,MAAM,aACL,MAAM,UAAU,WAClB,MAAM,UAAU,qBACN,MAAM,UAAU,mBAClB,MAAM,KACtB,MAAM,mBA0DR,CAAA;AAyCD,eAAO,MAAM,sBAAsB,aACvB,MAAM,cACJ,MAAM,qBACC,MAAM,UAAU,mBAClB,MAAM,KACtB,MAAM,mBAwFR,CAAA"}
@@ -1,3 +1,12 @@
1
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
2
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
3
+ if (ar || !(i in from)) {
4
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
5
+ ar[i] = from[i];
6
+ }
7
+ }
8
+ return to.concat(ar || Array.prototype.slice.call(from));
9
+ };
1
10
  import * as types from '@babel/types';
2
11
  import * as URLQueryWriter from './url-query-writer';
3
12
  // Shared builders for two-way `<state> ⇄ ?key=` URL search-param syncing.
@@ -28,6 +37,9 @@ var accessKeyOf = function (object, paramKey) {
28
37
  }
29
38
  return types.memberExpression(object, types.stringLiteral(paramKey), true);
30
39
  };
40
+ var adoptedRefCurrent = function (refName) {
41
+ return types.memberExpression(types.identifier(refName), types.identifier('current'));
42
+ };
31
43
  var routerQueryAccess = function (paramKey) {
32
44
  return accessKeyOf(types.memberExpression(types.identifier('router'), types.identifier('query')), paramKey);
33
45
  };
@@ -84,20 +96,33 @@ var clone = function (expr) {
84
96
  // means there is nothing to re-assert.
85
97
  // 4. Empty / null value deletes the key entirely so the URL never keeps a
86
98
  // sticky `?key=` empty param. The writer treats `undefined` as "remove".
87
- export var buildUrlWriteBackEffect = function (paramKey, valueExpr, depExpr, defaultValueExpr) {
99
+ // 5. `adoptedRefName` (optional) names a `useRef(false)` the paired read-back
100
+ // flips once it has adopted the URL value; until then the write-back stays
101
+ // silent. For a state seeded with its DEFAULT rather than from the URL
102
+ // (`urlSearchParamBinding.hydrateAfterMount`): on the first ready render
103
+ // the state still holds the default, and a write-back running before the
104
+ // read-back would push that default onto the URL — deleting the very key
105
+ // the read-back was about to adopt — after which the two chase each other
106
+ // forever (`/products?view=list` → `/products` → …).
107
+ export var buildUrlWriteBackEffect = function (paramKey, valueExpr, depExpr, defaultValueExpr, adoptedRefName) {
88
108
  // value === '' || value == null [|| value === <default>]
89
109
  var deleteCondition = types.logicalExpression('||', types.binaryExpression('===', clone(valueExpr), types.stringLiteral('')), types.binaryExpression('==', clone(valueExpr), types.nullLiteral()));
90
110
  if (defaultValueExpr) {
91
111
  deleteCondition = types.logicalExpression('||', deleteCondition, types.binaryExpression('===', clone(valueExpr), clone(defaultValueExpr)));
92
112
  }
93
- var effectBody = types.blockStatement([
113
+ var effectBody = types.blockStatement(__spreadArray(__spreadArray([
94
114
  // if (typeof window === 'undefined') return
95
115
  types.ifStatement(types.binaryExpression('===', types.unaryExpression('typeof', types.identifier('window')), types.stringLiteral('undefined')), types.returnStatement(null)),
96
116
  // if (!router.isReady) return
97
- types.ifStatement(types.unaryExpression('!', types.memberExpression(types.identifier('router'), types.identifier('isReady'))), types.returnStatement(null)),
117
+ types.ifStatement(types.unaryExpression('!', types.memberExpression(types.identifier('router'), types.identifier('isReady'))), types.returnStatement(null))
118
+ ], (adoptedRefName
119
+ ? [
120
+ types.ifStatement(types.unaryExpression('!', adoptedRefCurrent(adoptedRefName)), types.returnStatement(null)),
121
+ ]
122
+ : []), true), [
98
123
  // __tqWriteQueryParam('<key>', <deleteCondition> ? undefined : <value>)
99
124
  URLQueryWriter.buildQueryWriteCall(paramKey, types.conditionalExpression(deleteCondition, types.identifier('undefined'), clone(valueExpr))),
100
- ]);
125
+ ], false));
101
126
  return types.expressionStatement(types.callExpression(types.identifier('useEffect'), [
102
127
  types.arrowFunctionExpression([], effectBody),
103
128
  types.arrayExpression([
@@ -142,7 +167,10 @@ export var buildUrlWriteBackEffect = function (paramKey, valueExpr, depExpr, def
142
167
  // key, forcing an extra unsorted fetch and losing the ordering. It also keeps
143
168
  // browser back/forward to the param-free URL restoring the default view.
144
169
  // Omitting it reproduces the pre-default `''` fallback byte-for-byte.
145
- export var buildUrlReadBackEffect = function (paramKey, setterName, defaultValueExpr) {
170
+ //
171
+ // `adoptedRefName` (optional): the flag the paired write-back waits on — set
172
+ // once the URL value has been handed to the state. See the write-back's note 5.
173
+ export var buildUrlReadBackEffect = function (paramKey, setterName, defaultValueExpr, adoptedRefName) {
146
174
  var normalizeArg = types.conditionalExpression(
147
175
  // typeof __urlValue === 'string' ? __urlValue
148
176
  types.binaryExpression('===', types.unaryExpression('typeof', types.identifier('__urlValue')), types.stringLiteral('string')), types.identifier('__urlValue'), types.conditionalExpression(
@@ -154,7 +182,7 @@ export var buildUrlReadBackEffect = function (paramKey, setterName, defaultValue
154
182
  var nextValueExpr = defaultValueExpr
155
183
  ? types.logicalExpression('||', normalizeArg, clone(defaultValueExpr))
156
184
  : normalizeArg;
157
- var effectBody = types.blockStatement([
185
+ var effectBody = types.blockStatement(__spreadArray([
158
186
  // if (!router.isReady) return
159
187
  types.ifStatement(types.unaryExpression('!', types.memberExpression(types.identifier('router'), types.identifier('isReady'))), types.returnStatement(null)),
160
188
  // const __urlValue = router.query.<paramKey>
@@ -168,8 +196,12 @@ export var buildUrlReadBackEffect = function (paramKey, setterName, defaultValue
168
196
  // setState((prev) => prev === __nextValue ? prev : __nextValue)
169
197
  types.expressionStatement(types.callExpression(types.identifier(setterName), [
170
198
  types.arrowFunctionExpression([types.identifier('prev')], types.conditionalExpression(types.binaryExpression('===', types.identifier('prev'), types.identifier('__nextValue')), types.identifier('prev'), types.identifier('__nextValue'))),
171
- ])),
172
- ]);
199
+ ]))
200
+ ], (adoptedRefName
201
+ ? [
202
+ types.expressionStatement(types.assignmentExpression('=', adoptedRefCurrent(adoptedRefName), types.booleanLiteral(true))),
203
+ ]
204
+ : []), true));
173
205
  return types.expressionStatement(types.callExpression(types.identifier('useEffect'), [
174
206
  types.arrowFunctionExpression([], effectBody),
175
207
  types.arrayExpression([
@@ -1 +1 @@
1
- {"version":3,"file":"url-search-param-sync.js","sourceRoot":"","sources":["../../../src/utils/url-search-param-sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"url-search-param-sync.js","sourceRoot":"","sources":["../../../src/utils/url-search-param-sync.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,cAAc,MAAM,oBAAoB,CAAA;AAEpD,0EAA0E;AAC1E,EAAE;AACF,gBAAgB;AAChB,8EAA8E;AAC9E,4EAA4E;AAC5E,iEAAiE;AACjE,iFAAiF;AACjF,iEAAiE;AACjE,kFAAkF;AAClF,wEAAwE;AACxE,EAAE;AACF,4EAA4E;AAC5E,uEAAuE;AACvE,0CAA0C;AAE1C,6EAA6E;AAC7E,4EAA4E;AAC5E,yEAAyE;AACzE,4EAA4E;AAC5E,sDAAsD;AACtD,IAAM,mBAAmB,GAAG,4BAA4B,CAAA;AAExD,iFAAiF;AACjF,0EAA0E;AAC1E,IAAM,WAAW,GAAG,UAAC,MAAwB,EAAE,QAAgB;IAC7D,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QACtC,OAAO,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAA;KAClE;IACD,OAAO,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;AAC5E,CAAC,CAAA;AAED,IAAM,iBAAiB,GAAG,UAAC,OAAe;IACxC,OAAA,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAA9E,CAA8E,CAAA;AAEhF,IAAM,iBAAiB,GAAG,UAAC,QAAgB;IACzC,OAAA,WAAW,CACT,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAC7E,QAAQ,CACT;AAHD,CAGC,CAAA;AAEH,2EAA2E;AAC3E,8EAA8E;AAC9E,qEAAqE;AACrE,IAAM,KAAK,GAAG,UAAC,IAAsB;IACnC,OAAA,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAqB;AAA1D,CAA0D,CAAA;AAE5D,2EAA2E;AAC3E,yDAAyD;AACzD,EAAE;AACF,sBAAsB;AACtB,gDAAgD;AAChD,kCAAkC;AAClC,2BAA2B;AAC3B,0BAA0B;AAC1B,2FAA2F;AAC3F,QAAQ;AACR,2CAA2C;AAC3C,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,wEAAwE;AACxE,EAAE;AACF,4EAA4E;AAC5E,uEAAuE;AACvE,4EAA4E;AAC5E,4EAA4E;AAC5E,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,sCAAsC;AACtC,EAAE;AACF,SAAS;AACT,2EAA2E;AAC3E,4DAA4D;AAC5D,6EAA6E;AAC7E,8EAA8E;AAC9E,qEAAqE;AACrE,gEAAgE;AAChE,8EAA8E;AAC9E,6EAA6E;AAC7E,iFAAiF;AACjF,gFAAgF;AAChF,8EAA8E;AAC9E,8EAA8E;AAC9E,iDAAiD;AACjD,uEAAuE;AACvE,4EAA4E;AAC5E,gFAAgF;AAChF,+EAA+E;AAC/E,0CAA0C;AAC1C,0EAA0E;AAC1E,4EAA4E;AAC5E,8EAA8E;AAC9E,8EAA8E;AAC9E,0EAA0E;AAC1E,4EAA4E;AAC5E,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,wDAAwD;AACxD,MAAM,CAAC,IAAM,uBAAuB,GAAG,UACrC,QAAgB,EAChB,SAA2B,EAC3B,OAAyB,EACzB,gBAAmC,EACnC,cAAuB;IAEvB,0DAA0D;IAC1D,IAAI,eAAe,GAAqB,KAAK,CAAC,iBAAiB,CAC7D,IAAI,EACJ,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,EACxE,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CACpE,CAAA;IACD,IAAI,gBAAgB,EAAE;QACpB,eAAe,GAAG,KAAK,CAAC,iBAAiB,CACvC,IAAI,EACJ,eAAe,EACf,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CACzE,CAAA;KACF;IAED,IAAM,UAAU,GAAG,KAAK,CAAC,cAAc;QACrC,4CAA4C;QAC5C,KAAK,CAAC,WAAW,CACf,KAAK,CAAC,gBAAgB,CACpB,KAAK,EACL,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAC3D,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CACjC,EACD,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAC5B;QACD,8BAA8B;QAC9B,KAAK,CAAC,WAAW,CACf,KAAK,CAAC,eAAe,CACnB,GAAG,EACH,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAChF,EACD,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAC5B;OAEE,CAAC,cAAc;QAChB,CAAC,CAAC;YACE,KAAK,CAAC,WAAW,CACf,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC,EAC7D,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAC5B;SACF;QACH,CAAC,CAAC,EAAE,CAAC;QACP,wEAAwE;QACxE,cAAc,CAAC,mBAAmB,CAChC,QAAQ,EACR,KAAK,CAAC,qBAAqB,CAAC,eAAe,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAC9F;cACD,CAAA;IAEF,OAAO,KAAK,CAAC,mBAAmB,CAC9B,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;QAClD,KAAK,CAAC,uBAAuB,CAAC,EAAE,EAAE,UAAU,CAAC;QAC7C,KAAK,CAAC,eAAe,CAAC;YACpB,KAAK,CAAC,OAAO,CAAC;YACd,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;SAChF,CAAC;KACH,CAAC,CACH,CAAA;AACH,CAAC,CAAA;AAED,sEAAsE;AACtE,4DAA4D;AAC5D,EAAE;AACF,sBAAsB;AACtB,kCAAkC;AAClC,qDAAqD;AACrD,0BAA0B;AAC1B,6GAA6G;AAC7G,iFAAiF;AACjF,sDAAsD;AACtD,EAAE;AACF,4CAA4C;AAC5C,+EAA+E;AAC/E,gFAAgF;AAChF,iFAAiF;AACjF,8EAA8E;AAC9E,kDAAkD;AAClD,0EAA0E;AAC1E,gFAAgF;AAChF,8EAA8E;AAC9E,4EAA4E;AAC5E,0DAA0D;AAC1D,4EAA4E;AAC5E,4EAA4E;AAC5E,gFAAgF;AAChF,wEAAwE;AACxE,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,4EAA4E;AAC5E,iFAAiF;AACjF,8EAA8E;AAC9E,yEAAyE;AACzE,sEAAsE;AACtE,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,MAAM,CAAC,IAAM,sBAAsB,GAAG,UACpC,QAAgB,EAChB,UAAkB,EAClB,gBAAmC,EACnC,cAAuB;IAEvB,IAAM,YAAY,GAAG,KAAK,CAAC,qBAAqB;IAC9C,8CAA8C;IAC9C,KAAK,CAAC,gBAAgB,CACpB,KAAK,EACL,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAC/D,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAC9B,EACD,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,EAC9B,KAAK,CAAC,qBAAqB;IACzB,yDAAyD;IACzD,KAAK,CAAC,cAAc,CAClB,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAC9E,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CACjC,EACD,KAAK,CAAC,iBAAiB,CACrB,IAAI,EACJ,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EACrF,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CACxB,EACD,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CACxB,CACF,CAAA;IAED,8EAA8E;IAC9E,uEAAuE;IACvE,8CAA8C;IAC9C,IAAM,aAAa,GAAqB,gBAAgB;QACtD,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACtE,CAAC,CAAC,YAAY,CAAA;IAEhB,IAAM,UAAU,GAAG,KAAK,CAAC,cAAc;QACrC,8BAA8B;QAC9B,KAAK,CAAC,WAAW,CACf,KAAK,CAAC,eAAe,CACnB,GAAG,EACH,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAChF,EACD,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAC5B;QACD,6CAA6C;QAC7C,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE;YACjC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;SACtF,CAAC;QACF,kDAAkD;QAClD,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE;YACjC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;SACzE,CAAC;QACF,gEAAgE;QAChE,KAAK,CAAC,mBAAmB,CACvB,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;YACjD,KAAK,CAAC,uBAAuB,CAC3B,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAC1B,KAAK,CAAC,qBAAqB,CACzB,KAAK,CAAC,gBAAgB,CACpB,KAAK,EACL,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EACxB,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAChC,EACD,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EACxB,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAChC,CACF;SACF,CAAC,CACH;OAEE,CAAC,cAAc;QAChB,CAAC,CAAC;YACE,KAAK,CAAC,mBAAmB,CACvB,KAAK,CAAC,oBAAoB,CACxB,GAAG,EACH,iBAAiB,CAAC,cAAc,CAAC,EACjC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAC3B,CACF;SACF;QACH,CAAC,CAAC,EAAE,CAAC,QACP,CAAA;IAEF,OAAO,KAAK,CAAC,mBAAmB,CAC9B,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;QAClD,KAAK,CAAC,uBAAuB,CAAC,EAAE,EAAE,UAAU,CAAC;QAC7C,KAAK,CAAC,eAAe,CAAC;YACpB,iBAAiB,CAAC,QAAQ,CAAC;YAC3B,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;SAChF,CAAC;KACH,CAAC,CACH,CAAA;AACH,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teleporthq/teleport-plugin-common",
3
- "version": "0.43.66",
3
+ "version": "0.43.68",
4
4
  "description": "Common building and modelating functions for ASTs and HASTs",
5
5
  "author": "teleportHQ",
6
6
  "license": "MIT",
@@ -27,10 +27,10 @@
27
27
  "@babel/core": "^7.5.5",
28
28
  "@babel/preset-react": "^7.22.5",
29
29
  "@babel/types": "^7.5.5",
30
- "@teleporthq/teleport-shared": "^0.43.66",
31
- "@teleporthq/teleport-types": "^0.43.66",
30
+ "@teleporthq/teleport-shared": "^0.43.68",
31
+ "@teleporthq/teleport-types": "^0.43.68",
32
32
  "jss": "^10.0.0",
33
33
  "jss-preset-default": "^10.0.0"
34
34
  },
35
- "gitHead": "7b6301bf8c7b6f059103f9c08562f4215b5dfac3"
35
+ "gitHead": "b197a80eaae1c0652504dd9e34453839e38e4c52"
36
36
  }
@@ -698,9 +698,7 @@ const resolveScopedDynamicStyleValues = (
698
698
  const inlineStyleOverrides: Record<string, ParsedASTNode> = {}
699
699
  for (const cssProperty of Object.keys(style)) {
700
700
  const styleValue = style[cssProperty]
701
- const camelCaseProperty = cssProperty.replace(/-([a-z])/g, (_, letter: string) =>
702
- letter.toUpperCase()
703
- )
701
+ const camelCaseProperty = StringUtils.cssPropertyToInlineStyleKey(cssProperty)
704
702
 
705
703
  // A pre-resolved expression style value (e.g. a data-source-bound style whose
706
704
  // mapper already produced the full member-access expression). The UIDL style
@@ -2143,11 +2141,17 @@ const generateCMSListRepeaterNode: NodeToJSX<UIDLCMSListRepeaterNode, JSXASTRetu
2143
2141
  // Map renderPropIdentifier to the correct ecommerce context path
2144
2142
  const ecommercePathMap: Record<string, string[]> = {
2145
2143
  paymentProvider: ['paymentProviders'],
2144
+ // The providers a cart holding a subscription is offered — the checkout's
2145
+ // second method list. Same fallthrough hazard as `shippingMethod`.
2146
+ subscriptionPaymentProvider: ['subscriptionPaymentProviders'],
2146
2147
  storeLocation: ['storeLocations'],
2147
2148
  // The checkout's shipping-method list (`Cart.shippingOptions`). Without
2148
2149
  // this entry it fell to the cart items below and offered the buyer their
2149
2150
  // own products as shipping methods.
2150
2151
  shippingMethod: ['Cart', 'shippingOptions'],
2152
+ // The checkout's "Choose your discount" list, in each fulfilment shape.
2153
+ discountOption: ['Cart', 'discountOptions'],
2154
+ discountOptionPickup: ['Cart', 'discountOptionsPickup'],
2151
2155
  }
2152
2156
  // Default: cart items for orderItem, cartItem, or any unrecognized identifier
2153
2157
  const path = ecommercePathMap[rpId] || ['Cart', 'items']
@@ -1045,6 +1045,26 @@ const resolveOperandExpression = (
1045
1045
  return convertValueToLiteral(operand, conditionalIdentifier.type)
1046
1046
  }
1047
1047
 
1048
+ /**
1049
+ * `resolveOperandExpression` for an operand that is ONE ELEMENT of the bound
1050
+ * collection (`contains` / `notContains`), not a value of the collection's own
1051
+ * type.
1052
+ *
1053
+ * The typed resolver parses a static operand as the identifier's type, which
1054
+ * for an array-typed state means `JSON.parse`: the string `"5"` came out as the
1055
+ * number `5`, `"true"` as `true`. The rows an array state actually holds are
1056
+ * whatever a workflow pushed — strings, read off `data-*` attributes — so
1057
+ * `selectedRatings.includes(5)` never matched `["5"]` and a ticked rating
1058
+ * checkbox stayed empty. The literal keeps the type it was authored with, which
1059
+ * is also how the editor's canvas evaluates the same condition.
1060
+ */
1061
+ const resolveElementOperandExpression = (
1062
+ operand: string | number | boolean | UIDLDynamicReference | UIDLExpressionValue,
1063
+ conditionalIdentifier: ConditionalIdentifier,
1064
+ options: { localIdentifier?: string; detailsPageExposeAsName?: string }
1065
+ ): types.Expression =>
1066
+ resolveOperandExpression(operand, { ...conditionalIdentifier, type: '' }, options)
1067
+
1048
1068
  /**
1049
1069
  * Coerce a conditional identifier to an empty collection when it is null or
1050
1070
  * undefined, so the collection operators below can dereference it safely.
@@ -1199,7 +1219,7 @@ export const createBinaryExpression = (
1199
1219
  }
1200
1220
 
1201
1221
  if (operation === 'contains' && operand !== undefined) {
1202
- const operandExpr = resolveOperandExpression(operand, conditionalIdentifier, options)
1222
+ const operandExpr = resolveElementOperandExpression(operand, conditionalIdentifier, options)
1203
1223
  const target = createNullSafeCollection(identifier, conditionalIdentifier, t)
1204
1224
 
1205
1225
  if (containsField) {
@@ -1220,7 +1240,7 @@ export const createBinaryExpression = (
1220
1240
  }
1221
1241
 
1222
1242
  if (operation === 'notContains' && operand !== undefined) {
1223
- const operandExpr = resolveOperandExpression(operand, conditionalIdentifier, options)
1243
+ const operandExpr = resolveElementOperandExpression(operand, conditionalIdentifier, options)
1224
1244
  const target = createNullSafeCollection(identifier, conditionalIdentifier, t)
1225
1245
 
1226
1246
  if (containsField) {
@@ -614,13 +614,21 @@ export const addRawAttributeToJSXTag = (
614
614
  jsxNode.openingElement.attributes.push(attributeDefinition)
615
615
  }
616
616
 
617
+ // A JSX attribute string is raw text: nothing in it is unescaped, yet Babel
618
+ // prints a backslash or a line break in it escaped, so `pattern="\d"` would reach
619
+ // the page as `\\d`. Such a value goes in an expression container instead, where
620
+ // the escapes are JavaScript's and are read back.
621
+ const RAW_JSX_ATTRIBUTE_UNSAFE = /[\\\n\r\u2028\u2029]/
622
+
617
623
  /**
618
624
  * node must be a AST node element of type JSXElement (babel-types) or
619
625
  * equivalent
620
626
  */
621
627
  const getProperAttributeValueAssignment = (value: string | unknown, t = types) => {
622
628
  if (typeof value === 'string') {
623
- return t.stringLiteral(StringUtils.encode(value))
629
+ return RAW_JSX_ATTRIBUTE_UNSAFE.test(value)
630
+ ? t.jsxExpressionContainer(t.stringLiteral(value))
631
+ : t.stringLiteral(StringUtils.encode(value))
624
632
  }
625
633
 
626
634
  if (!value && value !== 0 && value !== false) {
@@ -949,7 +957,14 @@ export const createStateHookAST = (
949
957
  } else if (
950
958
  stateDefinition.urlSearchParamBinding &&
951
959
  typeof stateDefinition.urlSearchParamBinding.key === 'string' &&
952
- stateDefinition.urlSearchParamBinding.key !== ''
960
+ stateDefinition.urlSearchParamBinding.key !== '' &&
961
+ // `hydrateAfterMount`: the state keeps its static default on the client's
962
+ // first render too, and the router read-back effect adopts the URL value
963
+ // once `router.isReady` — a real update, so the elements it gates
964
+ // re-render. Needed where the server markup and a URL-seeded client value
965
+ // would differ only in ATTRIBUTES of same-tag siblings (a pressed toggle):
966
+ // React 17 does not patch those on hydration. See the type's docs.
967
+ stateDefinition.urlSearchParamBinding.hydrateAfterMount !== true
953
968
  ) {
954
969
  // URL-search-param binding: seed the initial state directly from
955
970
  // `window.location.search`. We deliberately DO NOT use Next.js'
@@ -1,5 +1,5 @@
1
1
  import { UIDLWorkflows } from '@teleporthq/teleport-types'
2
- import { RoutePaths } from '@teleporthq/teleport-shared'
2
+ import { RoutePaths, TableAccess } from '@teleporthq/teleport-shared'
3
3
 
4
4
  /**
5
5
  * True when this UIDL component's output route contains a Next.js dynamic
@@ -91,3 +91,44 @@ export const pageHasSameTableMutationWorkflow = (
91
91
  )
92
92
  })
93
93
  }
94
+
95
+ const collectResourceTables = (value: unknown, tables: Set<string>, seen: Set<unknown>): void => {
96
+ if (!value || typeof value !== 'object' || seen.has(value)) {
97
+ return
98
+ }
99
+ seen.add(value)
100
+ if (Array.isArray(value)) {
101
+ value.forEach((item) => collectResourceTables(item, tables, seen))
102
+ return
103
+ }
104
+ const record = value as Record<string, unknown>
105
+ const definition = record.resourceDefinition as { tableName?: unknown } | undefined
106
+ if (definition && typeof definition.tableName === 'string') {
107
+ tables.add(definition.tableName.trim().toLowerCase())
108
+ }
109
+ Object.keys(record).forEach((key) => collectResourceTables(record[key], tables, seen))
110
+ }
111
+
112
+ /**
113
+ * True when anything on this page reads a table that holds money, the keys
114
+ * to it, or the customers' own records (`TableAccess.PROTECTED_TABLES`: gift
115
+ * cards, vouchers, their ledgers, orders, accounts). Such a page renders per
116
+ * request. A statically generated one bakes codes, balances and addresses
117
+ * into the build output and keeps serving a balance the checkout has already
118
+ * spent until the next revalidation.
119
+ *
120
+ * Shared by the static-props and static-paths plugins and the page pipeline's
121
+ * getServerSideProps finalizer, which must all reach the same verdict.
122
+ */
123
+ export const pageReadsProtectedTable = (uidl: {
124
+ node?: unknown
125
+ outputOptions?: { detailsPageInfo?: { tableName?: string } }
126
+ }): boolean => {
127
+ const tables = new Set<string>()
128
+ const detailsTable = uidl.outputOptions?.detailsPageInfo?.tableName
129
+ if (typeof detailsTable === 'string') {
130
+ tables.add(detailsTable.trim().toLowerCase())
131
+ }
132
+ collectResourceTables(uidl.node, tables, new Set())
133
+ return TableAccess.PROTECTED_TABLES.some((table) => tables.has(table))
134
+ }
@@ -32,6 +32,9 @@ const accessKeyOf = (object: types.Expression, paramKey: string): types.MemberEx
32
32
  return types.memberExpression(object, types.stringLiteral(paramKey), true)
33
33
  }
34
34
 
35
+ const adoptedRefCurrent = (refName: string): types.MemberExpression =>
36
+ types.memberExpression(types.identifier(refName), types.identifier('current'))
37
+
35
38
  const routerQueryAccess = (paramKey: string): types.MemberExpression =>
36
39
  accessKeyOf(
37
40
  types.memberExpression(types.identifier('router'), types.identifier('query')),
@@ -91,11 +94,20 @@ const clone = (expr: types.Expression): types.Expression =>
91
94
  // means there is nothing to re-assert.
92
95
  // 4. Empty / null value deletes the key entirely so the URL never keeps a
93
96
  // sticky `?key=` empty param. The writer treats `undefined` as "remove".
97
+ // 5. `adoptedRefName` (optional) names a `useRef(false)` the paired read-back
98
+ // flips once it has adopted the URL value; until then the write-back stays
99
+ // silent. For a state seeded with its DEFAULT rather than from the URL
100
+ // (`urlSearchParamBinding.hydrateAfterMount`): on the first ready render
101
+ // the state still holds the default, and a write-back running before the
102
+ // read-back would push that default onto the URL — deleting the very key
103
+ // the read-back was about to adopt — after which the two chase each other
104
+ // forever (`/products?view=list` → `/products` → …).
94
105
  export const buildUrlWriteBackEffect = (
95
106
  paramKey: string,
96
107
  valueExpr: types.Expression,
97
108
  depExpr: types.Expression,
98
- defaultValueExpr?: types.Expression
109
+ defaultValueExpr?: types.Expression,
110
+ adoptedRefName?: string
99
111
  ): types.ExpressionStatement => {
100
112
  // value === '' || value == null [|| value === <default>]
101
113
  let deleteCondition: types.Expression = types.logicalExpression(
@@ -129,6 +141,15 @@ export const buildUrlWriteBackEffect = (
129
141
  ),
130
142
  types.returnStatement(null)
131
143
  ),
144
+ // if (!<adoptedRef>.current) return — only with `adoptedRefName`, see note 5
145
+ ...(adoptedRefName
146
+ ? [
147
+ types.ifStatement(
148
+ types.unaryExpression('!', adoptedRefCurrent(adoptedRefName)),
149
+ types.returnStatement(null)
150
+ ),
151
+ ]
152
+ : []),
132
153
  // __tqWriteQueryParam('<key>', <deleteCondition> ? undefined : <value>)
133
154
  URLQueryWriter.buildQueryWriteCall(
134
155
  paramKey,
@@ -183,10 +204,14 @@ export const buildUrlWriteBackEffect = (
183
204
  // key, forcing an extra unsorted fetch and losing the ordering. It also keeps
184
205
  // browser back/forward to the param-free URL restoring the default view.
185
206
  // Omitting it reproduces the pre-default `''` fallback byte-for-byte.
207
+ //
208
+ // `adoptedRefName` (optional): the flag the paired write-back waits on — set
209
+ // once the URL value has been handed to the state. See the write-back's note 5.
186
210
  export const buildUrlReadBackEffect = (
187
211
  paramKey: string,
188
212
  setterName: string,
189
- defaultValueExpr?: types.Expression
213
+ defaultValueExpr?: types.Expression,
214
+ adoptedRefName?: string
190
215
  ): types.ExpressionStatement => {
191
216
  const normalizeArg = types.conditionalExpression(
192
217
  // typeof __urlValue === 'string' ? __urlValue
@@ -252,6 +277,18 @@ export const buildUrlReadBackEffect = (
252
277
  ),
253
278
  ])
254
279
  ),
280
+ // <adoptedRef>.current = true — only with `adoptedRefName`
281
+ ...(adoptedRefName
282
+ ? [
283
+ types.expressionStatement(
284
+ types.assignmentExpression(
285
+ '=',
286
+ adoptedRefCurrent(adoptedRefName),
287
+ types.booleanLiteral(true)
288
+ )
289
+ ),
290
+ ]
291
+ : []),
255
292
  ])
256
293
 
257
294
  return types.expressionStatement(