@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.
- package/__tests__/node-handlers/node-to-jsx/cms-list-repeater-ecommerce-source.ts +7 -0
- package/__tests__/node-handlers/node-to-jsx/index.ts +32 -0
- package/__tests__/node-handlers/node-to-jsx/utils.ts +17 -0
- package/__tests__/utils/ast-utils.ts +32 -0
- package/dist/cjs/node-handlers/node-to-jsx/index.d.ts.map +1 -1
- package/dist/cjs/node-handlers/node-to-jsx/index.js +7 -3
- package/dist/cjs/node-handlers/node-to-jsx/index.js.map +1 -1
- package/dist/cjs/node-handlers/node-to-jsx/utils.d.ts.map +1 -1
- package/dist/cjs/node-handlers/node-to-jsx/utils.js +29 -2
- package/dist/cjs/node-handlers/node-to-jsx/utils.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/utils/ast-utils.d.ts.map +1 -1
- package/dist/cjs/utils/ast-utils.js +16 -2
- package/dist/cjs/utils/ast-utils.js.map +1 -1
- package/dist/cjs/utils/route-utils.d.ts +19 -0
- package/dist/cjs/utils/route-utils.d.ts.map +1 -1
- package/dist/cjs/utils/route-utils.js +39 -1
- package/dist/cjs/utils/route-utils.js.map +1 -1
- package/dist/cjs/utils/url-search-param-sync.d.ts +2 -2
- package/dist/cjs/utils/url-search-param-sync.d.ts.map +1 -1
- package/dist/cjs/utils/url-search-param-sync.js +40 -8
- package/dist/cjs/utils/url-search-param-sync.js.map +1 -1
- package/dist/esm/node-handlers/node-to-jsx/index.d.ts.map +1 -1
- package/dist/esm/node-handlers/node-to-jsx/index.js +7 -3
- package/dist/esm/node-handlers/node-to-jsx/index.js.map +1 -1
- package/dist/esm/node-handlers/node-to-jsx/utils.d.ts.map +1 -1
- package/dist/esm/node-handlers/node-to-jsx/utils.js +29 -2
- package/dist/esm/node-handlers/node-to-jsx/utils.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/utils/ast-utils.d.ts.map +1 -1
- package/dist/esm/utils/ast-utils.js +16 -2
- package/dist/esm/utils/ast-utils.js.map +1 -1
- package/dist/esm/utils/route-utils.d.ts +19 -0
- package/dist/esm/utils/route-utils.d.ts.map +1 -1
- package/dist/esm/utils/route-utils.js +38 -1
- package/dist/esm/utils/route-utils.js.map +1 -1
- package/dist/esm/utils/url-search-param-sync.d.ts +2 -2
- package/dist/esm/utils/url-search-param-sync.d.ts.map +1 -1
- package/dist/esm/utils/url-search-param-sync.js +40 -8
- package/dist/esm/utils/url-search-param-sync.js.map +1 -1
- package/package.json +4 -4
- package/src/node-handlers/node-to-jsx/index.ts +7 -3
- package/src/node-handlers/node-to-jsx/utils.ts +22 -2
- package/src/utils/ast-utils.ts +17 -2
- package/src/utils/route-utils.ts +42 -1
- 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;
|
|
1
|
+
{"version":3,"file":"route-utils.js","sourceRoot":"","sources":["../../../src/utils/route-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
|
|
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":"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,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,MAAM,CAAC,IAAM,uBAAuB,GAAG,UACrC,QAAgB,EAChB,SAA2B,EAC3B,OAAyB,EACzB,gBAAmC;
|
|
1
|
+
{"version":3,"file":"url-search-param-sync.js","sourceRoot":"","sources":["../../../src/utils/url-search-param-sync.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teleporthq/teleport-plugin-common",
|
|
3
|
-
"version": "0.43.
|
|
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.
|
|
31
|
-
"@teleporthq/teleport-types": "^0.43.
|
|
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": "
|
|
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 =
|
|
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 =
|
|
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 =
|
|
1243
|
+
const operandExpr = resolveElementOperandExpression(operand, conditionalIdentifier, options)
|
|
1224
1244
|
const target = createNullSafeCollection(identifier, conditionalIdentifier, t)
|
|
1225
1245
|
|
|
1226
1246
|
if (containsField) {
|
package/src/utils/ast-utils.ts
CHANGED
|
@@ -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
|
|
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'
|
package/src/utils/route-utils.ts
CHANGED
|
@@ -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(
|