@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,85 @@
1
+ /**
2
+ * Feature Config System - Phase 2.1
3
+ *
4
+ * Config-driven feature definitions for universal filtering system
5
+ * Eliminates boilerplate code and ensures consistency across features
6
+ *
7
+ * Usage:
8
+ * export const ordersFeatureConfig: FeatureConfig = {
9
+ * tableName: 'orders',
10
+ * organizationIdField: 'organizationid',
11
+ * filters: [...],
12
+ * counts: {...}
13
+ * };
14
+ */
15
+ /**
16
+ * Helper: Generate validators from feature config
17
+ * Used by auto-validator registration system (Phase 2.3)
18
+ */
19
+ export function generateValidators(config) {
20
+ const validators = {};
21
+ if (!config.filters)
22
+ return validators;
23
+ config.filters.forEach(filter => {
24
+ switch (filter.type) {
25
+ case 'enum':
26
+ validators[filter.name] = (value) => {
27
+ if (filter.values.includes(value) || value === 'all')
28
+ return value;
29
+ throw new Error(`❌ CONFIG ERROR: Invalid value '${value}' for filter '${filter.name}'. Allowed values: ${filter.values.join(', ')}, all. Fix your config UI options!`);
30
+ };
31
+ break;
32
+ case 'search':
33
+ validators[filter.name] = (value) => value?.trim() || '';
34
+ break;
35
+ case 'time':
36
+ validators[filter.name] = (value) => {
37
+ // v1.3: Added 'custom' for custom date ranges. Support both underscore and hyphen formats
38
+ const allowed = ['all', 'today', 'yesterday', 'this_week', 'this_month', 'this-week', 'this-month', 'older', 'custom'];
39
+ if (allowed.includes(value))
40
+ return value;
41
+ throw new Error(`❌ CONFIG ERROR: Invalid value '${value}' for time filter '${filter.name}'. Allowed values: ${allowed.join(', ')}. Your config uses: ${filter.ui?.options?.map(o => o.value).join(', ')}. Fix the config to match!`);
42
+ };
43
+ // Also register start_date and end_date validators for custom ranges
44
+ validators['start_date'] = (value) => value; // ISO date string
45
+ validators['end_date'] = (value) => value; // ISO date string
46
+ break;
47
+ case 'nullable':
48
+ case 'related':
49
+ validators[filter.name] = (value) => {
50
+ const allowed = ['all', 'with', 'without'];
51
+ if (allowed.includes(value))
52
+ return value;
53
+ throw new Error(`❌ CONFIG ERROR: Invalid value '${value}' for filter '${filter.name}'. Allowed values: ${allowed.join(', ')}. Fix your config UI options!`);
54
+ };
55
+ break;
56
+ case 'boolean':
57
+ validators[filter.name] = (value) => {
58
+ if (typeof value === 'boolean')
59
+ return value;
60
+ return value === 'true';
61
+ };
62
+ break;
63
+ case 'multiselect':
64
+ validators[filter.name] = (value) => {
65
+ if (Array.isArray(value))
66
+ return value;
67
+ return value ? value.split(',') : [];
68
+ };
69
+ break;
70
+ case 'column':
71
+ case 'daterange':
72
+ // Pass through as-is, will be validated by database
73
+ validators[filter.name] = (value) => value;
74
+ break;
75
+ }
76
+ });
77
+ // Always add include validator
78
+ validators['include'] = (value) => {
79
+ if (Array.isArray(value))
80
+ return value;
81
+ return value ? value.split(',') : [];
82
+ };
83
+ return validators;
84
+ }
85
+ //# sourceMappingURL=feature-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-config.js","sourceRoot":"","sources":["../../../src/shared/types/feature-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Query Configuration Types
3
+ * Used by QueryServiceFactory for feature-specific configuration
4
+ */
5
+ export interface IncludeConfig {
6
+ foreignKey: string | null;
7
+ fields: string[];
8
+ tableName?: string;
9
+ column?: string;
10
+ nested?: Record<string, IncludeConfig>;
11
+ isReverseRelation?: boolean;
12
+ batchRpcFunction?: string;
13
+ junctionTable?: string;
14
+ junctionForeignKey?: string;
15
+ junctionTargetKey?: string;
16
+ computedFields?: Record<string, string>;
17
+ outputName?: string;
18
+ orderBy?: string;
19
+ deepNested?: Record<string, {
20
+ tableName: string;
21
+ joinColumn: string;
22
+ fields: string[];
23
+ outputName?: string;
24
+ }>;
25
+ }
26
+ export interface QueryConfig<TItem = Record<string, unknown>> {
27
+ tableName: string;
28
+ primaryKey?: string;
29
+ organizationIdField?: string;
30
+ searchFields?: string[];
31
+ searchRpcFunction?: string;
32
+ defaultSortField?: string;
33
+ allowedSortFields?: string[];
34
+ includeMapping?: Record<string, IncludeConfig>;
35
+ filterRpcName?: string;
36
+ countsRpcName?: string;
37
+ filters?: Record<string, any>;
38
+ includeConfig?: Record<string, any>;
39
+ requiredFields?: string[];
40
+ }
41
+ //# sourceMappingURL=query-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-config.d.ts","sourceRoot":"","sources":["../../../src/shared/types/query-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAG1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAK3B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIxC,UAAU,CAAC,EAAE,MAAM,CAAC;IAIpB,OAAO,CAAC,EAAE,MAAM,CAAC;IAKjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACJ;AAGD,MAAM,WAAW,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE1D,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAG7B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG7B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAG/C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAG9B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAGpC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Query Configuration Types
3
+ * Used by QueryServiceFactory for feature-specific configuration
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=query-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-config.js","sourceRoot":"","sources":["../../../src/shared/types/query-config.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Config-Driven Filtering Framework
3
+ *
4
+ * Eliminates hardcoded filter interfaces, parameter parsing, and RPC mapping.
5
+ * All filtering logic is derived from FeatureConfig at runtime.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // Before (hardcoded):
10
+ * interface OrderFilters {
11
+ * status?: string;
12
+ * voucher?: string;
13
+ * // ... 10 more hardcoded fields
14
+ * }
15
+ * const { status, voucher, ... } = req.query; // Manual destructuring
16
+ * const rpcParams = {
17
+ * p_status: status === 'all' ? null : status,
18
+ * p_voucher: voucher === 'all' ? null : voucher,
19
+ * // ... manual mapping
20
+ * };
21
+ *
22
+ * // After (config-driven):
23
+ * type OrderFilters = GenerateFiltersFromConfig<typeof ordersFeatureConfig>;
24
+ * const filters = parseFiltersFromConfig(req.query, ordersFeatureConfig);
25
+ * const rpcParams = mapFiltersToRPC(filters, ordersFeatureConfig);
26
+ * ```
27
+ *
28
+ * Benefits:
29
+ * - Zero hardcoded filter fields
30
+ * - Automatic validation against config
31
+ * - Type-safe parameter mapping
32
+ * - Single source of truth (config)
33
+ *
34
+ * Created: October 24, 2025
35
+ */
36
+ import { FeatureConfig } from '../types/feature-config.js';
37
+ /**
38
+ * Generic filter type generated from config
39
+ *
40
+ * Usage:
41
+ * ```typescript
42
+ * type OrderFilters = GenerateFiltersFromConfig<typeof ordersFeatureConfig>;
43
+ * // Result: { status?: string; voucher?: string; search?: string; ... }
44
+ * ```
45
+ *
46
+ * Note: TypeScript has limitations with complex mapped types,
47
+ * so this is a simplified version that returns a generic Record.
48
+ * For type-safety, manually define your filter interface.
49
+ */
50
+ export type GenerateFiltersFromConfig<T extends FeatureConfig> = Record<string, string | string[] | undefined>;
51
+ /**
52
+ * Parsed filter values with metadata
53
+ */
54
+ export interface ParsedFilters {
55
+ /** Filter values keyed by filter name */
56
+ values: Record<string, string | string[] | undefined>;
57
+ /** Validation errors (if any) */
58
+ errors: Array<{
59
+ filter: string;
60
+ message: string;
61
+ }>;
62
+ /** Filter names that were provided in query */
63
+ provided: string[];
64
+ }
65
+ /**
66
+ * Parse filters from request query using config
67
+ *
68
+ * Handles:
69
+ * - Array parameters (phases[]=value1&phases[]=value2)
70
+ * - Single values (status=paid)
71
+ * - Default values (status → 'all')
72
+ * - Validation against config.values
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * const parsed = parseFiltersFromConfig(req.query, ordersFeatureConfig);
77
+ * if (parsed.errors.length > 0) {
78
+ * return RFC7807ErrorResponse.badRequest(res, parsed.errors);
79
+ * }
80
+ * const filters = parsed.values;
81
+ * ```
82
+ */
83
+ export declare function parseFiltersFromConfig(query: Record<string, any>, config: FeatureConfig, defaults?: Record<string, string>): ParsedFilters;
84
+ /**
85
+ * Map filters to RPC function parameters
86
+ *
87
+ * Handles:
88
+ * - 'all' → null conversion
89
+ * - Array parameters (phases)
90
+ * - Snake_case parameter naming (p_status, p_voucher)
91
+ * - Special cases (search, sortBy)
92
+ *
93
+ * @example
94
+ * ```typescript
95
+ * const rpcParams = mapFiltersToRPC(filters, ordersFeatureConfig, organizationId);
96
+ * const { data } = await supabase.rpc('filter_orders_simple', rpcParams);
97
+ * ```
98
+ */
99
+ export declare function mapFiltersToRPC(filters: Record<string, any>, config: FeatureConfig, organizationId?: string): Record<string, any>;
100
+ /**
101
+ * Validate filters against config definition
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * const validation = validateFilters(filters, ordersFeatureConfig);
106
+ * if (!validation.valid) {
107
+ * return RFC7807ErrorResponse.badRequest(res, validation.errors);
108
+ * }
109
+ * ```
110
+ */
111
+ export declare function validateFilters(filters: Record<string, any>, config: FeatureConfig): {
112
+ valid: boolean;
113
+ errors: Array<{
114
+ filter: string;
115
+ message: string;
116
+ }>;
117
+ };
118
+ /**
119
+ * Get filter defaults from config
120
+ *
121
+ * Useful for setting up default filter state.
122
+ */
123
+ export declare function getFilterDefaults(config: FeatureConfig): Record<string, string>;
124
+ /**
125
+ * Pagination params result
126
+ */
127
+ export interface PaginationParams {
128
+ limit: number;
129
+ offset: number;
130
+ }
131
+ /**
132
+ * Parse pagination parameters from query with config validation
133
+ *
134
+ * @example
135
+ * ```typescript
136
+ * const result = parsePaginationParams(req.query, ordersFeatureConfig);
137
+ * if ('error' in result) {
138
+ * return RFC7807ErrorResponse.badRequest(res, result.error);
139
+ * }
140
+ * const { limit, offset } = result;
141
+ * ```
142
+ */
143
+ export declare function parsePaginationParams(query: Record<string, any>, config: FeatureConfig): PaginationParams | {
144
+ error: string;
145
+ };
146
+ /**
147
+ * Sorting params result
148
+ */
149
+ export interface SortingParams {
150
+ field: string;
151
+ order: 'asc' | 'desc';
152
+ }
153
+ /**
154
+ * Parse sorting parameters from query with config validation
155
+ *
156
+ * @example
157
+ * ```typescript
158
+ * const result = parseSortingFromConfig(req.query, ordersFeatureConfig);
159
+ * if ('error' in result) {
160
+ * return RFC7807ErrorResponse.badRequest(res, result.error);
161
+ * }
162
+ * const { field, order } = result;
163
+ * ```
164
+ */
165
+ export declare function parseSortingFromConfig(query: Record<string, any>, config: FeatureConfig): SortingParams | {
166
+ error: string;
167
+ };
168
+ /**
169
+ * Parse include parameters from query with config validation
170
+ *
171
+ * Validates against config.includeMapping to ensure only valid includes are returned
172
+ *
173
+ * @example
174
+ * ```typescript
175
+ * const includes = parseIncludesFromConfig(req.query.include, ordersFeatureConfig);
176
+ * // Returns: ['users_public', 'orderitems'] (only valid includes)
177
+ * ```
178
+ */
179
+ export declare function parseIncludesFromConfig(includeParam: string | string[] | undefined, config: FeatureConfig): string[];
180
+ /**
181
+ * Complete parsed query result (Config-Driven v2.0)
182
+ */
183
+ export interface ParsedQuery {
184
+ /** Filter values */
185
+ filters: Record<string, string | string[] | undefined>;
186
+ /** Pagination params */
187
+ pagination: PaginationParams;
188
+ /** Sorting params */
189
+ sorting: SortingParams;
190
+ /** Include params */
191
+ includes: string[];
192
+ /** Validation errors (if any) */
193
+ errors: Array<{
194
+ field: string;
195
+ message: string;
196
+ }>;
197
+ }
198
+ /**
199
+ * Parse complete query (filters + pagination + sorting + includes)
200
+ *
201
+ * ONE CALL to parse everything with config validation!
202
+ *
203
+ * @example
204
+ * ```typescript
205
+ * const parsed = parseQueryFromConfig(req.query, ordersFeatureConfig);
206
+ * if (parsed.errors.length > 0) {
207
+ * return RFC7807ErrorResponse.validationError(res, parsed.errors);
208
+ * }
209
+ *
210
+ * const { filters, pagination, sorting, includes } = parsed;
211
+ * // Ready to use!
212
+ * ```
213
+ */
214
+ export declare function parseQueryFromConfig(query: Record<string, any>, config: FeatureConfig): ParsedQuery;
215
+ //# sourceMappingURL=config-driven-filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-driven-filters.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/config-driven-filters.ts"],"names":[],"mappings":"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"}