@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
@@ -64,6 +64,7 @@ var teleport_types_1 = require("@teleporthq/teleport-types");
64
64
  var types = __importStar(require("@babel/types"));
65
65
  var teleport_shared_1 = require("@teleporthq/teleport-shared");
66
66
  var utils_1 = require("./utils");
67
+ var data_source_fetchers_1 = require("./data-source-fetchers");
67
68
  // Scan UIDL to find all data source usages and build a registry
68
69
  function buildStateRegistry(uidlNode) {
69
70
  var usages = [];
@@ -71,7 +72,7 @@ function buildStateRegistry(uidlNode) {
71
72
  var byArrayMapperRenderProp = new Map();
72
73
  var index = 0;
73
74
  var traverse = function (node, parentDataSource) {
74
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
75
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
75
76
  if (!node || typeof node !== 'object') {
76
77
  return;
77
78
  }
@@ -110,9 +111,19 @@ function buildStateRegistry(uidlNode) {
110
111
  if ((_h = (_g = parentDataSource.resourceParams) === null || _g === void 0 ? void 0 : _g.queryColumns) === null || _h === void 0 ? void 0 : _h.content) {
111
112
  queryColumns = parentDataSource.resourceParams.queryColumns.content;
112
113
  }
114
+ // Extract sorts from parent's resource params
115
+ var sorts = [];
116
+ if ((_k = (_j = parentDataSource.resourceParams) === null || _j === void 0 ? void 0 : _j.sorts) === null || _k === void 0 ? void 0 : _k.content) {
117
+ sorts = parentDataSource.resourceParams.sorts.content;
118
+ }
119
+ // Extract filters from parent's resource params
120
+ var filters = [];
121
+ if ((_m = (_l = parentDataSource.resourceParams) === null || _l === void 0 ? void 0 : _l.filters) === null || _m === void 0 ? void 0 : _m.content) {
122
+ filters = parentDataSource.resourceParams.filters.content;
123
+ }
113
124
  // Extract limit from parent's resource params (for plain array mappers)
114
125
  var limit = 0;
115
- if ((_k = (_j = parentDataSource.resourceParams) === null || _j === void 0 ? void 0 : _j.limit) === null || _k === void 0 ? void 0 : _k.content) {
126
+ if ((_p = (_o = parentDataSource.resourceParams) === null || _o === void 0 ? void 0 : _o.limit) === null || _p === void 0 ? void 0 : _p.content) {
116
127
  limit = parentDataSource.resourceParams.limit.content;
117
128
  }
118
129
  // For paginated mappers, use perPage from cms-list-repeater
@@ -132,6 +143,8 @@ function buildStateRegistry(uidlNode) {
132
143
  searchEnabled: !!content.searchEnabled,
133
144
  searchDebounce: content.searchDebounce || 300,
134
145
  queryColumns: queryColumns,
146
+ sorts: sorts,
147
+ filters: filters,
135
148
  category: 'plain',
136
149
  };
137
150
  // Determine category
@@ -153,22 +166,22 @@ function buildStateRegistry(uidlNode) {
153
166
  byArrayMapperRenderProp.set(arrayMapperRenderProp, usage);
154
167
  }
155
168
  // Continue traversing inside the repeater
156
- if ((_l = content.nodes) === null || _l === void 0 ? void 0 : _l.list) {
169
+ if ((_q = content.nodes) === null || _q === void 0 ? void 0 : _q.list) {
157
170
  traverse(content.nodes.list, parentDataSource);
158
171
  }
159
172
  return;
160
173
  }
161
174
  // Recurse into children
162
- if (((_m = node.content) === null || _m === void 0 ? void 0 : _m.children) && Array.isArray(node.content.children)) {
163
- for (var _i = 0, _q = node.content.children; _i < _q.length; _i++) {
164
- var child = _q[_i];
175
+ if (((_r = node.content) === null || _r === void 0 ? void 0 : _r.children) && Array.isArray(node.content.children)) {
176
+ for (var _i = 0, _u = node.content.children; _i < _u.length; _i++) {
177
+ var child = _u[_i];
165
178
  traverse(child, parentDataSource);
166
179
  }
167
180
  }
168
- if ((_o = node.content) === null || _o === void 0 ? void 0 : _o.node) {
181
+ if ((_s = node.content) === null || _s === void 0 ? void 0 : _s.node) {
169
182
  traverse(node.content.node, parentDataSource);
170
183
  }
171
- if ((_p = node.content) === null || _p === void 0 ? void 0 : _p.nodes) {
184
+ if ((_t = node.content) === null || _t === void 0 ? void 0 : _t.nodes) {
172
185
  if (node.content.nodes.success) {
173
186
  traverse(node.content.nodes.success, parentDataSource);
174
187
  }
@@ -186,8 +199,8 @@ function buildStateRegistry(uidlNode) {
186
199
  }
187
200
  }
188
201
  if (Array.isArray(node.children)) {
189
- for (var _r = 0, _s = node.children; _r < _s.length; _r++) {
190
- var child = _s[_r];
202
+ for (var _v = 0, _w = node.children; _v < _w.length; _v++) {
203
+ var child = _w[_v];
191
204
  traverse(child, parentDataSource);
192
205
  }
193
206
  }
@@ -373,6 +386,29 @@ var createNextArrayMapperPaginationPlugin = function () {
373
386
  if (usage.queryColumns.length > 0) {
374
387
  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); }))])));
375
388
  }
389
+ // Add sorts to count fetch params if present
390
+ if (usage.sorts && usage.sorts.length > 0) {
391
+ urlParams.push(types.objectProperty(types.identifier('sorts'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
392
+ types.arrayExpression(usage.sorts.map(function (sort) {
393
+ return types.objectExpression([
394
+ types.objectProperty(types.identifier('field'), types.stringLiteral(sort.field || '')),
395
+ types.objectProperty(types.identifier('order'), types.stringLiteral(sort.order || '')),
396
+ ]);
397
+ })),
398
+ ])));
399
+ }
400
+ // Add filters to count fetch params if present
401
+ if (usage.filters && usage.filters.length > 0) {
402
+ urlParams.push(types.objectProperty(types.identifier('filters'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
403
+ types.arrayExpression(usage.filters.map(function (filter) {
404
+ return types.objectExpression([
405
+ types.objectProperty(types.identifier('source'), types.stringLiteral(filter.source || '')),
406
+ types.objectProperty(types.identifier('destination'), types.stringLiteral(filter.destination || '')),
407
+ types.objectProperty(types.identifier('operand'), types.stringLiteral(filter.operand || '')),
408
+ ]);
409
+ })),
410
+ ])));
411
+ }
376
412
  // Build the count fetch effect body
377
413
  var countFetchEffectBody = [];
378
414
  // Only add skip-on-mount check for pages (where we have server-side count)
@@ -536,13 +572,11 @@ var createNextArrayMapperPaginationPlugin = function () {
536
572
  else if (usage.category === 'search-only') {
537
573
  updateDataProviderForSearchOnly(dp, usage, vars, fileName);
538
574
  }
539
- else {
540
- updateDataProviderForPlain(dp, vars);
541
- }
542
- // Create API route if needed
543
- if (usage.category !== 'plain') {
544
- ensureAPIRouteExists(options.extractedResources, usage);
575
+ else if (usage.category === 'plain') {
576
+ updateDataProviderForPlain(dp, fileName);
545
577
  }
578
+ // Create API route for all categories (including 'plain' for components)
579
+ ensureAPIRouteExists(options.extractedResources, usage, options.dataSources);
546
580
  });
547
581
  dataProvidersWithoutRepeaters = dataProviders.filter(function (dp) {
548
582
  var hasRepeater = findArrayMapperRenderPropInDataProvider(dp) !== undefined;
@@ -575,7 +609,7 @@ var createNextArrayMapperPaginationPlugin = function () {
575
609
  });
576
610
  // STEP 6: Update getStaticProps if this is a page
577
611
  if (isPage) {
578
- updateGetStaticProps(chunks, registry);
612
+ updateGetStaticProps(chunks, registry, dependencies);
579
613
  }
580
614
  return [2 /*return*/, structure];
581
615
  });
