@teleporthq/teleport-plugin-next-data-source 0.42.8 → 0.42.10

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 (160) hide show
  1. package/__tests__/csv-header-detection.test.ts +212 -0
  2. package/__tests__/validation.test.ts +33 -2
  3. package/dist/cjs/data-source-fetchers.d.ts +2 -2
  4. package/dist/cjs/data-source-fetchers.d.ts.map +1 -1
  5. package/dist/cjs/data-source-fetchers.js +30 -7
  6. package/dist/cjs/data-source-fetchers.js.map +1 -1
  7. package/dist/cjs/fetchers/airtable.d.ts.map +1 -1
  8. package/dist/cjs/fetchers/airtable.js +2 -2
  9. package/dist/cjs/fetchers/airtable.js.map +1 -1
  10. package/dist/cjs/fetchers/clickhouse.d.ts.map +1 -1
  11. package/dist/cjs/fetchers/clickhouse.js +1 -1
  12. package/dist/cjs/fetchers/clickhouse.js.map +1 -1
  13. package/dist/cjs/fetchers/csv-file.d.ts.map +1 -1
  14. package/dist/cjs/fetchers/csv-file.js +23 -3
  15. package/dist/cjs/fetchers/csv-file.js.map +1 -1
  16. package/dist/cjs/fetchers/firestore.d.ts.map +1 -1
  17. package/dist/cjs/fetchers/firestore.js +1 -1
  18. package/dist/cjs/fetchers/firestore.js.map +1 -1
  19. package/dist/cjs/fetchers/google-sheets.d.ts.map +1 -1
  20. package/dist/cjs/fetchers/google-sheets.js +6 -1
  21. package/dist/cjs/fetchers/google-sheets.js.map +1 -1
  22. package/dist/cjs/fetchers/javascript.d.ts.map +1 -1
  23. package/dist/cjs/fetchers/javascript.js +2 -1
  24. package/dist/cjs/fetchers/javascript.js.map +1 -1
  25. package/dist/cjs/fetchers/mariadb.d.ts.map +1 -1
  26. package/dist/cjs/fetchers/mariadb.js +3 -3
  27. package/dist/cjs/fetchers/mariadb.js.map +1 -1
  28. package/dist/cjs/fetchers/mongodb.d.ts +1 -1
  29. package/dist/cjs/fetchers/mongodb.d.ts.map +1 -1
  30. package/dist/cjs/fetchers/mongodb.js +11 -3
  31. package/dist/cjs/fetchers/mongodb.js.map +1 -1
  32. package/dist/cjs/fetchers/mysql.d.ts.map +1 -1
  33. package/dist/cjs/fetchers/mysql.js +2 -2
  34. package/dist/cjs/fetchers/mysql.js.map +1 -1
  35. package/dist/cjs/fetchers/postgresql.d.ts.map +1 -1
  36. package/dist/cjs/fetchers/postgresql.js +3 -3
  37. package/dist/cjs/fetchers/postgresql.js.map +1 -1
  38. package/dist/cjs/fetchers/redis.d.ts.map +1 -1
  39. package/dist/cjs/fetchers/redis.js +1 -1
  40. package/dist/cjs/fetchers/redis.js.map +1 -1
  41. package/dist/cjs/fetchers/redshift.d.ts.map +1 -1
  42. package/dist/cjs/fetchers/redshift.js +2 -2
  43. package/dist/cjs/fetchers/redshift.js.map +1 -1
  44. package/dist/cjs/fetchers/rest-api.d.ts.map +1 -1
  45. package/dist/cjs/fetchers/rest-api.js +3 -2
  46. package/dist/cjs/fetchers/rest-api.js.map +1 -1
  47. package/dist/cjs/fetchers/static-collection.d.ts.map +1 -1
  48. package/dist/cjs/fetchers/static-collection.js +2 -1
  49. package/dist/cjs/fetchers/static-collection.js.map +1 -1
  50. package/dist/cjs/fetchers/supabase.d.ts.map +1 -1
  51. package/dist/cjs/fetchers/supabase.js +2 -2
  52. package/dist/cjs/fetchers/supabase.js.map +1 -1
  53. package/dist/cjs/fetchers/turso.d.ts.map +1 -1
  54. package/dist/cjs/fetchers/turso.js +1 -1
  55. package/dist/cjs/fetchers/turso.js.map +1 -1
  56. package/dist/cjs/fetchers/utils/header-detection.d.ts +2 -0
  57. package/dist/cjs/fetchers/utils/header-detection.d.ts.map +1 -0
  58. package/dist/cjs/fetchers/utils/header-detection.js +8 -0
  59. package/dist/cjs/fetchers/utils/header-detection.js.map +1 -0
  60. package/dist/cjs/index.d.ts.map +1 -1
  61. package/dist/cjs/index.js +168 -4
  62. package/dist/cjs/index.js.map +1 -1
  63. package/dist/cjs/pagination-plugin.d.ts.map +1 -1
  64. package/dist/cjs/pagination-plugin.js +320 -65
  65. package/dist/cjs/pagination-plugin.js.map +1 -1
  66. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  67. package/dist/cjs/utils.d.ts +3 -0
  68. package/dist/cjs/utils.d.ts.map +1 -1
  69. package/dist/cjs/utils.js +218 -46
  70. package/dist/cjs/utils.js.map +1 -1
  71. package/dist/esm/data-source-fetchers.d.ts +2 -2
  72. package/dist/esm/data-source-fetchers.d.ts.map +1 -1
  73. package/dist/esm/data-source-fetchers.js +29 -6
  74. package/dist/esm/data-source-fetchers.js.map +1 -1
  75. package/dist/esm/fetchers/airtable.d.ts.map +1 -1
  76. package/dist/esm/fetchers/airtable.js +3 -3
  77. package/dist/esm/fetchers/airtable.js.map +1 -1
  78. package/dist/esm/fetchers/clickhouse.d.ts.map +1 -1
  79. package/dist/esm/fetchers/clickhouse.js +2 -2
  80. package/dist/esm/fetchers/clickhouse.js.map +1 -1
  81. package/dist/esm/fetchers/csv-file.d.ts.map +1 -1
  82. package/dist/esm/fetchers/csv-file.js +23 -3
  83. package/dist/esm/fetchers/csv-file.js.map +1 -1
  84. package/dist/esm/fetchers/firestore.d.ts.map +1 -1
  85. package/dist/esm/fetchers/firestore.js +2 -2
  86. package/dist/esm/fetchers/firestore.js.map +1 -1
  87. package/dist/esm/fetchers/google-sheets.d.ts.map +1 -1
  88. package/dist/esm/fetchers/google-sheets.js +6 -1
  89. package/dist/esm/fetchers/google-sheets.js.map +1 -1
  90. package/dist/esm/fetchers/javascript.d.ts.map +1 -1
  91. package/dist/esm/fetchers/javascript.js +2 -1
  92. package/dist/esm/fetchers/javascript.js.map +1 -1
  93. package/dist/esm/fetchers/mariadb.d.ts.map +1 -1
  94. package/dist/esm/fetchers/mariadb.js +4 -4
  95. package/dist/esm/fetchers/mariadb.js.map +1 -1
  96. package/dist/esm/fetchers/mongodb.d.ts +1 -1
  97. package/dist/esm/fetchers/mongodb.d.ts.map +1 -1
  98. package/dist/esm/fetchers/mongodb.js +12 -4
  99. package/dist/esm/fetchers/mongodb.js.map +1 -1
  100. package/dist/esm/fetchers/mysql.d.ts.map +1 -1
  101. package/dist/esm/fetchers/mysql.js +3 -3
  102. package/dist/esm/fetchers/mysql.js.map +1 -1
  103. package/dist/esm/fetchers/postgresql.d.ts.map +1 -1
  104. package/dist/esm/fetchers/postgresql.js +4 -4
  105. package/dist/esm/fetchers/postgresql.js.map +1 -1
  106. package/dist/esm/fetchers/redis.d.ts.map +1 -1
  107. package/dist/esm/fetchers/redis.js +2 -2
  108. package/dist/esm/fetchers/redis.js.map +1 -1
  109. package/dist/esm/fetchers/redshift.d.ts.map +1 -1
  110. package/dist/esm/fetchers/redshift.js +3 -3
  111. package/dist/esm/fetchers/redshift.js.map +1 -1
  112. package/dist/esm/fetchers/rest-api.d.ts.map +1 -1
  113. package/dist/esm/fetchers/rest-api.js +3 -2
  114. package/dist/esm/fetchers/rest-api.js.map +1 -1
  115. package/dist/esm/fetchers/static-collection.d.ts.map +1 -1
  116. package/dist/esm/fetchers/static-collection.js +2 -1
  117. package/dist/esm/fetchers/static-collection.js.map +1 -1
  118. package/dist/esm/fetchers/supabase.d.ts.map +1 -1
  119. package/dist/esm/fetchers/supabase.js +3 -3
  120. package/dist/esm/fetchers/supabase.js.map +1 -1
  121. package/dist/esm/fetchers/turso.d.ts.map +1 -1
  122. package/dist/esm/fetchers/turso.js +2 -2
  123. package/dist/esm/fetchers/turso.js.map +1 -1
  124. package/dist/esm/fetchers/utils/header-detection.d.ts +2 -0
  125. package/dist/esm/fetchers/utils/header-detection.d.ts.map +1 -0
  126. package/dist/esm/fetchers/utils/header-detection.js +4 -0
  127. package/dist/esm/fetchers/utils/header-detection.js.map +1 -0
  128. package/dist/esm/index.d.ts.map +1 -1
  129. package/dist/esm/index.js +169 -5
  130. package/dist/esm/index.js.map +1 -1
  131. package/dist/esm/pagination-plugin.d.ts.map +1 -1
  132. package/dist/esm/pagination-plugin.js +320 -65
  133. package/dist/esm/pagination-plugin.js.map +1 -1
  134. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  135. package/dist/esm/utils.d.ts +3 -0
  136. package/dist/esm/utils.d.ts.map +1 -1
  137. package/dist/esm/utils.js +214 -45
  138. package/dist/esm/utils.js.map +1 -1
  139. package/package.json +2 -2
  140. package/src/data-source-fetchers.ts +29 -13
  141. package/src/fetchers/airtable.ts +81 -31
  142. package/src/fetchers/clickhouse.ts +88 -19
  143. package/src/fetchers/csv-file.ts +256 -27
  144. package/src/fetchers/firestore.ts +65 -13
  145. package/src/fetchers/google-sheets.ts +243 -26
  146. package/src/fetchers/javascript.ts +106 -23
  147. package/src/fetchers/mariadb.ts +85 -26
  148. package/src/fetchers/mongodb.ts +156 -37
  149. package/src/fetchers/mysql.ts +86 -26
  150. package/src/fetchers/postgresql.ts +89 -27
  151. package/src/fetchers/redis.ts +43 -5
  152. package/src/fetchers/redshift.ts +87 -18
  153. package/src/fetchers/rest-api.ts +105 -24
  154. package/src/fetchers/static-collection.ts +100 -18
  155. package/src/fetchers/supabase.ts +178 -54
  156. package/src/fetchers/turso.ts +87 -18
  157. package/src/fetchers/utils/header-detection.ts +200 -0
  158. package/src/index.ts +248 -2
  159. package/src/pagination-plugin.ts +708 -191
  160. package/src/utils.ts +374 -38
