@soulbatical/tetra-core 0.1.0

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.

Potentially problematic release.


This version of @soulbatical/tetra-core might be problematic. Click here for more details.

Files changed (181) hide show
  1. package/dist/core/SupabaseUserClient.d.ts +14 -0
  2. package/dist/core/SupabaseUserClient.d.ts.map +1 -0
  3. package/dist/core/SupabaseUserClient.js +49 -0
  4. package/dist/core/SupabaseUserClient.js.map +1 -0
  5. package/dist/core/adminDb.d.ts +21 -0
  6. package/dist/core/adminDb.d.ts.map +1 -0
  7. package/dist/core/adminDb.js +43 -0
  8. package/dist/core/adminDb.js.map +1 -0
  9. package/dist/core/publicDb.d.ts +19 -0
  10. package/dist/core/publicDb.d.ts.map +1 -0
  11. package/dist/core/publicDb.js +29 -0
  12. package/dist/core/publicDb.js.map +1 -0
  13. package/dist/core/superadminDb.d.ts +29 -0
  14. package/dist/core/superadminDb.d.ts.map +1 -0
  15. package/dist/core/superadminDb.js +53 -0
  16. package/dist/core/superadminDb.js.map +1 -0
  17. package/dist/core/systemDb.d.ts +34 -0
  18. package/dist/core/systemDb.d.ts.map +1 -0
  19. package/dist/core/systemDb.js +64 -0
  20. package/dist/core/systemDb.js.map +1 -0
  21. package/dist/core/userDb.d.ts +22 -0
  22. package/dist/core/userDb.d.ts.map +1 -0
  23. package/dist/core/userDb.js +36 -0
  24. package/dist/core/userDb.js.map +1 -0
  25. package/dist/core/webhookDb.d.ts +16 -0
  26. package/dist/core/webhookDb.d.ts.map +1 -0
  27. package/dist/core/webhookDb.js +26 -0
  28. package/dist/core/webhookDb.js.map +1 -0
  29. package/dist/frontend/components/FeatureFilters.d.ts +81 -0
  30. package/dist/frontend/components/FeatureFilters.d.ts.map +1 -0
  31. package/dist/frontend/components/FeatureFilters.js +257 -0
  32. package/dist/frontend/components/FeatureFilters.js.map +1 -0
  33. package/dist/frontend/components/FeatureTable.d.ts +96 -0
  34. package/dist/frontend/components/FeatureTable.d.ts.map +1 -0
  35. package/dist/frontend/components/FeatureTable.js +279 -0
  36. package/dist/frontend/components/FeatureTable.js.map +1 -0
  37. package/dist/frontend/hooks/useFeature.d.ts +108 -0
  38. package/dist/frontend/hooks/useFeature.d.ts.map +1 -0
  39. package/dist/frontend/hooks/useFeature.js +354 -0
  40. package/dist/frontend/hooks/useFeature.js.map +1 -0
  41. package/dist/frontend/index.d.ts +17 -0
  42. package/dist/frontend/index.d.ts.map +1 -0
  43. package/dist/frontend/index.js +14 -0
  44. package/dist/frontend/index.js.map +1 -0
  45. package/dist/index.d.ts +78 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +71 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/middleware/authMiddleware.d.ts +137 -0
  50. package/dist/middleware/authMiddleware.d.ts.map +1 -0
  51. package/dist/middleware/authMiddleware.js +292 -0
  52. package/dist/middleware/authMiddleware.js.map +1 -0
  53. package/dist/middleware/autoRegisterValidators.d.ts +31 -0
  54. package/dist/middleware/autoRegisterValidators.d.ts.map +1 -0
  55. package/dist/middleware/autoRegisterValidators.js +125 -0
  56. package/dist/middleware/autoRegisterValidators.js.map +1 -0
  57. package/dist/middleware/validateQueryParams.d.ts +62 -0
  58. package/dist/middleware/validateQueryParams.d.ts.map +1 -0
  59. package/dist/middleware/validateQueryParams.js +321 -0
  60. package/dist/middleware/validateQueryParams.js.map +1 -0
  61. package/dist/shared/controllers/BaseMutationController.d.ts +79 -0
  62. package/dist/shared/controllers/BaseMutationController.d.ts.map +1 -0
  63. package/dist/shared/controllers/BaseMutationController.js +241 -0
  64. package/dist/shared/controllers/BaseMutationController.js.map +1 -0
  65. package/dist/shared/controllers/BaseQueryController.d.ts +72 -0
  66. package/dist/shared/controllers/BaseQueryController.d.ts.map +1 -0
  67. package/dist/shared/controllers/BaseQueryController.js +375 -0
  68. package/dist/shared/controllers/BaseQueryController.js.map +1 -0
  69. package/dist/shared/controllers/FilterConfigController.d.ts +37 -0
  70. package/dist/shared/controllers/FilterConfigController.d.ts.map +1 -0
  71. package/dist/shared/controllers/FilterConfigController.js +94 -0
  72. package/dist/shared/controllers/FilterConfigController.js.map +1 -0
  73. package/dist/shared/controllers/index.d.ts +5 -0
  74. package/dist/shared/controllers/index.d.ts.map +1 -0
  75. package/dist/shared/controllers/index.js +4 -0
  76. package/dist/shared/controllers/index.js.map +1 -0
  77. package/dist/shared/controllers/types.d.ts +57 -0
  78. package/dist/shared/controllers/types.d.ts.map +1 -0
  79. package/dist/shared/controllers/types.js +2 -0
  80. package/dist/shared/controllers/types.js.map +1 -0
  81. package/dist/shared/factories/BatchRouteFactory.d.ts +33 -0
  82. package/dist/shared/factories/BatchRouteFactory.d.ts.map +1 -0
  83. package/dist/shared/factories/BatchRouteFactory.js +54 -0
  84. package/dist/shared/factories/BatchRouteFactory.js.map +1 -0
  85. package/dist/shared/factories/MutationRouteFactory.d.ts +27 -0
  86. package/dist/shared/factories/MutationRouteFactory.d.ts.map +1 -0
  87. package/dist/shared/factories/MutationRouteFactory.js +39 -0
  88. package/dist/shared/factories/MutationRouteFactory.js.map +1 -0
  89. package/dist/shared/factories/PhaseRouteFactory.d.ts +33 -0
  90. package/dist/shared/factories/PhaseRouteFactory.d.ts.map +1 -0
  91. package/dist/shared/factories/PhaseRouteFactory.js +67 -0
  92. package/dist/shared/factories/PhaseRouteFactory.js.map +1 -0
  93. package/dist/shared/factories/QueryRouteFactory.d.ts +37 -0
  94. package/dist/shared/factories/QueryRouteFactory.d.ts.map +1 -0
  95. package/dist/shared/factories/QueryRouteFactory.js +244 -0
  96. package/dist/shared/factories/QueryRouteFactory.js.map +1 -0
  97. package/dist/shared/factories/QueryServiceFactory.d.ts +282 -0
  98. package/dist/shared/factories/QueryServiceFactory.d.ts.map +1 -0
  99. package/dist/shared/factories/QueryServiceFactory.js +277 -0
  100. package/dist/shared/factories/QueryServiceFactory.js.map +1 -0
  101. package/dist/shared/factories/index.d.ts +8 -0
  102. package/dist/shared/factories/index.d.ts.map +1 -0
  103. package/dist/shared/factories/index.js +6 -0
  104. package/dist/shared/factories/index.js.map +1 -0
  105. package/dist/shared/factories/types.d.ts +98 -0
  106. package/dist/shared/factories/types.d.ts.map +1 -0
  107. package/dist/shared/factories/types.js +8 -0
  108. package/dist/shared/factories/types.js.map +1 -0
  109. package/dist/shared/ownership/types.d.ts +84 -0
  110. package/dist/shared/ownership/types.d.ts.map +1 -0
  111. package/dist/shared/ownership/types.js +8 -0
  112. package/dist/shared/ownership/types.js.map +1 -0
  113. package/dist/shared/rfc7807ErrorResponse.d.ts +54 -0
  114. package/dist/shared/rfc7807ErrorResponse.d.ts.map +1 -0
  115. package/dist/shared/rfc7807ErrorResponse.js +98 -0
  116. package/dist/shared/rfc7807ErrorResponse.js.map +1 -0
  117. package/dist/shared/services/BaseCronService.d.ts +171 -0
  118. package/dist/shared/services/BaseCronService.d.ts.map +1 -0
  119. package/dist/shared/services/BaseCronService.js +444 -0
  120. package/dist/shared/services/BaseCronService.js.map +1 -0
  121. package/dist/shared/services/BasePhaseService.d.ts +170 -0
  122. package/dist/shared/services/BasePhaseService.d.ts.map +1 -0
  123. package/dist/shared/services/BasePhaseService.js +409 -0
  124. package/dist/shared/services/BasePhaseService.js.map +1 -0
  125. package/dist/shared/services/CronRegistry.d.ts +67 -0
  126. package/dist/shared/services/CronRegistry.d.ts.map +1 -0
  127. package/dist/shared/services/CronRegistry.js +68 -0
  128. package/dist/shared/services/CronRegistry.js.map +1 -0
  129. package/dist/shared/services/SimpleRPCQueryService.d.ts +111 -0
  130. package/dist/shared/services/SimpleRPCQueryService.d.ts.map +1 -0
  131. package/dist/shared/services/SimpleRPCQueryService.js +265 -0
  132. package/dist/shared/services/SimpleRPCQueryService.js.map +1 -0
  133. package/dist/shared/types/feature-config.d.ts +611 -0
  134. package/dist/shared/types/feature-config.d.ts.map +1 -0
  135. package/dist/shared/types/feature-config.js +85 -0
  136. package/dist/shared/types/feature-config.js.map +1 -0
  137. package/dist/shared/types/query-config.d.ts +41 -0
  138. package/dist/shared/types/query-config.d.ts.map +1 -0
  139. package/dist/shared/types/query-config.js +6 -0
  140. package/dist/shared/types/query-config.js.map +1 -0
  141. package/dist/shared/utils/config-driven-filters.d.ts +215 -0
  142. package/dist/shared/utils/config-driven-filters.d.ts.map +1 -0
  143. package/dist/shared/utils/config-driven-filters.js +451 -0
  144. package/dist/shared/utils/config-driven-filters.js.map +1 -0
  145. package/dist/shared/utils/controllerErrorHandler.d.ts +44 -0
  146. package/dist/shared/utils/controllerErrorHandler.d.ts.map +1 -0
  147. package/dist/shared/utils/controllerErrorHandler.js +126 -0
  148. package/dist/shared/utils/controllerErrorHandler.js.map +1 -0
  149. package/dist/shared/utils/parseInclude.d.ts +14 -0
  150. package/dist/shared/utils/parseInclude.d.ts.map +1 -0
  151. package/dist/shared/utils/parseInclude.js +28 -0
  152. package/dist/shared/utils/parseInclude.js.map +1 -0
  153. package/dist/shared/utils/queryHelpers.d.ts +62 -0
  154. package/dist/shared/utils/queryHelpers.d.ts.map +1 -0
  155. package/dist/shared/utils/queryHelpers.js +61 -0
  156. package/dist/shared/utils/queryHelpers.js.map +1 -0
  157. package/dist/shared/utils/response-mapper.d.ts +42 -0
  158. package/dist/shared/utils/response-mapper.d.ts.map +1 -0
  159. package/dist/shared/utils/response-mapper.js +176 -0
  160. package/dist/shared/utils/response-mapper.js.map +1 -0
  161. package/dist/shared/utils/responseBuilder.d.ts +103 -0
  162. package/dist/shared/utils/responseBuilder.d.ts.map +1 -0
  163. package/dist/shared/utils/responseBuilder.js +131 -0
  164. package/dist/shared/utils/responseBuilder.js.map +1 -0
  165. package/dist/shared/validators/featureConfigValidator.d.ts +23 -0
  166. package/dist/shared/validators/featureConfigValidator.d.ts.map +1 -0
  167. package/dist/shared/validators/featureConfigValidator.js +143 -0
  168. package/dist/shared/validators/featureConfigValidator.js.map +1 -0
  169. package/dist/shared/validators/organizationValidator.d.ts +53 -0
  170. package/dist/shared/validators/organizationValidator.d.ts.map +1 -0
  171. package/dist/shared/validators/organizationValidator.js +69 -0
  172. package/dist/shared/validators/organizationValidator.js.map +1 -0
  173. package/dist/shared/validators/uuidValidator.d.ts +57 -0
  174. package/dist/shared/validators/uuidValidator.d.ts.map +1 -0
  175. package/dist/shared/validators/uuidValidator.js +77 -0
  176. package/dist/shared/validators/uuidValidator.js.map +1 -0
  177. package/dist/utils/logger.d.ts +40 -0
  178. package/dist/utils/logger.d.ts.map +1 -0
  179. package/dist/utils/logger.js +47 -0
  180. package/dist/utils/logger.js.map +1 -0
  181. package/package.json +80 -0
