@teleporthq/teleport-plugin-next-data-source 0.43.55 → 0.43.57
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-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 +15 -1
- package/dist/cjs/transformations/ecommerce-product.d.ts.map +1 -1
- package/dist/cjs/transformations/ecommerce-product.js +7 -3
- package/dist/cjs/transformations/ecommerce-product.js.map +1 -1
- package/dist/cjs/transformations/index.d.ts +13 -2
- package/dist/cjs/transformations/index.d.ts.map +1 -1
- package/dist/cjs/transformations/index.js +21 -3
- package/dist/cjs/transformations/index.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 +15 -1
- package/dist/esm/transformations/ecommerce-product.d.ts.map +1 -1
- package/dist/esm/transformations/ecommerce-product.js +7 -3
- package/dist/esm/transformations/ecommerce-product.js.map +1 -1
- package/dist/esm/transformations/index.d.ts +13 -2
- package/dist/esm/transformations/index.d.ts.map +1 -1
- package/dist/esm/transformations/index.js +20 -3
- package/dist/esm/transformations/index.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 +53 -2
- package/src/transformations/index.ts +25 -4
- package/src/utils.ts +10 -5
package/src/loading-state.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as types from '@babel/types'
|
|
2
|
+
import { findCachedFetchNetworkChain } from './cache/ast'
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* ------------------------------------------------------------------
|
|
@@ -137,17 +138,79 @@ export function applyLoadingStateToDataProvider(
|
|
|
137
138
|
}
|
|
138
139
|
|
|
139
140
|
const fetchArrow = findMemoizedFetchDataArrow(fetchDataAttr)
|
|
140
|
-
if (!fetchArrow
|
|
141
|
+
if (!fetchArrow) {
|
|
141
142
|
return false
|
|
142
143
|
}
|
|
143
144
|
|
|
144
|
-
|
|
145
|
+
if (fetchArrow.body.type === 'CallExpression') {
|
|
146
|
+
fetchArrow.body = buildTrackedFetchBody(fetchArrow.body, vars)
|
|
147
|
+
} else if (fetchArrow.body.type === 'BlockStatement') {
|
|
148
|
+
if (!injectTrackingIntoCachedBody(fetchArrow.body, vars)) {
|
|
149
|
+
return false
|
|
150
|
+
}
|
|
151
|
+
} else {
|
|
152
|
+
return false
|
|
153
|
+
}
|
|
145
154
|
|
|
146
155
|
setPersistDataDuringLoading(attributes, vars)
|
|
147
156
|
|
|
148
157
|
return true
|
|
149
158
|
}
|
|
150
159
|
|
|
160
|
+
/**
|
|
161
|
+
* Adds the in-flight bookkeeping to a CACHED `fetchData` body.
|
|
162
|
+
*
|
|
163
|
+
* The body already returns early with `Promise.resolve(hit)` on a cache hit, so
|
|
164
|
+
* the tracking is attached to the network chain BELOW that — never to the early
|
|
165
|
+
* return. That is the whole point: a hit must not raise `isFetching`, because
|
|
166
|
+
* `persistDataDuringLoading={!isFetching}` would then drop the provider into its
|
|
167
|
+
* loading slot for a frame and produce exactly the skeleton flash the cache
|
|
168
|
+
* exists to remove.
|
|
169
|
+
*
|
|
170
|
+
* Returns `false` when the body is not the shape this module knows how to wrap,
|
|
171
|
+
* so the caller emits no state declarations rather than half-wiring it.
|
|
172
|
+
*/
|
|
173
|
+
function injectTrackingIntoCachedBody(body: types.BlockStatement, vars: LoadingStateVars): boolean {
|
|
174
|
+
// Idempotent: a second pass over the same AST must not double-count.
|
|
175
|
+
if (containsIdentifier(body, vars.setIsFetchingVar)) {
|
|
176
|
+
return false
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const networkChain = findCachedFetchNetworkChain(body)
|
|
180
|
+
if (!networkChain) {
|
|
181
|
+
return false
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const tracked = buildTrackedFetchBody(networkChain.statement.argument as types.Expression, vars)
|
|
185
|
+
body.body.splice(networkChain.index, 1, ...tracked.body)
|
|
186
|
+
|
|
187
|
+
return true
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// tslint:disable-next-line:no-any
|
|
191
|
+
function containsIdentifier(node: any, name: string): boolean {
|
|
192
|
+
if (!node || typeof node !== 'object') {
|
|
193
|
+
return false
|
|
194
|
+
}
|
|
195
|
+
if (node.type === 'Identifier' && node.name === name) {
|
|
196
|
+
return true
|
|
197
|
+
}
|
|
198
|
+
for (const key of Object.keys(node)) {
|
|
199
|
+
if (key === 'loc' || key === 'start' || key === 'end') {
|
|
200
|
+
continue
|
|
201
|
+
}
|
|
202
|
+
const value = node[key]
|
|
203
|
+
if (Array.isArray(value)) {
|
|
204
|
+
if (value.some((entry) => containsIdentifier(entry, name))) {
|
|
205
|
+
return true
|
|
206
|
+
}
|
|
207
|
+
} else if (value && typeof value === 'object' && containsIdentifier(value, name)) {
|
|
208
|
+
return true
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return false
|
|
212
|
+
}
|
|
213
|
+
|
|
151
214
|
// tslint:disable-next-line:no-any
|
|
152
215
|
function findAttribute(attributes: any[], name: string): types.JSXAttribute | undefined {
|
|
153
216
|
return attributes.find(
|