@tablecraft/engine 0.1.0-beta.1

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 (237) hide show
  1. package/dist/src/__tests__/inputValidator.test.d.ts +2 -0
  2. package/dist/src/__tests__/inputValidator.test.d.ts.map +1 -0
  3. package/dist/src/__tests__/inputValidator.test.js +205 -0
  4. package/dist/src/__tests__/inputValidator.test.js.map +1 -0
  5. package/dist/src/__tests__/metadataBuilder.test.d.ts +2 -0
  6. package/dist/src/__tests__/metadataBuilder.test.d.ts.map +1 -0
  7. package/dist/src/__tests__/metadataBuilder.test.js +221 -0
  8. package/dist/src/__tests__/metadataBuilder.test.js.map +1 -0
  9. package/dist/src/core/aggregationBuilder.d.ts +17 -0
  10. package/dist/src/core/aggregationBuilder.d.ts.map +1 -0
  11. package/dist/src/core/aggregationBuilder.js +81 -0
  12. package/dist/src/core/aggregationBuilder.js.map +1 -0
  13. package/dist/src/core/cursorPagination.d.ts +36 -0
  14. package/dist/src/core/cursorPagination.d.ts.map +1 -0
  15. package/dist/src/core/cursorPagination.js +88 -0
  16. package/dist/src/core/cursorPagination.js.map +1 -0
  17. package/dist/src/core/datePresets.d.ts +19 -0
  18. package/dist/src/core/datePresets.d.ts.map +1 -0
  19. package/dist/src/core/datePresets.js +96 -0
  20. package/dist/src/core/datePresets.js.map +1 -0
  21. package/dist/src/core/dialect.d.ts +17 -0
  22. package/dist/src/core/dialect.d.ts.map +1 -0
  23. package/dist/src/core/dialect.js +60 -0
  24. package/dist/src/core/dialect.js.map +1 -0
  25. package/dist/src/core/fieldSelector.d.ts +19 -0
  26. package/dist/src/core/fieldSelector.d.ts.map +1 -0
  27. package/dist/src/core/fieldSelector.js +49 -0
  28. package/dist/src/core/fieldSelector.js.map +1 -0
  29. package/dist/src/core/filterBuilder.d.ts +22 -0
  30. package/dist/src/core/filterBuilder.d.ts.map +1 -0
  31. package/dist/src/core/filterBuilder.js +112 -0
  32. package/dist/src/core/filterBuilder.js.map +1 -0
  33. package/dist/src/core/filterGroupBuilder.d.ts +28 -0
  34. package/dist/src/core/filterGroupBuilder.d.ts.map +1 -0
  35. package/dist/src/core/filterGroupBuilder.js +73 -0
  36. package/dist/src/core/filterGroupBuilder.js.map +1 -0
  37. package/dist/src/core/groupByBuilder.d.ts +23 -0
  38. package/dist/src/core/groupByBuilder.d.ts.map +1 -0
  39. package/dist/src/core/groupByBuilder.js +127 -0
  40. package/dist/src/core/groupByBuilder.js.map +1 -0
  41. package/dist/src/core/inputValidator.d.ts +8 -0
  42. package/dist/src/core/inputValidator.d.ts.map +1 -0
  43. package/dist/src/core/inputValidator.js +117 -0
  44. package/dist/src/core/inputValidator.js.map +1 -0
  45. package/dist/src/core/metadataBuilder.d.ts +91 -0
  46. package/dist/src/core/metadataBuilder.d.ts.map +1 -0
  47. package/dist/src/core/metadataBuilder.js +220 -0
  48. package/dist/src/core/metadataBuilder.js.map +1 -0
  49. package/dist/src/core/paginationBuilder.d.ts +20 -0
  50. package/dist/src/core/paginationBuilder.d.ts.map +1 -0
  51. package/dist/src/core/paginationBuilder.js +42 -0
  52. package/dist/src/core/paginationBuilder.js.map +1 -0
  53. package/dist/src/core/queryBuilder.d.ts +20 -0
  54. package/dist/src/core/queryBuilder.d.ts.map +1 -0
  55. package/dist/src/core/queryBuilder.js +163 -0
  56. package/dist/src/core/queryBuilder.js.map +1 -0
  57. package/dist/src/core/recursiveBuilder.d.ts +25 -0
  58. package/dist/src/core/recursiveBuilder.d.ts.map +1 -0
  59. package/dist/src/core/recursiveBuilder.js +86 -0
  60. package/dist/src/core/recursiveBuilder.js.map +1 -0
  61. package/dist/src/core/relationBuilder.d.ts +19 -0
  62. package/dist/src/core/relationBuilder.d.ts.map +1 -0
  63. package/dist/src/core/relationBuilder.js +118 -0
  64. package/dist/src/core/relationBuilder.js.map +1 -0
  65. package/dist/src/core/roleFilter.d.ts +11 -0
  66. package/dist/src/core/roleFilter.d.ts.map +1 -0
  67. package/dist/src/core/roleFilter.js +24 -0
  68. package/dist/src/core/roleFilter.js.map +1 -0
  69. package/dist/src/core/searchBuilder.d.ts +17 -0
  70. package/dist/src/core/searchBuilder.d.ts.map +1 -0
  71. package/dist/src/core/searchBuilder.js +71 -0
  72. package/dist/src/core/searchBuilder.js.map +1 -0
  73. package/dist/src/core/softDelete.d.ts +12 -0
  74. package/dist/src/core/softDelete.d.ts.map +1 -0
  75. package/dist/src/core/softDelete.js +29 -0
  76. package/dist/src/core/softDelete.js.map +1 -0
  77. package/dist/src/core/sortBuilder.d.ts +14 -0
  78. package/dist/src/core/sortBuilder.d.ts.map +1 -0
  79. package/dist/src/core/sortBuilder.js +58 -0
  80. package/dist/src/core/sortBuilder.js.map +1 -0
  81. package/dist/src/core/subqueryBuilder.d.ts +13 -0
  82. package/dist/src/core/subqueryBuilder.d.ts.map +1 -0
  83. package/dist/src/core/subqueryBuilder.js +47 -0
  84. package/dist/src/core/subqueryBuilder.js.map +1 -0
  85. package/dist/src/core/validator.d.ts +18 -0
  86. package/dist/src/core/validator.d.ts.map +1 -0
  87. package/dist/src/core/validator.js +88 -0
  88. package/dist/src/core/validator.js.map +1 -0
  89. package/dist/src/define.d.ts +274 -0
  90. package/dist/src/define.d.ts.map +1 -0
  91. package/dist/src/define.js +690 -0
  92. package/dist/src/define.js.map +1 -0
  93. package/dist/src/engine.d.ts +17 -0
  94. package/dist/src/engine.d.ts.map +1 -0
  95. package/dist/src/engine.js +429 -0
  96. package/dist/src/engine.js.map +1 -0
  97. package/dist/src/errors.d.ts +53 -0
  98. package/dist/src/errors.d.ts.map +1 -0
  99. package/dist/src/errors.js +80 -0
  100. package/dist/src/errors.js.map +1 -0
  101. package/dist/src/index.d.ts +37 -0
  102. package/dist/src/index.d.ts.map +1 -0
  103. package/dist/src/index.js +41 -0
  104. package/dist/src/index.js.map +1 -0
  105. package/dist/src/types/engine.d.ts +92 -0
  106. package/dist/src/types/engine.d.ts.map +1 -0
  107. package/dist/src/types/engine.js +2 -0
  108. package/dist/src/types/engine.js.map +1 -0
  109. package/dist/src/types/table.d.ts +867 -0
  110. package/dist/src/types/table.d.ts.map +1 -0
  111. package/dist/src/types/table.js +198 -0
  112. package/dist/src/types/table.js.map +1 -0
  113. package/dist/src/utils/adapterUtils.d.ts +16 -0
  114. package/dist/src/utils/adapterUtils.d.ts.map +1 -0
  115. package/dist/src/utils/adapterUtils.js +28 -0
  116. package/dist/src/utils/adapterUtils.js.map +1 -0
  117. package/dist/src/utils/codegen.d.ts +7 -0
  118. package/dist/src/utils/codegen.d.ts.map +1 -0
  119. package/dist/src/utils/codegen.js +126 -0
  120. package/dist/src/utils/codegen.js.map +1 -0
  121. package/dist/src/utils/export.d.ts +15 -0
  122. package/dist/src/utils/export.d.ts.map +1 -0
  123. package/dist/src/utils/export.js +42 -0
  124. package/dist/src/utils/export.js.map +1 -0
  125. package/dist/src/utils/introspect.d.ts +32 -0
  126. package/dist/src/utils/introspect.d.ts.map +1 -0
  127. package/dist/src/utils/introspect.js +174 -0
  128. package/dist/src/utils/introspect.js.map +1 -0
  129. package/dist/src/utils/openapi.d.ts +6 -0
  130. package/dist/src/utils/openapi.d.ts.map +1 -0
  131. package/dist/src/utils/openapi.js +138 -0
  132. package/dist/src/utils/openapi.js.map +1 -0
  133. package/dist/src/utils/operators.d.ts +8 -0
  134. package/dist/src/utils/operators.d.ts.map +1 -0
  135. package/dist/src/utils/operators.js +70 -0
  136. package/dist/src/utils/operators.js.map +1 -0
  137. package/dist/src/utils/requestParser.d.ts +18 -0
  138. package/dist/src/utils/requestParser.d.ts.map +1 -0
  139. package/dist/src/utils/requestParser.js +126 -0
  140. package/dist/src/utils/requestParser.js.map +1 -0
  141. package/dist/src/utils/responseFormatter.d.ts +12 -0
  142. package/dist/src/utils/responseFormatter.d.ts.map +1 -0
  143. package/dist/src/utils/responseFormatter.js +106 -0
  144. package/dist/src/utils/responseFormatter.js.map +1 -0
  145. package/dist/src/utils/typedSql.d.ts +70 -0
  146. package/dist/src/utils/typedSql.d.ts.map +1 -0
  147. package/dist/src/utils/typedSql.js +102 -0
  148. package/dist/src/utils/typedSql.js.map +1 -0
  149. package/dist/test/columnMeta.test.d.ts +2 -0
  150. package/dist/test/columnMeta.test.d.ts.map +1 -0
  151. package/dist/test/columnMeta.test.js +92 -0
  152. package/dist/test/columnMeta.test.js.map +1 -0
  153. package/dist/test/core/aggregationBuilder.test.d.ts +2 -0
  154. package/dist/test/core/aggregationBuilder.test.d.ts.map +1 -0
  155. package/dist/test/core/aggregationBuilder.test.js +64 -0
  156. package/dist/test/core/aggregationBuilder.test.js.map +1 -0
  157. package/dist/test/core/filterBuilder.test.d.ts +2 -0
  158. package/dist/test/core/filterBuilder.test.d.ts.map +1 -0
  159. package/dist/test/core/filterBuilder.test.js +80 -0
  160. package/dist/test/core/filterBuilder.test.js.map +1 -0
  161. package/dist/test/core/paginationBuilder.test.d.ts +2 -0
  162. package/dist/test/core/paginationBuilder.test.d.ts.map +1 -0
  163. package/dist/test/core/paginationBuilder.test.js +63 -0
  164. package/dist/test/core/paginationBuilder.test.js.map +1 -0
  165. package/dist/test/core/queryBuilder.test.d.ts +2 -0
  166. package/dist/test/core/queryBuilder.test.d.ts.map +1 -0
  167. package/dist/test/core/queryBuilder.test.js +92 -0
  168. package/dist/test/core/queryBuilder.test.js.map +1 -0
  169. package/dist/test/core/searchBuilder.test.d.ts +2 -0
  170. package/dist/test/core/searchBuilder.test.d.ts.map +1 -0
  171. package/dist/test/core/searchBuilder.test.js +68 -0
  172. package/dist/test/core/searchBuilder.test.js.map +1 -0
  173. package/dist/test/core/softDelete.test.d.ts +2 -0
  174. package/dist/test/core/softDelete.test.d.ts.map +1 -0
  175. package/dist/test/core/softDelete.test.js +60 -0
  176. package/dist/test/core/softDelete.test.js.map +1 -0
  177. package/dist/test/core/sortBuilder.test.d.ts +2 -0
  178. package/dist/test/core/sortBuilder.test.d.ts.map +1 -0
  179. package/dist/test/core/sortBuilder.test.js +59 -0
  180. package/dist/test/core/sortBuilder.test.js.map +1 -0
  181. package/dist/test/core/subqueryBuilder.test.d.ts +2 -0
  182. package/dist/test/core/subqueryBuilder.test.d.ts.map +1 -0
  183. package/dist/test/core/subqueryBuilder.test.js +48 -0
  184. package/dist/test/core/subqueryBuilder.test.js.map +1 -0
  185. package/dist/test/core/validator.test.d.ts +2 -0
  186. package/dist/test/core/validator.test.d.ts.map +1 -0
  187. package/dist/test/core/validator.test.js +81 -0
  188. package/dist/test/core/validator.test.js.map +1 -0
  189. package/dist/test/datePresets.test.d.ts +2 -0
  190. package/dist/test/datePresets.test.d.ts.map +1 -0
  191. package/dist/test/datePresets.test.js +57 -0
  192. package/dist/test/datePresets.test.js.map +1 -0
  193. package/dist/test/errors.test.d.ts +2 -0
  194. package/dist/test/errors.test.d.ts.map +1 -0
  195. package/dist/test/errors.test.js +62 -0
  196. package/dist/test/errors.test.js.map +1 -0
  197. package/dist/test/inputValidator.test.d.ts +2 -0
  198. package/dist/test/inputValidator.test.d.ts.map +1 -0
  199. package/dist/test/inputValidator.test.js +60 -0
  200. package/dist/test/inputValidator.test.js.map +1 -0
  201. package/dist/test/metadata.test.d.ts +2 -0
  202. package/dist/test/metadata.test.d.ts.map +1 -0
  203. package/dist/test/metadata.test.js +285 -0
  204. package/dist/test/metadata.test.js.map +1 -0
  205. package/dist/test/metadataComplete.test.d.ts +2 -0
  206. package/dist/test/metadataComplete.test.d.ts.map +1 -0
  207. package/dist/test/metadataComplete.test.js +113 -0
  208. package/dist/test/metadataComplete.test.js.map +1 -0
  209. package/dist/test/roleFilter.test.d.ts +2 -0
  210. package/dist/test/roleFilter.test.d.ts.map +1 -0
  211. package/dist/test/roleFilter.test.js +53 -0
  212. package/dist/test/roleFilter.test.js.map +1 -0
  213. package/dist/test/typedSql.test.d.ts +2 -0
  214. package/dist/test/typedSql.test.d.ts.map +1 -0
  215. package/dist/test/typedSql.test.js +63 -0
  216. package/dist/test/typedSql.test.js.map +1 -0
  217. package/dist/test/utils/codegen.test.d.ts +2 -0
  218. package/dist/test/utils/codegen.test.d.ts.map +1 -0
  219. package/dist/test/utils/codegen.test.js +65 -0
  220. package/dist/test/utils/codegen.test.js.map +1 -0
  221. package/dist/test/utils/export.test.d.ts +2 -0
  222. package/dist/test/utils/export.test.d.ts.map +1 -0
  223. package/dist/test/utils/export.test.js +54 -0
  224. package/dist/test/utils/export.test.js.map +1 -0
  225. package/dist/test/utils/openapi.test.d.ts +2 -0
  226. package/dist/test/utils/openapi.test.d.ts.map +1 -0
  227. package/dist/test/utils/openapi.test.js +65 -0
  228. package/dist/test/utils/openapi.test.js.map +1 -0
  229. package/dist/test/utils/requestParser.test.d.ts +2 -0
  230. package/dist/test/utils/requestParser.test.d.ts.map +1 -0
  231. package/dist/test/utils/requestParser.test.js +89 -0
  232. package/dist/test/utils/requestParser.test.js.map +1 -0
  233. package/dist/test/utils/responseFormatter.test.d.ts +2 -0
  234. package/dist/test/utils/responseFormatter.test.d.ts.map +1 -0
  235. package/dist/test/utils/responseFormatter.test.js +79 -0
  236. package/dist/test/utils/responseFormatter.test.js.map +1 -0
  237. package/package.json +42 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=inputValidator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputValidator.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/inputValidator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,205 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { validateInput } from '../core/inputValidator';
