@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.
Files changed (101) hide show
  1. package/__tests__/array-mapper-cache-wiring.test.ts +425 -0
  2. package/__tests__/data-source-cache-wrapping.test.ts +152 -0
  3. package/__tests__/ecommerce-product-storefront-tax.test.ts +118 -0
  4. package/dist/cjs/cache/ast.d.ts +71 -0
  5. package/dist/cjs/cache/ast.d.ts.map +1 -0
  6. package/dist/cjs/cache/ast.js +229 -0
  7. package/dist/cjs/cache/ast.js.map +1 -0
  8. package/dist/cjs/cache/config.d.ts +22 -0
  9. package/dist/cjs/cache/config.d.ts.map +1 -0
  10. package/dist/cjs/cache/config.js +67 -0
  11. package/dist/cjs/cache/config.js.map +1 -0
  12. package/dist/cjs/cache/types.d.ts +31 -0
  13. package/dist/cjs/cache/types.d.ts.map +1 -0
  14. package/dist/cjs/cache/types.js +3 -0
  15. package/dist/cjs/cache/types.js.map +1 -0
  16. package/dist/cjs/data-source-fetchers.d.ts +5 -3
  17. package/dist/cjs/data-source-fetchers.d.ts.map +1 -1
  18. package/dist/cjs/data-source-fetchers.js +51 -8
  19. package/dist/cjs/data-source-fetchers.js.map +1 -1
  20. package/dist/cjs/fetchers/teleport.d.ts +2 -2
  21. package/dist/cjs/fetchers/teleport.d.ts.map +1 -1
  22. package/dist/cjs/fetchers/teleport.js +3 -2
  23. package/dist/cjs/fetchers/teleport.js.map +1 -1
  24. package/dist/cjs/index.d.ts +2 -0
  25. package/dist/cjs/index.d.ts.map +1 -1
  26. package/dist/cjs/index.js +14 -9
  27. package/dist/cjs/index.js.map +1 -1
  28. package/dist/cjs/loading-state.d.ts.map +1 -1
  29. package/dist/cjs/loading-state.js +74 -2
  30. package/dist/cjs/loading-state.js.map +1 -1
  31. package/dist/cjs/pagination-plugin.d.ts.map +1 -1
  32. package/dist/cjs/pagination-plugin.js +204 -64
  33. package/dist/cjs/pagination-plugin.js.map +1 -1
  34. package/dist/cjs/transformations/ecommerce-product.d.ts +15 -1
  35. package/dist/cjs/transformations/ecommerce-product.d.ts.map +1 -1
  36. package/dist/cjs/transformations/ecommerce-product.js +7 -3
  37. package/dist/cjs/transformations/ecommerce-product.js.map +1 -1
  38. package/dist/cjs/transformations/index.d.ts +13 -2
  39. package/dist/cjs/transformations/index.d.ts.map +1 -1
  40. package/dist/cjs/transformations/index.js +21 -3
  41. package/dist/cjs/transformations/index.js.map +1 -1
  42. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  43. package/dist/cjs/utils.d.ts +4 -3
  44. package/dist/cjs/utils.d.ts.map +1 -1
  45. package/dist/cjs/utils.js +6 -4
  46. package/dist/cjs/utils.js.map +1 -1
  47. package/dist/esm/cache/ast.d.ts +71 -0
  48. package/dist/esm/cache/ast.d.ts.map +1 -0
  49. package/dist/esm/cache/ast.js +196 -0
  50. package/dist/esm/cache/ast.js.map +1 -0
  51. package/dist/esm/cache/config.d.ts +22 -0
  52. package/dist/esm/cache/config.d.ts.map +1 -0
  53. package/dist/esm/cache/config.js +62 -0
  54. package/dist/esm/cache/config.js.map +1 -0
  55. package/dist/esm/cache/types.d.ts +31 -0
  56. package/dist/esm/cache/types.d.ts.map +1 -0
  57. package/dist/esm/cache/types.js +2 -0
  58. package/dist/esm/cache/types.js.map +1 -0
  59. package/dist/esm/data-source-fetchers.d.ts +5 -3
  60. package/dist/esm/data-source-fetchers.d.ts.map +1 -1
  61. package/dist/esm/data-source-fetchers.js +51 -8
  62. package/dist/esm/data-source-fetchers.js.map +1 -1
  63. package/dist/esm/fetchers/teleport.d.ts +2 -2
  64. package/dist/esm/fetchers/teleport.d.ts.map +1 -1
  65. package/dist/esm/fetchers/teleport.js +3 -2
  66. package/dist/esm/fetchers/teleport.js.map +1 -1
  67. package/dist/esm/index.d.ts +2 -0
  68. package/dist/esm/index.d.ts.map +1 -1
  69. package/dist/esm/index.js +12 -8
  70. package/dist/esm/index.js.map +1 -1
  71. package/dist/esm/loading-state.d.ts.map +1 -1
  72. package/dist/esm/loading-state.js +74 -2
  73. package/dist/esm/loading-state.js.map +1 -1
  74. package/dist/esm/pagination-plugin.d.ts.map +1 -1
  75. package/dist/esm/pagination-plugin.js +205 -65
  76. package/dist/esm/pagination-plugin.js.map +1 -1
  77. package/dist/esm/transformations/ecommerce-product.d.ts +15 -1
  78. package/dist/esm/transformations/ecommerce-product.d.ts.map +1 -1
  79. package/dist/esm/transformations/ecommerce-product.js +7 -3
  80. package/dist/esm/transformations/ecommerce-product.js.map +1 -1
  81. package/dist/esm/transformations/index.d.ts +13 -2
  82. package/dist/esm/transformations/index.d.ts.map +1 -1
  83. package/dist/esm/transformations/index.js +20 -3
  84. package/dist/esm/transformations/index.js.map +1 -1
  85. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  86. package/dist/esm/utils.d.ts +4 -3
  87. package/dist/esm/utils.d.ts.map +1 -1
  88. package/dist/esm/utils.js +6 -4
  89. package/dist/esm/utils.js.map +1 -1
  90. package/package.json +5 -5
  91. package/src/cache/ast.ts +265 -0
  92. package/src/cache/config.ts +79 -0
  93. package/src/cache/types.ts +31 -0
  94. package/src/data-source-fetchers.ts +66 -12
  95. package/src/fetchers/teleport.ts +3 -3
  96. package/src/index.ts +10 -4
  97. package/src/loading-state.ts +65 -2
  98. package/src/pagination-plugin.ts +315 -116
  99. package/src/transformations/ecommerce-product.ts +53 -2
  100. package/src/transformations/index.ts +25 -4
  101. package/src/utils.ts +10 -5
@@ -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 || fetchArrow.body.type !== 'CallExpression') {
141
+ if (!fetchArrow) {
141
142
  return false
142
143
  }
143
144
 
144
- fetchArrow.body = buildTrackedFetchBody(fetchArrow.body, vars)
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(