@@ -38,6 +38,7 @@ import { ChunkType, FileType, } from '@teleporthq/teleport-types';
38
38
  import * as types from '@babel/types';
39
39
  import { StringUtils } from '@teleporthq/teleport-shared';
40
40
  import { generateSafeFileName } from './utils';
41
+ import { generateDataSourceFetcherWithCore } from './data-source-fetchers';
41
42
  // Scan UIDL to find all data source usages and build a registry
42
43
  function buildStateRegistry(uidlNode) {
43
44
  var usages = [];
@@ -45,7 +46,7 @@ function buildStateRegistry(uidlNode) {
45
46
  var byArrayMapperRenderProp = new Map();
46
47
  var index = 0;
47
48
  var traverse = function (node, parentDataSource) {
48
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
49
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
49
50
  if (!node || typeof node !== 'object') {
50
51
  return;
51
52
  }
@@ -84,9 +85,19 @@ function buildStateRegistry(uidlNode) {
84
85
  if ((_h = (_g = parentDataSource.resourceParams) === null || _g === void 0 ? void 0 : _g.queryColumns) === null || _h === void 0 ? void 0 : _h.content) {
85
86
  queryColumns = parentDataSource.resourceParams.queryColumns.content;
86
87
  }
88
+ // Extract sorts from parent's resource params
89
+ var sorts = [];
90
+ if ((_k = (_j = parentDataSource.resourceParams) === null || _j === void 0 ? void 0 : _j.sorts) === null || _k === void 0 ? void 0 : _k.content) {
91
+ sorts = parentDataSource.resourceParams.sorts.content;
92
+ }
93
+ // Extract filters from parent's resource params
94
+ var filters = [];
95
+ if ((_m = (_l = parentDataSource.resourceParams) === null || _l === void 0 ? void 0 : _l.filters) === null || _m === void 0 ? void 0 : _m.content) {
96
+ filters = parentDataSource.resourceParams.filters.content;
97
+ }
87
98
  // Extract limit from parent's resource params (for plain array mappers)
88
99
  var limit = 0;
89
- if ((_k = (_j = parentDataSource.resourceParams) === null || _j === void 0 ? void 0 : _j.limit) === null || _k === void 0 ? void 0 : _k.content) {
100
+ if ((_p = (_o = parentDataSource.resourceParams) === null || _o === void 0 ? void 0 : _o.limit) === null || _p === void 0 ? void 0 : _p.content) {
90
101
  limit = parentDataSource.resourceParams.limit.content;
91
102
  }
92
103
  // For paginated mappers, use perPage from cms-list-repeater
@@ -106,6 +117,8 @@ function buildStateRegistry(uidlNode) {
106
117
  searchEnabled: !!content.searchEnabled,
107
118
  searchDebounce: content.searchDebounce || 300,
108
119
  queryColumns: queryColumns,
120
+ sorts: sorts,
121
+ filters: filters,
109
122
  category: 'plain',
110
123
  };
111
124
  // Determine category
@@ -127,22 +140,22 @@ function buildStateRegistry(uidlNode) {
127
140
  byArrayMapperRenderProp.set(arrayMapperRenderProp, usage);
128
141
  }
129
142
  // Continue traversing inside the repeater
130
- if ((_l = content.nodes) === null || _l === void 0 ? void 0 : _l.list) {
143
+ if ((_q = content.nodes) === null || _q === void 0 ? void 0 : _q.list) {
131
144
  traverse(content.nodes.list, parentDataSource);
132
145
  }
133
146
  return;
134
147
  }
135
148
  // Recurse into children
136
- if (((_m = node.content) === null || _m === void 0 ? void 0 : _m.children) && Array.isArray(node.content.children)) {
137
- for (var _i = 0, _q = node.content.children; _i < _q.length; _i++) {
138
- var child = _q[_i];
149
+ if (((_r = node.content) === null || _r === void 0 ? void 0 : _r.children) && Array.isArray(node.content.children)) {
150
+ for (var _i = 0, _u = node.content.children; _i < _u.length; _i++) {
151
+ var child = _u[_i];
139
152
  traverse(child, parentDataSource);
140
153
  }
141
154
  }
142
- if ((_o = node.content) === null || _o === void 0 ? void 0 : _o.node) {
155
+ if ((_s = node.content) === null || _s === void 0 ? void 0 : _s.node) {
143
156
  traverse(node.content.node, parentDataSource);
144
157
  }
145
- if ((_p = node.content) === null || _p === void 0 ? void 0 : _p.nodes) {
158
+ if ((_t = node.content) === null || _t === void 0 ? void 0 : _t.nodes) {
146
159
  if (node.content.nodes.success) {
147
160
  traverse(node.content.nodes.success, parentDataSource);
148
161
  }
@@ -160,8 +173,8 @@ function buildStateRegistry(uidlNode) {
160
173
  }
161
174
  }
162
175
  if (Array.isArray(node.children)) {
163
- for (var _r = 0, _s = node.children; _r < _s.length; _r++) {
164
- var child = _s[_r];
176
+ for (var _v = 0, _w = node.children; _v < _w.length; _v++) {
177
+ var child = _w[_v];
165
178
  traverse(child, parentDataSource);
166
179
  }
167
180
  }
@@ -347,6 +360,29 @@ export var createNextArrayMapperPaginationPlugin = function () {
347
360
  if (usage.queryColumns.length > 0) {
348
361
  urlParams.push(types.objectProperty(types.identifier('queryColumns'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [types.arrayExpression(usage.queryColumns.map(function (c) { return types.stringLiteral(c); }))])));
349
362
  }
363
+ // Add sorts to count fetch params if present
364
+ if (usage.sorts && usage.sorts.length > 0) {
365
+ urlParams.push(types.objectProperty(types.identifier('sorts'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
366
+ types.arrayExpression(usage.sorts.map(function (sort) {
367
+ return types.objectExpression([
368
+ types.objectProperty(types.identifier('field'), types.stringLiteral(sort.field || '')),
369
+ types.objectProperty(types.identifier('order'), types.stringLiteral(sort.order || '')),
370
+ ]);
371
+ })),
372
+ ])));
373
+ }
374
+ // Add filters to count fetch params if present
375
+ if (usage.filters && usage.filters.length > 0) {
376
+ urlParams.push(types.objectProperty(types.identifier('filters'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
377
+ types.arrayExpression(usage.filters.map(function (filter) {
378
+ return types.objectExpression([
379
+ types.objectProperty(types.identifier('source'), types.stringLiteral(filter.source || '')),
380
+ types.objectProperty(types.identifier('destination'), types.stringLiteral(filter.destination || '')),
381
+ types.objectProperty(types.identifier('operand'), types.stringLiteral(filter.operand || '')),
382
+ ]);
383
+ })),
384
+ ])));
385
+ }
350
386
  // Build the count fetch effect body
351
387
  var countFetchEffectBody = [];
352
388
  // Only add skip-on-mount check for pages (where we have server-side count)
@@ -510,13 +546,11 @@ export var createNextArrayMapperPaginationPlugin = function () {
510
546
  else if (usage.category === 'search-only') {
511
547
  updateDataProviderForSearchOnly(dp, usage, vars, fileName);
512
548
  }
513
- else {
514
- updateDataProviderForPlain(dp, vars);
515
- }
516
- // Create API route if needed
517
- if (usage.category !== 'plain') {
518
- ensureAPIRouteExists(options.extractedResources, usage);
549
+ else if (usage.category === 'plain') {
550
+ updateDataProviderForPlain(dp, fileName);
519
551
  }
552
+ // Create API route for all categories (including 'plain' for components)
553
+ ensureAPIRouteExists(options.extractedResources, usage, options.dataSources);
520
554
  });
521
555
  dataProvidersWithoutRepeaters = dataProviders.filter(function (dp) {
522
556
  var hasRepeater = findArrayMapperRenderPropInDataProvider(dp) !== undefined;
@@ -549,7 +583,7 @@ export var createNextArrayMapperPaginationPlugin = function () {
549
583
  });
550
584
  // STEP 6: Update getStaticProps if this is a page
551
585
  if (isPage) {
552
- updateGetStaticProps(chunks, registry);
586
+ updateGetStaticProps(chunks, registry, dependencies);
553
587
  }
554
588
  return [2 /*return*/, structure];
555
589
  });
@@ -733,6 +767,29 @@ function updateDataProviderForPaginatedSearch(dp, usage, vars, fileName) {
733
767
  if (usage.queryColumns.length > 0) {
734
768
  paramsProps.push(types.objectProperty(types.identifier('queryColumns'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [types.arrayExpression(usage.queryColumns.map(function (c) { return types.stringLiteral(c); }))])));
735
769
  }
770
+ // Add sorts if present
771
+ if (usage.sorts && usage.sorts.length > 0) {
772
+ paramsProps.push(types.objectProperty(types.identifier('sorts'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
773
+ types.arrayExpression(usage.sorts.map(function (sort) {
774
+ return types.objectExpression([
775
+ types.objectProperty(types.identifier('field'), types.stringLiteral(sort.field || '')),
776
+ types.objectProperty(types.identifier('order'), types.stringLiteral(sort.order || '')),
777
+ ]);
778
+ })),
779
+ ])));
780
+ }
781
+ // Add filters if present
782
+ if (usage.filters && usage.filters.length > 0) {
783
+ paramsProps.push(types.objectProperty(types.identifier('filters'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
784
+ types.arrayExpression(usage.filters.map(function (filter) {
785
+ return types.objectExpression([
786
+ types.objectProperty(types.identifier('source'), types.stringLiteral(filter.source || '')),
787
+ types.objectProperty(types.identifier('destination'), types.stringLiteral(filter.destination || '')),
788
+ types.objectProperty(types.identifier('operand'), types.stringLiteral(filter.operand || '')),
789
+ ]);
790
+ })),
791
+ ])));
792
+ }
736
793
  dp.openingElement.attributes.push(types.jsxAttribute(types.jsxIdentifier('params'), types.jsxExpressionContainer(types.callExpression(types.identifier('useMemo'), [
737
794
  types.arrowFunctionExpression([], types.objectExpression(paramsProps)),
738
795
  types.arrayExpression([types.identifier(vars.combinedStateVar)]),
@@ -763,12 +820,37 @@ function updateDataProviderForPaginationOnly(dp, usage, vars, fileName) {
763
820
  var _a;
764
821
  return !['params', 'key', 'initialData', 'fetchData', 'persistDataDuringLoading'].includes((_a = attr.name) === null || _a === void 0 ? void 0 : _a.name);
765
822
  });
823
+ // Build params properties
824
+ var paramsProps = [
825
+ types.objectProperty(types.identifier('page'), types.identifier(vars.pageStateVar)),
826
+ types.objectProperty(types.identifier('perPage'), types.numericLiteral(usage.perPage)),
827
+ ];
828
+ // Add sorts if present
829
+ if (usage.sorts && usage.sorts.length > 0) {
830
+ paramsProps.push(types.objectProperty(types.identifier('sorts'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
831
+ types.arrayExpression(usage.sorts.map(function (sort) {
832
+ return types.objectExpression([
833
+ types.objectProperty(types.identifier('field'), types.stringLiteral(sort.field || '')),
834
+ types.objectProperty(types.identifier('order'), types.stringLiteral(sort.order || '')),
835
+ ]);
836
+ })),
837
+ ])));
838
+ }
839
+ // Add filters if present
840
+ if (usage.filters && usage.filters.length > 0) {
841
+ paramsProps.push(types.objectProperty(types.identifier('filters'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
842
+ types.arrayExpression(usage.filters.map(function (filter) {
843
+ return types.objectExpression([
844
+ types.objectProperty(types.identifier('source'), types.stringLiteral(filter.source || '')),
845
+ types.objectProperty(types.identifier('destination'), types.stringLiteral(filter.destination || '')),
846
+ types.objectProperty(types.identifier('operand'), types.stringLiteral(filter.operand || '')),
847
+ ]);
848
+ })),
849
+ ])));
850
+ }
766
851
  // Add params
767
852
  dp.openingElement.attributes.push(types.jsxAttribute(types.jsxIdentifier('params'), types.jsxExpressionContainer(types.callExpression(types.identifier('useMemo'), [
768
- types.arrowFunctionExpression([], types.objectExpression([
769
- types.objectProperty(types.identifier('page'), types.identifier(vars.pageStateVar)),
770
- types.objectProperty(types.identifier('perPage'), types.numericLiteral(usage.perPage)),
771
- ])),
853
+ types.arrowFunctionExpression([], types.objectExpression(paramsProps)),
772
854
  types.arrayExpression([types.identifier(vars.pageStateVar)]),
773
855
  ]))));
774
856
  // Add initialData
@@ -798,6 +880,29 @@ function updateDataProviderForSearchOnly(dp, usage, vars, fileName) {
798
880
  if (usage.queryColumns.length > 0) {
799
881
  paramsProps.push(types.objectProperty(types.identifier('queryColumns'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [types.arrayExpression(usage.queryColumns.map(function (c) { return types.stringLiteral(c); }))])));
800
882
  }
883
+ // Add sorts if present
884
+ if (usage.sorts && usage.sorts.length > 0) {
885
+ paramsProps.push(types.objectProperty(types.identifier('sorts'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
886
+ types.arrayExpression(usage.sorts.map(function (sort) {
887
+ return types.objectExpression([
888
+ types.objectProperty(types.identifier('field'), types.stringLiteral(sort.field || '')),
889
+ types.objectProperty(types.identifier('order'), types.stringLiteral(sort.order || '')),
890
+ ]);
891
+ })),
892
+ ])));
893
+ }
894
+ // Add filters if present
895
+ if (usage.filters && usage.filters.length > 0) {
896
+ paramsProps.push(types.objectProperty(types.identifier('filters'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
897
+ types.arrayExpression(usage.filters.map(function (filter) {
898
+ return types.objectExpression([
899
+ types.objectProperty(types.identifier('source'), types.stringLiteral(filter.source || '')),
900
+ types.objectProperty(types.identifier('destination'), types.stringLiteral(filter.destination || '')),
901
+ types.objectProperty(types.identifier('operand'), types.stringLiteral(filter.operand || '')),
902
+ ]);
903
+ })),
904
+ ])));
905
+ }
801
906
  dp.openingElement.attributes.push(types.jsxAttribute(types.jsxIdentifier('params'), types.jsxExpressionContainer(types.callExpression(types.identifier('useMemo'), [
802
907
  types.arrowFunctionExpression([], types.objectExpression(paramsProps)),
803
908
  types.arrayExpression([types.identifier(vars.debouncedSearchQueryVar)]),
@@ -813,15 +918,48 @@ function updateDataProviderForSearchOnly(dp, usage, vars, fileName) {
813
918
  dp.openingElement.attributes.push(createFetchDataAttribute(fileName));
814
919
  dp.openingElement.attributes.push(types.jsxAttribute(types.jsxIdentifier('persistDataDuringLoading'), types.jsxExpressionContainer(types.booleanLiteral(true))));
815
920
  }
816
- function updateDataProviderForPlain(dp, vars) {
921
+ function updateDataProviderForPlain(dp, fileName) {
922
+ var _a, _b, _c;
817
923
  var attrs = dp.openingElement.attributes;
818
- // Remove params and fetchData - plain mappers only use initialData
819
- dp.openingElement.attributes = attrs.filter(function (attr) { var _a; return !['params', 'fetchData'].includes((_a = attr.name) === null || _a === void 0 ? void 0 : _a.name); });
820
- // Update initialData to use correct prop
821
- var existingInitialData = dp.openingElement.attributes.find(function (attr) { return attr.type === 'JSXAttribute' && attr.name.name === 'initialData'; });
822
- if (existingInitialData) {
823
- existingInitialData.value = types.jsxExpressionContainer(types.optionalMemberExpression(types.identifier('props'), types.identifier(vars.propsPrefix), false, true));
924
+ // Check if fetchData already exists
925
+ var hasFetchData = attrs.some(function (attr) { var _a; return attr.type === 'JSXAttribute' && ((_a = attr.name) === null || _a === void 0 ? void 0 : _a.name) === 'fetchData'; });
926
+ // If no fetchData, add it
927
+ if (!hasFetchData) {
928
+ attrs.push(createFetchDataAttribute(fileName));
929
+ }
930
+ // Check if persistDataDuringLoading already exists
931
+ var hasPersistData = attrs.some(function (attr) { var _a; return attr.type === 'JSXAttribute' && ((_a = attr.name) === null || _a === void 0 ? void 0 : _a.name) === 'persistDataDuringLoading'; });
932
+ // If no persistDataDuringLoading, add it
933
+ if (!hasPersistData) {
934
+ attrs.push(types.jsxAttribute(types.jsxIdentifier('persistDataDuringLoading'), types.jsxExpressionContainer(types.booleanLiteral(true))));
935
+ }
936
+ // Find the params attribute
937
+ var paramsAttrIndex = attrs.findIndex(function (attr) { return attr.type === 'JSXAttribute' && attr.name.name === 'params'; });
938
+ if (paramsAttrIndex === -1) {
939
+ return;
940
+ }
941
+ var paramsAttr = attrs[paramsAttrIndex];
942
+ // Check if params is already wrapped in useMemo
943
+ if (((_a = paramsAttr.value) === null || _a === void 0 ? void 0 : _a.type) === 'JSXExpressionContainer' &&
944
+ paramsAttr.value.expression.type === 'CallExpression' &&
945
+ ((_b = paramsAttr.value.expression.callee) === null || _b === void 0 ? void 0 : _b.name) === 'useMemo') {
946
+ return;
824
947
  }
948
+ // Get the current params value expression
949
+ var paramsExpression = null;
950
+ if (((_c = paramsAttr.value) === null || _c === void 0 ? void 0 : _c.type) === 'JSXExpressionContainer') {
951
+ paramsExpression = paramsAttr.value.expression;
952
+ }
953
+ if (!paramsExpression) {
954
+ return;
955
+ }
956
+ // Wrap params in useMemo with empty dependencies array
957
+ var memoizedParams = types.callExpression(types.identifier('useMemo'), [
958
+ types.arrowFunctionExpression([], paramsExpression),
959
+ types.arrayExpression([]),
960
+ ]);
961
+ // Replace the params attribute
962
+ attrs[paramsAttrIndex] = types.jsxAttribute(types.jsxIdentifier('params'), types.jsxExpressionContainer(memoizedParams));
825
963
  }
826
964
  function stabilizeDataProviderWithoutRepeater(dp) {
827
965
  var _a, _b, _c;
@@ -987,35 +1125,54 @@ function wirePaginationButtons(paginationNode, usage, vars) {
987
1125
  }
988
1126
  }
989
1127
  }
990
- function ensureAPIRouteExists(extractedResources, usage) {
1128
+ function ensureAPIRouteExists(extractedResources, usage, dataSources) {
991
1129
  // Generate file name for the API route
992
1130
  var fileName = generateSafeFileName(usage.resourceDefinition.dataSourceType, usage.resourceDefinition.tableName, usage.resourceDefinition.dataSourceId);
993
- // Check if the utils data source file exists - if so, create API routes that re-export from it
994
- if (extractedResources["utils/".concat(fileName)]) {
995
- // Create main data API route if not exists
996
- if (!extractedResources["api/".concat(fileName)]) {
997
- var apiRouteCode = "import dataSourceModule from '../../utils/data-sources/".concat(fileName, "'\n\nexport default dataSourceModule.handler\n");
998
- extractedResources["api/".concat(fileName)] = {
999
- fileName: fileName,
1000
- fileType: FileType.JS,
1001
- path: ['pages', 'api'],
1002
- content: apiRouteCode,
1003
- };
1004
- }
1005
- // Create count API route if not exists (needed for paginated+search cases)
1006
- var countFileName = "".concat(fileName, "-count");
1007
- if (!extractedResources["api/".concat(countFileName)]) {
1008
- var countApiRouteCode = "import dataSourceModule from '../../utils/data-sources/".concat(fileName, "'\n\nexport default dataSourceModule.getCount\n");
1009
- extractedResources["api/".concat(countFileName)] = {
1010
- fileName: countFileName,
1011
- fileType: FileType.JS,
1012
- path: ['pages', 'api'],
1013
- content: countApiRouteCode,
1014
- };
1131
+ // Check if the utils data source file exists - if not, create it
1132
+ if (!extractedResources["utils/".concat(fileName)]) {
1133
+ // Get the data source from dataSources
1134
+ var dataSource = dataSources[usage.resourceDefinition.dataSourceId];
1135
+ if (dataSource) {
1136
+ try {
1137
+ // Generate the utils file with fetchData, fetchCount, handler, and getCount
1138
+ var fetcherCode = generateDataSourceFetcherWithCore(dataSource, usage.resourceDefinition.tableName || 'data');
1139
+ extractedResources["utils/".concat(fileName)] = {
1140
+ fileName: fileName,
1141
+ fileType: FileType.JS,
1142
+ path: ['utils', 'data-sources'],
1143
+ content: fetcherCode,
1144
+ };
1145
+ }
1146
+ catch (error) {
1147
+ // If generation fails, skip
1148
+ return;
1149
+ }
1015
1150
  }
1016
1151
  }
1152
+ // Now create API routes that re-export from the utils file
1153
+ // Create main data API route if not exists
1154
+ if (!extractedResources["api/".concat(fileName)]) {
1155
+ var apiRouteCode = "import dataSourceModule from '../../utils/data-sources/".concat(fileName, "'\n\nexport default dataSourceModule.handler\n");
1156
+ extractedResources["api/".concat(fileName)] = {
1157
+ fileName: fileName,
1158
+ fileType: FileType.JS,
1159
+ path: ['pages', 'api'],
1160
+ content: apiRouteCode,
1161
+ };
1162
+ }
1163
+ // Create count API route if not exists (needed for paginated+search cases)
1164
+ var countFileName = "".concat(fileName, "-count");
1165
+ if (!extractedResources["api/".concat(countFileName)]) {
1166
+ var countApiRouteCode = "import dataSourceModule from '../../utils/data-sources/".concat(fileName, "'\n\nexport default dataSourceModule.getCount\n");
1167
+ extractedResources["api/".concat(countFileName)] = {
1168
+ fileName: countFileName,
1169
+ fileType: FileType.JS,
1170
+ path: ['pages', 'api'],
1171
+ content: countApiRouteCode,
1172
+ };
1173
+ }
1017
1174
  }
1018
- function updateGetStaticProps(chunks, registry) {
1175
+ function updateGetStaticProps(chunks, registry, dependencies) {
1019
1176
  var _a;
1020
1177
  var getStaticPropsChunk = chunks.find(function (c) { return c.name === 'getStaticProps'; });
1021
1178
  if (!getStaticPropsChunk || getStaticPropsChunk.type !== ChunkType.AST) {
@@ -1061,7 +1218,11 @@ function updateGetStaticProps(chunks, registry) {
1061
1218
  var arrayPattern = declarator.id;
1062
1219
  // Track unique data sources for count fetching
1063
1220
  var dataSourcesNeedingCount = new Set();
1064
- registry.usages.forEach(function (usage) {
1221
+ // Only process usages that need pagination or search functionality
1222
+ // Non-paginated, non-search usages are handled by the main plugin
1223
+ registry.usages
1224
+ .filter(function (u) { return u.paginated || u.searchEnabled; })
1225
+ .forEach(function (usage) {
1065
1226
  var vars = getStateVarsForUsage(usage);
1066
1227
  var fileName = generateSafeFileName(usage.resourceDefinition.dataSourceType, usage.resourceDefinition.tableName, usage.resourceDefinition.dataSourceId);
1067
1228
  // Use consistent import name generation (matches extractDataSourceIntoGetStaticProps)
@@ -1081,6 +1242,29 @@ function updateGetStaticProps(chunks, registry) {
1081
1242
  if (usage.queryColumns.length > 0) {
1082
1243
  fetchParams.push(types.objectProperty(types.identifier('queryColumns'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [types.arrayExpression(usage.queryColumns.map(function (c) { return types.stringLiteral(c); }))])));
1083
1244
  }
1245
+ // Add sorts if present
1246
+ if (usage.sorts && usage.sorts.length > 0) {
1247
+ fetchParams.push(types.objectProperty(types.identifier('sorts'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
1248
+ types.arrayExpression(usage.sorts.map(function (sort) {
1249
+ return types.objectExpression([
1250
+ types.objectProperty(types.identifier('field'), types.stringLiteral(sort.field || '')),
1251
+ types.objectProperty(types.identifier('order'), types.stringLiteral(sort.order || '')),
1252
+ ]);
1253
+ })),
1254
+ ])));
1255
+ }
1256
+ // Add filters if present
1257
+ if (usage.filters && usage.filters.length > 0) {
1258
+ fetchParams.push(types.objectProperty(types.identifier('filters'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
1259
+ types.arrayExpression(usage.filters.map(function (filter) {
1260
+ return types.objectExpression([
1261
+ types.objectProperty(types.identifier('source'), types.stringLiteral(filter.source || '')),
1262
+ types.objectProperty(types.identifier('destination'), types.stringLiteral(filter.destination || '')),
1263
+ types.objectProperty(types.identifier('operand'), types.stringLiteral(filter.operand || '')),
1264
+ ]);
1265
+ })),
1266
+ ])));
1267
+ }
1084
1268
  // Check if this fetch already exists
1085
1269
  var existingFetchIndex = arrayPattern.elements.findIndex(function (el) { return (el === null || el === void 0 ? void 0 : el.type) === 'Identifier' && el.name === vars.propsPrefix; });
1086
1270
  if (existingFetchIndex === -1) {
@@ -1094,6 +1278,13 @@ function updateGetStaticProps(chunks, registry) {
1094
1278
  types.returnStatement(types.arrayExpression([])),
1095
1279
  ])),
1096
1280
  ]));
1281
+ // Add import dependency for the fetcher
1282
+ if (!dependencies[fetcherImportName]) {
1283
+ dependencies[fetcherImportName] = {
1284
+ type: 'local',
1285
+ path: "../utils/data-sources/".concat(fileName),
1286
+ };
1287
+ }
1097
1288
  // Add to props
1098
1289
  propsObj.properties.push(types.objectProperty(types.identifier(vars.propsPrefix), types.identifier(vars.propsPrefix)));
1099
1290
  }
@@ -1104,7 +1295,11 @@ function updateGetStaticProps(chunks, registry) {
1104
1295
  // Add maxPages calculation for paginated
1105
1296
  if (usage.paginated) {
1106
1297
  var maxPagesPropName_1 = "".concat(vars.propsPrefix, "_maxPages");
1107
- var countVarName = "".concat(usage.dataSourceIdentifier, "_count");
1298
+ // Use filter-specific count variable if usage has filters
1299
+ var hasFilters = usage.filters && usage.filters.length > 0;
1300
+ var countVarName = hasFilters
1301
+ ? "".concat(usage.dataSourceIdentifier, "_ds_").concat(usage.index, "_count")
1302
+ : "".concat(usage.dataSourceIdentifier, "_count");
1108
1303
  // Check if maxPages calculation already exists
1109
1304
  var existingMaxPages = tryBlock.body.find(function (s) { var _a, _b, _c; return s.type === 'VariableDeclaration' && ((_c = (_b = (_a = s.declarations) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.name) === maxPagesPropName_1; });
1110
1305
  if (!existingMaxPages) {
@@ -1121,26 +1316,86 @@ function updateGetStaticProps(chunks, registry) {
1121
1316
  }
1122
1317
  });
1123
1318
  // Add count fetches for unique data sources
1319
+ // Group usages by filters to determine which need separate count fetches
1320
+ var processedCountKeys = new Set();
1124
1321
  dataSourcesNeedingCount.forEach(function (key) {
1125
1322
  var _a = key.split(':'), dataSourceType = _a[0], tableName = _a[1], dataSourceId = _a[2];
1126
1323
  var fileName = generateSafeFileName(dataSourceType, tableName, dataSourceId);
1127
- // Use consistent import name generation (matches extractDataSourceIntoGetStaticProps)
1128
1324
  var fetcherImportName = StringUtils.dashCaseToCamelCase(fileName);
1129
- // Find usage to get dataSourceIdentifier
1130
- var usage = registry.usages.find(function (u) {
1325
+ // Find all paginated usages for this data source
1326
+ var usagesForDataSource = registry.usages.filter(function (u) {
1131
1327
  return u.resourceDefinition.dataSourceId === dataSourceId &&
1132
- u.resourceDefinition.tableName === tableName;
1328
+ u.resourceDefinition.tableName === tableName &&
1329
+ u.paginated;
1133
1330
  });
1134
- if (!usage) {
1331
+ if (usagesForDataSource.length === 0) {
1135
1332
  return;
1136
1333
  }
1137
- var countVarName = "".concat(usage.dataSourceIdentifier, "_count");
1138
- // Check if count fetch already exists
1139
- var existingCount = arrayPattern.elements.findIndex(function (el) { return (el === null || el === void 0 ? void 0 : el.type) === 'Identifier' && el.name === countVarName; });
1140
- if (existingCount === -1) {
1141
- arrayPattern.elements.push(types.identifier(countVarName));
1142
- fetchesArray.elements.push(types.callExpression(types.memberExpression(types.identifier(fetcherImportName), types.identifier('fetchCount')), []));
1334
+ // Group usages by their filters (stringify for comparison)
1335
+ var usagesByFilters = new Map();
1336
+ for (var _i = 0, usagesForDataSource_1 = usagesForDataSource; _i < usagesForDataSource_1.length; _i++) {
1337
+ var usage = usagesForDataSource_1[_i];
1338
+ var filtersKey = JSON.stringify(usage.filters || []);
1339
+ var existing = usagesByFilters.get(filtersKey) || [];
1340
+ existing.push(usage);
1341
+ usagesByFilters.set(filtersKey, existing);
1143
1342
  }
1343
+ // Generate count fetches for each unique filter configuration
1344
+ usagesByFilters.forEach(function (usages, filtersKey) {
1345
+ var firstUsage = usages[0];
1346
+ var hasFilters = firstUsage.filters && firstUsage.filters.length > 0;
1347
+ // Create unique count variable name based on filters
1348
+ var countVarName = hasFilters
1349
+ ? "".concat(firstUsage.dataSourceIdentifier, "_ds_").concat(firstUsage.index, "_count")
1350
+ : "".concat(firstUsage.dataSourceIdentifier, "_count");
1351
+ // Check if this count was already processed
1352
+ var countKey = "".concat(key, ":").concat(filtersKey);
1353
+ if (processedCountKeys.has(countKey)) {
1354
+ return;
1355
+ }
1356
+ processedCountKeys.add(countKey);
1357
+ // Check if count fetch already exists
1358
+ var existingCount = arrayPattern.elements.findIndex(function (el) { return (el === null || el === void 0 ? void 0 : el.type) === 'Identifier' && el.name === countVarName; });
1359
+ if (existingCount === -1) {
1360
+ arrayPattern.elements.push(types.identifier(countVarName));
1361
+ // Build count params if filters exist
1362
+ var countParams = [];
1363
+ if (hasFilters) {
1364
+ countParams.push(types.objectProperty(types.identifier('filters'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
1365
+ types.arrayExpression(firstUsage.filters.map(function (f) {
1366
+ return types.objectExpression([
1367
+ types.objectProperty(types.identifier('source'), types.stringLiteral(f.source)),
1368
+ types.objectProperty(types.identifier('destination'), types.stringLiteral(f.destination)),
1369
+ types.objectProperty(types.identifier('operand'), types.stringLiteral(f.operand)),
1370
+ ]);
1371
+ })),
1372
+ ])));
1373
+ }
1374
+ fetchesArray.elements.push(types.callExpression(types.memberExpression(types.callExpression(types.memberExpression(types.identifier(fetcherImportName), types.identifier('fetchCount')), countParams.length > 0 ? [types.objectExpression(countParams)] : []), types.identifier('catch')), [
1375
+ types.arrowFunctionExpression([types.identifier('error')], types.blockStatement([
1376
+ types.expressionStatement(types.callExpression(types.memberExpression(types.identifier('console'), types.identifier('error')), [
1377
+ types.stringLiteral("Error fetching ".concat(countVarName, ":")),
1378
+ types.identifier('error'),
1379
+ ])),
1380
+ types.returnStatement(types.numericLiteral(0)),
1381
+ ])),
1382
+ ]));
1383
+ // Store which usages use this count variable for maxPages calculation
1384
+ for (var _i = 0, usages_1 = usages; _i < usages_1.length; _i++) {
1385
+ var usage = usages_1[_i];
1386
+ // tslint:disable-next-line:no-any
1387
+ ;
1388
+ usage.countVarName = countVarName;
1389
+ }
1390
+ // Add import dependency for the fetcher
1391
+ if (!dependencies[fetcherImportName]) {
1392
+ dependencies[fetcherImportName] = {
1393
+ type: 'local',
1394
+ path: "../utils/data-sources/".concat(fileName),
1395
+ };
1396
+ }
1397
+ }
1398
+ });
1144
1399
  });
1145
1400
  }
1146
1401
  //# sourceMappingURL=pagination-plugin.js.map