3
+ function createTestConfig(columns) {
4
+ return {
5
+ name: 'test',
6
+ base: 'test_table',
7
+ columns: columns.map((c) => ({
8
+ name: c.name ?? 'id',
9
+ type: c.type ?? 'string',
10
+ label: c.label ?? c.name ?? 'ID',
11
+ hidden: c.hidden ?? false,
12
+ sortable: c.sortable ?? true,
13
+ filterable: c.filterable ?? true,
14
+ ...c,
15
+ })),
16
+ };
17
+ }
18
+ describe('inputValidator', () => {
19
+ describe('validateFilterValues', () => {
20
+ it('should skip unknown filter fields gracefully', () => {
21
+ const config = createTestConfig([
22
+ { name: 'id', type: 'number', filterable: true },
23
+ { name: 'name', type: 'string', filterable: true },
24
+ ]);
25
+ const params = {
26
+ filters: {
27
+ nonexistentField: { operator: 'eq', value: 123 },
28
+ anotherUnknown: { operator: 'gte', value: 'test' },
29
+ },
30
+ };
31
+ expect(() => validateInput(params, config)).not.toThrow();
32
+ });
33
+ it('should skip unknown fields but still validate known fields in mixed requests', () => {
34
+ const config = createTestConfig([
35
+ { name: 'id', type: 'number', filterable: true },
36
+ { name: 'name', type: 'string', filterable: true },
37
+ ]);
38
+ const validMixedParams = {
39
+ filters: {
40
+ nonexistentField: { operator: 'eq', value: 123 },
41
+ id: { operator: 'gt', value: 100 },
42
+ },
43
+ };
44
+ expect(() => validateInput(validMixedParams, config)).not.toThrow();
45
+ const invalidMixedParams = {
46
+ filters: {
47
+ nonexistentField: { operator: 'eq', value: 123 },
48
+ id: { operator: 'gt', value: 'not-a-number' },
49
+ },
50
+ };
51
+ expect(() => validateInput(invalidMixedParams, config)).toThrow();
52
+ });
53
+ it('should validate known filter fields with correct types', () => {
54
+ const config = createTestConfig([
55
+ { name: 'id', type: 'number', filterable: true },
56
+ { name: 'name', type: 'string', filterable: true },
57
+ ]);
58
+ const params = {
59
+ filters: {
60
+ id: { operator: 'gt', value: 100 },
61
+ name: { operator: 'contains', value: 'test' },
62
+ },
63
+ };
64
+ expect(() => validateInput(params, config)).not.toThrow();
65
+ });
66
+ it('should throw for non-filterable columns', () => {
67
+ const config = createTestConfig([
68
+ { name: 'id', type: 'number', filterable: false },
69
+ ]);
70
+ const params = {
71
+ filters: {
72
+ id: { operator: 'eq', value: 1 },
73
+ },
74
+ };
75
+ expect(() => validateInput(params, config)).toThrow('is not filterable');
76
+ });
77
+ it('should validate number type correctly', () => {
78
+ const config = createTestConfig([
79
+ { name: 'price', type: 'number', filterable: true },
80
+ ]);
81
+ const validParams = {
82
+ filters: { price: { operator: 'gte', value: 100 } },
83
+ };
84
+ expect(() => validateInput(validParams, config)).not.toThrow();
85
+ const invalidParams = {
86
+ filters: { price: { operator: 'gte', value: 'not-a-number' } },
87
+ };
88
+ expect(() => validateInput(invalidParams, config)).toThrow();
89
+ });
90
+ it('should validate date type correctly', () => {
91
+ const config = createTestConfig([
92
+ { name: 'createdAt', type: 'date', filterable: true },
93
+ ]);
94
+ const validParams = {
95
+ filters: { createdAt: { operator: 'gte', value: '2024-01-01T00:00:00Z' } },
96
+ };
97
+ expect(() => validateInput(validParams, config)).not.toThrow();
98
+ const invalidParams = {
99
+ filters: { createdAt: { operator: 'gte', value: 'not-a-date' } },
100
+ };
101
+ expect(() => validateInput(invalidParams, config)).toThrow();
102
+ });
103
+ it('should validate boolean type correctly', () => {
104
+ const config = createTestConfig([
105
+ { name: 'isActive', type: 'boolean', filterable: true },
106
+ ]);
107
+ const validParams = {
108
+ filters: { isActive: { operator: 'eq', value: true } },
109
+ };
110
+ expect(() => validateInput(validParams, config)).not.toThrow();
111
+ const invalidParams = {
112
+ filters: { isActive: { operator: 'eq', value: 'yes' } },
113
+ };
114
+ expect(() => validateInput(invalidParams, config)).toThrow();
115
+ });
116
+ it('should validate between operator with array value', () => {
117
+ const config = createTestConfig([
118
+ { name: 'price', type: 'number', filterable: true },
119
+ ]);
120
+ const validParams = {
121
+ filters: { price: { operator: 'between', value: [10, 100] } },
122
+ };
123
+ expect(() => validateInput(validParams, config)).not.toThrow();
124
+ const invalidParams = {
125
+ filters: { price: { operator: 'between', value: [10] } },
126
+ };
127
+ expect(() => validateInput(invalidParams, config)).toThrow();
128
+ });
129
+ it('should validate in operator with array value', () => {
130
+ const config = createTestConfig([
131
+ { name: 'status', type: 'string', filterable: true },
132
+ ]);
133
+ const validParams = {
134
+ filters: { status: { operator: 'in', value: ['active', 'pending'] } },
135
+ };
136
+ expect(() => validateInput(validParams, config)).not.toThrow();
137
+ const invalidParams = {
138
+ filters: { status: { operator: 'in', value: 'active' } },
139
+ };
140
+ expect(() => validateInput(invalidParams, config)).toThrow();
141
+ });
142
+ it('should skip validation for isNull and isNotNull operators', () => {
143
+ const config = createTestConfig([
144
+ { name: 'deletedAt', type: 'date', filterable: true },
145
+ ]);
146
+ const params = {
147
+ filters: { deletedAt: { operator: 'isNull', value: null } },
148
+ };
149
+ expect(() => validateInput(params, config)).not.toThrow();
150
+ });
151
+ });
152
+ describe('validateSelectFields', () => {
153
+ it('should validate existing fields', () => {
154
+ const config = createTestConfig([
155
+ { name: 'id', type: 'number' },
156
+ { name: 'name', type: 'string' },
157
+ ]);
158
+ const params = {
159
+ select: ['id', 'name'],
160
+ };
161
+ expect(() => validateInput(params, config)).not.toThrow();
162
+ });
163
+ it('should throw for non-existent fields', () => {
164
+ const config = createTestConfig([
165
+ { name: 'id', type: 'number' },
166
+ ]);
167
+ const params = {
168
+ select: ['nonexistent'],
169
+ };
170
+ expect(() => validateInput(params, config)).toThrow('does not exist');
171
+ });
172
+ it('should throw for hidden fields', () => {
173
+ const config = createTestConfig([
174
+ { name: 'id', type: 'number' },
175
+ { name: 'secret', type: 'string', hidden: true },
176
+ ]);
177
+ const params = {
178
+ select: ['secret'],
179
+ };
180
+ expect(() => validateInput(params, config)).toThrow('is not accessible');
181
+ });
182
+ });
183
+ describe('validateSortFields', () => {
184
+ it('should validate sortable fields', () => {
185
+ const config = createTestConfig([
186
+ { name: 'id', type: 'number', sortable: true },
187
+ { name: 'name', type: 'string', sortable: true },
188
+ ]);
189
+ const params = {
190
+ sort: [{ field: 'id', order: 'asc' }],
191
+ };
192
+ expect(() => validateInput(params, config)).not.toThrow();
193
+ });
194
+ it('should throw for non-sortable fields', () => {
195
+ const config = createTestConfig([
196
+ { name: 'id', type: 'number', sortable: false },
197
+ ]);
198
+ const params = {
199
+ sort: [{ field: 'id', order: 'asc' }],
200
+ };
201
+ expect(() => validateInput(params, config)).toThrow('is not sortable');
202
+ });
203
+ });
204
+ });
205
+ //# sourceMappingURL=inputValidator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputValidator.test.js","sourceRoot":"","sources":["../../../src/__tests__/inputValidator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=metadataBuilder.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadataBuilder.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/metadataBuilder.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,221 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { buildMetadata } from '../core/metadataBuilder';
3
+ function createTestConfig(overrides = {}) {
4
+ return {
5
+ name: 'test_table',
6
+ base: 'test_table',
7
+ columns: [
8
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
9
+ { name: 'name', type: 'string', label: 'Name', hidden: false, sortable: true, filterable: true },
10
+ ],
11
+ ...overrides,
12
+ };
13
+ }
14
+ describe('metadataBuilder', () => {
15
+ describe('dateRangeColumn detection', () => {
16
+ it('should return null when no date columns exist', () => {
17
+ const config = createTestConfig({
18
+ columns: [
19
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
20
+ { name: 'name', type: 'string', label: 'Name', hidden: false, sortable: true, filterable: true },
21
+ ],
22
+ });
23
+ const meta = buildMetadata(config);
24
+ expect(meta.dateRangeColumn).toBeNull();
25
+ expect(meta.dateColumns).toEqual([]);
26
+ });
27
+ it('should detect createdAt column automatically', () => {
28
+ const config = createTestConfig({
29
+ columns: [
30
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
31
+ { name: 'createdAt', type: 'date', label: 'Created At', hidden: false, sortable: true, filterable: true },
32
+ ],
33
+ });
34
+ const meta = buildMetadata(config);
35
+ expect(meta.dateRangeColumn).toBe('createdAt');
36
+ expect(meta.dateColumns).toEqual(['createdAt']);
37
+ });
38
+ it('should detect created_at column (snake_case) automatically', () => {
39
+ const config = createTestConfig({
40
+ columns: [
41
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
42
+ { name: 'created_at', type: 'date', label: 'Created At', hidden: false, sortable: true, filterable: true },
43
+ ],
44
+ });
45
+ const meta = buildMetadata(config);
46
+ expect(meta.dateRangeColumn).toBe('created_at');
47
+ expect(meta.dateColumns).toEqual(['created_at']);
48
+ });
49
+ it('should prefer createdAt over other date columns', () => {
50
+ const config = createTestConfig({
51
+ columns: [
52
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
53
+ { name: 'customDate', type: 'date', label: 'Custom Date', hidden: false, sortable: true, filterable: true },
54
+ { name: 'createdAt', type: 'date', label: 'Created At', hidden: false, sortable: true, filterable: true },
55
+ ],
56
+ });
57
+ const meta = buildMetadata(config);
58
+ expect(meta.dateRangeColumn).toBe('createdAt');
59
+ expect(meta.dateColumns).toEqual(['customDate', 'createdAt']);
60
+ });
61
+ it('should use first date column when no createdAt exists', () => {
62
+ const config = createTestConfig({
63
+ columns: [
64
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
65
+ { name: 'shippedAt', type: 'date', label: 'Shipped At', hidden: false, sortable: true, filterable: true },
66
+ { name: 'deliveredAt', type: 'date', label: 'Delivered At', hidden: false, sortable: true, filterable: true },
67
+ ],
68
+ });
69
+ const meta = buildMetadata(config);
70
+ expect(meta.dateRangeColumn).toBe('shippedAt');
71
+ expect(meta.dateColumns).toEqual(['shippedAt', 'deliveredAt']);
72
+ });
73
+ it('should use explicit dateRangeColumn from config', () => {
74
+ const config = createTestConfig({
75
+ dateRangeColumn: 'deliveredAt',
76
+ columns: [
77
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
78
+ { name: 'createdAt', type: 'date', label: 'Created At', hidden: false, sortable: true, filterable: true },
79
+ { name: 'deliveredAt', type: 'date', label: 'Delivered At', hidden: false, sortable: true, filterable: true },
80
+ ],
81
+ });
82
+ const meta = buildMetadata(config);
83
+ expect(meta.dateRangeColumn).toBe('deliveredAt');
84
+ expect(meta.dateColumns).toEqual(['createdAt', 'deliveredAt']);
85
+ });
86
+ it('should fall back to auto-detected dateRangeColumn when config references a missing column', () => {
87
+ const config = createTestConfig({
88
+ dateRangeColumn: 'missingColumn',
89
+ columns: [
90
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
91
+ { name: 'shippedAt', type: 'date', label: 'Shipped At', hidden: false, sortable: true, filterable: true },
92
+ { name: 'deliveredAt', type: 'date', label: 'Delivered At', hidden: false, sortable: true, filterable: true },
93
+ ],
94
+ });
95
+ const meta = buildMetadata(config);
96
+ expect(meta.dateRangeColumn).toBe('shippedAt');
97
+ expect(meta.dateColumns).toEqual(['shippedAt', 'deliveredAt']);
98
+ });
99
+ it('should fall back to auto-detected dateRangeColumn when config references a non-date column', () => {
100
+ const config = createTestConfig({
101
+ dateRangeColumn: 'id',
102
+ columns: [
103
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
104
+ { name: 'shippedAt', type: 'date', label: 'Shipped At', hidden: false, sortable: true, filterable: true },
105
+ { name: 'deliveredAt', type: 'date', label: 'Delivered At', hidden: false, sortable: true, filterable: true },
106
+ ],
107
+ });
108
+ const meta = buildMetadata(config);
109
+ expect(meta.dateRangeColumn).toBe('shippedAt');
110
+ expect(meta.dateColumns).toEqual(['shippedAt', 'deliveredAt']);
111
+ });
112
+ it('should fall back to auto-detected dateRangeColumn when config references a hidden column', () => {
113
+ const config = createTestConfig({
114
+ dateRangeColumn: 'internalDate',
115
+ columns: [
116
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
117
+ { name: 'shippedAt', type: 'date', label: 'Shipped At', hidden: false, sortable: true, filterable: true },
118
+ { name: 'internalDate', type: 'date', label: 'Internal', hidden: true, sortable: true, filterable: true },
119
+ ],
120
+ });
121
+ const meta = buildMetadata(config);
122
+ expect(meta.dateRangeColumn).toBe('shippedAt');
123
+ expect(meta.dateColumns).toEqual(['shippedAt']);
124
+ });
125
+ it('should exclude hidden columns from dateColumns', () => {
126
+ const config = createTestConfig({
127
+ columns: [
128
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
129
+ { name: 'createdAt', type: 'date', label: 'Created At', hidden: false, sortable: true, filterable: true },
130
+ { name: 'internalDate', type: 'date', label: 'Internal', hidden: true, sortable: true, filterable: true },
131
+ ],
132
+ });
133
+ const meta = buildMetadata(config);
134
+ expect(meta.dateColumns).toEqual(['createdAt']);
135
+ expect(meta.dateRangeColumn).toBe('createdAt');
136
+ });
137
+ it('should return null when dateRangeColumn is not set and no date columns exist', () => {
138
+ const config = createTestConfig({
139
+ columns: [
140
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
141
+ { name: 'name', type: 'string', label: 'Name', hidden: false, sortable: true, filterable: true },
142
+ ],
143
+ });
144
+ const meta = buildMetadata(config);
145
+ expect(meta.dateRangeColumn).toBeNull();
146
+ expect(meta.dateColumns).toEqual([]);
147
+ });
148
+ it('should exclude computed columns from dateColumns', () => {
149
+ const config = createTestConfig({
150
+ columns: [
151
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
152
+ { name: 'createdAt', type: 'date', label: 'Created At', hidden: false, sortable: true, filterable: true },
153
+ { name: 'computedDate', type: 'date', label: 'Computed', hidden: false, sortable: true, filterable: true, computed: true },
154
+ ],
155
+ });
156
+ const meta = buildMetadata(config);
157
+ expect(meta.dateColumns).toEqual(['createdAt']);
158
+ expect(meta.dateRangeColumn).toBe('createdAt');
159
+ });
160
+ it('should detect multiple date columns', () => {
161
+ const config = createTestConfig({
162
+ columns: [
163
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
164
+ { name: 'createdAt', type: 'date', label: 'Created At', hidden: false, sortable: true, filterable: true },
165
+ { name: 'updatedAt', type: 'date', label: 'Updated At', hidden: false, sortable: true, filterable: true },
166
+ { name: 'deletedAt', type: 'date', label: 'Deleted At', hidden: false, sortable: true, filterable: true },
167
+ ],
168
+ });
169
+ const meta = buildMetadata(config);
170
+ expect(meta.dateColumns).toEqual(['createdAt', 'updatedAt', 'deletedAt']);
171
+ expect(meta.dateRangeColumn).toBe('createdAt');
172
+ });
173
+ });
174
+ describe('filter metadata', () => {
175
+ it('should generate filter metadata for filterable columns', () => {
176
+ const config = createTestConfig({
177
+ columns: [
178
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
179
+ { name: 'name', type: 'string', label: 'Name', hidden: false, sortable: true, filterable: false },
180
+ { name: 'status', type: 'string', label: 'Status', hidden: false, sortable: true, filterable: true },
181
+ ],
182
+ });
183
+ const meta = buildMetadata(config);
184
+ expect(meta.filters).toHaveLength(2);
185
+ expect(meta.filters.map(f => f.field)).toEqual(['id', 'status']);
186
+ });
187
+ it('should include correct operators for column types', () => {
188
+ const config = createTestConfig({
189
+ columns: [
190
+ { name: 'price', type: 'number', label: 'Price', hidden: false, sortable: true, filterable: true },
191
+ { name: 'createdAt', type: 'date', label: 'Created', hidden: false, sortable: true, filterable: true },
192
+ { name: 'isActive', type: 'boolean', label: 'Active', hidden: false, sortable: true, filterable: true },
193
+ ],
194
+ });
195
+ const meta = buildMetadata(config);
196
+ const priceFilter = meta.filters.find(f => f.field === 'price');
197
+ expect(priceFilter?.operators).toContain('gt');
198
+ expect(priceFilter?.operators).toContain('between');
199
+ const dateFilter = meta.filters.find(f => f.field === 'createdAt');
200
+ expect(dateFilter?.operators).toContain('gte');
201
+ expect(dateFilter?.operators).toContain('between');
202
+ const boolFilter = meta.filters.find(f => f.field === 'isActive');
203
+ expect(boolFilter?.operators).toEqual(['eq', 'neq']);
204
+ });
205
+ });
206
+ describe('column metadata', () => {
207
+ it('should exclude hidden columns from visible columns', () => {
208
+ const config = createTestConfig({
209
+ columns: [
210
+ { name: 'id', type: 'number', label: 'ID', hidden: false, sortable: true, filterable: true },
211
+ { name: 'secret', type: 'string', label: 'Secret', hidden: true, sortable: true, filterable: true },
212
+ { name: 'name', type: 'string', label: 'Name', hidden: false, sortable: true, filterable: true },
213
+ ],
214
+ });
215
+ const meta = buildMetadata(config);
216
+ expect(meta.columns).toHaveLength(2);
217
+ expect(meta.columns.map(c => c.name)).toEqual(['id', 'name']);
218
+ });
219
+ });
220
+ });
221
+ //# sourceMappingURL=metadataBuilder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadataBuilder.test.js","sourceRoot":"","sources":["../../../src/__tests__/metadataBuilder.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { SQL } from 'drizzle-orm';
2
+ import { TableConfig } from '../types/table';
3
+ export declare class AggregationBuilder {
4
+ private schema;
5
+ constructor(schema: Record<string, unknown>);
6
+ /**
7
+ * Builds aggregation select fields (COUNT, SUM, AVG, MIN, MAX).
8
+ * Returns a map of alias → SQL expression for use in a separate aggregation query.
9
+ */
10
+ buildAggregations(config: TableConfig): Record<string, SQL> | undefined;
11
+ /**
12
+ * Builds the select map for a standalone aggregation query,
13
+ * always including a total row count alongside configured aggregations.
14
+ */
15
+ buildAggregationSelect(config: TableConfig): Record<string, SQL>;
16
+ }
17
+ //# sourceMappingURL=aggregationBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregationBuilder.d.ts","sourceRoot":"","sources":["../../../src/core/aggregationBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,GAAG,EAOJ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,qBAAa,kBAAkB;IACjB,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnD;;;OAGG;IACH,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS;IAqCvE;;;OAGG;IACH,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAmCjE"}
@@ -0,0 +1,81 @@
1
+ import { getTableColumns, count, sum, avg, min, max, } from 'drizzle-orm';
2
+ export class AggregationBuilder {
3
+ schema;
4
+ constructor(schema) {
5
+ this.schema = schema;
6
+ }
7
+ /**
8
+ * Builds aggregation select fields (COUNT, SUM, AVG, MIN, MAX).
9
+ * Returns a map of alias → SQL expression for use in a separate aggregation query.
10
+ */
11
+ buildAggregations(config) {
12
+ if (!config.aggregations || config.aggregations.length === 0) {
13
+ return undefined;
14
+ }
15
+ const table = this.schema[config.base];
16
+ if (!table)
17
+ return undefined;
18
+ const columns = getTableColumns(table);
19
+ const result = {};
20
+ for (const agg of config.aggregations) {
21
+ const col = columns[agg.field];
22
+ if (!col)
23
+ continue;
24
+ switch (agg.type) {
25
+ case 'count':
26
+ result[agg.alias] = count(col);
27
+ break;
28
+ case 'sum':
29
+ result[agg.alias] = sum(col);
30
+ break;
31
+ case 'avg':
32
+ result[agg.alias] = avg(col);
33
+ break;
34
+ case 'min':
35
+ result[agg.alias] = min(col);
36
+ break;
37
+ case 'max':
38
+ result[agg.alias] = max(col);
39
+ break;
40
+ }
41
+ }
42
+ return Object.keys(result).length > 0 ? result : undefined;
43
+ }
44
+ /**
45
+ * Builds the select map for a standalone aggregation query,
46
+ * always including a total row count alongside configured aggregations.
47
+ */
48
+ buildAggregationSelect(config) {
49
+ const result = { _totalCount: count() };
50
+ if (!config.aggregations)
51
+ return result;
52
+ const table = this.schema[config.base];
53
+ if (!table)
54
+ return result;
55
+ const columns = getTableColumns(table);
56
+ for (const agg of config.aggregations) {
57
+ const col = columns[agg.field];
58
+ if (!col)
59
+ continue;
60
+ switch (agg.type) {
61
+ case 'count':
62
+ result[agg.alias] = count(col);
63
+ break;
64
+ case 'sum':
65
+ result[agg.alias] = sum(col);
66
+ break;
67
+ case 'avg':
68
+ result[agg.alias] = avg(col);
69
+ break;
70
+ case 'min':
71
+ result[agg.alias] = min(col);
72
+ break;
73
+ case 'max':
74
+ result[agg.alias] = max(col);
75
+ break;
76
+ }
77
+ }
78
+ return result;
79
+ }
80
+ }
81
+ //# sourceMappingURL=aggregationBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregationBuilder.js","sourceRoot":"","sources":["../../../src/core/aggregationBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { SQL } from 'drizzle-orm';
2
+ import { TableConfig, SortConfig } from '../types/table';
3
+ export interface CursorResult {
4
+ whereCondition: SQL | undefined;
5
+ orderBy: SQL[];
6
+ limit: number;
7
+ }
8
+ export interface CursorMeta {
9
+ nextCursor: string | null;
10
+ pageSize: number;
11
+ }
12
+ /**
13
+ * Cursor-based pagination.
14
+ * Uses the sort column value as the cursor instead of OFFSET.
15
+ * O(1) performance regardless of page depth.
16
+ *
17
+ * Cursor format: base64({ field: value, field2: value2 })
18
+ */
19
+ export declare class CursorPaginationBuilder {
20
+ private schema;
21
+ constructor(schema: Record<string, unknown>);
22
+ /**
23
+ * Decodes a cursor string and builds WHERE + ORDER BY for the next page.
24
+ */
25
+ build(config: TableConfig, cursor: string | undefined, pageSize: number, sort?: SortConfig[]): CursorResult;
26
+ /**
27
+ * From the fetched data (with 1 extra row), determine next cursor.
28
+ */
29
+ buildMeta(data: Record<string, unknown>[], pageSize: number, sort?: SortConfig[]): {
30
+ data: Record<string, unknown>[];
31
+ meta: CursorMeta;
32
+ };
33
+ }
34
+ export declare function encodeCursor(values: Record<string, unknown>): string;
35
+ export declare function decodeCursor(cursor: string): Record<string, unknown> | null;
36
+ //# sourceMappingURL=cursorPagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursorPagination.d.ts","sourceRoot":"","sources":["../../../src/core/cursorPagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,GAAG,EAA2C,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,GAAG,GAAG,SAAS,CAAC;IAChC,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,qBAAa,uBAAuB;IACtB,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnD;;OAEG;IACH,KAAK,CACH,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,UAAU,EAAE,GAClB,YAAY;IA6Cf;;OAEG;IACH,SAAS,CACP,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,UAAU,EAAE,GAClB;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE;CAgBzD;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAEpE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAO3E"}