@edium/halifax 1.0.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.
- package/CHANGELOG.md +31 -0
- package/LICENSE +21 -0
- package/README.md +148 -0
- package/README_AUTH.md +172 -0
- package/README_AUTOCRUD.md +253 -0
- package/README_CACHE.md +164 -0
- package/README_HTTP_ADAPTERS.md +309 -0
- package/README_MULTITENANCY.md +162 -0
- package/README_QUERYBUILDER.md +219 -0
- package/README_REPO_ADAPTERS.md +266 -0
- package/dist/adapters/http/ExpressAdapter.d.ts +40 -0
- package/dist/adapters/http/ExpressAdapter.d.ts.map +1 -0
- package/dist/adapters/http/ExpressAdapter.js +109 -0
- package/dist/adapters/http/ExpressAdapter.js.map +1 -0
- package/dist/adapters/orm/prisma/PrismaAdapter.d.ts +143 -0
- package/dist/adapters/orm/prisma/PrismaAdapter.d.ts.map +1 -0
- package/dist/adapters/orm/prisma/PrismaAdapter.js +277 -0
- package/dist/adapters/orm/prisma/PrismaAdapter.js.map +1 -0
- package/dist/adapters/orm/prisma/createPrismaResources.d.ts +15 -0
- package/dist/adapters/orm/prisma/createPrismaResources.d.ts.map +1 -0
- package/dist/adapters/orm/prisma/createPrismaResources.js +51 -0
- package/dist/adapters/orm/prisma/createPrismaResources.js.map +1 -0
- package/dist/adapters/orm/prisma/helpers.d.ts +27 -0
- package/dist/adapters/orm/prisma/helpers.d.ts.map +1 -0
- package/dist/adapters/orm/prisma/helpers.js +45 -0
- package/dist/adapters/orm/prisma/helpers.js.map +1 -0
- package/dist/adapters/orm/prisma/index.d.ts +4 -0
- package/dist/adapters/orm/prisma/index.d.ts.map +1 -0
- package/dist/adapters/orm/prisma/index.js +3 -0
- package/dist/adapters/orm/prisma/index.js.map +1 -0
- package/dist/adapters/orm/prisma/types.d.ts +49 -0
- package/dist/adapters/orm/prisma/types.d.ts.map +1 -0
- package/dist/adapters/orm/prisma/types.js +2 -0
- package/dist/adapters/orm/prisma/types.js.map +1 -0
- package/dist/auth/AuthStrategy.d.ts +198 -0
- package/dist/auth/AuthStrategy.d.ts.map +1 -0
- package/dist/auth/AuthStrategy.js +227 -0
- package/dist/auth/AuthStrategy.js.map +1 -0
- package/dist/classes/QueryBuilder.d.ts +33 -0
- package/dist/classes/QueryBuilder.d.ts.map +1 -0
- package/dist/classes/QueryBuilder.js +262 -0
- package/dist/classes/QueryBuilder.js.map +1 -0
- package/dist/core/crudRouter.d.ts +36 -0
- package/dist/core/crudRouter.d.ts.map +1 -0
- package/dist/core/crudRouter.js +391 -0
- package/dist/core/crudRouter.js.map +1 -0
- package/dist/core/queryString.d.ts +13 -0
- package/dist/core/queryString.d.ts.map +1 -0
- package/dist/core/queryString.js +89 -0
- package/dist/core/queryString.js.map +1 -0
- package/dist/core/types.d.ts +293 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +13 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/validation.d.ts +75 -0
- package/dist/core/validation.d.ts.map +1 -0
- package/dist/core/validation.js +206 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/enums/SqlComparison.d.ts +18 -0
- package/dist/enums/SqlComparison.d.ts.map +1 -0
- package/dist/enums/SqlComparison.js +19 -0
- package/dist/enums/SqlComparison.js.map +1 -0
- package/dist/enums/SqlOperator.d.ts +6 -0
- package/dist/enums/SqlOperator.d.ts.map +1 -0
- package/dist/enums/SqlOperator.js +7 -0
- package/dist/enums/SqlOperator.js.map +1 -0
- package/dist/enums/SqlOrder.d.ts +6 -0
- package/dist/enums/SqlOrder.d.ts.map +1 -0
- package/dist/enums/SqlOrder.js +7 -0
- package/dist/enums/SqlOrder.js.map +1 -0
- package/dist/errors/AuthenticationError.d.ts +10 -0
- package/dist/errors/AuthenticationError.d.ts.map +1 -0
- package/dist/errors/AuthenticationError.js +13 -0
- package/dist/errors/AuthenticationError.js.map +1 -0
- package/dist/errors/AuthorizationError.d.ts +10 -0
- package/dist/errors/AuthorizationError.d.ts.map +1 -0
- package/dist/errors/AuthorizationError.js +13 -0
- package/dist/errors/AuthorizationError.js.map +1 -0
- package/dist/errors/BadRequestError.d.ts +10 -0
- package/dist/errors/BadRequestError.d.ts.map +1 -0
- package/dist/errors/BadRequestError.js +13 -0
- package/dist/errors/BadRequestError.js.map +1 -0
- package/dist/errors/HttpError.d.ts +12 -0
- package/dist/errors/HttpError.d.ts.map +1 -0
- package/dist/errors/HttpError.js +17 -0
- package/dist/errors/HttpError.js.map +1 -0
- package/dist/errors/MethodNotAllowedError.d.ts +10 -0
- package/dist/errors/MethodNotAllowedError.d.ts.map +1 -0
- package/dist/errors/MethodNotAllowedError.js +13 -0
- package/dist/errors/MethodNotAllowedError.js.map +1 -0
- package/dist/errors/NotAcceptableError.d.ts +10 -0
- package/dist/errors/NotAcceptableError.d.ts.map +1 -0
- package/dist/errors/NotAcceptableError.js +13 -0
- package/dist/errors/NotAcceptableError.js.map +1 -0
- package/dist/errors/NotFoundError.d.ts +10 -0
- package/dist/errors/NotFoundError.d.ts.map +1 -0
- package/dist/errors/NotFoundError.js +13 -0
- package/dist/errors/NotFoundError.js.map +1 -0
- package/dist/errors/NotImplementedError.d.ts +10 -0
- package/dist/errors/NotImplementedError.d.ts.map +1 -0
- package/dist/errors/NotImplementedError.js +13 -0
- package/dist/errors/NotImplementedError.js.map +1 -0
- package/dist/errors/ServerError.d.ts +10 -0
- package/dist/errors/ServerError.d.ts.map +1 -0
- package/dist/errors/ServerError.js +13 -0
- package/dist/errors/ServerError.js.map +1 -0
- package/dist/errors/UnprocessableEntityError.d.ts +10 -0
- package/dist/errors/UnprocessableEntityError.d.ts.map +1 -0
- package/dist/errors/UnprocessableEntityError.js +13 -0
- package/dist/errors/UnprocessableEntityError.js.map +1 -0
- package/dist/errors/UnsupportedMediaTypeError.d.ts +10 -0
- package/dist/errors/UnsupportedMediaTypeError.d.ts.map +1 -0
- package/dist/errors/UnsupportedMediaTypeError.js +13 -0
- package/dist/errors/UnsupportedMediaTypeError.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/IParamQuery.d.ts +8 -0
- package/dist/interfaces/IParamQuery.d.ts.map +1 -0
- package/dist/interfaces/IParamQuery.js +2 -0
- package/dist/interfaces/IParamQuery.js.map +1 -0
- package/dist/interfaces/IQueryFilter.d.ts +18 -0
- package/dist/interfaces/IQueryFilter.d.ts.map +1 -0
- package/dist/interfaces/IQueryFilter.js +2 -0
- package/dist/interfaces/IQueryFilter.js.map +1 -0
- package/dist/interfaces/IQueryOptions.d.ts +20 -0
- package/dist/interfaces/IQueryOptions.d.ts.map +1 -0
- package/dist/interfaces/IQueryOptions.js +2 -0
- package/dist/interfaces/IQueryOptions.js.map +1 -0
- package/dist/interfaces/ISort.d.ts +9 -0
- package/dist/interfaces/ISort.d.ts.map +1 -0
- package/dist/interfaces/ISort.js +2 -0
- package/dist/interfaces/ISort.js.map +1 -0
- package/package.json +169 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { SqlComparison } from '../enums/SqlComparison.js';
|
|
2
|
+
import { BadRequestError } from '../errors/BadRequestError.js';
|
|
3
|
+
/**
|
|
4
|
+
* Returns `true` when `value` is neither `undefined` nor `null`.
|
|
5
|
+
* @param value - Value to test.
|
|
6
|
+
* @returns `true` when `value` is defined and not null.
|
|
7
|
+
*/
|
|
8
|
+
function isDefined(value) {
|
|
9
|
+
return value !== undefined && value !== null;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Replaces `?` placeholder markers with PostgreSQL-style `$1`, `$2`, … numbered parameters.
|
|
13
|
+
* @param statement - SQL string containing `?` placeholders.
|
|
14
|
+
* @returns The same SQL string with `?` replaced by `$1`, `$2`, etc. in order.
|
|
15
|
+
*/
|
|
16
|
+
function numberParams(statement) {
|
|
17
|
+
let i = 0;
|
|
18
|
+
return statement.replace(/\?/g, () => `$${++i}`);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Returns the SELECT field list, or `*` when no fields are specified.
|
|
22
|
+
* @param fields - Array of column names to include, or `undefined` for all columns.
|
|
23
|
+
* @returns A comma-separated field list, or `'*'`.
|
|
24
|
+
*/
|
|
25
|
+
function addFields(fields) {
|
|
26
|
+
return fields?.length ? fields.join(',') : '*';
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Returns the `FROM <tableName>` clause.
|
|
30
|
+
* @param tableName - Target table name.
|
|
31
|
+
* @returns A `FROM <tableName>` SQL fragment.
|
|
32
|
+
* @throws {@link BadRequestError} when `tableName` is absent.
|
|
33
|
+
*/
|
|
34
|
+
function addFrom(tableName) {
|
|
35
|
+
if (!tableName) {
|
|
36
|
+
throw new BadRequestError('The query builder requires a table name.');
|
|
37
|
+
}
|
|
38
|
+
return `FROM ${tableName}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns the `ORDER BY` clause from the query options, or an empty string when no sorts are given.
|
|
42
|
+
* @param queryOptions - Query AST whose `orderBy` array is used.
|
|
43
|
+
* @returns An `ORDER BY ...` SQL fragment, or `''` when `orderBy` is absent or empty.
|
|
44
|
+
*/
|
|
45
|
+
function addOrderBy(queryOptions) {
|
|
46
|
+
const order = queryOptions.orderBy ?? [];
|
|
47
|
+
const orderClauses = order.map((sort) => `${sort.field} ${sort.order}`);
|
|
48
|
+
if (orderClauses.length === 0)
|
|
49
|
+
return '';
|
|
50
|
+
return `ORDER BY ${orderClauses.join(',')}`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Builds the filter clause fragment for a list of {@link IQueryFilter} conditions.
|
|
54
|
+
* @param queryItems - Filter conditions to convert into SQL.
|
|
55
|
+
* @param includeParentheses - When `true`, wraps the result in parentheses (used for child groups).
|
|
56
|
+
* @returns A SQL fragment representing all conditions joined by their operators.
|
|
57
|
+
*/
|
|
58
|
+
function addSelectionFilter(queryItems = [], includeParentheses = false) {
|
|
59
|
+
const filterClause = [];
|
|
60
|
+
queryItems.forEach((item) => {
|
|
61
|
+
const comparison = item.comparison
|
|
62
|
+
? item.comparison.toUpperCase()
|
|
63
|
+
: SqlComparison.Equal;
|
|
64
|
+
const operator = item.operator ? item.operator.toUpperCase() : '';
|
|
65
|
+
switch (comparison) {
|
|
66
|
+
case SqlComparison.Between:
|
|
67
|
+
case SqlComparison.NotBetween: {
|
|
68
|
+
filterClause.push(`${item.field} ${comparison} ? AND ?`);
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case SqlComparison.Like:
|
|
72
|
+
case SqlComparison.NotLike: {
|
|
73
|
+
filterClause.push(`${item.field} ${comparison} ?`);
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
case SqlComparison.IsNull:
|
|
77
|
+
case SqlComparison.IsNotNull: {
|
|
78
|
+
filterClause.push(`${item.field} ${comparison}`);
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
case SqlComparison.In:
|
|
82
|
+
case SqlComparison.NotIn: {
|
|
83
|
+
const values = Array.isArray(item.value1) ? item.value1 : [];
|
|
84
|
+
const wildcards = values.map(() => {
|
|
85
|
+
return '?';
|
|
86
|
+
});
|
|
87
|
+
filterClause.push(`${item.field} ${comparison} (${wildcards.join(',')})`);
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
default: {
|
|
91
|
+
filterClause.push(`${item.field} ${comparison} ?`);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (operator) {
|
|
96
|
+
filterClause.push(operator);
|
|
97
|
+
}
|
|
98
|
+
if (item.children?.length) {
|
|
99
|
+
filterClause.push(addSelectionFilter(item.children, true));
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
return includeParentheses ? `(${filterClause.join(' ')})` : filterClause.join(' ');
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Returns an `OFFSET <value> ROWS` SQL fragment.
|
|
106
|
+
* @param value - Number of rows to skip.
|
|
107
|
+
* @returns The OFFSET clause string.
|
|
108
|
+
*/
|
|
109
|
+
function addOffset(value) {
|
|
110
|
+
return `OFFSET ${value} ROWS`;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Returns a `FETCH NEXT <value> ROWS ONLY` SQL fragment.
|
|
114
|
+
* @param value - Maximum number of rows to return.
|
|
115
|
+
* @returns The FETCH clause string.
|
|
116
|
+
*/
|
|
117
|
+
function addLimit(value) {
|
|
118
|
+
return `FETCH NEXT ${value} ROWS ONLY`;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Returns a `WHERE ...` clause, or an empty string when there are no filters.
|
|
122
|
+
* @param queryItems - Array of filter conditions, or `undefined`.
|
|
123
|
+
* @returns A `WHERE ...` SQL fragment, or `''` when `queryItems` is empty.
|
|
124
|
+
*/
|
|
125
|
+
function addWhere(queryItems) {
|
|
126
|
+
if (!queryItems?.length) {
|
|
127
|
+
return '';
|
|
128
|
+
}
|
|
129
|
+
return `WHERE ${addSelectionFilter(queryItems)}`;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Builds a `SET col = ?, ...` fragment and collects the corresponding parameter values.
|
|
133
|
+
* The `id` column is automatically excluded from the SET clause.
|
|
134
|
+
* @param update - Key-value pairs to assign (the `id` key is skipped).
|
|
135
|
+
* @returns A parameterised SET clause and its ordered bind values.
|
|
136
|
+
*/
|
|
137
|
+
function buildUpdate(update, idField = 'id') {
|
|
138
|
+
const setClause = ['SET'];
|
|
139
|
+
const parameters = [];
|
|
140
|
+
const keys = Object.keys(update).filter((key) => {
|
|
141
|
+
return key !== idField;
|
|
142
|
+
});
|
|
143
|
+
keys.forEach((key, index) => {
|
|
144
|
+
parameters.push(update[key]);
|
|
145
|
+
const suffix = index < keys.length - 1 ? ',' : '';
|
|
146
|
+
setClause.push(`${key} = ?${suffix}`);
|
|
147
|
+
});
|
|
148
|
+
return {
|
|
149
|
+
statement: setClause.join(' '),
|
|
150
|
+
parameters
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Recursively extracts the ordered list of bind parameters from a filter tree.
|
|
155
|
+
* @param queryItems - Array of filter conditions to extract parameters from.
|
|
156
|
+
* @returns Flat array of bind values in the same order as the `?` placeholders in the SQL.
|
|
157
|
+
*/
|
|
158
|
+
function getParameters(queryItems = []) {
|
|
159
|
+
let parameters = [];
|
|
160
|
+
queryItems.forEach((item) => {
|
|
161
|
+
const comparison = item.comparison
|
|
162
|
+
? item.comparison.toUpperCase()
|
|
163
|
+
: SqlComparison.Equal;
|
|
164
|
+
if (comparison === SqlComparison.In || comparison === SqlComparison.NotIn) {
|
|
165
|
+
parameters = parameters.concat(item.value1);
|
|
166
|
+
}
|
|
167
|
+
else if (comparison !== SqlComparison.IsNull && comparison !== SqlComparison.IsNotNull) {
|
|
168
|
+
parameters.push(item.value1);
|
|
169
|
+
}
|
|
170
|
+
if (isDefined(item.value2)) {
|
|
171
|
+
parameters.push(item.value2);
|
|
172
|
+
}
|
|
173
|
+
if (item.children?.length) {
|
|
174
|
+
parameters = parameters.concat(getParameters(item.children));
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
return parameters;
|
|
178
|
+
}
|
|
179
|
+
/** Generates parameterised PostgreSQL SQL statements from a query-builder AST. */
|
|
180
|
+
export class QueryBuilder {
|
|
181
|
+
/**
|
|
182
|
+
* Builds a `SELECT COUNT(*) AS count FROM …` query.
|
|
183
|
+
* @param queryOptions - Query AST including table name and optional WHERE clause.
|
|
184
|
+
* @returns A parameterised SQL statement and its bind values, ready to execute.
|
|
185
|
+
*/
|
|
186
|
+
static buildCountQuery(queryOptions) {
|
|
187
|
+
const statementPieces = ['SELECT'];
|
|
188
|
+
if (queryOptions.isDistinct) {
|
|
189
|
+
statementPieces.push('DISTINCT');
|
|
190
|
+
}
|
|
191
|
+
statementPieces.push('COUNT(*) AS count');
|
|
192
|
+
statementPieces.push(addFrom(queryOptions.tableName));
|
|
193
|
+
statementPieces.push(addWhere(queryOptions.where));
|
|
194
|
+
return {
|
|
195
|
+
statement: numberParams(statementPieces.filter(Boolean).join(' ')),
|
|
196
|
+
parameters: getParameters(queryOptions.where)
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Builds a `SELECT … FROM … WHERE … ORDER BY … OFFSET … FETCH NEXT …` query.
|
|
201
|
+
* @param queryOptions - Full query AST including fields, pagination, sorting, and filters.
|
|
202
|
+
* @returns A parameterised SQL statement and its bind values, ready to execute.
|
|
203
|
+
*/
|
|
204
|
+
static buildSelectQuery(queryOptions) {
|
|
205
|
+
const statementPieces = ['SELECT'];
|
|
206
|
+
if (queryOptions.isDistinct) {
|
|
207
|
+
statementPieces.push('DISTINCT');
|
|
208
|
+
}
|
|
209
|
+
statementPieces.push(addFields(queryOptions.fields));
|
|
210
|
+
statementPieces.push(addFrom(queryOptions.tableName));
|
|
211
|
+
statementPieces.push(addWhere(queryOptions.where));
|
|
212
|
+
statementPieces.push(addOrderBy(queryOptions));
|
|
213
|
+
if (isDefined(queryOptions.limit)) {
|
|
214
|
+
const offset = queryOptions.offset ?? 0;
|
|
215
|
+
statementPieces.push(addOffset(offset));
|
|
216
|
+
statementPieces.push(addLimit(queryOptions.limit));
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
statement: numberParams(statementPieces.filter(Boolean).join(' ')),
|
|
220
|
+
parameters: getParameters(queryOptions.where)
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Builds a `DELETE FROM … WHERE …` query, with an optional `RETURNING` clause.
|
|
225
|
+
* @param queryOptions - Query AST including table name and WHERE clause.
|
|
226
|
+
* @param returning - Column names to include in a `RETURNING` clause (e.g. `['id']`).
|
|
227
|
+
* @returns A parameterised SQL statement and its bind values, ready to execute.
|
|
228
|
+
*/
|
|
229
|
+
static buildDeleteQuery(queryOptions, returning) {
|
|
230
|
+
const returningClause = returning?.length ? `RETURNING ${returning.join(', ')}` : '';
|
|
231
|
+
return {
|
|
232
|
+
statement: numberParams(['DELETE FROM', queryOptions.tableName, addWhere(queryOptions.where), returningClause]
|
|
233
|
+
.filter(Boolean)
|
|
234
|
+
.join(' ')),
|
|
235
|
+
parameters: getParameters(queryOptions.where)
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Builds an `UPDATE … SET … WHERE …` query, with an optional `RETURNING` clause.
|
|
240
|
+
* @param queryOptions - Query AST including table name and WHERE clause.
|
|
241
|
+
* @param update - Key-value pairs to assign in the SET clause (`id` is excluded automatically).
|
|
242
|
+
* @param returning - Column names to include in a `RETURNING` clause (e.g. `['id']`).
|
|
243
|
+
* @returns A parameterised SQL statement and its bind values, ready to execute.
|
|
244
|
+
*/
|
|
245
|
+
static buildUpdateQuery(queryOptions, update, returning, idField = 'id') {
|
|
246
|
+
const updateClause = buildUpdate(update, idField);
|
|
247
|
+
const returningClause = returning?.length ? `RETURNING ${returning.join(', ')}` : '';
|
|
248
|
+
return {
|
|
249
|
+
statement: numberParams([
|
|
250
|
+
'UPDATE',
|
|
251
|
+
queryOptions.tableName,
|
|
252
|
+
updateClause.statement,
|
|
253
|
+
addWhere(queryOptions.where),
|
|
254
|
+
returningClause
|
|
255
|
+
]
|
|
256
|
+
.filter(Boolean)
|
|
257
|
+
.join(' ')),
|
|
258
|
+
parameters: updateClause.parameters.concat(getParameters(queryOptions.where))
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=QueryBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryBuilder.js","sourceRoot":"","sources":["../../src/classes/QueryBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type AuthStrategy } from '../auth/AuthStrategy.js';
|
|
2
|
+
import { type ResourceDefinition } from '../core/types.js';
|
|
3
|
+
import type { HttpServer } from '../core/types.js';
|
|
4
|
+
/** Options for {@link registerCrudApi} / {@link createExpressCrudRouter}. */
|
|
5
|
+
export interface CrudApiOptions {
|
|
6
|
+
/** Auth strategy used for all routes. Defaults to {@link AllowAllAuthStrategy}. */
|
|
7
|
+
authStrategy?: AuthStrategy;
|
|
8
|
+
/** Path segment for the query-builder POST route (default: `'query-builder'`). */
|
|
9
|
+
queryBuilderPath?: string;
|
|
10
|
+
/** Path for the query-builder preview route (default: `'/query-builder/preview'`). */
|
|
11
|
+
previewQueryBuilderPath?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Converts any thrown value to a structured `{ status, code, message, details }` object.
|
|
15
|
+
* {@link HttpError} subclasses preserve their status; all other errors become 500.
|
|
16
|
+
* @param error - The caught value to normalise (may be any type).
|
|
17
|
+
* @returns A plain object with `status`, `code`, `message`, and optional `details`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function normalizeError(error: unknown): {
|
|
20
|
+
status: number;
|
|
21
|
+
code: string;
|
|
22
|
+
message: string;
|
|
23
|
+
details?: unknown;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Registers all CRUD routes for every resource on the given HTTP server.
|
|
27
|
+
*
|
|
28
|
+
* Routes are controlled by `resource.permissions` merged with {@link defaultCrudPermissions}.
|
|
29
|
+
* A global query-builder preview endpoint is also registered at `previewQueryBuilderPath`.
|
|
30
|
+
*
|
|
31
|
+
* @param server - The HTTP server adapter to register routes on (e.g. {@link ExpressHttpServer}).
|
|
32
|
+
* @param resources - Resource definitions to wire up as CRUD endpoints.
|
|
33
|
+
* @param options - Auth strategy, query-builder path overrides, and preview path overrides.
|
|
34
|
+
*/
|
|
35
|
+
export declare function registerCrudApi(server: HttpServer, resources: ResourceDefinition[], options?: CrudApiOptions): void;
|
|
36
|
+
//# sourceMappingURL=crudRouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crudRouter.d.ts","sourceRoot":"","sources":["../../src/core/crudRouter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAYhF,OAAO,EAA2C,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAClG,OAAO,KAAK,EAA6B,UAAU,EAAE,MAAM,iBAAiB,CAAA;AA6C5E,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,mFAAmF;IACnF,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,sFAAsF;IACtF,uBAAuB,CAAC,EAAE,MAAM,CAAA;CACjC;AAeD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG;IAC9C,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAaA;AAwID;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,kBAAkB,EAAE,EAC/B,OAAO,GAAE,cAAmB,GAC3B,IAAI,CA2ON"}
|