@@ -760,6 +794,29 @@ function updateDataProviderForPaginatedSearch(dp, usage, vars, fileName) {
760
794
  if (usage.queryColumns.length > 0) {
761
795
  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); }))])));
762
796
  }
797
+ // Add sorts if present
798
+ if (usage.sorts && usage.sorts.length > 0) {
799
+ paramsProps.push(types.objectProperty(types.identifier('sorts'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
800
+ types.arrayExpression(usage.sorts.map(function (sort) {
801
+ return types.objectExpression([
802
+ types.objectProperty(types.identifier('field'), types.stringLiteral(sort.field || '')),
803
+ types.objectProperty(types.identifier('order'), types.stringLiteral(sort.order || '')),
804
+ ]);
805
+ })),
806
+ ])));
807
+ }
808
+ // Add filters if present
809
+ if (usage.filters && usage.filters.length > 0) {
810
+ paramsProps.push(types.objectProperty(types.identifier('filters'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
811
+ types.arrayExpression(usage.filters.map(function (filter) {
812
+ return types.objectExpression([
813
+ types.objectProperty(types.identifier('source'), types.stringLiteral(filter.source || '')),
814
+ types.objectProperty(types.identifier('destination'), types.stringLiteral(filter.destination || '')),
815
+ types.objectProperty(types.identifier('operand'), types.stringLiteral(filter.operand || '')),
816
+ ]);
817
+ })),
818
+ ])));
819
+ }
763
820
  dp.openingElement.attributes.push(types.jsxAttribute(types.jsxIdentifier('params'), types.jsxExpressionContainer(types.callExpression(types.identifier('useMemo'), [
764
821
  types.arrowFunctionExpression([], types.objectExpression(paramsProps)),
765
822
  types.arrayExpression([types.identifier(vars.combinedStateVar)]),
@@ -790,12 +847,37 @@ function updateDataProviderForPaginationOnly(dp, usage, vars, fileName) {
790
847
  var _a;
791
848
  return !['params', 'key', 'initialData', 'fetchData', 'persistDataDuringLoading'].includes((_a = attr.name) === null || _a === void 0 ? void 0 : _a.name);
792
849
  });
850
+ // Build params properties
851
+ var paramsProps = [
852
+ types.objectProperty(types.identifier('page'), types.identifier(vars.pageStateVar)),
853
+ types.objectProperty(types.identifier('perPage'), types.numericLiteral(usage.perPage)),
854
+ ];
855
+ // Add sorts if present
856
+ if (usage.sorts && usage.sorts.length > 0) {
857
+ paramsProps.push(types.objectProperty(types.identifier('sorts'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
858
+ types.arrayExpression(usage.sorts.map(function (sort) {
859
+ return types.objectExpression([
860
+ types.objectProperty(types.identifier('field'), types.stringLiteral(sort.field || '')),
861
+ types.objectProperty(types.identifier('order'), types.stringLiteral(sort.order || '')),
862
+ ]);
863
+ })),
864
+ ])));
865
+ }
866
+ // Add filters if present
867
+ if (usage.filters && usage.filters.length > 0) {
868
+ paramsProps.push(types.objectProperty(types.identifier('filters'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
869
+ types.arrayExpression(usage.filters.map(function (filter) {
870
+ return types.objectExpression([
871
+ types.objectProperty(types.identifier('source'), types.stringLiteral(filter.source || '')),
872
+ types.objectProperty(types.identifier('destination'), types.stringLiteral(filter.destination || '')),
873
+ types.objectProperty(types.identifier('operand'), types.stringLiteral(filter.operand || '')),
874
+ ]);
875
+ })),
876
+ ])));
877
+ }
793
878
  // Add params
794
879
  dp.openingElement.attributes.push(types.jsxAttribute(types.jsxIdentifier('params'), types.jsxExpressionContainer(types.callExpression(types.identifier('useMemo'), [
795
- types.arrowFunctionExpression([], types.objectExpression([
796
- types.objectProperty(types.identifier('page'), types.identifier(vars.pageStateVar)),
797
- types.objectProperty(types.identifier('perPage'), types.numericLiteral(usage.perPage)),
798
- ])),
880
+ types.arrowFunctionExpression([], types.objectExpression(paramsProps)),
799
881
  types.arrayExpression([types.identifier(vars.pageStateVar)]),
800
882
  ]))));
801
883
  // Add initialData
@@ -825,6 +907,29 @@ function updateDataProviderForSearchOnly(dp, usage, vars, fileName) {
825
907
  if (usage.queryColumns.length > 0) {
826
908
  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); }))])));
