@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.
- package/dist/core/SupabaseUserClient.d.ts +14 -0
- package/dist/core/SupabaseUserClient.d.ts.map +1 -0
- package/dist/core/SupabaseUserClient.js +49 -0
- package/dist/core/SupabaseUserClient.js.map +1 -0
- package/dist/core/adminDb.d.ts +21 -0
- package/dist/core/adminDb.d.ts.map +1 -0
- package/dist/core/adminDb.js +43 -0
- package/dist/core/adminDb.js.map +1 -0
- package/dist/core/publicDb.d.ts +19 -0
- package/dist/core/publicDb.d.ts.map +1 -0
- package/dist/core/publicDb.js +29 -0
- package/dist/core/publicDb.js.map +1 -0
- package/dist/core/superadminDb.d.ts +29 -0
- package/dist/core/superadminDb.d.ts.map +1 -0
- package/dist/core/superadminDb.js +53 -0
- package/dist/core/superadminDb.js.map +1 -0
- package/dist/core/systemDb.d.ts +34 -0
- package/dist/core/systemDb.d.ts.map +1 -0
- package/dist/core/systemDb.js +64 -0
- package/dist/core/systemDb.js.map +1 -0
- package/dist/core/userDb.d.ts +22 -0
- package/dist/core/userDb.d.ts.map +1 -0
- package/dist/core/userDb.js +36 -0
- package/dist/core/userDb.js.map +1 -0
- package/dist/core/webhookDb.d.ts +16 -0
- package/dist/core/webhookDb.d.ts.map +1 -0
- package/dist/core/webhookDb.js +26 -0
- package/dist/core/webhookDb.js.map +1 -0
- package/dist/frontend/components/FeatureFilters.d.ts +81 -0
- package/dist/frontend/components/FeatureFilters.d.ts.map +1 -0
- package/dist/frontend/components/FeatureFilters.js +257 -0
- package/dist/frontend/components/FeatureFilters.js.map +1 -0
- package/dist/frontend/components/FeatureTable.d.ts +96 -0
- package/dist/frontend/components/FeatureTable.d.ts.map +1 -0
- package/dist/frontend/components/FeatureTable.js +279 -0
- package/dist/frontend/components/FeatureTable.js.map +1 -0
- package/dist/frontend/hooks/useFeature.d.ts +108 -0
- package/dist/frontend/hooks/useFeature.d.ts.map +1 -0
- package/dist/frontend/hooks/useFeature.js +354 -0
- package/dist/frontend/hooks/useFeature.js.map +1 -0
- package/dist/frontend/index.d.ts +17 -0
- package/dist/frontend/index.d.ts.map +1 -0
- package/dist/frontend/index.js +14 -0
- package/dist/frontend/index.js.map +1 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/authMiddleware.d.ts +137 -0
- package/dist/middleware/authMiddleware.d.ts.map +1 -0
- package/dist/middleware/authMiddleware.js +292 -0
- package/dist/middleware/authMiddleware.js.map +1 -0
- package/dist/middleware/autoRegisterValidators.d.ts +31 -0
- package/dist/middleware/autoRegisterValidators.d.ts.map +1 -0
- package/dist/middleware/autoRegisterValidators.js +125 -0
- package/dist/middleware/autoRegisterValidators.js.map +1 -0
- package/dist/middleware/validateQueryParams.d.ts +62 -0
- package/dist/middleware/validateQueryParams.d.ts.map +1 -0
- package/dist/middleware/validateQueryParams.js +321 -0
- package/dist/middleware/validateQueryParams.js.map +1 -0
- package/dist/shared/controllers/BaseMutationController.d.ts +79 -0
- package/dist/shared/controllers/BaseMutationController.d.ts.map +1 -0
- package/dist/shared/controllers/BaseMutationController.js +241 -0
- package/dist/shared/controllers/BaseMutationController.js.map +1 -0
- package/dist/shared/controllers/BaseQueryController.d.ts +72 -0
- package/dist/shared/controllers/BaseQueryController.d.ts.map +1 -0
- package/dist/shared/controllers/BaseQueryController.js +375 -0
- package/dist/shared/controllers/BaseQueryController.js.map +1 -0
- package/dist/shared/controllers/FilterConfigController.d.ts +37 -0
- package/dist/shared/controllers/FilterConfigController.d.ts.map +1 -0
- package/dist/shared/controllers/FilterConfigController.js +94 -0
- package/dist/shared/controllers/FilterConfigController.js.map +1 -0
- package/dist/shared/controllers/index.d.ts +5 -0
- package/dist/shared/controllers/index.d.ts.map +1 -0
- package/dist/shared/controllers/index.js +4 -0
- package/dist/shared/controllers/index.js.map +1 -0
- package/dist/shared/controllers/types.d.ts +57 -0
- package/dist/shared/controllers/types.d.ts.map +1 -0
- package/dist/shared/controllers/types.js +2 -0
- package/dist/shared/controllers/types.js.map +1 -0
- package/dist/shared/factories/BatchRouteFactory.d.ts +33 -0
- package/dist/shared/factories/BatchRouteFactory.d.ts.map +1 -0
- package/dist/shared/factories/BatchRouteFactory.js +54 -0
- package/dist/shared/factories/BatchRouteFactory.js.map +1 -0
- package/dist/shared/factories/MutationRouteFactory.d.ts +27 -0
- package/dist/shared/factories/MutationRouteFactory.d.ts.map +1 -0
- package/dist/shared/factories/MutationRouteFactory.js +39 -0
- package/dist/shared/factories/MutationRouteFactory.js.map +1 -0
- package/dist/shared/factories/PhaseRouteFactory.d.ts +33 -0
- package/dist/shared/factories/PhaseRouteFactory.d.ts.map +1 -0
- package/dist/shared/factories/PhaseRouteFactory.js +67 -0
- package/dist/shared/factories/PhaseRouteFactory.js.map +1 -0
- package/dist/shared/factories/QueryRouteFactory.d.ts +37 -0
- package/dist/shared/factories/QueryRouteFactory.d.ts.map +1 -0
- package/dist/shared/factories/QueryRouteFactory.js +244 -0
- package/dist/shared/factories/QueryRouteFactory.js.map +1 -0
- package/dist/shared/factories/QueryServiceFactory.d.ts +282 -0
- package/dist/shared/factories/QueryServiceFactory.d.ts.map +1 -0
- package/dist/shared/factories/QueryServiceFactory.js +277 -0
- package/dist/shared/factories/QueryServiceFactory.js.map +1 -0
- package/dist/shared/factories/index.d.ts +8 -0
- package/dist/shared/factories/index.d.ts.map +1 -0
- package/dist/shared/factories/index.js +6 -0
- package/dist/shared/factories/index.js.map +1 -0
- package/dist/shared/factories/types.d.ts +98 -0
- package/dist/shared/factories/types.d.ts.map +1 -0
- package/dist/shared/factories/types.js +8 -0
- package/dist/shared/factories/types.js.map +1 -0
- package/dist/shared/ownership/types.d.ts +84 -0
- package/dist/shared/ownership/types.d.ts.map +1 -0
- package/dist/shared/ownership/types.js +8 -0
- package/dist/shared/ownership/types.js.map +1 -0
- package/dist/shared/rfc7807ErrorResponse.d.ts +54 -0
- package/dist/shared/rfc7807ErrorResponse.d.ts.map +1 -0
- package/dist/shared/rfc7807ErrorResponse.js +98 -0
- package/dist/shared/rfc7807ErrorResponse.js.map +1 -0
- package/dist/shared/services/BaseCronService.d.ts +171 -0
- package/dist/shared/services/BaseCronService.d.ts.map +1 -0
- package/dist/shared/services/BaseCronService.js +444 -0
- package/dist/shared/services/BaseCronService.js.map +1 -0
- package/dist/shared/services/BasePhaseService.d.ts +170 -0
- package/dist/shared/services/BasePhaseService.d.ts.map +1 -0
- package/dist/shared/services/BasePhaseService.js +409 -0
- package/dist/shared/services/BasePhaseService.js.map +1 -0
- package/dist/shared/services/CronRegistry.d.ts +67 -0
- package/dist/shared/services/CronRegistry.d.ts.map +1 -0
- package/dist/shared/services/CronRegistry.js +68 -0
- package/dist/shared/services/CronRegistry.js.map +1 -0
- package/dist/shared/services/SimpleRPCQueryService.d.ts +111 -0
- package/dist/shared/services/SimpleRPCQueryService.d.ts.map +1 -0
- package/dist/shared/services/SimpleRPCQueryService.js +265 -0
- package/dist/shared/services/SimpleRPCQueryService.js.map +1 -0
- package/dist/shared/types/feature-config.d.ts +611 -0
- package/dist/shared/types/feature-config.d.ts.map +1 -0
- package/dist/shared/types/feature-config.js +85 -0
- package/dist/shared/types/feature-config.js.map +1 -0
- package/dist/shared/types/query-config.d.ts +41 -0
- package/dist/shared/types/query-config.d.ts.map +1 -0
- package/dist/shared/types/query-config.js +6 -0
- package/dist/shared/types/query-config.js.map +1 -0
- package/dist/shared/utils/config-driven-filters.d.ts +215 -0
- package/dist/shared/utils/config-driven-filters.d.ts.map +1 -0
- package/dist/shared/utils/config-driven-filters.js +451 -0
- package/dist/shared/utils/config-driven-filters.js.map +1 -0
- package/dist/shared/utils/controllerErrorHandler.d.ts +44 -0
- package/dist/shared/utils/controllerErrorHandler.d.ts.map +1 -0
- package/dist/shared/utils/controllerErrorHandler.js +126 -0
- package/dist/shared/utils/controllerErrorHandler.js.map +1 -0
- package/dist/shared/utils/parseInclude.d.ts +14 -0
- package/dist/shared/utils/parseInclude.d.ts.map +1 -0
- package/dist/shared/utils/parseInclude.js +28 -0
- package/dist/shared/utils/parseInclude.js.map +1 -0
- package/dist/shared/utils/queryHelpers.d.ts +62 -0
- package/dist/shared/utils/queryHelpers.d.ts.map +1 -0
- package/dist/shared/utils/queryHelpers.js +61 -0
- package/dist/shared/utils/queryHelpers.js.map +1 -0
- package/dist/shared/utils/response-mapper.d.ts +42 -0
- package/dist/shared/utils/response-mapper.d.ts.map +1 -0
- package/dist/shared/utils/response-mapper.js +176 -0
- package/dist/shared/utils/response-mapper.js.map +1 -0
- package/dist/shared/utils/responseBuilder.d.ts +103 -0
- package/dist/shared/utils/responseBuilder.d.ts.map +1 -0
- package/dist/shared/utils/responseBuilder.js +131 -0
- package/dist/shared/utils/responseBuilder.js.map +1 -0
- package/dist/shared/validators/featureConfigValidator.d.ts +23 -0
- package/dist/shared/validators/featureConfigValidator.d.ts.map +1 -0
- package/dist/shared/validators/featureConfigValidator.js +143 -0
- package/dist/shared/validators/featureConfigValidator.js.map +1 -0
- package/dist/shared/validators/organizationValidator.d.ts +53 -0
- package/dist/shared/validators/organizationValidator.d.ts.map +1 -0
- package/dist/shared/validators/organizationValidator.js +69 -0
- package/dist/shared/validators/organizationValidator.js.map +1 -0
- package/dist/shared/validators/uuidValidator.d.ts +57 -0
- package/dist/shared/validators/uuidValidator.d.ts.map +1 -0
- package/dist/shared/validators/uuidValidator.js +77 -0
- package/dist/shared/validators/uuidValidator.js.map +1 -0
- package/dist/utils/logger.d.ts +40 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/logger.js.map +1 -0
- 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 @@
|
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAc3D;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,yBAAyB,CAAC,CAAC,SAAS,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAE/G;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IAEtD,iCAAiC;IACjC,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEnD,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,MAAM,EAAE,aAAa,EACrB,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACpC,aAAa,CAwFf;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,MAAM,EAAE,aAAa,EACrB,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CA4ErB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,MAAM,EAAE,aAAa,GACpB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAsCxE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAY/E;AAMD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,MAAM,EAAE,aAAa,GACpB,gBAAgB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAkBtC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,MAAM,EAAE,aAAa,GACpB,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAwCnC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,EAC3C,MAAM,EAAE,aAAa,GACpB,MAAM,EAAE,CAqCV;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IAEvD,wBAAwB;IACxB,UAAU,EAAE,gBAAgB,CAAC;IAE7B,qBAAqB;IACrB,OAAO,EAAE,aAAa,CAAC;IAEvB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,iCAAiC;IACjC,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,MAAM,EAAE,aAAa,GACpB,WAAW,CAsCb"}
|