@teleporthq/teleport-plugin-next-data-source 0.43.55 → 0.43.59
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__/array-mapper-cache-wiring.test.ts +425 -0
- package/__tests__/data-source-cache-wrapping.test.ts +152 -0
- package/__tests__/ecommerce-product-allow-backorders.test.ts +156 -0
- package/__tests__/ecommerce-product-model.test.ts +179 -0
- package/__tests__/ecommerce-product-storefront-tax.test.ts +118 -0
- package/dist/cjs/cache/ast.d.ts +71 -0
- package/dist/cjs/cache/ast.d.ts.map +1 -0
- package/dist/cjs/cache/ast.js +229 -0
- package/dist/cjs/cache/ast.js.map +1 -0
- package/dist/cjs/cache/config.d.ts +22 -0
- package/dist/cjs/cache/config.d.ts.map +1 -0
- package/dist/cjs/cache/config.js +67 -0
- package/dist/cjs/cache/config.js.map +1 -0
- package/dist/cjs/cache/types.d.ts +31 -0
- package/dist/cjs/cache/types.d.ts.map +1 -0
- package/dist/cjs/cache/types.js +3 -0
- package/dist/cjs/cache/types.js.map +1 -0
- package/dist/cjs/data-source-fetchers.d.ts +5 -3
- package/dist/cjs/data-source-fetchers.d.ts.map +1 -1
- package/dist/cjs/data-source-fetchers.js +51 -8
- package/dist/cjs/data-source-fetchers.js.map +1 -1
- package/dist/cjs/fetchers/teleport.d.ts +2 -2
- package/dist/cjs/fetchers/teleport.d.ts.map +1 -1
- package/dist/cjs/fetchers/teleport.js +3 -2
- package/dist/cjs/fetchers/teleport.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +14 -9
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/loading-state.d.ts.map +1 -1
- package/dist/cjs/loading-state.js +74 -2
- package/dist/cjs/loading-state.js.map +1 -1
- package/dist/cjs/pagination-plugin.d.ts.map +1 -1
- package/dist/cjs/pagination-plugin.js +204 -64
- package/dist/cjs/pagination-plugin.js.map +1 -1
- package/dist/cjs/transformations/ecommerce-product.d.ts +27 -1
- package/dist/cjs/transformations/ecommerce-product.d.ts.map +1 -1
- package/dist/cjs/transformations/ecommerce-product.js +8 -3
- package/dist/cjs/transformations/ecommerce-product.js.map +1 -1
- package/dist/cjs/transformations/index.d.ts +14 -2
- package/dist/cjs/transformations/index.d.ts.map +1 -1
- package/dist/cjs/transformations/index.js +37 -3
- package/dist/cjs/transformations/index.js.map +1 -1
- package/dist/cjs/transformations/shared-utils.d.ts.map +1 -1
- package/dist/cjs/transformations/shared-utils.js +1 -1
- package/dist/cjs/transformations/shared-utils.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/utils.d.ts +4 -3
- package/dist/cjs/utils.d.ts.map +1 -1
- package/dist/cjs/utils.js +6 -4
- package/dist/cjs/utils.js.map +1 -1
- package/dist/esm/cache/ast.d.ts +71 -0
- package/dist/esm/cache/ast.d.ts.map +1 -0
- package/dist/esm/cache/ast.js +196 -0
- package/dist/esm/cache/ast.js.map +1 -0
- package/dist/esm/cache/config.d.ts +22 -0
- package/dist/esm/cache/config.d.ts.map +1 -0
- package/dist/esm/cache/config.js +62 -0
- package/dist/esm/cache/config.js.map +1 -0
- package/dist/esm/cache/types.d.ts +31 -0
- package/dist/esm/cache/types.d.ts.map +1 -0
- package/dist/esm/cache/types.js +2 -0
- package/dist/esm/cache/types.js.map +1 -0
- package/dist/esm/data-source-fetchers.d.ts +5 -3
- package/dist/esm/data-source-fetchers.d.ts.map +1 -1
- package/dist/esm/data-source-fetchers.js +51 -8
- package/dist/esm/data-source-fetchers.js.map +1 -1
- package/dist/esm/fetchers/teleport.d.ts +2 -2
- package/dist/esm/fetchers/teleport.d.ts.map +1 -1
- package/dist/esm/fetchers/teleport.js +3 -2
- package/dist/esm/fetchers/teleport.js.map +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +12 -8
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/loading-state.d.ts.map +1 -1
- package/dist/esm/loading-state.js +74 -2
- package/dist/esm/loading-state.js.map +1 -1
- package/dist/esm/pagination-plugin.d.ts.map +1 -1
- package/dist/esm/pagination-plugin.js +205 -65
- package/dist/esm/pagination-plugin.js.map +1 -1
- package/dist/esm/transformations/ecommerce-product.d.ts +27 -1
- package/dist/esm/transformations/ecommerce-product.d.ts.map +1 -1
- package/dist/esm/transformations/ecommerce-product.js +8 -3
- package/dist/esm/transformations/ecommerce-product.js.map +1 -1
- package/dist/esm/transformations/index.d.ts +14 -2
- package/dist/esm/transformations/index.d.ts.map +1 -1
- package/dist/esm/transformations/index.js +36 -3
- package/dist/esm/transformations/index.js.map +1 -1
- package/dist/esm/transformations/shared-utils.d.ts.map +1 -1
- package/dist/esm/transformations/shared-utils.js +1 -1
- package/dist/esm/transformations/shared-utils.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/utils.d.ts +4 -3
- package/dist/esm/utils.d.ts.map +1 -1
- package/dist/esm/utils.js +6 -4
- package/dist/esm/utils.js.map +1 -1
- package/package.json +5 -5
- package/src/cache/ast.ts +265 -0
- package/src/cache/config.ts +79 -0
- package/src/cache/types.ts +31 -0
- package/src/data-source-fetchers.ts +66 -12
- package/src/fetchers/teleport.ts +3 -3
- package/src/index.ts +10 -4
- package/src/loading-state.ts +65 -2
- package/src/pagination-plugin.ts +315 -116
- package/src/transformations/ecommerce-product.ts +161 -5
- package/src/transformations/index.ts +43 -4
- package/src/transformations/shared-utils.ts +14 -0
- package/src/utils.ts +10 -5
|
@@ -0,0 +1,196 @@
|
|
|
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
|
+
};
|
|
10
|
+
import * as types from '@babel/types';
|
|
11
|
+
/** Identifiers the emitted page imports from `utils/tq-cache/client`. */
|
|
12
|
+
export var CACHE_CLIENT_IMPORTS = [
|
|
13
|
+
'tqCacheKey',
|
|
14
|
+
'tqCacheGet',
|
|
15
|
+
'tqCacheSet',
|
|
16
|
+
'tqCacheSetVersion',
|
|
17
|
+
'tqMarkHydrated',
|
|
18
|
+
'tqCacheRevalidate',
|
|
19
|
+
];
|
|
20
|
+
/** Local identifiers used inside the generated `fetchData` body. */
|
|
21
|
+
var KEY_VAR = '__tqKey';
|
|
22
|
+
var HIT_VAR = '__tqHit';
|
|
23
|
+
export var cachedValueVarFor = function (index) { return "ds_".concat(index, "_cached"); };
|
|
24
|
+
/**
|
|
25
|
+
* Registers the client runtime's named imports on the page.
|
|
26
|
+
*
|
|
27
|
+
* Each identifier is its own dependency entry because that is how the
|
|
28
|
+
* import-statements plugin keys them; they share one path, so they collapse
|
|
29
|
+
* into a single `import { … } from '…/utils/tq-cache/client'`.
|
|
30
|
+
*/
|
|
31
|
+
export var registerCacheClientImports = function (dependencies, folderPath) {
|
|
32
|
+
var depth = (folderPath ? folderPath.length : 0) + 1;
|
|
33
|
+
var path = "".concat('../'.repeat(depth), "utils/tq-cache/client");
|
|
34
|
+
CACHE_CLIENT_IMPORTS.forEach(function (identifier) {
|
|
35
|
+
if (!dependencies[identifier]) {
|
|
36
|
+
dependencies[identifier] = {
|
|
37
|
+
type: 'local',
|
|
38
|
+
path: path,
|
|
39
|
+
meta: { namedImport: true },
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* `const __tqKey = tqCacheKey(params)` +
|
|
46
|
+
* `const __tqHit = tqCacheGet(SCOPE, __tqKey)` +
|
|
47
|
+
* `if (__tqHit !== undefined) return Promise.resolve(__tqHit)`
|
|
48
|
+
*
|
|
49
|
+
* The early return is what keeps a hit from ever touching the network — and,
|
|
50
|
+
* just as importantly, from raising the in-flight flag that would paint the
|
|
51
|
+
* loading slot. `loading-state` deliberately attaches its bookkeeping to the
|
|
52
|
+
* network chain BELOW this, never to the `Promise.resolve`.
|
|
53
|
+
*/
|
|
54
|
+
var buildCachePeekPreamble = function (scope) { return [
|
|
55
|
+
types.variableDeclaration('const', [
|
|
56
|
+
types.variableDeclarator(types.identifier(KEY_VAR), types.callExpression(types.identifier('tqCacheKey'), [types.identifier('params')])),
|
|
57
|
+
]),
|
|
58
|
+
types.variableDeclaration('const', [
|
|
59
|
+
types.variableDeclarator(types.identifier(HIT_VAR), types.callExpression(types.identifier('tqCacheGet'), [
|
|
60
|
+
types.stringLiteral(scope),
|
|
61
|
+
types.identifier(KEY_VAR),
|
|
62
|
+
])),
|
|
63
|
+
]),
|
|
64
|
+
types.ifStatement(types.binaryExpression('!==', types.identifier(HIT_VAR), types.identifier('undefined')), types.blockStatement([
|
|
65
|
+
types.returnStatement(types.callExpression(types.memberExpression(types.identifier('Promise'), types.identifier('resolve')), [types.identifier(HIT_VAR)])),
|
|
66
|
+
])),
|
|
67
|
+
]; };
|
|
68
|
+
/**
|
|
69
|
+
* The terminal `.then` of a cached fetch: record the version the server
|
|
70
|
+
* answered with (which purges the scope if it moved) and store the rows.
|
|
71
|
+
*
|
|
72
|
+
* `tqCacheSet` returns the value it was given, so the promise still resolves to
|
|
73
|
+
* exactly what the uncached chain resolved to — `response?.data`.
|
|
74
|
+
*/
|
|
75
|
+
export var buildCacheStoreThen = function (cache) {
|
|
76
|
+
var responseData = types.optionalMemberExpression(types.identifier('response'), types.identifier('data'), false, true);
|
|
77
|
+
var responseVersion = types.optionalMemberExpression(types.identifier('response'), types.identifier('version'), false, true);
|
|
78
|
+
return types.arrowFunctionExpression([types.identifier('response')], types.blockStatement([
|
|
79
|
+
types.expressionStatement(types.callExpression(types.identifier('tqCacheSetVersion'), [
|
|
80
|
+
types.stringLiteral(cache.scope),
|
|
81
|
+
types.cloneNode(responseVersion, true),
|
|
82
|
+
])),
|
|
83
|
+
types.returnStatement(types.callExpression(types.identifier('tqCacheSet'), [
|
|
84
|
+
types.stringLiteral(cache.scope),
|
|
85
|
+
types.identifier(KEY_VAR),
|
|
86
|
+
responseData,
|
|
87
|
+
types.numericLiteral(cache.ttlSeconds),
|
|
88
|
+
types.cloneNode(responseVersion, true),
|
|
89
|
+
])),
|
|
90
|
+
]));
|
|
91
|
+
};
|
|
92
|
+
/** Wraps a network chain in the peek preamble, producing the cached body. */
|
|
93
|
+
export var buildCachedFetchBody = function (networkChain, cache) {
|
|
94
|
+
return types.blockStatement(__spreadArray(__spreadArray([], buildCachePeekPreamble(cache.scope), true), [
|
|
95
|
+
types.returnStatement(networkChain),
|
|
96
|
+
], false));
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Finds the `return <fetch(...)…>` statement inside a cached `fetchData` body.
|
|
100
|
+
*
|
|
101
|
+
* Shared with `loading-state` so both modules agree on what "the network chain"
|
|
102
|
+
* means: the body also contains an early `return Promise.resolve(hit)`, and
|
|
103
|
+
* attaching in-flight bookkeeping to THAT would flip the loading flag on every
|
|
104
|
+
* cache hit — the exact flash this feature exists to remove.
|
|
105
|
+
*/
|
|
106
|
+
export var findCachedFetchNetworkChain = function (body) {
|
|
107
|
+
for (var index = body.body.length - 1; index >= 0; index--) {
|
|
108
|
+
var statement = body.body[index];
|
|
109
|
+
if (statement.type !== 'ReturnStatement' || !statement.argument) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (statement.argument.type === 'CallExpression' &&
|
|
113
|
+
callChainStartsWithFetch(statement.argument)) {
|
|
114
|
+
return { statement: statement, index: index };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return undefined;
|
|
118
|
+
};
|
|
119
|
+
var callChainStartsWithFetch = function (expression) {
|
|
120
|
+
var current = expression;
|
|
121
|
+
while (current.type === 'CallExpression') {
|
|
122
|
+
var callee = current.callee;
|
|
123
|
+
if (callee.type === 'Identifier' && callee.name === 'fetch') {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
if (callee.type === 'MemberExpression') {
|
|
127
|
+
current = callee.object;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
return false;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Hoists a cached provider's `params` into a component const and adds the
|
|
136
|
+
* synchronous cache peek beside it.
|
|
137
|
+
*
|
|
138
|
+
* The peek is what removes the loading flash on a page or search change: those
|
|
139
|
+
* change the provider's `key`, so it REMOUNTS with `data: undefined` and paints
|
|
140
|
+
* `renderLoading()` before any promise — even an already-resolved one — can
|
|
141
|
+
* resume. Feeding a hit into `initialData` makes the provider skip its first
|
|
142
|
+
* fetch entirely and paint the cached rows on the very first frame.
|
|
143
|
+
*
|
|
144
|
+
* `sticky` is set because this value is handed to a mounted provider: once it
|
|
145
|
+
* has been, TTL expiry must not flip it back to `undefined`, or the list would
|
|
146
|
+
* blank out without refetching (its `params` never changed).
|
|
147
|
+
*
|
|
148
|
+
* Reference identity comes from the runtime's own map, not from this `useMemo`
|
|
149
|
+
* — the memo only keeps the peek from re-running on unrelated renders.
|
|
150
|
+
*/
|
|
151
|
+
export var buildCachedParamsDeclarations = function (params) {
|
|
152
|
+
var paramsIdentifier = "ds_".concat(params.index, "_params");
|
|
153
|
+
var cachedIdentifier = cachedValueVarFor(params.index);
|
|
154
|
+
return {
|
|
155
|
+
paramsIdentifier: paramsIdentifier,
|
|
156
|
+
cachedIdentifier: cachedIdentifier,
|
|
157
|
+
declarations: [
|
|
158
|
+
types.variableDeclaration('const', [
|
|
159
|
+
types.variableDeclarator(types.identifier(paramsIdentifier), params.paramsMemo),
|
|
160
|
+
]),
|
|
161
|
+
types.variableDeclaration('const', [
|
|
162
|
+
types.variableDeclarator(types.identifier(cachedIdentifier), types.callExpression(types.identifier('useMemo'), [
|
|
163
|
+
types.arrowFunctionExpression([], types.callExpression(types.identifier('tqCacheGet'), [
|
|
164
|
+
types.stringLiteral(params.cache.scope),
|
|
165
|
+
types.callExpression(types.identifier('tqCacheKey'), [
|
|
166
|
+
types.identifier(paramsIdentifier),
|
|
167
|
+
]),
|
|
168
|
+
types.objectExpression([
|
|
169
|
+
types.objectProperty(types.identifier('sticky'), types.booleanLiteral(true)),
|
|
170
|
+
]),
|
|
171
|
+
])),
|
|
172
|
+
types.arrayExpression([types.identifier(paramsIdentifier)]),
|
|
173
|
+
])),
|
|
174
|
+
]),
|
|
175
|
+
],
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
179
|
+
* `useEffect(() => { tqMarkHydrated(); tqCacheRevalidate([...]) }, [])`
|
|
180
|
+
*
|
|
181
|
+
* One effect per page, covering every scope on it in a single request. Flipping
|
|
182
|
+
* the hydration latch here rather than at import time is what keeps the first
|
|
183
|
+
* client render byte-identical to the server render.
|
|
184
|
+
*/
|
|
185
|
+
export var buildCacheHydrationEffect = function (scopes) {
|
|
186
|
+
return types.expressionStatement(types.callExpression(types.identifier('useEffect'), [
|
|
187
|
+
types.arrowFunctionExpression([], types.blockStatement([
|
|
188
|
+
types.expressionStatement(types.callExpression(types.identifier('tqMarkHydrated'), [])),
|
|
189
|
+
types.expressionStatement(types.callExpression(types.identifier('tqCacheRevalidate'), [
|
|
190
|
+
types.arrayExpression(scopes.map(function (scope) { return types.stringLiteral(scope); })),
|
|
191
|
+
])),
|
|
192
|
+
])),
|
|
193
|
+
types.arrayExpression([]),
|
|
194
|
+
]));
|
|
195
|
+
};
|
|
196
|
+
//# sourceMappingURL=ast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../../src/cache/ast.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { UIDLDataCacheConfig } from '@teleporthq/teleport-types';
|
|
2
|
+
import { DataSourceServerCacheOptions, ResolvedDataSourceCache } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Reads the `cache` block off a `cms-list-repeater`.
|
|
5
|
+
*
|
|
6
|
+
* Returns `undefined` — meaning "emit exactly what this generator emitted
|
|
7
|
+
* before caching existed" — for anything that is off, incomplete, or caches
|
|
8
|
+
* into neither layer.
|
|
9
|
+
*/
|
|
10
|
+
export declare const resolveCacheFromRepeaterContent: (cache: UIDLDataCacheConfig | undefined, resourceDefinition: {
|
|
11
|
+
dataSourceId?: string;
|
|
12
|
+
tableName?: string;
|
|
13
|
+
} | undefined) => ResolvedDataSourceCache | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Folds several mappers' requests for the same generated file into one.
|
|
16
|
+
*
|
|
17
|
+
* Enabled if ANY mapper wants it, but with the SHORTEST requested TTL and the
|
|
18
|
+
* shortest shared-cache window — a mapper that asked for fresher data must
|
|
19
|
+
* never be made staler by a sibling that asked for less.
|
|
20
|
+
*/
|
|
21
|
+
export declare const mergeServerCacheOptions: (entries: DataSourceServerCacheOptions[]) => DataSourceServerCacheOptions | undefined;
|
|
22
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cache/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAE/E;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,UACnC,mBAAmB,GAAG,SAAS,sBAClB;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,KAC5E,uBAAuB,GAAG,SAoC5B,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,YACzB,4BAA4B,EAAE,KACtC,4BAA4B,GAAG,SAiBjC,CAAA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { DataCache } from '@teleporthq/teleport-shared';
|
|
2
|
+
/**
|
|
3
|
+
* Reads the `cache` block off a `cms-list-repeater`.
|
|
4
|
+
*
|
|
5
|
+
* Returns `undefined` — meaning "emit exactly what this generator emitted
|
|
6
|
+
* before caching existed" — for anything that is off, incomplete, or caches
|
|
7
|
+
* into neither layer.
|
|
8
|
+
*/
|
|
9
|
+
export var resolveCacheFromRepeaterContent = function (cache, resourceDefinition) {
|
|
10
|
+
if (!cache || cache.enabled !== true) {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
var client = cache.client === true;
|
|
14
|
+
var server = cache.server === true;
|
|
15
|
+
if (!client && !server) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
var scope = cache.versionScope ||
|
|
19
|
+
((resourceDefinition === null || resourceDefinition === void 0 ? void 0 : resourceDefinition.dataSourceId) && (resourceDefinition === null || resourceDefinition === void 0 ? void 0 : resourceDefinition.tableName)
|
|
20
|
+
? DataCache.cacheScopeFor(resourceDefinition.dataSourceId, resourceDefinition.tableName)
|
|
21
|
+
: '');
|
|
22
|
+
if (!scope) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
var ttlSeconds = typeof cache.ttlSeconds === 'number' && cache.ttlSeconds > 0
|
|
26
|
+
? Math.trunc(cache.ttlSeconds)
|
|
27
|
+
: DataCache.DEFAULT_CACHE_TTL_SECONDS;
|
|
28
|
+
return {
|
|
29
|
+
scope: scope,
|
|
30
|
+
ttlSeconds: ttlSeconds,
|
|
31
|
+
client: client,
|
|
32
|
+
server: server,
|
|
33
|
+
sMaxAge: typeof cache.cdnSMaxAge === 'number' && cache.cdnSMaxAge > 0 ? cache.cdnSMaxAge : 0,
|
|
34
|
+
staleWhileRevalidate: typeof cache.cdnStaleWhileRevalidate === 'number' && cache.cdnStaleWhileRevalidate > 0
|
|
35
|
+
? cache.cdnStaleWhileRevalidate
|
|
36
|
+
: undefined,
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Folds several mappers' requests for the same generated file into one.
|
|
41
|
+
*
|
|
42
|
+
* Enabled if ANY mapper wants it, but with the SHORTEST requested TTL and the
|
|
43
|
+
* shortest shared-cache window — a mapper that asked for fresher data must
|
|
44
|
+
* never be made staler by a sibling that asked for less.
|
|
45
|
+
*/
|
|
46
|
+
export var mergeServerCacheOptions = function (entries) {
|
|
47
|
+
var enabled = entries.filter(function (entry) { return entry.ttlSeconds > 0 || (entry.sMaxAge || 0) > 0; });
|
|
48
|
+
if (!enabled.length) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
var positive = function (values) { return values.filter(function (value) { return value > 0; }); };
|
|
52
|
+
var ttls = positive(enabled.map(function (entry) { return entry.ttlSeconds; }));
|
|
53
|
+
var sMaxAges = positive(enabled.map(function (entry) { return entry.sMaxAge || 0; }));
|
|
54
|
+
var swrs = positive(enabled.map(function (entry) { return entry.staleWhileRevalidate || 0; }));
|
|
55
|
+
return {
|
|
56
|
+
scope: enabled[0].scope,
|
|
57
|
+
ttlSeconds: ttls.length ? Math.min.apply(Math, ttls) : 0,
|
|
58
|
+
sMaxAge: sMaxAges.length ? Math.min.apply(Math, sMaxAges) : 0,
|
|
59
|
+
staleWhileRevalidate: swrs.length ? Math.min.apply(Math, swrs) : undefined,
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cache/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A mapper's caching setup once the UIDL has been read and the defaults filled
|
|
3
|
+
* in. `client` and `server` are independent — both layers may run at once.
|
|
4
|
+
*/
|
|
5
|
+
export interface ResolvedDataSourceCache {
|
|
6
|
+
scope: string;
|
|
7
|
+
ttlSeconds: number;
|
|
8
|
+
client: boolean;
|
|
9
|
+
server: boolean;
|
|
10
|
+
/** `Cache-Control: s-maxage`. Zero unless a shared window was granted. */
|
|
11
|
+
sMaxAge: number;
|
|
12
|
+
staleWhileRevalidate?: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Cache configuration as it reaches the emitters.
|
|
16
|
+
*
|
|
17
|
+
* Resolved per generated data-source FILE, not per array mapper: the
|
|
18
|
+
* `utils/data-sources/<file>.js` module is shared by every mapper reading the
|
|
19
|
+
* same `(type, table, dataSourceId)` triple, so two mappers on two pages must
|
|
20
|
+
* agree on one server-side setup. See `mergeServerCacheOptions`.
|
|
21
|
+
*/
|
|
22
|
+
export interface DataSourceServerCacheOptions {
|
|
23
|
+
/** `<dataSourceId>:<tableName>` — the unit of invalidation. */
|
|
24
|
+
scope: string;
|
|
25
|
+
/** In-process TTL, seconds. `0` disables the server cache. */
|
|
26
|
+
ttlSeconds: number;
|
|
27
|
+
/** `Cache-Control: s-maxage`, seconds. `0` keeps the response private. */
|
|
28
|
+
sMaxAge?: number;
|
|
29
|
+
staleWhileRevalidate?: number;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cache/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAA;IACf,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,4BAA4B;IAC3C,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAA;IACb,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAA;IAClB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cache/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { DataSourceType, UIDLDataSource
|
|
1
|
+
import { DataSourceType, UIDLDataSource } from '@teleporthq/teleport-types';
|
|
2
2
|
import { generateRawQueryFetcher, parseQueryTemplateVariables } from './fetchers';
|
|
3
|
+
import type { EcommerceProductTransformOptions } from './transformations';
|
|
4
|
+
import type { DataSourceServerCacheOptions } from './cache/types';
|
|
3
5
|
export { generateRawQueryFetcher, parseQueryTemplateVariables };
|
|
4
6
|
interface DataSourceFetcherDependencies {
|
|
5
7
|
packages: string[];
|
|
@@ -7,10 +9,10 @@ interface DataSourceFetcherDependencies {
|
|
|
7
9
|
}
|
|
8
10
|
export declare const isSupabaseConnectionStringFallback: (config: Record<string, unknown>) => boolean;
|
|
9
11
|
export declare const getDataSourceDependencies: (type: DataSourceType, config?: Record<string, unknown>) => DataSourceFetcherDependencies;
|
|
10
|
-
export declare function generateDataSourceFetcher(dataSource: UIDLDataSource, tableName: string,
|
|
12
|
+
export declare function generateDataSourceFetcher(dataSource: UIDLDataSource, tableName: string, transformOptions?: EcommerceProductTransformOptions): string;
|
|
11
13
|
/**
|
|
12
14
|
* Generates a fetcher with both a core fetchData function (for server-side use in getStaticProps)
|
|
13
15
|
* and an API handler (for client-side use)
|
|
14
16
|
*/
|
|
15
|
-
export declare function generateDataSourceFetcherWithCore(dataSource: UIDLDataSource, tableName: string, isApiRoute?: boolean,
|
|
17
|
+
export declare function generateDataSourceFetcherWithCore(dataSource: UIDLDataSource, tableName: string, isApiRoute?: boolean, transformOptions?: EcommerceProductTransformOptions, cacheOptions?: DataSourceServerCacheOptions): string;
|
|
16
18
|
//# sourceMappingURL=data-source-fetchers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-source-fetchers.d.ts","sourceRoot":"","sources":["../../src/data-source-fetchers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"data-source-fetchers.d.ts","sourceRoot":"","sources":["../../src/data-source-fetchers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3E,OAAO,EA6BL,uBAAuB,EACvB,2BAA2B,EAC5B,MAAM,YAAY,CAAA;AAGnB,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,mBAAmB,CAAA;AAEzE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAA;AAEjE,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,CAAA;AAE/D,UAAU,6BAA6B;IACrC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,eAAO,MAAM,kCAAkC,WAAY,OAAO,MAAM,EAAE,OAAO,CAAC,KAAG,OAEpF,CAAA;AAED,eAAO,MAAM,yBAAyB,SAC9B,cAAc,WACX,OAAO,MAAM,EAAE,OAAO,CAAC,KAC/B,6BA4BF,CAAA;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,cAAc,EAC1B,SAAS,EAAE,MAAM,EACjB,gBAAgB,GAAE,gCAAqC,GACtD,MAAM,CAsKR;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,cAAc,EAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,OAAe,EAC3B,gBAAgB,GAAE,gCAAqC,EACvD,YAAY,CAAC,EAAE,4BAA4B,GAC1C,MAAM,CAqJR"}
|
|
@@ -10,6 +10,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
10
10
|
import { generatePostgreSQLFetcher, generateMySQLFetcher, generateMariaDBFetcher, generateRedshiftFetcher, generateMongoDBFetcher, validateMongoDBConfig, generateRedisFetcher, validateRedisConfig, generateFirestoreFetcher, validateFirestoreConfig, generateClickHouseFetcher, validateClickHouseConfig, generateAirtableFetcher, validateAirtableConfig, generateSupabaseFetcher, validateSupabaseConfig, generateTursoFetcher, validateTursoConfig, generateRESTAPIFetcher, validateRESTAPIConfig, generateJavaScriptFetcher, validateJavaScriptConfig, generateCSVFileFetcher, validateCSVConfig, generateGoogleSheetsFetcher, validateGoogleSheetsConfig, generateTeleportFetcher, validateTeleportConfig, generateRawQueryFetcher, parseQueryTemplateVariables, } from './fetchers';
|
|
11
11
|
import { validateDatabaseConfig } from './validation';
|
|
12
12
|
import { generateCountFetcher } from './count-fetchers';
|
|
13
|
+
import { DataCache } from '@teleporthq/teleport-shared';
|
|
13
14
|
export { generateRawQueryFetcher, parseQueryTemplateVariables };
|
|
14
15
|
export var isSupabaseConnectionStringFallback = function (config) {
|
|
15
16
|
return !!(config === null || config === void 0 ? void 0 : config.connectionString) && !(config === null || config === void 0 ? void 0 : config.supabaseUrl);
|
|
@@ -41,7 +42,8 @@ export var getDataSourceDependencies = function (type, config) {
|
|
|
41
42
|
};
|
|
42
43
|
return dependencyMap[type];
|
|
43
44
|
};
|
|
44
|
-
export function generateDataSourceFetcher(dataSource, tableName,
|
|
45
|
+
export function generateDataSourceFetcher(dataSource, tableName, transformOptions) {
|
|
46
|
+
if (transformOptions === void 0) { transformOptions = {}; }
|
|
45
47
|
if (!dataSource || typeof dataSource !== 'object') {
|
|
46
48
|
throw new Error('Invalid data source: data source must be a valid object');
|
|
47
49
|
}
|
|
@@ -174,7 +176,7 @@ export function generateDataSourceFetcher(dataSource, tableName, categories) {
|
|
|
174
176
|
if (!validation.isValid) {
|
|
175
177
|
throw new Error("Teleport config validation failed: ".concat(validation.error));
|
|
176
178
|
}
|
|
177
|
-
return generateTeleportFetcher(config, tableName,
|
|
179
|
+
return generateTeleportFetcher(config, tableName, transformOptions);
|
|
178
180
|
}
|
|
179
181
|
default:
|
|
180
182
|
throw new Error("Unsupported data source type: ".concat(type));
|
|
@@ -190,9 +192,10 @@ export function generateDataSourceFetcher(dataSource, tableName, categories) {
|
|
|
190
192
|
* Generates a fetcher with both a core fetchData function (for server-side use in getStaticProps)
|
|
191
193
|
* and an API handler (for client-side use)
|
|
192
194
|
*/
|
|
193
|
-
export function generateDataSourceFetcherWithCore(dataSource, tableName, isApiRoute,
|
|
195
|
+
export function generateDataSourceFetcherWithCore(dataSource, tableName, isApiRoute, transformOptions, cacheOptions) {
|
|
194
196
|
if (isApiRoute === void 0) { isApiRoute = false; }
|
|
195
|
-
|
|
197
|
+
if (transformOptions === void 0) { transformOptions = {}; }
|
|
198
|
+
var apiHandler = generateDataSourceFetcher(dataSource, tableName, transformOptions);
|
|
196
199
|
// Extract the handler function body from the API route
|
|
197
200
|
// The API route is structured as: export default async function handler(req, res) { ... }
|
|
198
201
|
// We need to create a fetchData function that can be called directly
|
|
@@ -208,11 +211,51 @@ export function generateDataSourceFetcherWithCore(dataSource, tableName, isApiRo
|
|
|
208
211
|
var countFetcherWithoutImports = countFetcherCode.replace(importRegex, '').trim();
|
|
209
212
|
// Combine and deduplicate imports
|
|
210
213
|
var allImports = Array.from(new Set(__spreadArray(__spreadArray([], imports, true), countImports, true)));
|
|
214
|
+
// Caching is applied HERE rather than in the API route because four separate
|
|
215
|
+
// places emit an `api/<file>` route and a fifth path (`getStaticProps` →
|
|
216
|
+
// `fetchData` → `handler`) never goes through a route at all. Wrapping the
|
|
217
|
+
// module's exports is the one point that covers all five, and leaves every
|
|
218
|
+
// route emitter untouched.
|
|
219
|
+
//
|
|
220
|
+
// The import depth differs by destination: this module is written to
|
|
221
|
+
// `utils/data-sources/` normally, but the `isApiRoute` variant is inlined
|
|
222
|
+
// straight into `pages/api/`.
|
|
223
|
+
var cachePreamble = cacheOptions
|
|
224
|
+
? "import { tqWithCache } from '".concat(isApiRoute ? '../../' : '../', "tq-cache/server'")
|
|
225
|
+
: '';
|
|
226
|
+
var cacheWiring = cacheOptions
|
|
227
|
+
? "\nconst __tqDataCache = ".concat(JSON.stringify({
|
|
228
|
+
scope: cacheOptions.scope,
|
|
229
|
+
ttl: cacheOptions.ttlSeconds,
|
|
230
|
+
sMaxAge: cacheOptions.sMaxAge || 0,
|
|
231
|
+
swr: cacheOptions.staleWhileRevalidate || 0,
|
|
232
|
+
}), "\nconst __tqCountCache = ").concat(JSON.stringify({
|
|
233
|
+
scope: DataCache.countScopeFor(cacheOptions.scope),
|
|
234
|
+
// Its OWN keyspace, but the DATA scope's version row. A write bumps one
|
|
235
|
+
// row; if the count kept a separate version nothing would ever bump it,
|
|
236
|
+
// and the total would stay stale after every create and delete — the
|
|
237
|
+
// grid showing one more row than the pager counts.
|
|
238
|
+
versionScope: cacheOptions.scope,
|
|
239
|
+
ttl: cacheOptions.ttlSeconds,
|
|
240
|
+
sMaxAge: cacheOptions.sMaxAge || 0,
|
|
241
|
+
swr: cacheOptions.staleWhileRevalidate || 0,
|
|
242
|
+
}), "\n\nconst cachedHandler = tqWithCache(handler, __tqDataCache)\nconst cachedGetCount = tqWithCache(getCount, __tqCountCache)\n")
|
|
243
|
+
: '';
|
|
244
|
+
var handlerExport = cacheOptions ? 'cachedHandler' : 'handler';
|
|
245
|
+
var countExport = cacheOptions ? 'cachedGetCount' : 'getCount';
|
|
211
246
|
// For API routes, export just the handler function
|
|
212
247
|
// For utils files, export the full object with all functions
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
248
|
+
//
|
|
249
|
+
// The uncached branch is spelled out verbatim rather than interpolated, so an
|
|
250
|
+
// uncached project keeps generating byte-identical output — `handler as
|
|
251
|
+
// handler` would be harmless at runtime and still a diff in every snapshot.
|
|
252
|
+
var exports = !cacheOptions
|
|
253
|
+
? isApiRoute
|
|
254
|
+
? 'export default handler'
|
|
255
|
+
: "export { fetchData, fetchCount, handler, getCount }\nexport default { fetchData, fetchCount, handler, getCount }"
|
|
256
|
+
: isApiRoute
|
|
257
|
+
? "export default ".concat(handlerExport)
|
|
258
|
+
: "export { fetchData, fetchCount, ".concat(handlerExport, " as handler, ").concat(countExport, " as getCount }\nexport default { fetchData, fetchCount, handler: ").concat(handlerExport, ", getCount: ").concat(countExport, " }");
|
|
259
|
+
return "".concat(__spreadArray(__spreadArray([], allImports, true), [cachePreamble], false).filter(Boolean).join('\n'), "\n\nasync function fetchData(params = {}) {\n const req = {\n query: params,\n method: 'GET',\n }\n \n let result = null\n let statusCode = 200\n \n const res = {\n status: (code) => {\n statusCode = code\n return res\n },\n json: (data) => {\n result = data\n return res\n },\n }\n \n await ").concat(handlerExport, "(req, res)\n \n if (statusCode !== 200 || !result || !result.success) {\n throw new Error(result?.error || 'Failed to fetch data')\n }\n \n return result.data\n}\n\nasync function fetchCount(params = {}) {\n const req = {\n query: params,\n method: 'GET',\n }\n \n let result = null\n let statusCode = 200\n \n const res = {\n status: (code) => {\n statusCode = code\n return res\n },\n json: (data) => {\n result = data\n return res\n },\n }\n \n await ").concat(countExport, "(req, res)\n \n if (statusCode !== 200 || !result || !result.success) {\n throw new Error(result?.error || 'Failed to get count')\n }\n \n return result.count\n}\n\n").concat(countFetcherWithoutImports, "\n\n").concat(handlerWithoutImports, "\n").concat(cacheWiring, "\n").concat(exports, "\n");
|
|
217
260
|
}
|
|
218
261
|
//# sourceMappingURL=data-source-fetchers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-source-fetchers.js","sourceRoot":"","sources":["../../src/data-source-fetchers.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"data-source-fetchers.js","sourceRoot":"","sources":["../../src/data-source-fetchers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type EcommerceProductTransformOptions } from '../transformations';
|
|
2
2
|
export declare const validateTeleportConfig: (config: Record<string, unknown>) => {
|
|
3
3
|
isValid: boolean;
|
|
4
4
|
error?: string;
|
|
5
5
|
};
|
|
6
|
-
export declare const generateTeleportFetcher: (config: Record<string, unknown>, tableName: string,
|
|
6
|
+
export declare const generateTeleportFetcher: (config: Record<string, unknown>, tableName: string, transformOptions?: EcommerceProductTransformOptions) => string;
|
|
7
7
|
export declare const generateTeleportCountFetcher: (config: Record<string, unknown>, tableName: string) => string;
|
|
8
8
|
//# sourceMappingURL=teleport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teleport.d.ts","sourceRoot":"","sources":["../../../src/fetchers/teleport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"teleport.d.ts","sourceRoot":"","sources":["../../../src/fetchers/teleport.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,gCAAgC,EACtC,MAAM,oBAAoB,CAAA;AA8B3B,eAAO,MAAM,sBAAsB,WACzB,OAAO,MAAM,EAAE,OAAO,CAAC,KAC9B;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAMpC,CAAA;AAED,eAAO,MAAM,uBAAuB,WAC1B,OAAO,MAAM,EAAE,OAAO,CAAC,aACpB,MAAM,qBACC,gCAAgC,KACjD,MAiXF,CAAA;AAED,eAAO,MAAM,4BAA4B,WAC/B,OAAO,MAAM,EAAE,OAAO,CAAC,aACpB,MAAM,KAChB,MA0FF,CAAA"}
|
|
@@ -20,8 +20,9 @@ export var validateTeleportConfig = function (config) {
|
|
|
20
20
|
}
|
|
21
21
|
return { isValid: true };
|
|
22
22
|
};
|
|
23
|
-
export var generateTeleportFetcher = function (config, tableName,
|
|
23
|
+
export var generateTeleportFetcher = function (config, tableName, transformOptions) {
|
|
24
24
|
var _a;
|
|
25
|
+
if (transformOptions === void 0) { transformOptions = {}; }
|
|
25
26
|
var dbConfig = config;
|
|
26
27
|
var schema = (_a = dbConfig.options) === null || _a === void 0 ? void 0 : _a.schema;
|
|
27
28
|
var hostRef = resolveEnvReference(dbConfig.host, DEFAULT_ENV_KEYS.host);
|
|
@@ -40,7 +41,7 @@ export var generateTeleportFetcher = function (config, tableName, categories) {
|
|
|
40
41
|
? "key: ".concat(resolveEnvReference(dbConfig.sslConfig.key, 'TELEPORT_DB_SSL_KEY'), ",")
|
|
41
42
|
: '', "\n rejectUnauthorized: false\n }")
|
|
42
43
|
: "(process.env.".concat(DEFAULT_ENV_KEYS.ssl, " === 'false' ? false : process.env.").concat(DEFAULT_ENV_KEYS.ssl, " === 'true' ? { rejectUnauthorized: false } : undefined)");
|
|
43
|
-
return "import { Client } from 'pg'\n\nfunction normalizePostgresConnectionString(connectionString) {\n if (!connectionString || typeof connectionString !== 'string') return connectionString;\n if (/^postgresql:\\/(?!\\/)/i.test(connectionString)) {\n return connectionString.replace(/^postgresql:\\//i, 'postgresql://');\n }\n return connectionString;\n}\n\nfunction stripSslQueryParamsFromConnectionString(connectionString) {\n if (!connectionString || typeof connectionString !== 'string') return connectionString;\n try {\n var u = new URL(connectionString.replace(/^postgresql:/i, 'postgres:'));\n u.searchParams.delete('sslmode');\n u.searchParams.delete('ssl');\n u.searchParams.delete('sslrootcert');\n u.searchParams.delete('sslcert');\n u.searchParams.delete('sslkey');\n return u.toString().replace(/^postgres:/i, 'postgresql:');\n } catch (e) {\n return connectionString;\n }\n}\n\nconst getClient = () => {\n var ssl = ".concat(sslCode, ";\n var connStr = process.env.TELEPORT_DB_CONNECTION_STRING;\n if (connStr) {\n connStr = normalizePostgresConnectionString(connStr);\n }\n if (ssl === false && connStr) {\n connStr = stripSslQueryParamsFromConnectionString(connStr);\n }\n if (connStr) {\n return new Client(Object.assign(\n { connectionString: connStr },\n ssl !== undefined ? { ssl: ssl } : {}\n ));\n }\n return new Client(Object.assign(\n {\n host: ").concat(hostRef, ",\n port: parseInt(").concat(portRef, " || '5432', 10),\n user: ").concat(userRef, ",\n password: ").concat(passwordRef, ",\n database: ").concat(databaseRef, ",\n },\n ssl !== undefined ? { ssl: ssl } : {}\n ));\n}\n\n").concat(generateSafeJSONParseCode(), "\n\n").concat(generateSearchEscapeHelpersCode(), "\n").concat(getTransformationCode(tableName,
|
|
44
|
+
return "import { Client } from 'pg'\n\nfunction normalizePostgresConnectionString(connectionString) {\n if (!connectionString || typeof connectionString !== 'string') return connectionString;\n if (/^postgresql:\\/(?!\\/)/i.test(connectionString)) {\n return connectionString.replace(/^postgresql:\\//i, 'postgresql://');\n }\n return connectionString;\n}\n\nfunction stripSslQueryParamsFromConnectionString(connectionString) {\n if (!connectionString || typeof connectionString !== 'string') return connectionString;\n try {\n var u = new URL(connectionString.replace(/^postgresql:/i, 'postgres:'));\n u.searchParams.delete('sslmode');\n u.searchParams.delete('ssl');\n u.searchParams.delete('sslrootcert');\n u.searchParams.delete('sslcert');\n u.searchParams.delete('sslkey');\n return u.toString().replace(/^postgres:/i, 'postgresql:');\n } catch (e) {\n return connectionString;\n }\n}\n\nconst getClient = () => {\n var ssl = ".concat(sslCode, ";\n var connStr = process.env.TELEPORT_DB_CONNECTION_STRING;\n if (connStr) {\n connStr = normalizePostgresConnectionString(connStr);\n }\n if (ssl === false && connStr) {\n connStr = stripSslQueryParamsFromConnectionString(connStr);\n }\n if (connStr) {\n return new Client(Object.assign(\n { connectionString: connStr },\n ssl !== undefined ? { ssl: ssl } : {}\n ));\n }\n return new Client(Object.assign(\n {\n host: ").concat(hostRef, ",\n port: parseInt(").concat(portRef, " || '5432', 10),\n user: ").concat(userRef, ",\n password: ").concat(passwordRef, ",\n database: ").concat(databaseRef, ",\n },\n ssl !== undefined ? { ssl: ssl } : {}\n ));\n}\n\n").concat(generateSafeJSONParseCode(), "\n\n").concat(generateSearchEscapeHelpersCode(), "\n").concat(getTransformationCode(tableName, transformOptions), "\n").concat(getTransformWrapperCode(tableName), "\nconst processFilters = (filters, conditions, queryParams, paramIndex) => {\n if (!filters) return paramIndex\n \n const parsedFilters = safeJSONParse(filters)\n \n if (Array.isArray(parsedFilters)) {\n parsedFilters.forEach((filter) => {\n if (!filter.source || filter.destination === undefined) return\n \n const field = filter.source\n const value = filter.destination\n const operand = filter.operand || '='\n \n if (Array.isArray(value)) {\n if (value.length === 0) return\n if (operand === 'array_overlap') {\n // Row column is a JSON array (e.g. category_ids). Match when it\n // shares any element with the destination set. jsonb ?| (function\n // form) avoids the '?' placeholder-token ambiguity some drivers hit.\n conditions.push(`jsonb_exists_any(NULLIF(${field}, '')::jsonb, $${paramIndex}::text[])`)\n queryParams.push(value.map((entry) => String(entry)))\n paramIndex++\n return\n }\n const placeholders = value.map(() => `$${paramIndex++}`)\n queryParams.push(...value)\n if (operand === '!=') {\n conditions.push(`${field} NOT IN (${placeholders.join(', ')})`)\n } else {\n conditions.push(`${field} IN (${placeholders.join(', ')})`)\n }\n } else {\n if (operand === 'array_overlap') {\n if (value === '' || value === null || value === undefined) return\n // A single comma-joined string (the multi-select Category Filter's\n // ?categoryFilter=a,b,c) expands to multiple ids; one id stays one.\n const overlapValues = String(value).split(',').map((entry) => entry.trim()).filter(Boolean)\n if (overlapValues.length === 0) return\n conditions.push(`jsonb_exists_any(NULLIF(${field}, '')::jsonb, $${paramIndex}::text[])`)\n queryParams.push(overlapValues)\n paramIndex++\n return\n }\n if (value === null) {\n if (operand === '=') {\n conditions.push(`${field} IS NULL`)\n } else if (operand === '!=') {\n conditions.push(`${field} IS NOT NULL`)\n }\n } else {\n const validOps = ['=', '!=', '>', '<', '>=', '<=']\n const sqlOperator = validOps.includes(operand) ? operand : '='\n conditions.push(`${field} ${sqlOperator} $${paramIndex}`)\n queryParams.push(value)\n paramIndex++\n }\n }\n })\n } else {\n Object.entries(parsedFilters).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n const placeholders = value.map(() => `$${paramIndex++}`)\n queryParams.push(...value)\n conditions.push(`${key} IN (${placeholders.join(', ')})`)\n } else {\n conditions.push(`${key} = $${paramIndex}`)\n queryParams.push(value)\n paramIndex++\n }\n })\n }\n \n return paramIndex\n}\n\n").concat(generateDateFormatterCode(), "\n\n// Matches DDL / dangerous statements the raw-query branch should refuse.\n// Keep this list conservative \u2014 anything destructive or schema-changing is\n// out of scope for a client-triggered fetch. SELECT and CTEs (WITH ...) are\n// the only shapes consumers legitimately need.\nconst BLOCKED_RAW_QUERY_PATTERNS = [\n /\\bcreate\\s+(?:temporary\\s+|temp\\s+|unlogged\\s+|global\\s+|local\\s+)?table\\b/i,\n /\\bcreate\\s+(?:unique\\s+)?index\\b/i,\n /\\bcreate\\s+(?:or\\s+replace\\s+)?(?:materialized\\s+)?view\\b/i,\n /\\bcreate\\s+(?:or\\s+replace\\s+)?trigger\\b/i,\n /\\bcreate\\s+(?:or\\s+replace\\s+)?(?:aggregate\\s+)?function\\b/i,\n /\\bcreate\\s+(?:or\\s+replace\\s+)?procedure\\b/i,\n /\\bcreate\\s+(?:database|schema|sequence|extension|type|role|user)\\b/i,\n /\\bdrop\\s+(?:table|view|index|schema|database|sequence|trigger|function|procedure|role|user|extension|type|materialized)\\b/i,\n /\\balter\\s+(?:table|view|index|schema|database|sequence|role|user|system)\\b/i,\n /\\btruncate\\b/i,\n /\\bgrant\\b/i,\n /\\brevoke\\b/i,\n /\\binsert\\b/i,\n /\\bupdate\\b/i,\n /\\bdelete\\b/i,\n /\\bcopy\\b/i,\n /\\bvacuum\\b/i,\n /\\breindex\\b/i,\n /\\bcluster\\b/i,\n]\n\nfunction assertRawQuerySafe(rawQuery) {\n if (typeof rawQuery !== 'string' || rawQuery.length === 0) {\n throw new Error('rawQuery must be a non-empty string')\n }\n // Reject multi-statement payloads \u2014 only single SELECT / WITH statements.\n // A trailing semicolon is tolerated but any content after it fails.\n var trimmed = rawQuery.trim().replace(/;\\s*$/, '')\n if (trimmed.indexOf(';') !== -1) {\n throw new Error('rawQuery must contain exactly one statement')\n }\n for (var i = 0; i < BLOCKED_RAW_QUERY_PATTERNS.length; i++) {\n if (BLOCKED_RAW_QUERY_PATTERNS[i].test(trimmed)) {\n throw new Error('rawQuery contains a blocked statement')\n }\n }\n}\n\nexport default async function handler(req, res) {\n const client = getClient()\n\n try {\n await client.connect()\n ").concat(schema ? "await client.query('SET search_path TO ".concat(schema, "')") : '', "\n\n // If the caller supplied a rawQuery, run it verbatim (after a safety\n // guard). The schema-driven branch below builds `SELECT * FROM ").concat(tableName, "`\n // with optional filters \u2014 it's the default read path and ignores\n // rawQuery. Page-load workflows and other consumers that need a JOIN\n // or a user-scoped filter pass their fully-rendered SQL here via\n // `fetchData({ rawQuery })` and expect it to execute verbatim.\n if (req.query && typeof req.query.rawQuery === 'string' && req.query.rawQuery.length > 0) {\n assertRawQuerySafe(req.query.rawQuery)\n const rawResult = await client.query(req.query.rawQuery)\n const rawRows = Array.isArray(rawResult?.rows) ? rawResult.rows : []\n const rawPlain = rawRows.map((row) =>\n row && typeof row.toJSON === 'function' ? row.toJSON() : row\n )\n const rawSafe = JSON.parse(JSON.stringify(rawPlain, dateReplacer))\n return res.status(200).json({\n success: true,\n data: rawSafe,\n timestamp: Date.now()\n })\n }\n\n const { query, queryColumns, limit, page, perPage, sortBy, sortOrder, filters, sorts, offset } = req.query\n \n const conditions = []\n const queryParams = []\n let paramIndex = 1\n \n if (query) {\n let columns = []\n \n if (queryColumns) {\n const parsed = safeJSONParse(queryColumns)\n columns = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : [])\n } else {\n try {\n const schemaQuery = `\n SELECT column_name \n FROM information_schema.columns \n WHERE table_name = $1\n ").concat(schema ? "AND table_schema = $2" : '', "\n ORDER BY ordinal_position\n `\n const schemaParams = ").concat(schema
|
|
44
45
|
? "[".concat(JSON.stringify(tableName), ", ").concat(JSON.stringify(schema), "]")
|
|
45
46
|
: "[".concat(JSON.stringify(tableName), "]"), "\n \n const schemaResult = await client.query(schemaQuery, schemaParams)\n columns = schemaResult.rows.map(row => row.column_name)\n } catch (schemaError) {\n console.warn('Failed to fetch column names from information_schema:', schemaError.message)\n }\n }\n \n if (columns.length > 0) {\n const pattern = '%' + escapeLikePattern(query) + '%'\n const placeholder = '$' + paramIndex\n paramIndex++\n queryParams.push(pattern)\n const searchConditions = columns.map(\n (col) => '\"' + sanitizeSearchIdentifier(col) + '\"::text ILIKE ' + placeholder + \" ESCAPE '|'\"\n )\n conditions.push('(' + searchConditions.join(' OR ') + ')')\n }\n }\n \n paramIndex = processFilters(filters, conditions, queryParams, paramIndex)\n \n let sql = `SELECT * FROM ").concat(tableName, "`\n \n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`\n }\n \n if (sorts) {\n const parsedSorts = safeJSONParse(sorts)\n if (Array.isArray(parsedSorts) && parsedSorts.length > 0) {\n const orderClauses = parsedSorts.map((sort) => {\n if (!sort.field) return null\n const order = (sort.order || '').toUpperCase().startsWith('DESC') ? 'DESC' : 'ASC'\n return `${sort.field} ${order}`\n }).filter(Boolean)\n\n if (orderClauses.length > 0) {\n sql += ` ORDER BY ${orderClauses.join(', ')}`\n }\n }\n } else if (sortBy) {\n sql += ` ORDER BY ${sortBy} ${(sortOrder || '').toUpperCase().startsWith('DESC') ? 'DESC' : 'ASC'}`\n }\n \n const limitValue = limit || perPage\n const offsetValue = offset !== undefined ? parseInt(offset) : (page && perPage ? (parseInt(page) - 1) * parseInt(perPage) : undefined)\n \n if (limitValue) {\n sql += ` LIMIT ${limitValue}`\n }\n \n if (offsetValue !== undefined) {\n sql += ` OFFSET ${offsetValue}`\n }\n \n const result = await client.query(sql, queryParams)\n const rows = Array.isArray(result?.rows) ? result.rows : []\n const plainRows = rows.map((row) =>\n row && typeof row.toJSON === 'function' ? row.toJSON() : row\n )\n const safeData = JSON.parse(JSON.stringify(plainRows, dateReplacer))\n ").concat(getTransformExpression(tableName)
|
|
46
47
|
? "const transformedData = ".concat(getTransformExpression(tableName))
|