827
909
  }
910
+ // Add sorts if present
911
+ if (usage.sorts && usage.sorts.length > 0) {
912
+ paramsProps.push(types.objectProperty(types.identifier('sorts'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
913
+ types.arrayExpression(usage.sorts.map(function (sort) {
914
+ return types.objectExpression([
915
+ types.objectProperty(types.identifier('field'), types.stringLiteral(sort.field || '')),
916
+ types.objectProperty(types.identifier('order'), types.stringLiteral(sort.order || '')),
917
+ ]);
918
+ })),
919
+ ])));
920
+ }
921
+ // Add filters if present
922
+ if (usage.filters && usage.filters.length > 0) {
923
+ paramsProps.push(types.objectProperty(types.identifier('filters'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
924
+ types.arrayExpression(usage.filters.map(function (filter) {
925
+ return types.objectExpression([
926
+ types.objectProperty(types.identifier('source'), types.stringLiteral(filter.source || '')),
927
+ types.objectProperty(types.identifier('destination'), types.stringLiteral(filter.destination || '')),
928
+ types.objectProperty(types.identifier('operand'), types.stringLiteral(filter.operand || '')),
929
+ ]);
930
+ })),
931
+ ])));
932
+ }
828
933
  dp.openingElement.attributes.push(types.jsxAttribute(types.jsxIdentifier('params'), types.jsxExpressionContainer(types.callExpression(types.identifier('useMemo'), [
829
934
  types.arrowFunctionExpression([], types.objectExpression(paramsProps)),
830
935
  types.arrayExpression([types.identifier(vars.debouncedSearchQueryVar)]),
@@ -840,15 +945,48 @@ function updateDataProviderForSearchOnly(dp, usage, vars, fileName) {
840
945
  dp.openingElement.attributes.push(createFetchDataAttribute(fileName));
841
946
  dp.openingElement.attributes.push(types.jsxAttribute(types.jsxIdentifier('persistDataDuringLoading'), types.jsxExpressionContainer(types.booleanLiteral(true))));
842
947
  }
843
- function updateDataProviderForPlain(dp, vars) {
948
+ function updateDataProviderForPlain(dp, fileName) {
949
+ var _a, _b, _c;
844
950
  var attrs = dp.openingElement.attributes;
845
- // Remove params and fetchData - plain mappers only use initialData
846
- dp.openingElement.attributes = attrs.filter(function (attr) { var _a; return !['params', 'fetchData'].includes((_a = attr.name) === null || _a === void 0 ? void 0 : _a.name); });
847
- // Update initialData to use correct prop
848
- var existingInitialData = dp.openingElement.attributes.find(function (attr) { return attr.type === 'JSXAttribute' && attr.name.name === 'initialData'; });
849
- if (existingInitialData) {
850
- existingInitialData.value = types.jsxExpressionContainer(types.optionalMemberExpression(types.identifier('props'), types.identifier(vars.propsPrefix), false, true));
951
+ // Check if fetchData already exists
952
+ var hasFetchData = attrs.some(function (attr) { var _a; return attr.type === 'JSXAttribute' && ((_a = attr.name) === null || _a === void 0 ? void 0 : _a.name) === 'fetchData'; });
953
+ // If no fetchData, add it
954
+ if (!hasFetchData) {
955
+ attrs.push(createFetchDataAttribute(fileName));
956
+ }
957
+ // Check if persistDataDuringLoading already exists
958
+ var hasPersistData = attrs.some(function (attr) { var _a; return attr.type === 'JSXAttribute' && ((_a = attr.name) === null || _a === void 0 ? void 0 : _a.name) === 'persistDataDuringLoading'; });
959
+ // If no persistDataDuringLoading, add it
960
+ if (!hasPersistData) {
961
+ attrs.push(types.jsxAttribute(types.jsxIdentifier('persistDataDuringLoading'), types.jsxExpressionContainer(types.booleanLiteral(true))));
962
+ }
963
+ // Find the params attribute
964
+ var paramsAttrIndex = attrs.findIndex(function (attr) { return attr.type === 'JSXAttribute' && attr.name.name === 'params'; });
965
+ if (paramsAttrIndex === -1) {
966
+ return;
967
+ }
968
+ var paramsAttr = attrs[paramsAttrIndex];
969
+ // Check if params is already wrapped in useMemo
970
+ if (((_a = paramsAttr.value) === null || _a === void 0 ? void 0 : _a.type) === 'JSXExpressionContainer' &&
971
+ paramsAttr.value.expression.type === 'CallExpression' &&
972
+ ((_b = paramsAttr.value.expression.callee) === null || _b === void 0 ? void 0 : _b.name) === 'useMemo') {
973
+ return;
851
974
  }
975
+ // Get the current params value expression
976
+ var paramsExpression = null;
977
+ if (((_c = paramsAttr.value) === null || _c === void 0 ? void 0 : _c.type) === 'JSXExpressionContainer') {
978
+ paramsExpression = paramsAttr.value.expression;
979
+ }
980
+ if (!paramsExpression) {
981
+ return;
982
+ }
983
+ // Wrap params in useMemo with empty dependencies array
984
+ var memoizedParams = types.callExpression(types.identifier('useMemo'), [
985
+ types.arrowFunctionExpression([], paramsExpression),
986
+ types.arrayExpression([]),
987
+ ]);
988
+ // Replace the params attribute
989
+ attrs[paramsAttrIndex] = types.jsxAttribute(types.jsxIdentifier('params'), types.jsxExpressionContainer(memoizedParams));
852
990
  }
853
991
  function stabilizeDataProviderWithoutRepeater(dp) {
854
992
  var _a, _b, _c;
@@ -1014,35 +1152,54 @@ function wirePaginationButtons(paginationNode, usage, vars) {
1014
1152
  }
1015
1153
  }
1016
1154
  }
1017
- function ensureAPIRouteExists(extractedResources, usage) {
1155
+ function ensureAPIRouteExists(extractedResources, usage, dataSources) {
1018
1156
  // Generate file name for the API route
1019
1157
  var fileName = (0, utils_1.generateSafeFileName)(usage.resourceDefinition.dataSourceType, usage.resourceDefinition.tableName, usage.resourceDefinition.dataSourceId);
1020
- // Check if the utils data source file exists - if so, create API routes that re-export from it
1021
- if (extractedResources["utils/".concat(fileName)]) {
1022
- // Create main data API route if not exists
1023
- if (!extractedResources["api/".concat(fileName)]) {
1024
- var apiRouteCode = "import dataSourceModule from '../../utils/data-sources/".concat(fileName, "'\n\nexport default dataSourceModule.handler\n");
1025
- extractedResources["api/".concat(fileName)] = {
1026
- fileName: fileName,
1027
- fileType: teleport_types_1.FileType.JS,
1028
- path: ['pages', 'api'],
1029
- content: apiRouteCode,
1030
- };
1031
- }
1032
- // Create count API route if not exists (needed for paginated+search cases)
1033
- var countFileName = "".concat(fileName, "-count");
1034
- if (!extractedResources["api/".concat(countFileName)]) {
1035
- var countApiRouteCode = "import dataSourceModule from '../../utils/data-sources/".concat(fileName, "'\n\nexport default dataSourceModule.getCount\n");
1036
- extractedResources["api/".concat(countFileName)] = {
1037
- fileName: countFileName,
1038
- fileType: teleport_types_1.FileType.JS,
1039
- path: ['pages', 'api'],
1040
- content: countApiRouteCode,
1041
- };
1158
+ // Check if the utils data source file exists - if not, create it
1159
+ if (!extractedResources["utils/".concat(fileName)]) {
1160
+ // Get the data source from dataSources
1161
+ var dataSource = dataSources[usage.resourceDefinition.dataSourceId];
1162
+ if (dataSource) {
1163
+ try {
1164
+ // Generate the utils file with fetchData, fetchCount, handler, and getCount
1165
+ var fetcherCode = (0, data_source_fetchers_1.generateDataSourceFetcherWithCore)(dataSource, usage.resourceDefinition.tableName || 'data');
1166
+ extractedResources["utils/".concat(fileName)] = {
1167
+ fileName: fileName,
1168
+ fileType: teleport_types_1.FileType.JS,
1169
+ path: ['utils', 'data-sources'],
1170
+ content: fetcherCode,
1171
+ };
1172
+ }
1173
+ catch (error) {
1174
+ // If generation fails, skip
1175
+ return;
1176
+ }
1042
1177
  }
1043
1178
  }
1179
+ // Now create API routes that re-export from the utils file
1180
+ // Create main data API route if not exists
1181
+ if (!extractedResources["api/".concat(fileName)]) {
1182
+ var apiRouteCode = "import dataSourceModule from '../../utils/data-sources/".concat(fileName, "'\n\nexport default dataSourceModule.handler\n");
1183
+ extractedResources["api/".concat(fileName)] = {
1184
+ fileName: fileName,
1185
+ fileType: teleport_types_1.FileType.JS,
1186
+ path: ['pages', 'api'],
1187
+ content: apiRouteCode,
1188
+ };
1189
+ }
1190
+ // Create count API route if not exists (needed for paginated+search cases)
1191
+ var countFileName = "".concat(fileName, "-count");
1192
+ if (!extractedResources["api/".concat(countFileName)]) {
1193
+ var countApiRouteCode = "import dataSourceModule from '../../utils/data-sources/".concat(fileName, "'\n\nexport default dataSourceModule.getCount\n");
1194
+ extractedResources["api/".concat(countFileName)] = {
1195
+ fileName: countFileName,
1196
+ fileType: teleport_types_1.FileType.JS,
1197
+ path: ['pages', 'api'],
1198
+ content: countApiRouteCode,
1199
+ };
1200
+ }
1044
1201
  }
1045
- function updateGetStaticProps(chunks, registry) {
1202
+ function updateGetStaticProps(chunks, registry, dependencies) {
1046
1203
  var _a;
1047
1204
  var getStaticPropsChunk = chunks.find(function (c) { return c.name === 'getStaticProps'; });
1048
1205
  if (!getStaticPropsChunk || getStaticPropsChunk.type !== teleport_types_1.ChunkType.AST) {
@@ -1088,7 +1245,11 @@ function updateGetStaticProps(chunks, registry) {
1088
1245
  var arrayPattern = declarator.id;
1089
1246
  // Track unique data sources for count fetching
1090
1247
  var dataSourcesNeedingCount = new Set();
1091
- registry.usages.forEach(function (usage) {
1248
+ // Only process usages that need pagination or search functionality
1249
+ // Non-paginated, non-search usages are handled by the main plugin
1250
+ registry.usages
1251
+ .filter(function (u) { return u.paginated || u.searchEnabled; })
1252
+ .forEach(function (usage) {
1092
1253
  var vars = getStateVarsForUsage(usage);
1093
1254
  var fileName = (0, utils_1.generateSafeFileName)(usage.resourceDefinition.dataSourceType, usage.resourceDefinition.tableName, usage.resourceDefinition.dataSourceId);
1094
1255
  // Use consistent import name generation (matches extractDataSourceIntoGetStaticProps)
@@ -1108,6 +1269,29 @@ function updateGetStaticProps(chunks, registry) {
1108
1269
  if (usage.queryColumns.length > 0) {
1109
1270
  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); }))])));
1110
1271
  }
1272
+ // Add sorts if present
1273
+ if (usage.sorts && usage.sorts.length > 0) {
1274
+ fetchParams.push(types.objectProperty(types.identifier('sorts'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
1275
+ types.arrayExpression(usage.sorts.map(function (sort) {
1276
+ return types.objectExpression([
1277
+ types.objectProperty(types.identifier('field'), types.stringLiteral(sort.field || '')),
1278
+ types.objectProperty(types.identifier('order'), types.stringLiteral(sort.order || '')),
1279
+ ]);
1280
+ })),
1281
+ ])));
1282
+ }
1283
+ // Add filters if present
1284
+ if (usage.filters && usage.filters.length > 0) {
1285
+ fetchParams.push(types.objectProperty(types.identifier('filters'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
1286
+ types.arrayExpression(usage.filters.map(function (filter) {
1287
+ return types.objectExpression([
1288
+ types.objectProperty(types.identifier('source'), types.stringLiteral(filter.source || '')),
1289
+ types.objectProperty(types.identifier('destination'), types.stringLiteral(filter.destination || '')),
1290
+ types.objectProperty(types.identifier('operand'), types.stringLiteral(filter.operand || '')),
1291
+ ]);
1292
+ })),
1293
+ ])));
1294
+ }
1111
1295
  // Check if this fetch already exists
1112
1296
  var existingFetchIndex = arrayPattern.elements.findIndex(function (el) { return (el === null || el === void 0 ? void 0 : el.type) === 'Identifier' && el.name === vars.propsPrefix; });
1113
1297
  if (existingFetchIndex === -1) {
@@ -1121,6 +1305,13 @@ function updateGetStaticProps(chunks, registry) {
1121
1305
  types.returnStatement(types.arrayExpression([])),
1122
1306
  ])),
1123
1307
  ]));
1308
+ // Add import dependency for the fetcher
1309
+ if (!dependencies[fetcherImportName]) {
1310
+ dependencies[fetcherImportName] = {
1311
+ type: 'local',
1312
+ path: "../utils/data-sources/".concat(fileName),
1313
+ };
1314
+ }
1124
1315
  // Add to props
1125
1316
  propsObj.properties.push(types.objectProperty(types.identifier(vars.propsPrefix), types.identifier(vars.propsPrefix)));
1126
1317
  }
@@ -1131,7 +1322,11 @@ function updateGetStaticProps(chunks, registry) {
1131
1322
  // Add maxPages calculation for paginated
1132
1323
  if (usage.paginated) {
1133
1324
  var maxPagesPropName_1 = "".concat(vars.propsPrefix, "_maxPages");
1134
- var countVarName = "".concat(usage.dataSourceIdentifier, "_count");
1325
+ // Use filter-specific count variable if usage has filters
1326
+ var hasFilters = usage.filters && usage.filters.length > 0;
1327
+ var countVarName = hasFilters
1328
+ ? "".concat(usage.dataSourceIdentifier, "_ds_").concat(usage.index, "_count")
1329
+ : "".concat(usage.dataSourceIdentifier, "_count");
1135
1330
  // Check if maxPages calculation already exists
1136
1331
  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; });
1137
1332
  if (!existingMaxPages) {
@@ -1148,26 +1343,86 @@ function updateGetStaticProps(chunks, registry) {
1148
1343
  }
1149
1344
  });
1150
1345
  // Add count fetches for unique data sources
1346
+ // Group usages by filters to determine which need separate count fetches
1347
+ var processedCountKeys = new Set();
1151
1348
  dataSourcesNeedingCount.forEach(function (key) {
1152
1349
  var _a = key.split(':'), dataSourceType = _a[0], tableName = _a[1], dataSourceId = _a[2];
1153
1350
  var fileName = (0, utils_1.generateSafeFileName)(dataSourceType, tableName, dataSourceId);
1154
- // Use consistent import name generation (matches extractDataSourceIntoGetStaticProps)
1155
1351
  var fetcherImportName = teleport_shared_1.StringUtils.dashCaseToCamelCase(fileName);
1156
- // Find usage to get dataSourceIdentifier
1157
- var usage = registry.usages.find(function (u) {
1352
+ // Find all paginated usages for this data source
1353
+ var usagesForDataSource = registry.usages.filter(function (u) {
1158
1354
  return u.resourceDefinition.dataSourceId === dataSourceId &&
1159
- u.resourceDefinition.tableName === tableName;
1355
+ u.resourceDefinition.tableName === tableName &&
1356
+ u.paginated;
1160
1357
  });
1161
- if (!usage) {
1358
+ if (usagesForDataSource.length === 0) {
1162
1359
  return;
1163
1360
  }
1164
- var countVarName = "".concat(usage.dataSourceIdentifier, "_count");
1165
- // Check if count fetch already exists
1166
- var existingCount = arrayPattern.elements.findIndex(function (el) { return (el === null || el === void 0 ? void 0 : el.type) === 'Identifier' && el.name === countVarName; });
1167
- if (existingCount === -1) {
1168
- arrayPattern.elements.push(types.identifier(countVarName));
1169
- fetchesArray.elements.push(types.callExpression(types.memberExpression(types.identifier(fetcherImportName), types.identifier('fetchCount')), []));
1361
+ // Group usages by their filters (stringify for comparison)
1362
+ var usagesByFilters = new Map();
1363
+ for (var _i = 0, usagesForDataSource_1 = usagesForDataSource; _i < usagesForDataSource_1.length; _i++) {
1364
+ var usage = usagesForDataSource_1[_i];
1365
+ var filtersKey = JSON.stringify(usage.filters || []);
1366
+ var existing = usagesByFilters.get(filtersKey) || [];
1367
+ existing.push(usage);
1368
+ usagesByFilters.set(filtersKey, existing);
1170
1369
  }
1370
+ // Generate count fetches for each unique filter configuration
1371
+ usagesByFilters.forEach(function (usages, filtersKey) {
1372
+ var firstUsage = usages[0];
1373
+ var hasFilters = firstUsage.filters && firstUsage.filters.length > 0;
1374
+ // Create unique count variable name based on filters
1375
+ var countVarName = hasFilters
1376
+ ? "".concat(firstUsage.dataSourceIdentifier, "_ds_").concat(firstUsage.index, "_count")
1377
+ : "".concat(firstUsage.dataSourceIdentifier, "_count");
1378
+ // Check if this count was already processed
1379
+ var countKey = "".concat(key, ":").concat(filtersKey);
1380
+ if (processedCountKeys.has(countKey)) {
1381
+ return;
1382
+ }
1383
+ processedCountKeys.add(countKey);
1384
+ // Check if count fetch already exists
1385
+ var existingCount = arrayPattern.elements.findIndex(function (el) { return (el === null || el === void 0 ? void 0 : el.type) === 'Identifier' && el.name === countVarName; });
1386
+ if (existingCount === -1) {
1387
+ arrayPattern.elements.push(types.identifier(countVarName));
1388
+ // Build count params if filters exist
1389
+ var countParams = [];
1390
+ if (hasFilters) {
1391
+ countParams.push(types.objectProperty(types.identifier('filters'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
1392
+ types.arrayExpression(firstUsage.filters.map(function (f) {
1393
+ return types.objectExpression([
1394
+ types.objectProperty(types.identifier('source'), types.stringLiteral(f.source)),
1395
+ types.objectProperty(types.identifier('destination'), types.stringLiteral(f.destination)),
1396
+ types.objectProperty(types.identifier('operand'), types.stringLiteral(f.operand)),
1397
+ ]);
1398
+ })),
1399
+ ])));
1400
+ }
1401
+ 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')), [
1402
+ types.arrowFunctionExpression([types.identifier('error')], types.blockStatement([
1403
+ types.expressionStatement(types.callExpression(types.memberExpression(types.identifier('console'), types.identifier('error')), [
1404
+ types.stringLiteral("Error fetching ".concat(countVarName, ":")),
1405
+ types.identifier('error'),
1406
+ ])),
1407
+ types.returnStatement(types.numericLiteral(0)),
1408
+ ])),
1409
+ ]));
1410
+ // Store which usages use this count variable for maxPages calculation
1411
+ for (var _i = 0, usages_1 = usages; _i < usages_1.length; _i++) {
1412
+ var usage = usages_1[_i];
1413
+ // tslint:disable-next-line:no-any
1414
+ ;
1415
+ usage.countVarName = countVarName;
1416
+ }
1417
+ // Add import dependency for the fetcher
1418
+ if (!dependencies[fetcherImportName]) {
1419
+ dependencies[fetcherImportName] = {
1420
+ type: 'local',
1421
+ path: "../utils/data-sources/".concat(fileName),
1422
+ };
1423
+ }
1424
+ }
1425
+ });
1171
1426
  });
1172
1427
  }
1173
1428
  //# sourceMappingURL=pagination-plugin.js.map