@soulbatical/tetra-core 0.1.13 → 0.1.15
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/generators/rls-auditor.d.ts +39 -0
- package/dist/generators/rls-auditor.d.ts.map +1 -0
- package/dist/generators/rls-auditor.js +505 -0
- package/dist/generators/rls-auditor.js.map +1 -0
- package/dist/generators/rls-checker.d.ts +94 -0
- package/dist/generators/rls-checker.d.ts.map +1 -0
- package/dist/generators/rls-checker.js +215 -0
- package/dist/generators/rls-checker.js.map +1 -0
- package/dist/generators/rls-generator.d.ts +77 -0
- package/dist/generators/rls-generator.d.ts.map +1 -0
- package/dist/generators/rls-generator.js +402 -0
- package/dist/generators/rls-generator.js.map +1 -0
- package/dist/generators/rpc/detail-rpc-generator.d.ts +58 -0
- package/dist/generators/rpc/detail-rpc-generator.d.ts.map +1 -0
- package/dist/generators/rpc/detail-rpc-generator.js +163 -0
- package/dist/generators/rpc/detail-rpc-generator.js.map +1 -0
- package/dist/generators/rpc/index.d.ts +24 -0
- package/dist/generators/rpc/index.d.ts.map +1 -0
- package/dist/generators/rpc/index.js +20 -0
- package/dist/generators/rpc/index.js.map +1 -0
- package/dist/generators/rpc/rpc-generator.d.ts +150 -0
- package/dist/generators/rpc/rpc-generator.d.ts.map +1 -0
- package/dist/generators/rpc/rpc-generator.js +743 -0
- package/dist/generators/rpc/rpc-generator.js.map +1 -0
- package/dist/generators/rpc/templates/array.d.ts +29 -0
- package/dist/generators/rpc/templates/array.d.ts.map +1 -0
- package/dist/generators/rpc/templates/array.js +40 -0
- package/dist/generators/rpc/templates/array.js.map +1 -0
- package/dist/generators/rpc/templates/auth.d.ts +85 -0
- package/dist/generators/rpc/templates/auth.d.ts.map +1 -0
- package/dist/generators/rpc/templates/auth.js +233 -0
- package/dist/generators/rpc/templates/auth.js.map +1 -0
- package/dist/generators/rpc/templates/column.d.ts +39 -0
- package/dist/generators/rpc/templates/column.d.ts.map +1 -0
- package/dist/generators/rpc/templates/column.js +97 -0
- package/dist/generators/rpc/templates/column.js.map +1 -0
- package/dist/generators/rpc/templates/enum.d.ts +33 -0
- package/dist/generators/rpc/templates/enum.d.ts.map +1 -0
- package/dist/generators/rpc/templates/enum.js +93 -0
- package/dist/generators/rpc/templates/enum.js.map +1 -0
- package/dist/generators/rpc/templates/nullable.d.ts +31 -0
- package/dist/generators/rpc/templates/nullable.d.ts.map +1 -0
- package/dist/generators/rpc/templates/nullable.js +50 -0
- package/dist/generators/rpc/templates/nullable.js.map +1 -0
- package/dist/generators/rpc/templates/related.d.ts +47 -0
- package/dist/generators/rpc/templates/related.d.ts.map +1 -0
- package/dist/generators/rpc/templates/related.js +182 -0
- package/dist/generators/rpc/templates/related.js.map +1 -0
- package/dist/generators/rpc/templates/search.d.ts +42 -0
- package/dist/generators/rpc/templates/search.d.ts.map +1 -0
- package/dist/generators/rpc/templates/search.js +81 -0
- package/dist/generators/rpc/templates/search.js.map +1 -0
- package/dist/generators/rpc/templates/time.d.ts +44 -0
- package/dist/generators/rpc/templates/time.d.ts.map +1 -0
- package/dist/generators/rpc/templates/time.js +143 -0
- package/dist/generators/rpc/templates/time.js.map +1 -0
- package/dist/generators/rpc/utils.d.ts +58 -0
- package/dist/generators/rpc/utils.d.ts.map +1 -0
- package/dist/generators/rpc/utils.js +92 -0
- package/dist/generators/rpc/utils.js.map +1 -0
- package/dist/generators/rpc/validator.d.ts +21 -0
- package/dist/generators/rpc/validator.d.ts.map +1 -0
- package/dist/generators/rpc/validator.js +398 -0
- package/dist/generators/rpc/validator.js.map +1 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/shared/auth/index.d.ts +1 -1
- package/dist/shared/auth/index.d.ts.map +1 -1
- package/dist/shared/auth/routes.d.ts +4 -1
- package/dist/shared/auth/routes.d.ts.map +1 -1
- package/dist/shared/auth/routes.js +83 -1
- package/dist/shared/auth/routes.js.map +1 -1
- package/dist/shared/auth/types.d.ts +24 -0
- package/dist/shared/auth/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL Generator Validator
|
|
3
|
+
* Validates feature configs before generating SQL
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Validate feature config for SQL generation
|
|
7
|
+
*/
|
|
8
|
+
export function validateConfig(config) {
|
|
9
|
+
const errors = [];
|
|
10
|
+
const warnings = [];
|
|
11
|
+
// Check required fields
|
|
12
|
+
if (!config.tableName) {
|
|
13
|
+
errors.push({
|
|
14
|
+
type: 'error',
|
|
15
|
+
field: 'tableName',
|
|
16
|
+
message: 'tableName is required',
|
|
17
|
+
suggestion: 'Add tableName to feature config'
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
if (!config.organizationIdField) {
|
|
21
|
+
errors.push({
|
|
22
|
+
type: 'error',
|
|
23
|
+
field: 'organizationIdField',
|
|
24
|
+
message: 'organizationIdField is required',
|
|
25
|
+
suggestion: 'Add organizationIdField to feature config (usually "organization_id")'
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
if (!config.filters || config.filters.length === 0) {
|
|
29
|
+
errors.push({
|
|
30
|
+
type: 'error',
|
|
31
|
+
field: 'filters',
|
|
32
|
+
message: 'No filters defined',
|
|
33
|
+
suggestion: 'Add at least one filter to filters array'
|
|
34
|
+
});
|
|
35
|
+
return { valid: false, errors, warnings };
|
|
36
|
+
}
|
|
37
|
+
// Validate searchFields (root level)
|
|
38
|
+
if (config.searchFields) {
|
|
39
|
+
const supportedRelations = ['user', 'order'];
|
|
40
|
+
config.searchFields.forEach((field, index) => {
|
|
41
|
+
if (field.includes('.')) {
|
|
42
|
+
const [relation] = field.split('.');
|
|
43
|
+
if (!supportedRelations.includes(relation)) {
|
|
44
|
+
errors.push({
|
|
45
|
+
type: 'error',
|
|
46
|
+
field: `searchFields[${index}]`,
|
|
47
|
+
message: `Unsupported relation "${relation}" in field "${field}"`,
|
|
48
|
+
suggestion: `Supported relations: ${supportedRelations.join(', ')}`
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// Validate each filter
|
|
55
|
+
const filterNames = new Set();
|
|
56
|
+
const countsKeys = new Set();
|
|
57
|
+
config.filters.forEach((filter, index) => {
|
|
58
|
+
// Check duplicate filter names
|
|
59
|
+
if (filterNames.has(filter.name)) {
|
|
60
|
+
errors.push({
|
|
61
|
+
type: 'error',
|
|
62
|
+
field: `filters[${index}].name`,
|
|
63
|
+
message: `Duplicate filter name: ${filter.name}`,
|
|
64
|
+
suggestion: 'Filter names must be unique'
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
filterNames.add(filter.name);
|
|
68
|
+
// Check filter name is snake_case (for RPC param naming)
|
|
69
|
+
if (filter.name.match(/[A-Z]/)) {
|
|
70
|
+
errors.push({
|
|
71
|
+
type: 'error',
|
|
72
|
+
field: `filters[${index}].name`,
|
|
73
|
+
message: `Filter name "${filter.name}" uses camelCase, must be snake_case`,
|
|
74
|
+
suggestion: `Change to snake_case (e.g., "paymentStatus" → "payment_status")`
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// CRITICAL: Validate customWhereClause handles 'all' for ALL filter types
|
|
78
|
+
validateCustomWhereClause(filter, index, errors);
|
|
79
|
+
// Validate filter based on type
|
|
80
|
+
switch (filter.type) {
|
|
81
|
+
case 'enum':
|
|
82
|
+
validateEnumFilter(filter, index, errors, warnings);
|
|
83
|
+
break;
|
|
84
|
+
case 'boolean':
|
|
85
|
+
// Boolean is treated as enum with custom SQL
|
|
86
|
+
validateBooleanFilter(filter, index, errors, warnings);
|
|
87
|
+
break;
|
|
88
|
+
case 'column':
|
|
89
|
+
validateColumnFilter(filter, index, errors, warnings);
|
|
90
|
+
break;
|
|
91
|
+
case 'nullable':
|
|
92
|
+
validateNullableFilter(filter, index, errors, warnings);
|
|
93
|
+
break;
|
|
94
|
+
case 'related':
|
|
95
|
+
validateRelatedFilter(filter, index, errors, warnings);
|
|
96
|
+
break;
|
|
97
|
+
case 'time':
|
|
98
|
+
validateTimeFilter(filter, index, errors, warnings);
|
|
99
|
+
break;
|
|
100
|
+
case 'search':
|
|
101
|
+
validateSearchFilter(filter, index, errors, warnings);
|
|
102
|
+
break;
|
|
103
|
+
case 'array':
|
|
104
|
+
validateArrayFilter(filter, index, errors, warnings);
|
|
105
|
+
break;
|
|
106
|
+
default:
|
|
107
|
+
errors.push({
|
|
108
|
+
type: 'error',
|
|
109
|
+
field: `filters[${index}].type`,
|
|
110
|
+
message: `Unsupported filter type: ${filter.type}`,
|
|
111
|
+
suggestion: 'Use: enum, boolean, column, nullable, related, time, search, or array'
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// Check duplicate counts keys
|
|
115
|
+
if (filter.countsKey) {
|
|
116
|
+
if (countsKeys.has(filter.countsKey)) {
|
|
117
|
+
errors.push({
|
|
118
|
+
type: 'error',
|
|
119
|
+
field: `filters[${index}].countsKey`,
|
|
120
|
+
message: `Duplicate countsKey: ${filter.countsKey}`,
|
|
121
|
+
suggestion: 'Counts keys must be unique'
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
countsKeys.add(filter.countsKey);
|
|
125
|
+
}
|
|
126
|
+
// Validate UI config
|
|
127
|
+
if (!filter.ui) {
|
|
128
|
+
warnings.push({
|
|
129
|
+
type: 'warning',
|
|
130
|
+
field: `filters[${index}].ui`,
|
|
131
|
+
message: `Filter "${filter.name}" missing UI config`,
|
|
132
|
+
suggestion: 'Add ui object with label, placeholder, options'
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
return {
|
|
137
|
+
valid: errors.length === 0,
|
|
138
|
+
errors,
|
|
139
|
+
warnings
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* CRITICAL VALIDATION: Validate customWhereClause handles 'all' value
|
|
144
|
+
*
|
|
145
|
+
* When a filter has customWhereClause, mapFiltersToRPC() does NOT convert 'all' to null.
|
|
146
|
+
* This means the SQL MUST explicitly handle the 'all' value, otherwise it returns 0 items!
|
|
147
|
+
*
|
|
148
|
+
* Exception: Array filters (type='array') are excluded from this check because
|
|
149
|
+
* mapFiltersToRPC() ALWAYS converts 'all' to null for array parameters (line 237-242).
|
|
150
|
+
* Array parameters cannot be 'all' string - PostgreSQL expects array or null.
|
|
151
|
+
*
|
|
152
|
+
* Example problem:
|
|
153
|
+
* - Frontend sends: search=all (default value)
|
|
154
|
+
* - Backend passes: p_search='all' to RPC
|
|
155
|
+
* - SQL says: WHERE p_search IS NULL OR p_search = '' OR EXISTS(...)
|
|
156
|
+
* - Result: 0 items! (because 'all' !== NULL and 'all' !== '')
|
|
157
|
+
*
|
|
158
|
+
* Solution:
|
|
159
|
+
* - SQL must include: p_search IS NULL OR p_search = '' OR p_search = 'all' OR EXISTS(...)
|
|
160
|
+
*/
|
|
161
|
+
function validateCustomWhereClause(filter, index, errors) {
|
|
162
|
+
const customWhereClause = filter.sqlGeneration?.customWhereClause;
|
|
163
|
+
if (!customWhereClause) {
|
|
164
|
+
return; // No custom WHERE clause, no validation needed
|
|
165
|
+
}
|
|
166
|
+
// SKIP validation for array filters - they never receive 'all' value
|
|
167
|
+
// mapFiltersToRPC() converts 'all' → null for array types (config-driven-filters.ts:237-242)
|
|
168
|
+
if (filter.type === 'array') {
|
|
169
|
+
return; // Array filters are safe - no 'all' check needed
|
|
170
|
+
}
|
|
171
|
+
const paramName = `p_${filter.rpcParam || filter.name}`;
|
|
172
|
+
// Check if customWhereClause handles the 'all' value
|
|
173
|
+
const hasAllCheck = customWhereClause.includes(`${paramName} = 'all'`) ||
|
|
174
|
+
customWhereClause.includes(`${paramName} = "all"`);
|
|
175
|
+
if (!hasAllCheck) {
|
|
176
|
+
errors.push({
|
|
177
|
+
type: 'error',
|
|
178
|
+
field: `filters[${index}].sqlGeneration.customWhereClause`,
|
|
179
|
+
message: `CRITICAL: Filter "${filter.name}" with customWhereClause MUST handle 'all' value!`,
|
|
180
|
+
suggestion: `Your SQL will return 0 items when this filter is set to 'all' (the default)!\n\n` +
|
|
181
|
+
`Fix: Add this to your WHERE clause:\n` +
|
|
182
|
+
`${paramName} IS NULL OR ${paramName} = '' OR ${paramName} = 'all'\n\n` +
|
|
183
|
+
`Why: Filters with customWhereClause don't auto-convert 'all' to null,\n` +
|
|
184
|
+
`so the SQL must explicitly handle it. Without this, the API returns empty results!`
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function validateEnumFilter(filter, index, errors, warnings) {
|
|
189
|
+
if (!filter.column) {
|
|
190
|
+
errors.push({
|
|
191
|
+
type: 'error',
|
|
192
|
+
field: `filters[${index}].column`,
|
|
193
|
+
message: `Enum filter "${filter.name}" missing column`,
|
|
194
|
+
suggestion: 'Add column property (e.g., column: "status")'
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
if (!filter.values || filter.values.length === 0) {
|
|
198
|
+
errors.push({
|
|
199
|
+
type: 'error',
|
|
200
|
+
field: `filters[${index}].values`,
|
|
201
|
+
message: `Enum filter "${filter.name}" missing values`,
|
|
202
|
+
suggestion: 'Add values array (e.g., values: ["paid", "pending"])'
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
if (!filter.countsKey) {
|
|
206
|
+
warnings.push({
|
|
207
|
+
type: 'warning',
|
|
208
|
+
field: `filters[${index}].countsKey`,
|
|
209
|
+
message: `Enum filter "${filter.name}" missing countsKey`,
|
|
210
|
+
suggestion: 'Add countsKey (e.g., countsKey: "byStatus")'
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
function validateBooleanFilter(filter, index, errors, warnings) {
|
|
215
|
+
if (!filter.column) {
|
|
216
|
+
errors.push({
|
|
217
|
+
type: 'error',
|
|
218
|
+
field: `filters[${index}].column`,
|
|
219
|
+
message: `Boolean filter "${filter.name}" missing column`,
|
|
220
|
+
suggestion: 'Add column property (e.g., column: "is_active")'
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
if (!filter.values || filter.values.length !== 2) {
|
|
224
|
+
errors.push({
|
|
225
|
+
type: 'error',
|
|
226
|
+
field: `filters[${index}].values`,
|
|
227
|
+
message: `Boolean filter "${filter.name}" must have exactly 2 values: ['true', 'false']`,
|
|
228
|
+
suggestion: 'Add values: ["true", "false"]'
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
if (!filter.countsKey) {
|
|
232
|
+
warnings.push({
|
|
233
|
+
type: 'warning',
|
|
234
|
+
field: `filters[${index}].countsKey`,
|
|
235
|
+
message: `Boolean filter "${filter.name}" missing countsKey`,
|
|
236
|
+
suggestion: 'Add countsKey (e.g., countsKey: "byIsActive")'
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
// Boolean type requires custom SQL (handled by generator)
|
|
240
|
+
if (!filter.sqlGeneration?.customWhereClause) {
|
|
241
|
+
warnings.push({
|
|
242
|
+
type: 'warning',
|
|
243
|
+
field: `filters[${index}].sqlGeneration.customWhereClause`,
|
|
244
|
+
message: `Boolean filter "${filter.name}" missing custom WHERE clause`,
|
|
245
|
+
suggestion: 'Add sqlGeneration.customWhereClause for boolean conversion (::boolean cast)'
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function validateColumnFilter(filter, index, errors, warnings) {
|
|
250
|
+
if (!filter.column) {
|
|
251
|
+
errors.push({
|
|
252
|
+
type: 'error',
|
|
253
|
+
field: `filters[${index}].column`,
|
|
254
|
+
message: `Column filter "${filter.name}" missing column`,
|
|
255
|
+
suggestion: 'Add column property'
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
if (!filter.countsKey) {
|
|
259
|
+
warnings.push({
|
|
260
|
+
type: 'warning',
|
|
261
|
+
field: `filters[${index}].countsKey`,
|
|
262
|
+
message: `Column filter "${filter.name}" missing countsKey`,
|
|
263
|
+
suggestion: 'Add countsKey for dynamic counts'
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function validateNullableFilter(filter, index, errors, warnings) {
|
|
268
|
+
if (!filter.column) {
|
|
269
|
+
errors.push({
|
|
270
|
+
type: 'error',
|
|
271
|
+
field: `filters[${index}].column`,
|
|
272
|
+
message: `Nullable filter "${filter.name}" missing column`,
|
|
273
|
+
suggestion: 'Add column property to check for NULL'
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
if (!filter.countsKey) {
|
|
277
|
+
warnings.push({
|
|
278
|
+
type: 'warning',
|
|
279
|
+
field: `filters[${index}].countsKey`,
|
|
280
|
+
message: `Nullable filter "${filter.name}" missing countsKey`,
|
|
281
|
+
suggestion: 'Add countsKey (e.g., countsKey: "byUser")'
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
function validateRelatedFilter(filter, index, errors, warnings) {
|
|
286
|
+
if (!filter.relatedTable) {
|
|
287
|
+
errors.push({
|
|
288
|
+
type: 'error',
|
|
289
|
+
field: `filters[${index}].relatedTable`,
|
|
290
|
+
message: `Related filter "${filter.name}" missing relatedTable`,
|
|
291
|
+
suggestion: 'Add relatedTable property'
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
if (!filter.foreignKey) {
|
|
295
|
+
errors.push({
|
|
296
|
+
type: 'error',
|
|
297
|
+
field: `filters[${index}].foreignKey`,
|
|
298
|
+
message: `Related filter "${filter.name}" missing foreignKey`,
|
|
299
|
+
suggestion: 'Add foreignKey property'
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
if (!filter.countsKey) {
|
|
303
|
+
warnings.push({
|
|
304
|
+
type: 'warning',
|
|
305
|
+
field: `filters[${index}].countsKey`,
|
|
306
|
+
message: `Related filter "${filter.name}" missing countsKey`,
|
|
307
|
+
suggestion: 'Add countsKey (e.g., countsKey: "byVoucher")'
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
function validateTimeFilter(filter, index, _errors, warnings) {
|
|
312
|
+
if (!filter.dateField && !filter.column) {
|
|
313
|
+
warnings.push({
|
|
314
|
+
type: 'warning',
|
|
315
|
+
field: `filters[${index}].dateField`,
|
|
316
|
+
message: `Time filter "${filter.name}" missing dateField, will use created_at`,
|
|
317
|
+
suggestion: 'Add dateField property or column (e.g., dateField: "order_date")'
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
if (!filter.countsKey) {
|
|
321
|
+
warnings.push({
|
|
322
|
+
type: 'warning',
|
|
323
|
+
field: `filters[${index}].countsKey`,
|
|
324
|
+
message: `Time filter "${filter.name}" missing countsKey`,
|
|
325
|
+
suggestion: 'Add countsKey (e.g., countsKey: "byTimePeriod")'
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
function validateSearchFilter(filter, index, errors, _warnings) {
|
|
330
|
+
const searchFields = filter.sqlGeneration?.searchFields;
|
|
331
|
+
if (!searchFields || searchFields.length === 0) {
|
|
332
|
+
errors.push({
|
|
333
|
+
type: 'error',
|
|
334
|
+
field: `filters[${index}].sqlGeneration.searchFields`,
|
|
335
|
+
message: `Search filter "${filter.name}" missing searchFields`,
|
|
336
|
+
suggestion: 'Add sqlGeneration.searchFields array (e.g., ["reference", "email"])'
|
|
337
|
+
});
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
// Validate relation syntax (e.g., "order.reference")
|
|
341
|
+
searchFields.forEach((field, fieldIndex) => {
|
|
342
|
+
if (field.includes('.')) {
|
|
343
|
+
const [relation, columnName] = field.split('.');
|
|
344
|
+
// Check if relation is supported
|
|
345
|
+
const supportedRelations = ['user', 'order'];
|
|
346
|
+
if (!supportedRelations.includes(relation)) {
|
|
347
|
+
errors.push({
|
|
348
|
+
type: 'error',
|
|
349
|
+
field: `filters[${index}].sqlGeneration.searchFields[${fieldIndex}]`,
|
|
350
|
+
message: `Unsupported relation "${relation}" in field "${field}"`,
|
|
351
|
+
suggestion: `Supported relations: ${supportedRelations.join(', ')}`
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
// Warn if column name looks wrong
|
|
355
|
+
if (columnName.includes('_') && !columnName.match(/^[a-z_]+$/)) {
|
|
356
|
+
_warnings.push({
|
|
357
|
+
type: 'warning',
|
|
358
|
+
field: `filters[${index}].sqlGeneration.searchFields[${fieldIndex}]`,
|
|
359
|
+
message: `Column name "${columnName}" in "${field}" looks unusual`,
|
|
360
|
+
suggestion: 'Database columns are usually snake_case (e.g., first_name)'
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Validate array filter (for by-ids navigation)
|
|
368
|
+
*/
|
|
369
|
+
function validateArrayFilter(filter, index, errors, warnings) {
|
|
370
|
+
// Array filters need dbField or column to know which field to filter
|
|
371
|
+
if (!filter.dbField && !filter.column) {
|
|
372
|
+
errors.push({
|
|
373
|
+
type: 'error',
|
|
374
|
+
field: `filters[${index}].dbField`,
|
|
375
|
+
message: 'Array filters require dbField or column',
|
|
376
|
+
suggestion: 'Add dbField: "id" (or another field to filter by)'
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
// Array filters don't need countsKey (no counts generated)
|
|
380
|
+
if (filter.countsKey) {
|
|
381
|
+
warnings.push({
|
|
382
|
+
type: 'warning',
|
|
383
|
+
field: `filters[${index}].countsKey`,
|
|
384
|
+
message: 'Array filters don\'t generate counts - countsKey will be ignored',
|
|
385
|
+
suggestion: 'Remove countsKey (array filters are for specific item lookup)'
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
// Array filters don't need UI config (not rendered in UI)
|
|
389
|
+
if (filter.ui) {
|
|
390
|
+
warnings.push({
|
|
391
|
+
type: 'warning',
|
|
392
|
+
field: `filters[${index}].ui`,
|
|
393
|
+
message: 'Array filters are not rendered in UI - ui config will be ignored',
|
|
394
|
+
suggestion: 'Remove ui config (array filters are for backend-only filtering)'
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/generators/rpc/validator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -84,7 +84,15 @@ export { defaultAffiliateFeatureConfig } from './shared/affiliate/affiliateFeatu
|
|
|
84
84
|
export { addAffiliateAdminRoutes, addAffiliateUserRoutes, addAffiliatePublicRoutes } from './shared/affiliate/routes.js';
|
|
85
85
|
export type { AffiliateConfig, AffiliateTierConfig, AffiliateAttribution, AffiliateOrder, Affiliate, AffiliateCommission, AffiliateClick, AffiliatePayment, AffiliateTierHistory, AffiliateFilters, AffiliateDashboard, AffiliateDashboardStats, AffiliateDashboardCommission, AffiliateTierProgress } from './shared/affiliate/types.js';
|
|
86
86
|
export { addPublicAuthRoutes } from './shared/auth/routes.js';
|
|
87
|
-
export type { PublicAuthRoutesConfig, OnNewUserResult, OAuthProvider, InviteConfig, UserProfileOrg } from './shared/auth/types.js';
|
|
87
|
+
export type { PublicAuthRoutesConfig, OnNewUserResult, OAuthProvider, InviteConfig, MagicLinkConfig, UserProfileOrg } from './shared/auth/types.js';
|
|
88
|
+
export { generateRLS, generateRLSBatch } from './generators/rls-generator.js';
|
|
89
|
+
export type { RLSConfig, RLSTableType, RLSGeneratorResult } from './generators/rls-generator.js';
|
|
90
|
+
export { getAuditChecks, generateAuditSQL } from './generators/rls-auditor.js';
|
|
91
|
+
export type { AuditCheck } from './generators/rls-auditor.js';
|
|
92
|
+
export { runRLSCheck, runRLSCheckDebug } from './generators/rls-checker.js';
|
|
93
|
+
export type { RLSReport, RLSCheckResult, RLSViolation, RLSCategorySummary } from './generators/rls-checker.js';
|
|
94
|
+
export { RPCGenerator, DetailRPCGenerator, validateConfig as validateRPCConfig, generateAuthCheck, generateAuthWhereClause, generateAuthDeclarations, generateTimestamp, getTableAlias, escapeIdentifier } from './generators/rpc/index.js';
|
|
95
|
+
export type { GeneratedSQL, FilterDefinition, RPCGeneratorOptions, DetailRPCGeneratorOptions, ValidationResult as RPCValidationResult, ValidationError as RPCValidationError, AccessLevel, CreatorVisibilityConfig as RPCCreatorVisibilityConfig } from './generators/rpc/index.js';
|
|
88
96
|
export { createApp } from './core/createApp.js';
|
|
89
97
|
export type { CreateAppConfig } from './core/createApp.js';
|
|
90
98
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -81,6 +81,12 @@ export { defaultAffiliateFeatureConfig } from './shared/affiliate/affiliateFeatu
|
|
|
81
81
|
export { addAffiliateAdminRoutes, addAffiliateUserRoutes, addAffiliatePublicRoutes } from './shared/affiliate/routes.js';
|
|
82
82
|
// ─── Public Auth Routes ─────────────────────────────────────
|
|
83
83
|
export { addPublicAuthRoutes } from './shared/auth/routes.js';
|
|
84
|
+
// ─── Generators ──────────────────────────────────────────────
|
|
85
|
+
export { generateRLS, generateRLSBatch } from './generators/rls-generator.js';
|
|
86
|
+
export { getAuditChecks, generateAuditSQL } from './generators/rls-auditor.js';
|
|
87
|
+
export { runRLSCheck, runRLSCheckDebug } from './generators/rls-checker.js';
|
|
88
|
+
// RPC Generator (SQL Generator v3.17)
|
|
89
|
+
export { RPCGenerator, DetailRPCGenerator, validateConfig as validateRPCConfig, generateAuthCheck, generateAuthWhereClause, generateAuthDeclarations, generateTimestamp, getTableAlias, escapeIdentifier } from './generators/rpc/index.js';
|
|
84
90
|
// ─── App Bootstrap ──────────────────────────────────────────
|
|
85
91
|
export { createApp } from './core/createApp.js';
|
|
86
92
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { addPublicAuthRoutes } from './routes.js';
|
|
2
|
-
export type { PublicAuthRoutesConfig, OnNewUserResult, OAuthProvider, InviteConfig, UserProfileOrg } from './types.js';
|
|
2
|
+
export type { PublicAuthRoutesConfig, OnNewUserResult, OAuthProvider, InviteConfig, MagicLinkConfig, UserProfileOrg } from './types.js';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Standardized authentication routes for all Tetra projects.
|
|
5
5
|
* Handles: login, signup, OAuth, token refresh, session, /me, register,
|
|
6
|
-
* logout, and optionally invites.
|
|
6
|
+
* logout, and optionally magic link and invites.
|
|
7
7
|
*
|
|
8
8
|
* Usage:
|
|
9
9
|
* ```typescript
|
|
@@ -39,6 +39,9 @@ import type { PublicAuthRoutesConfig } from './types.js';
|
|
|
39
39
|
* Routes created (enableMe, default true):
|
|
40
40
|
* - GET /me — Full user profile + organizations + role
|
|
41
41
|
*
|
|
42
|
+
* Routes created (enableMagicLink):
|
|
43
|
+
* - POST /magic-link — Send passwordless login email
|
|
44
|
+
*
|
|
42
45
|
* Routes created (enableInvites):
|
|
43
46
|
* - POST /invite — Create org invite (requires auth)
|
|
44
47
|
* - POST /invite/accept — Accept invite (requires auth)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/shared/auth/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAIpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/shared/auth/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAIpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAkDzD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,sBAA2B,GAClC,IAAI,CAquBN"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Standardized authentication routes for all Tetra projects.
|
|
5
5
|
* Handles: login, signup, OAuth, token refresh, session, /me, register,
|
|
6
|
-
* logout, and optionally invites.
|
|
6
|
+
* logout, and optionally magic link and invites.
|
|
7
7
|
*
|
|
8
8
|
* Usage:
|
|
9
9
|
* ```typescript
|
|
@@ -42,6 +42,25 @@ function extractToken(req) {
|
|
|
42
42
|
return null;
|
|
43
43
|
return header.substring(7);
|
|
44
44
|
}
|
|
45
|
+
// ─── Auto-provision helper ───────────────────────────────────
|
|
46
|
+
async function autoProvisionIfNeeded(user, supabase, onNewUser) {
|
|
47
|
+
if (!onNewUser)
|
|
48
|
+
return;
|
|
49
|
+
const { data: existing } = await supabase
|
|
50
|
+
.from('users_public')
|
|
51
|
+
.select('id')
|
|
52
|
+
.eq('id', user.id)
|
|
53
|
+
.maybeSingle();
|
|
54
|
+
if (existing)
|
|
55
|
+
return;
|
|
56
|
+
const result = await onNewUser(user, supabase);
|
|
57
|
+
if (result) {
|
|
58
|
+
logger.info({ userId: user.id, email: user.email, organizationId: result.organizationId }, 'Auto-provisioned new user');
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
logger.warn({ userId: user.id, email: user.email }, 'onNewUser returned null during auto-provision');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
45
64
|
// ─── Route Factory ───────────────────────────────────────────
|
|
46
65
|
/**
|
|
47
66
|
* Add standard public authentication routes to a router.
|
|
@@ -59,6 +78,9 @@ function extractToken(req) {
|
|
|
59
78
|
* Routes created (enableMe, default true):
|
|
60
79
|
* - GET /me — Full user profile + organizations + role
|
|
61
80
|
*
|
|
81
|
+
* Routes created (enableMagicLink):
|
|
82
|
+
* - POST /magic-link — Send passwordless login email
|
|
83
|
+
*
|
|
62
84
|
* Routes created (enableInvites):
|
|
63
85
|
* - POST /invite — Create org invite (requires auth)
|
|
64
86
|
* - POST /invite/accept — Accept invite (requires auth)
|
|
@@ -137,6 +159,8 @@ export function addPublicAuthRoutes(router, config = {}) {
|
|
|
137
159
|
});
|
|
138
160
|
return;
|
|
139
161
|
}
|
|
162
|
+
// Auto-provision users_public + org if onNewUser is configured
|
|
163
|
+
await autoProvisionIfNeeded(data.user, supabase, config.onNewUser);
|
|
140
164
|
logger.info({ email, userId: data.user.id }, 'Signup successful');
|
|
141
165
|
res.status(201).json({
|
|
142
166
|
success: true,
|
|
@@ -312,6 +336,8 @@ export function addPublicAuthRoutes(router, config = {}) {
|
|
|
312
336
|
RFC7807ErrorResponse.unauthorized(res, 'Failed to exchange authorization code');
|
|
313
337
|
return;
|
|
314
338
|
}
|
|
339
|
+
// Auto-provision users_public + org for new OAuth users
|
|
340
|
+
await autoProvisionIfNeeded(data.user, supabase, config.onNewUser);
|
|
315
341
|
logger.info({ email: data.user.email, userId: data.user.id }, 'OAuth login successful');
|
|
316
342
|
res.json({
|
|
317
343
|
success: true,
|
|
@@ -403,6 +429,62 @@ export function addPublicAuthRoutes(router, config = {}) {
|
|
|
403
429
|
res.json({ success: true });
|
|
404
430
|
}
|
|
405
431
|
});
|
|
432
|
+
// ── POST /magic-link (optional) ─────────────────────────────
|
|
433
|
+
if (config.enableMagicLink) {
|
|
434
|
+
const mlConfig = config.magicLinkConfig || {};
|
|
435
|
+
const mlRedirectPath = mlConfig.redirectPath || callbackPath;
|
|
436
|
+
router.post('/magic-link', async (req, res) => {
|
|
437
|
+
const { email } = req.body;
|
|
438
|
+
if (!email) {
|
|
439
|
+
RFC7807ErrorResponse.badRequest(res, 'Email is required');
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
442
|
+
// Basic email validation
|
|
443
|
+
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
|
|
444
|
+
RFC7807ErrorResponse.badRequest(res, 'Invalid email format');
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
try {
|
|
448
|
+
const supabase = getSystemDB();
|
|
449
|
+
const redirectTo = `${frontendUrl}${mlRedirectPath}`;
|
|
450
|
+
if (mlConfig.sendEmail) {
|
|
451
|
+
// Custom email sender: generate link via admin API (does NOT send email)
|
|
452
|
+
const { data: linkData, error: linkError } = await supabase.auth.admin.generateLink({
|
|
453
|
+
type: 'magiclink',
|
|
454
|
+
email,
|
|
455
|
+
options: { redirectTo },
|
|
456
|
+
});
|
|
457
|
+
if (linkError || !linkData.properties?.action_link) {
|
|
458
|
+
logger.error({ error: linkError?.message, email }, 'Magic link generation failed');
|
|
459
|
+
RFC7807ErrorResponse.internalError(res, 'Failed to generate magic link');
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
await mlConfig.sendEmail(email, linkData.properties.action_link, supabase);
|
|
463
|
+
}
|
|
464
|
+
else {
|
|
465
|
+
// Default: let Supabase send the email
|
|
466
|
+
const { error } = await supabase.auth.signInWithOtp({
|
|
467
|
+
email,
|
|
468
|
+
options: { emailRedirectTo: redirectTo },
|
|
469
|
+
});
|
|
470
|
+
if (error) {
|
|
471
|
+
logger.error({ error: error.message, email }, 'Magic link send failed');
|
|
472
|
+
RFC7807ErrorResponse.internalError(res, 'Failed to send magic link');
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
logger.info({ email }, 'Magic link sent');
|
|
477
|
+
res.json({
|
|
478
|
+
success: true,
|
|
479
|
+
data: { message: 'Check your email for the login link.' },
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
catch (err) {
|
|
483
|
+
logger.error({ err }, 'Magic link error');
|
|
484
|
+
RFC7807ErrorResponse.internalError(res, 'Internal server error');
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
}
|
|
406
488
|
// ── Invite Routes (optional) ──────────────────────────────
|
|
407
489
|
if (config.enableInvites) {
|
|
408
490
|
const invCfg = config.inviteConfig || {};
|