@@ -0,0 +1,354 @@
1
+ /**
2
+ * useFeature() — Config-driven React hook for feature data management
3
+ *
4
+ * Replaces ALL per-feature hooks (useOrdersList, useOrdersCounts, useVouchersList, etc.)
5
+ * with a single generic hook driven by FeatureConfig.
6
+ *
7
+ * Before (100+ lines boilerplate PER feature):
8
+ * const { items } = useOrdersList(filters);
9
+ * const { data: counts } = useOrdersCounts(filters);
10
+ *
11
+ * After (ZERO boilerplate):
12
+ * const { data, counts, ... } = useFeature(ordersConfig, supabase);
13
+ *
14
+ * @module @tetra/core/frontend
15
+ * Created: February 20, 2026
16
+ */
17
+ import { useState, useCallback, useMemo, useEffect, useRef } from 'react';
18
+ // ─── Filter Defaults ────────────────────────────────────────
19
+ function buildFilterDefaults(config) {
20
+ const defaults = {};
21
+ for (const filter of config.filters || []) {
22
+ if (filter.ui?.defaultValue !== undefined) {
23
+ defaults[filter.name] = filter.ui.defaultValue;
24
+ }
25
+ else {
26
+ defaults[filter.name] = 'all';
27
+ }
28
+ }
29
+ return defaults;
30
+ }
31
+ // ─── RPC Parameter Builder ──────────────────────────────────
32
+ function buildRpcParams(filters, config, options) {
33
+ const params = {};
34
+ // Organization ID
35
+ if (options.organizationId) {
36
+ params.p_org_id = options.organizationId;
37
+ }
38
+ // Pagination
39
+ params.p_limit = options.limit;
40
+ params.p_offset = options.offset;
41
+ // Sorting
42
+ params.p_sort_field = options.sortField;
43
+ params.p_sort_direction = options.sortDirection;
44
+ // Search — use debounced value, respect min length
45
+ const searchValue = options.debouncedSearch ?? filters.search;
46
+ if (searchValue && searchValue.trim().length >= options.minSearchLength) {
47
+ params.p_search = searchValue.trim();
48
+ }
49
+ else {
50
+ params.p_search = null;
51
+ }
52
+ // Map all filters from config
53
+ for (const filter of config.filters || []) {
54
+ if (filter.type === 'search')
55
+ continue; // handled above
56
+ // Skip filters with custom RPC functions
57
+ if (filter.rpcFunction)
58
+ continue;
59
+ const value = filters[filter.name];
60
+ const rpcParamName = filter.rpcParam || filter.name;
61
+ const paramKey = `p_${rpcParamName}`;
62
+ // 'all' → null
63
+ if (value === 'all') {
64
+ params[paramKey] = null;
65
+ continue;
66
+ }
67
+ // undefined → null
68
+ if (value === undefined) {
69
+ params[paramKey] = null;
70
+ continue;
71
+ }
72
+ // Array values
73
+ if (Array.isArray(value)) {
74
+ params[paramKey] = value.length > 0 ? value : null;
75
+ continue;
76
+ }
77
+ // Single value
78
+ params[paramKey] = value;
79
+ }
80
+ return params;
81
+ }
82
+ function buildCountsRpcParams(filters, config, options) {
83
+ const params = {};
84
+ if (options.organizationId) {
85
+ params.p_org_id = options.organizationId;
86
+ }
87
+ // Search
88
+ const searchValue = options.debouncedSearch ?? filters.search;
89
+ if (searchValue && searchValue.trim().length >= options.minSearchLength) {
90
+ params.p_search = searchValue.trim();
91
+ }
92
+ else {
93
+ params.p_search = null;
94
+ }
95
+ // Map filters (same as results but without pagination/sorting)
96
+ for (const filter of config.filters || []) {
97
+ if (filter.type === 'search')
98
+ continue;
99
+ if (filter.rpcFunction)
100
+ continue;
101
+ const value = filters[filter.name];
102
+ const rpcParamName = filter.rpcParam || filter.name;
103
+ const paramKey = `p_${rpcParamName}`;
104
+ if (value === 'all' || value === undefined) {
105
+ params[paramKey] = null;
106
+ continue;
107
+ }
108
+ if (Array.isArray(value)) {
109
+ params[paramKey] = value.length > 0 ? value : null;
110
+ continue;
111
+ }
112
+ params[paramKey] = value;
113
+ }
114
+ return params;
115
+ }
116
+ // ─── Debounce Hook ──────────────────────────────────────────
117
+ function useDebounce(value, delay) {
118
+ const [debouncedValue, setDebouncedValue] = useState(value);
119
+ useEffect(() => {
120
+ const timer = setTimeout(() => setDebouncedValue(value), delay);
121
+ return () => clearTimeout(timer);
122
+ }, [value, delay]);
123
+ return debouncedValue;
124
+ }
125
+ // ─── Main Hook ──────────────────────────────────────────────
126
+ /**
127
+ * useFeature — Universal hook for config-driven feature data
128
+ *
129
+ * @param config - FeatureConfig with resultsRpcName and/or countsRpcName
130
+ * @param supabase - Supabase client instance
131
+ * @param options - Optional configuration
132
+ *
133
+ * @example
134
+ * ```tsx
135
+ * import { ordersConfig } from '@/config/features/orders.config';
136
+ * import { useFeature } from '@tetra/core/frontend';
137
+ *
138
+ * function OrdersPage() {
139
+ * const {
140
+ * data, counts, loading, error,
141
+ * filters, setFilter, resetFilters,
142
+ * page, setPage, pageCount,
143
+ * sortField, sortDirection, setSort,
144
+ * refetch
145
+ * } = useFeature(ordersConfig, supabase, {
146
+ * organizationId: user.organizationId,
147
+ * pageSize: 25,
148
+ * });
149
+ *
150
+ * return <FeatureTable config={ordersConfig} data={data} />;
151
+ * }
152
+ * ```
153
+ */
154
+ export function useFeature(config, supabase, options = {}) {
155
+ const { enabled = true, pageSize: initialPageSize, initialFilters, initialSortField, initialSortDirection = 'desc', searchDebounceMs = 300, minSearchLength = 2, organizationId, } = options;
156
+ // ─── Derived Defaults ─────────────────────────────
157
+ const defaultPageSize = initialPageSize ?? config.pagination?.defaultLimit ?? 20;
158
+ const defaultSortField = initialSortField ?? config.defaultSortField ?? 'created_at';
159
+ const filterDefaults = useMemo(() => ({
160
+ ...buildFilterDefaults(config),
161
+ ...initialFilters,
162
+ }), [config, initialFilters]);
163
+ // ─── State ────────────────────────────────────────
164
+ const [filters, setFiltersState] = useState(filterDefaults);
165
+ const [page, setPage] = useState(0);
166
+ const [pageSize] = useState(defaultPageSize);
167
+ const [sortField, setSortField] = useState(defaultSortField);
168
+ const [sortDirection, setSortDirection] = useState(initialSortDirection);
169
+ const [data, setData] = useState([]);
170
+ const [totalCount, setTotalCount] = useState(0);
171
+ const [counts, setCounts] = useState({});
172
+ const [loading, setLoading] = useState(false);
173
+ const [countsLoading, setCountsLoading] = useState(false);
174
+ const [error, setError] = useState(null);
175
+ // Track mounted state for async safety
176
+ const mountedRef = useRef(true);
177
+ useEffect(() => {
178
+ mountedRef.current = true;
179
+ return () => { mountedRef.current = false; };
180
+ }, []);
181
+ // Debounce search
182
+ const searchValue = filters.search || '';
183
+ const debouncedSearch = useDebounce(searchValue, searchDebounceMs);
184
+ // ─── Fetch Data ───────────────────────────────────
185
+ const fetchData = useCallback(async () => {
186
+ if (!enabled || !config.resultsRpcName)
187
+ return;
188
+ setLoading(true);
189
+ setError(null);
190
+ try {
191
+ const rpcParams = buildRpcParams(filters, config, {
192
+ organizationId,
193
+ limit: pageSize,
194
+ offset: page * pageSize,
195
+ sortField,
196
+ sortDirection,
197
+ debouncedSearch,
198
+ minSearchLength,
199
+ });
200
+ const { data: result, error: rpcError } = await supabase.rpc(config.resultsRpcName, rpcParams);
201
+ if (!mountedRef.current)
202
+ return;
203
+ if (rpcError) {
204
+ setError(rpcError.message);
205
+ setData([]);
206
+ setTotalCount(0);
207
+ return;
208
+ }
209
+ // Handle response: could be array of items, or object with items + total
210
+ if (Array.isArray(result)) {
211
+ setData(result);
212
+ // If the RPC returns a total_count in the first row (window function pattern)
213
+ if (result.length > 0 && 'total_count' in result[0]) {
214
+ setTotalCount(result[0].total_count);
215
+ }
216
+ }
217
+ else if (result && typeof result === 'object') {
218
+ // Object response: { items: [], total: N }
219
+ const items = result.items || result.data || [];
220
+ setData(items);
221
+ setTotalCount(result.total || result.total_count || items.length);
222
+ }
223
+ else {
224
+ setData([]);
225
+ setTotalCount(0);
226
+ }
227
+ }
228
+ catch (err) {
229
+ if (!mountedRef.current)
230
+ return;
231
+ setError(err instanceof Error ? err.message : 'Failed to fetch data');
232
+ setData([]);
233
+ }
234
+ finally {
235
+ if (mountedRef.current) {
236
+ setLoading(false);
237
+ }
238
+ }
239
+ }, [
240
+ enabled, config, supabase, filters, organizationId,
241
+ pageSize, page, sortField, sortDirection, debouncedSearch, minSearchLength,
242
+ ]);
243
+ // ─── Fetch Counts ─────────────────────────────────
244
+ const fetchCounts = useCallback(async () => {
245
+ if (!enabled || !config.countsRpcName)
246
+ return;
247
+ setCountsLoading(true);
248
+ try {
249
+ const rpcParams = buildCountsRpcParams(filters, config, {
250
+ organizationId,
251
+ debouncedSearch,
252
+ minSearchLength,
253
+ });
254
+ const { data: result, error: rpcError } = await supabase.rpc(config.countsRpcName, rpcParams);
255
+ if (!mountedRef.current)
256
+ return;
257
+ if (rpcError) {
258
+ setCounts({});
259
+ return;
260
+ }
261
+ // Counts RPC typically returns a single object with total + breakdowns
262
+ if (result && typeof result === 'object' && !Array.isArray(result)) {
263
+ setCounts(result);
264
+ // Also update totalCount from counts if available
265
+ if ('total' in result) {
266
+ setTotalCount(result.total);
267
+ }
268
+ }
269
+ else if (Array.isArray(result) && result.length === 1) {
270
+ // Some RPCs return single-row array
271
+ setCounts(result[0]);
272
+ if ('total' in result[0]) {
273
+ setTotalCount(result[0].total);
274
+ }
275
+ }
276
+ else {
277
+ setCounts({});
278
+ }
279
+ }
280
+ catch {
281
+ if (mountedRef.current) {
282
+ setCounts({});
283
+ }
284
+ }
285
+ finally {
286
+ if (mountedRef.current) {
287
+ setCountsLoading(false);
288
+ }
289
+ }
290
+ }, [enabled, config, supabase, filters, organizationId, debouncedSearch, minSearchLength]);
291
+ // ─── Effects ──────────────────────────────────────
292
+ useEffect(() => {
293
+ fetchData();
294
+ }, [fetchData]);
295
+ useEffect(() => {
296
+ fetchCounts();
297
+ }, [fetchCounts]);
298
+ // ─── Filter Actions ───────────────────────────────
299
+ const setFilter = useCallback((name, value) => {
300
+ setFiltersState(prev => ({ ...prev, [name]: value }));
301
+ setPage(0); // Reset to first page on filter change
302
+ }, []);
303
+ const setFilters = useCallback((newFilters) => {
304
+ setFiltersState(prev => ({ ...prev, ...newFilters }));
305
+ setPage(0);
306
+ }, []);
307
+ const resetFilters = useCallback(() => {
308
+ setFiltersState(filterDefaults);
309
+ setPage(0);
310
+ }, [filterDefaults]);
311
+ // ─── Sort Action ──────────────────────────────────
312
+ const setSort = useCallback((field, direction) => {
313
+ setSortField(field);
314
+ if (direction) {
315
+ setSortDirection(direction);
316
+ }
317
+ else {
318
+ // Toggle direction if same field, default to desc for new field
319
+ setSortDirection(prev => field === sortField ? (prev === 'asc' ? 'desc' : 'asc') : 'desc');
320
+ }
321
+ setPage(0);
322
+ }, [sortField]);
323
+ // ─── Refetch ──────────────────────────────────────
324
+ const refetch = useCallback(async () => {
325
+ await Promise.all([fetchData(), fetchCounts()]);
326
+ }, [fetchData, fetchCounts]);
327
+ // ─── Computed ─────────────────────────────────────
328
+ const pageCount = Math.max(1, Math.ceil(totalCount / pageSize));
329
+ const hasPreviousPage = page > 0;
330
+ const hasNextPage = page < pageCount - 1;
331
+ return {
332
+ data,
333
+ totalCount,
334
+ counts,
335
+ loading,
336
+ countsLoading,
337
+ error,
338
+ filters,
339
+ setFilter,
340
+ setFilters,
341
+ resetFilters,
342
+ page,
343
+ setPage,
344
+ sortField,
345
+ sortDirection,
346
+ setSort,
347
+ refetch,
348
+ pageCount,
349
+ hasPreviousPage,
350
+ hasNextPage,
351
+ pageSize,
352
+ };
353
+ }
354
+ //# sourceMappingURL=useFeature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFeature.js","sourceRoot":"","sources":["../../../src/frontend/hooks/useFeature.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @tetra/core/frontend — React hooks and components for config-driven features
3
+ *
4
+ * Usage:
5
+ * ```typescript
6
+ * import { useFeature, FeatureTable } from '@tetra/core/frontend';
7
+ * // or via main entry:
8
+ * import { useFeature, FeatureTable } from '@tetra/core';
9
+ * ```
10
+ */
11
+ export { useFeature } from './hooks/useFeature.js';
12
+ export type { UseFeatureOptions, UseFeatureResult } from './hooks/useFeature.js';
13
+ export { FeatureTable } from './components/FeatureTable.js';
14
+ export type { FeatureTableProps, CellRendererMap } from './components/FeatureTable.js';
15
+ export { FeatureFilters } from './components/FeatureFilters.js';
16
+ export type { FeatureFiltersProps } from './components/FeatureFilters.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/frontend/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEvF,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @tetra/core/frontend — React hooks and components for config-driven features
3
+ *
4
+ * Usage:
5
+ * ```typescript
6
+ * import { useFeature, FeatureTable } from '@tetra/core/frontend';
7
+ * // or via main entry:
8
+ * import { useFeature, FeatureTable } from '@tetra/core';
9
+ * ```
10
+ */
11
+ export { useFeature } from './hooks/useFeature.js';
12
+ export { FeatureTable } from './components/FeatureTable.js';
13
+ export { FeatureFilters } from './components/FeatureFilters.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/frontend/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @tetra/core — The foundation framework for platform projects
3
+ *
4
+ * Config-driven Express + Supabase + TypeScript
5
+ *
6
+ * Usage:
7
+ * ```typescript
8
+ * import {
9
+ * // Types
10
+ * FeatureConfig, AuthenticatedRequest,
11
+ * // Controllers
12
+ * BaseQueryController, BaseMutationController, createFilterConfigController,
13
+ * // Factories
14
+ * createQueryService, addQueryRoutes, addMutationRoutes, addBatchRoutes, addPhaseRoutes,
15
+ * // Services
16
+ * SimpleRPCQueryService, BaseCronService, CronRegistry,
17
+ * // Middleware
18
+ * authenticateToken, configureAuth, validateQueryParams,
19
+ * // Utils
20
+ * createLogger, RFC7807ErrorResponse,
21
+ * // DB
22
+ * createSupabaseClient,
23
+ * // Validators
24
+ * validateUUID, validateOrganization,
25
+ * } from '@tetra/core';
26
+ * ```
27
+ */
28
+ export type { FeatureConfig, FilterConfig, FilterUIConfig, CountConfig, CountConfigItem, ComputedFieldConfig, SQLComputedFieldConfig, ValidatorMapping, SortFieldConfig, PaginationConfig, EnrichmentConfig, DisplayConfig, PageDisplayConfig, ListDisplayConfig, CardDisplayConfig, CardAction, CreatorVisibilityConfig, ColumnConfig, FormFieldConfig } from './shared/types/feature-config.js';
29
+ export { generateValidators } from './shared/types/feature-config.js';
30
+ export type { IncludeConfig, QueryConfig } from './shared/types/query-config.js';
31
+ export type { AutoBoundQueryController, MethodNamesConfig } from './shared/controllers/types.js';
32
+ export type { CustomValidators, QueryRouteConfig, MutationRouteConfig, PhaseRouteConfig, BatchRouteConfig, BatchOperation } from './shared/factories/types.js';
33
+ export type { RFC7807ProblemDetails } from './shared/rfc7807ErrorResponse.js';
34
+ export { BaseQueryController } from './shared/controllers/BaseQueryController.js';
35
+ export { BaseMutationController } from './shared/controllers/BaseMutationController.js';
36
+ export { createFilterConfigController } from './shared/controllers/FilterConfigController.js';
37
+ export { createQueryService, createQueryServiceInstance } from './shared/factories/QueryServiceFactory.js';
38
+ export type { InferFilters, InferItem, CountsResult } from './shared/factories/QueryServiceFactory.js';
39
+ export { addQueryRoutes, getFactoryWarnings } from './shared/factories/QueryRouteFactory.js';
40
+ export { addMutationRoutes } from './shared/factories/MutationRouteFactory.js';
41
+ export { addBatchRoutes } from './shared/factories/BatchRouteFactory.js';
42
+ export { addPhaseRoutes } from './shared/factories/PhaseRouteFactory.js';
43
+ export { SimpleRPCQueryService } from './shared/services/SimpleRPCQueryService.js';
44
+ export { BaseCronService } from './shared/services/BaseCronService.js';
45
+ export type { CronServiceConfig as CronConfig, CronJobResult } from './shared/services/BaseCronService.js';
46
+ export { BasePhaseService } from './shared/services/BasePhaseService.js';
47
+ export type { BatchUpdateResult, PhaseUpdateData, PhaseUpdateResult } from './shared/services/BasePhaseService.js';
48
+ export { CronRegistry } from './shared/services/CronRegistry.js';
49
+ export { authenticateToken, authenticateTokenOnly, optionalAuth, requireSuperAdmin, requireOrgAdmin, requireOrganizationAdmin, requireRole, validateOrganizationAccess, configureAuth } from './middleware/authMiddleware.js';
50
+ export type { AuthenticatedRequest, AuthenticatedUser, UserContext, AuthConfig } from './middleware/authMiddleware.js';
51
+ export { validateQueryParams, sanitizeSearchTerm, validatePagination, validateSort, validateFields } from './middleware/validateQueryParams.js';
52
+ export { registerFeatureValidators, batchRegisterValidators } from './middleware/autoRegisterValidators.js';
53
+ export { createLogger, rootLogger } from './utils/logger.js';
54
+ export type { Logger } from './utils/logger.js';
55
+ export { RFC7807ErrorResponse } from './shared/rfc7807ErrorResponse.js';
56
+ export { parseQueryFromConfig, parseFiltersFromConfig, mapFiltersToRPC, validateFilters, getFilterDefaults, parsePaginationParams, parseSortingFromConfig, parseIncludesFromConfig } from './shared/utils/config-driven-filters.js';
57
+ export type { ParsedFilters, PaginationParams, SortingParams, ParsedQuery, GenerateFiltersFromConfig } from './shared/utils/config-driven-filters.js';
58
+ export { handleControllerError, withErrorHandling } from './shared/utils/controllerErrorHandler.js';
59
+ export { parseIncludeParam } from './shared/utils/parseInclude.js';
60
+ export { getValidatedQuery, parseQueryParams } from './shared/utils/queryHelpers.js';
61
+ export { mapCountsFromRPC } from './shared/utils/response-mapper.js';
62
+ export { buildPaginatedResponse, buildSingleResponse, buildErrorResponse } from './shared/utils/responseBuilder.js';
63
+ export type { PaginationMeta, ResponseOptions } from './shared/utils/responseBuilder.js';
64
+ export { validateUUID, validateUUIDOrThrow, validateUUIDs, filterValidUUIDs } from './shared/validators/uuidValidator.js';
65
+ export { validateOrganization, validateOrganizationOrRespond, hasOrganization } from './shared/validators/organizationValidator.js';
66
+ export type { ContentOwnershipType, UserRole, OwnershipFieldMapping, EntityOwnershipConfig, OwnershipValidationResult, OwnershipUserContext } from './shared/ownership/types.js';
67
+ export { useFeature } from './frontend/hooks/useFeature.js';
68
+ export type { UseFeatureOptions, UseFeatureResult } from './frontend/hooks/useFeature.js';
69
+ export { FeatureTable } from './frontend/components/FeatureTable.js';
70
+ export type { FeatureTableProps, CellRendererMap } from './frontend/components/FeatureTable.js';
71
+ export { publicDB } from './core/publicDb.js';
72
+ export { systemDB, addWhitelistedContexts } from './core/systemDb.js';
73
+ export { adminDB } from './core/adminDb.js';
74
+ export { userDB } from './core/userDb.js';
75
+ export { superadminDB } from './core/superadminDb.js';
76
+ export { webhookDB } from './core/webhookDb.js';
77
+ export { SupabaseUserClient } from './core/SupabaseUserClient.js';
78
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @tetra/core — The foundation framework for platform projects
3
+ *
4
+ * Config-driven Express + Supabase + TypeScript
5
+ *
6
+ * Usage:
7
+ * ```typescript
8
+ * import {
9
+ * // Types
10
+ * FeatureConfig, AuthenticatedRequest,
11
+ * // Controllers
12
+ * BaseQueryController, BaseMutationController, createFilterConfigController,
13
+ * // Factories
14
+ * createQueryService, addQueryRoutes, addMutationRoutes, addBatchRoutes, addPhaseRoutes,
15
+ * // Services
16
+ * SimpleRPCQueryService, BaseCronService, CronRegistry,
17
+ * // Middleware
18
+ * authenticateToken, configureAuth, validateQueryParams,
19
+ * // Utils
20
+ * createLogger, RFC7807ErrorResponse,
21
+ * // DB
22
+ * createSupabaseClient,
23
+ * // Validators
24
+ * validateUUID, validateOrganization,
25
+ * } from '@tetra/core';
26
+ * ```
27
+ */
28
+ export { generateValidators } from './shared/types/feature-config.js';
29
+ // ─── Controllers ────────────────────────────────────────────
30
+ export { BaseQueryController } from './shared/controllers/BaseQueryController.js';
31
+ export { BaseMutationController } from './shared/controllers/BaseMutationController.js';
32
+ export { createFilterConfigController } from './shared/controllers/FilterConfigController.js';
33
+ // ─── Factories ──────────────────────────────────────────────
34
+ export { createQueryService, createQueryServiceInstance } from './shared/factories/QueryServiceFactory.js';
35
+ export { addQueryRoutes, getFactoryWarnings } from './shared/factories/QueryRouteFactory.js';
36
+ export { addMutationRoutes } from './shared/factories/MutationRouteFactory.js';
37
+ export { addBatchRoutes } from './shared/factories/BatchRouteFactory.js';
38
+ export { addPhaseRoutes } from './shared/factories/PhaseRouteFactory.js';
39
+ // ─── Services ───────────────────────────────────────────────
40
+ export { SimpleRPCQueryService } from './shared/services/SimpleRPCQueryService.js';
41
+ export { BaseCronService } from './shared/services/BaseCronService.js';
42
+ export { BasePhaseService } from './shared/services/BasePhaseService.js';
43
+ export { CronRegistry } from './shared/services/CronRegistry.js';
44
+ // ─── Middleware ──────────────────────────────────────────────
45
+ export { authenticateToken, authenticateTokenOnly, optionalAuth, requireSuperAdmin, requireOrgAdmin, requireOrganizationAdmin, requireRole, validateOrganizationAccess, configureAuth } from './middleware/authMiddleware.js';
46
+ export { validateQueryParams, sanitizeSearchTerm, validatePagination, validateSort, validateFields } from './middleware/validateQueryParams.js';
47
+ export { registerFeatureValidators, batchRegisterValidators } from './middleware/autoRegisterValidators.js';
48
+ // ─── Utils ──────────────────────────────────────────────────
49
+ export { createLogger, rootLogger } from './utils/logger.js';
50
+ export { RFC7807ErrorResponse } from './shared/rfc7807ErrorResponse.js';
51
+ export { parseQueryFromConfig, parseFiltersFromConfig, mapFiltersToRPC, validateFilters, getFilterDefaults, parsePaginationParams, parseSortingFromConfig, parseIncludesFromConfig } from './shared/utils/config-driven-filters.js';
52
+ export { handleControllerError, withErrorHandling } from './shared/utils/controllerErrorHandler.js';
53
+ export { parseIncludeParam } from './shared/utils/parseInclude.js';
54
+ export { getValidatedQuery, parseQueryParams } from './shared/utils/queryHelpers.js';
55
+ export { mapCountsFromRPC } from './shared/utils/response-mapper.js';
56
+ export { buildPaginatedResponse, buildSingleResponse, buildErrorResponse } from './shared/utils/responseBuilder.js';
57
+ // ─── Validators ─────────────────────────────────────────────
58
+ export { validateUUID, validateUUIDOrThrow, validateUUIDs, filterValidUUIDs } from './shared/validators/uuidValidator.js';
59
+ export { validateOrganization, validateOrganizationOrRespond, hasOrganization } from './shared/validators/organizationValidator.js';
60
+ // ─── Frontend (React hooks + components) ─────────────────────
61
+ export { useFeature } from './frontend/hooks/useFeature.js';
62
+ export { FeatureTable } from './frontend/components/FeatureTable.js';
63
+ // ─── Core (DB clients) ─────────────────────────────────────
64
+ export { publicDB } from './core/publicDb.js';
65
+ export { systemDB, addWhitelistedContexts } from './core/systemDb.js';
66
+ export { adminDB } from './core/adminDb.js';
67
+ export { userDB } from './core/userDb.js';
68
+ export { superadminDB } from './core/superadminDb.js';
69
+ export { webhookDB } from './core/webhookDb.js';
70
+ export { SupabaseUserClient } from './core/SupabaseUserClient.js';
71
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}