@visulima/crud 1.0.3 → 1.0.5
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 +16 -0
- package/dist/chunk-JSOEPRPZ.mjs +2 -0
- package/dist/{chunk-SH6A4KBC.mjs.map → chunk-JSOEPRPZ.mjs.map} +1 -1
- package/dist/chunk-U35WXGEF.js +2 -0
- package/dist/chunk-U35WXGEF.js.map +1 -0
- package/dist/index.js +1 -1120
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1120
- package/dist/index.mjs.map +1 -1
- package/dist/next/index.js +1 -457
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs +1 -457
- package/dist/next/index.mjs.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-SH6A4KBC.mjs +0 -28
- package/dist/chunk-ZY3WOLEP.js +0 -28
- package/dist/chunk-ZY3WOLEP.js.map +0 -1
package/dist/next/index.mjs
CHANGED
|
@@ -1,458 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
get_accessible_routes_default
|
|
3
|
-
} from "../chunk-SH6A4KBC.mjs";
|
|
4
|
-
|
|
5
|
-
// src/base-crud-handler.ts
|
|
6
|
-
import createHttpError5 from "http-errors";
|
|
7
|
-
import { ApiError } from "next/dist/server/api-utils";
|
|
8
|
-
|
|
9
|
-
// src/handler/create.ts
|
|
10
|
-
var createHandler = async ({
|
|
11
|
-
adapter,
|
|
12
|
-
query,
|
|
13
|
-
resourceName,
|
|
14
|
-
request
|
|
15
|
-
}) => {
|
|
16
|
-
const resources = await adapter.create(resourceName, request.body, query);
|
|
17
|
-
return {
|
|
18
|
-
data: resources,
|
|
19
|
-
status: 201
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
var create_default = createHandler;
|
|
23
|
-
|
|
24
|
-
// src/handler/delete.ts
|
|
25
|
-
import createHttpError from "http-errors";
|
|
26
|
-
var deleteHandler = async ({
|
|
27
|
-
adapter,
|
|
28
|
-
query,
|
|
29
|
-
resourceName,
|
|
30
|
-
resourceId
|
|
31
|
-
}) => {
|
|
32
|
-
const resource = await adapter.getOne(resourceName, resourceId, query);
|
|
33
|
-
if (resource) {
|
|
34
|
-
const deletedResource = await adapter.delete(resourceName, resourceId, query);
|
|
35
|
-
return {
|
|
36
|
-
data: deletedResource,
|
|
37
|
-
status: 200
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
throw createHttpError(404, `${resourceName} ${resourceId} not found`);
|
|
41
|
-
};
|
|
42
|
-
var delete_default = deleteHandler;
|
|
43
|
-
|
|
44
|
-
// src/handler/list.ts
|
|
45
|
-
import { paginate } from "@visulima/pagination";
|
|
46
|
-
var listHandler = async ({
|
|
47
|
-
adapter,
|
|
48
|
-
query,
|
|
49
|
-
resourceName,
|
|
50
|
-
pagination
|
|
51
|
-
}) => {
|
|
52
|
-
let isPaginated = false;
|
|
53
|
-
let paginationOptions;
|
|
54
|
-
if ((query == null ? void 0 : query.page) !== void 0) {
|
|
55
|
-
if ((query == null ? void 0 : query.page) <= 0) {
|
|
56
|
-
throw new Error("page query must be a strictly positive number");
|
|
57
|
-
}
|
|
58
|
-
paginationOptions = {
|
|
59
|
-
page: query == null ? void 0 : query.page,
|
|
60
|
-
perPage: (query == null ? void 0 : query.limit) || pagination.perPage
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
if (paginationOptions) {
|
|
64
|
-
isPaginated = true;
|
|
65
|
-
query.skip = (paginationOptions.page - 1) * paginationOptions.perPage;
|
|
66
|
-
query.limit = paginationOptions.perPage;
|
|
67
|
-
}
|
|
68
|
-
const resources = await adapter.getAll(resourceName, query);
|
|
69
|
-
if (isPaginated) {
|
|
70
|
-
const { page, total } = await adapter.getPaginationData(resourceName, query);
|
|
71
|
-
const paginator = paginate(page, paginationOptions.perPage, total, resources);
|
|
72
|
-
return {
|
|
73
|
-
data: paginator.toJSON(),
|
|
74
|
-
status: 200
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
return {
|
|
78
|
-
data: resources,
|
|
79
|
-
status: 200
|
|
80
|
-
};
|
|
81
|
-
};
|
|
82
|
-
var list_default = listHandler;
|
|
83
|
-
|
|
84
|
-
// src/handler/read.ts
|
|
85
|
-
import createHttpError2 from "http-errors";
|
|
86
|
-
var readHandler = async ({
|
|
87
|
-
adapter,
|
|
88
|
-
query,
|
|
89
|
-
resourceName,
|
|
90
|
-
resourceId
|
|
91
|
-
}) => {
|
|
92
|
-
const resource = await adapter.getOne(resourceName, resourceId, query);
|
|
93
|
-
if (!resource) {
|
|
94
|
-
throw createHttpError2(404, `${resourceName} ${resourceId} not found`);
|
|
95
|
-
}
|
|
96
|
-
return {
|
|
97
|
-
data: resource,
|
|
98
|
-
status: 200
|
|
99
|
-
};
|
|
100
|
-
};
|
|
101
|
-
var read_default = readHandler;
|
|
102
|
-
|
|
103
|
-
// src/handler/update.ts
|
|
104
|
-
import createHttpError3 from "http-errors";
|
|
105
|
-
var updateHandler = async ({
|
|
106
|
-
adapter,
|
|
107
|
-
query,
|
|
108
|
-
resourceName,
|
|
109
|
-
resourceId,
|
|
110
|
-
request
|
|
111
|
-
}) => {
|
|
112
|
-
const resource = await adapter.getOne(resourceName, resourceId, query);
|
|
113
|
-
if (resource) {
|
|
114
|
-
const updatedResource = await adapter.update(resourceName, resourceId, request.body, query);
|
|
115
|
-
return {
|
|
116
|
-
status: 201,
|
|
117
|
-
data: updatedResource
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
throw createHttpError3(404, `${resourceName} ${resourceId} not found`);
|
|
121
|
-
};
|
|
122
|
-
var update_default = updateHandler;
|
|
123
|
-
|
|
124
|
-
// src/query-parser.ts
|
|
125
|
-
import set from "lodash.set";
|
|
126
|
-
import { parse } from "qs";
|
|
127
|
-
var parseRecursive = (select) => {
|
|
128
|
-
if (typeof select === "string") {
|
|
129
|
-
const selectFields = {};
|
|
130
|
-
const fields = select.split(",");
|
|
131
|
-
fields.forEach((field) => {
|
|
132
|
-
set(selectFields, field, true);
|
|
133
|
-
});
|
|
134
|
-
return selectFields;
|
|
135
|
-
}
|
|
136
|
-
throw new Error("select query param must be a string");
|
|
137
|
-
};
|
|
138
|
-
var parseWhere = (where) => {
|
|
139
|
-
const whereObject = JSON.parse(where);
|
|
140
|
-
const parsed = {};
|
|
141
|
-
Object.keys(whereObject).forEach((key) => {
|
|
142
|
-
set(parsed, key, whereObject[key]);
|
|
143
|
-
});
|
|
144
|
-
return parsed;
|
|
145
|
-
};
|
|
146
|
-
var parseOrderBy = (orderBy) => {
|
|
147
|
-
const parsed = {};
|
|
148
|
-
const orderByObject = JSON.parse(orderBy);
|
|
149
|
-
if (Object.keys(orderByObject).length > 0) {
|
|
150
|
-
const key = Object.keys(orderByObject)[0];
|
|
151
|
-
if (orderByObject[key] === "$asc" || orderByObject[key] === "$desc") {
|
|
152
|
-
parsed[key] = orderByObject[key];
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
if (Object.keys(parsed).length !== 1) {
|
|
156
|
-
throw new Error("orderBy needs to be an object with exactly 1 property with either $asc or $desc value");
|
|
157
|
-
}
|
|
158
|
-
return parsed;
|
|
159
|
-
};
|
|
160
|
-
var parseQuery = (queryString) => {
|
|
161
|
-
if (queryString) {
|
|
162
|
-
const query = parse(queryString);
|
|
163
|
-
const parsedQuery = {};
|
|
164
|
-
if (query.select) {
|
|
165
|
-
parsedQuery.select = parseRecursive(query.select);
|
|
166
|
-
}
|
|
167
|
-
if (query.include) {
|
|
168
|
-
parsedQuery.include = parseRecursive(query.include);
|
|
169
|
-
}
|
|
170
|
-
if (query.where) {
|
|
171
|
-
parsedQuery.where = parseWhere(query.where);
|
|
172
|
-
}
|
|
173
|
-
if (query.orderBy) {
|
|
174
|
-
parsedQuery.orderBy = parseOrderBy(query.orderBy);
|
|
175
|
-
}
|
|
176
|
-
if (query.limit !== void 0) {
|
|
177
|
-
parsedQuery.limit = Number.isFinite(+query.limit) ? +query.limit : void 0;
|
|
178
|
-
}
|
|
179
|
-
if (query.skip !== void 0) {
|
|
180
|
-
parsedQuery.skip = Number.isFinite(+query.skip) ? +query.skip : void 0;
|
|
181
|
-
}
|
|
182
|
-
if (query.distinct) {
|
|
183
|
-
parsedQuery.distinct = query.distinct;
|
|
184
|
-
}
|
|
185
|
-
if (query.page) {
|
|
186
|
-
parsedQuery.page = Number.isFinite(+query.page) ? +query.page : void 0;
|
|
187
|
-
}
|
|
188
|
-
return {
|
|
189
|
-
originalQuery: query,
|
|
190
|
-
...parsedQuery
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
return {};
|
|
194
|
-
};
|
|
195
|
-
var query_parser_default = parseQuery;
|
|
196
|
-
|
|
197
|
-
// src/utils/format-resource-id.ts
|
|
198
|
-
var formatResourceId = (resourceId) => Number.isSafeInteger(+resourceId) ? +resourceId : resourceId;
|
|
199
|
-
var format_resource_id_default = formatResourceId;
|
|
200
|
-
|
|
201
|
-
// src/utils/get-resource-name-from-url.ts
|
|
202
|
-
var ensureCamelCase = (string_) => `${string_.charAt(0).toLowerCase()}${string_.slice(1)}`;
|
|
203
|
-
var getResourceNameFromUrl = (url, models) => {
|
|
204
|
-
const realPath = url.split("?")[0];
|
|
205
|
-
if (realPath === void 0) {
|
|
206
|
-
throw new TypeError("Path is undefined");
|
|
207
|
-
}
|
|
208
|
-
const modelName = Object.keys(models).find((name) => {
|
|
209
|
-
const routeName = models[name];
|
|
210
|
-
const camelCaseModel = ensureCamelCase(routeName);
|
|
211
|
-
return new RegExp(`(${routeName}|${camelCaseModel}$)|(${routeName}|${camelCaseModel}/)`, "g").test(realPath);
|
|
212
|
-
});
|
|
213
|
-
return {
|
|
214
|
-
modelName,
|
|
215
|
-
resourceName: models[modelName]
|
|
216
|
-
};
|
|
217
|
-
};
|
|
218
|
-
|
|
219
|
-
// src/utils/get-route-type.ts
|
|
220
|
-
import { match } from "path-to-regexp";
|
|
221
|
-
var getRouteType = (method, url, resourceName) => {
|
|
222
|
-
const realPath = url.split("?")[0];
|
|
223
|
-
if (realPath === void 0) {
|
|
224
|
-
throw new TypeError("Path is undefined");
|
|
225
|
-
}
|
|
226
|
-
if (!realPath.includes(`/${resourceName}`)) {
|
|
227
|
-
throw new Error(`invalid resource name '${resourceName}' for route '${realPath}'`);
|
|
228
|
-
}
|
|
229
|
-
const entityMatcher = match([`/(.*)/${resourceName}`, `/(.*)/${resourceName}/:id`], { decode: decodeURIComponent });
|
|
230
|
-
const simpleMatcher = match(`/(.*)/${resourceName}`, {
|
|
231
|
-
decode: decodeURIComponent
|
|
232
|
-
});
|
|
233
|
-
switch (method) {
|
|
234
|
-
case "GET": {
|
|
235
|
-
const pathMatch = entityMatcher(realPath);
|
|
236
|
-
if (pathMatch && pathMatch.params.id) {
|
|
237
|
-
return {
|
|
238
|
-
routeType: "READ_ONE" /* READ_ONE */,
|
|
239
|
-
resourceId: pathMatch.params.id
|
|
240
|
-
};
|
|
241
|
-
}
|
|
242
|
-
return {
|
|
243
|
-
routeType: "READ_ALL" /* READ_ALL */
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
case "POST": {
|
|
247
|
-
const pathMatch = simpleMatcher(realPath);
|
|
248
|
-
if (pathMatch) {
|
|
249
|
-
return {
|
|
250
|
-
routeType: "CREATE" /* CREATE */
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
return {
|
|
254
|
-
routeType: null
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
case "PUT":
|
|
258
|
-
case "PATCH": {
|
|
259
|
-
const pathMatch = entityMatcher(realPath);
|
|
260
|
-
if (pathMatch && pathMatch.params.id) {
|
|
261
|
-
return {
|
|
262
|
-
routeType: "UPDATE" /* UPDATE */,
|
|
263
|
-
resourceId: pathMatch.params.id
|
|
264
|
-
};
|
|
265
|
-
}
|
|
266
|
-
return {
|
|
267
|
-
routeType: null
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
case "DELETE": {
|
|
271
|
-
const pathMatch = entityMatcher(realPath);
|
|
272
|
-
if (pathMatch && pathMatch.params.id) {
|
|
273
|
-
return {
|
|
274
|
-
routeType: "DELETE" /* DELETE */,
|
|
275
|
-
resourceId: pathMatch.params.id
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
return {
|
|
279
|
-
routeType: null
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
default: {
|
|
283
|
-
return {
|
|
284
|
-
routeType: null
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
};
|
|
289
|
-
var get_route_type_default = getRouteType;
|
|
290
|
-
|
|
291
|
-
// src/utils/validate-adapter-methods.ts
|
|
292
|
-
import createHttpError4 from "http-errors";
|
|
293
|
-
var adapterMethods = ["create"];
|
|
294
|
-
var validateAdapterMethods = (adapter) => {
|
|
295
|
-
adapterMethods.forEach((method) => {
|
|
296
|
-
if (!adapter[method]) {
|
|
297
|
-
throw createHttpError4(500, `Adapter must implement the "${method}" method.`);
|
|
298
|
-
}
|
|
299
|
-
});
|
|
300
|
-
};
|
|
301
|
-
var validate_adapter_methods_default = validateAdapterMethods;
|
|
302
|
-
|
|
303
|
-
// src/base-crud-handler.ts
|
|
304
|
-
async function baseHandler(responseExecutor, finalExecutor, adapter, options) {
|
|
305
|
-
var _a, _b;
|
|
306
|
-
try {
|
|
307
|
-
validate_adapter_methods_default(adapter);
|
|
308
|
-
} catch (error_) {
|
|
309
|
-
const error = error_;
|
|
310
|
-
throw new ApiError(error.statusCode, error.message);
|
|
311
|
-
}
|
|
312
|
-
await ((_a = adapter.init) == null ? void 0 : _a.call(adapter));
|
|
313
|
-
const config = {
|
|
314
|
-
formatResourceId: format_resource_id_default,
|
|
315
|
-
pagination: {
|
|
316
|
-
perPage: 20
|
|
317
|
-
},
|
|
318
|
-
...options
|
|
319
|
-
};
|
|
320
|
-
const routeNames = await ((_b = adapter.mapModelsToRouteNames) == null ? void 0 : _b.call(adapter));
|
|
321
|
-
const modelRoutes = {};
|
|
322
|
-
adapter.getModels().forEach((modelName) => {
|
|
323
|
-
var _a2, _b2;
|
|
324
|
-
modelRoutes[modelName] = ((_b2 = (_a2 = config == null ? void 0 : config.models) == null ? void 0 : _a2[modelName]) == null ? void 0 : _b2.name) || (routeNames == null ? void 0 : routeNames[modelName]) || modelName;
|
|
325
|
-
});
|
|
326
|
-
return async (request, responseOrContext) => {
|
|
327
|
-
var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
328
|
-
const { resourceName, modelName } = getResourceNameFromUrl(request.url, modelRoutes);
|
|
329
|
-
if (!resourceName) {
|
|
330
|
-
if (true) {
|
|
331
|
-
const mappedModels = await ((_a2 = adapter.mapModelsToRouteNames) == null ? void 0 : _a2.call(adapter));
|
|
332
|
-
if (typeof mappedModels === "object") {
|
|
333
|
-
throw createHttpError5(404, `Resource not found, possible models: ${Object.values(mappedModels).join(", ")}`);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
throw createHttpError5(404, `Resource not found: ${request.url}`);
|
|
337
|
-
}
|
|
338
|
-
const { routeType, resourceId } = get_route_type_default(request.method, request.url, resourceName);
|
|
339
|
-
if (routeType === null) {
|
|
340
|
-
throw createHttpError5(404, `Route not found: ${request.url}`);
|
|
341
|
-
}
|
|
342
|
-
const modelConfig = (_b2 = options == null ? void 0 : options.models) == null ? void 0 : _b2[modelName];
|
|
343
|
-
const accessibleRoutes = get_accessible_routes_default(modelConfig == null ? void 0 : modelConfig.only, modelConfig == null ? void 0 : modelConfig.exclude, (options == null ? void 0 : options.exposeStrategy) || "all");
|
|
344
|
-
if (!accessibleRoutes.includes(routeType)) {
|
|
345
|
-
throw createHttpError5(404, `Route not found: ${request.url}`);
|
|
346
|
-
}
|
|
347
|
-
try {
|
|
348
|
-
const resourceIdFormatted = ((_c = modelConfig == null ? void 0 : modelConfig.formatResourceId) == null ? void 0 : _c.call(modelConfig, resourceId)) ?? config.formatResourceId(resourceId);
|
|
349
|
-
await ((_d = adapter.connect) == null ? void 0 : _d.call(adapter));
|
|
350
|
-
const parsedQuery = query_parser_default(request.url.split("?")[1]);
|
|
351
|
-
const parameters = {
|
|
352
|
-
adapter,
|
|
353
|
-
query: adapter.parseQuery(modelName, parsedQuery),
|
|
354
|
-
resourceName: modelName
|
|
355
|
-
};
|
|
356
|
-
try {
|
|
357
|
-
let responseConfig;
|
|
358
|
-
switch (routeType) {
|
|
359
|
-
case "READ_ONE" /* READ_ONE */: {
|
|
360
|
-
responseConfig = await (((_e = config == null ? void 0 : config.handlers) == null ? void 0 : _e.get) || read_default)({
|
|
361
|
-
...parameters,
|
|
362
|
-
resourceId: resourceIdFormatted
|
|
363
|
-
});
|
|
364
|
-
break;
|
|
365
|
-
}
|
|
366
|
-
case "READ_ALL" /* READ_ALL */: {
|
|
367
|
-
responseConfig = await (((_f = config == null ? void 0 : config.handlers) == null ? void 0 : _f.list) || list_default)({
|
|
368
|
-
...parameters,
|
|
369
|
-
query: {
|
|
370
|
-
...parameters.query,
|
|
371
|
-
page: parsedQuery.page ? Number(parsedQuery.page) : void 0,
|
|
372
|
-
limit: parsedQuery.limit ? Number(parsedQuery.limit) : void 0
|
|
373
|
-
},
|
|
374
|
-
pagination: config.pagination
|
|
375
|
-
});
|
|
376
|
-
break;
|
|
377
|
-
}
|
|
378
|
-
case "CREATE" /* CREATE */: {
|
|
379
|
-
responseConfig = await (((_g = config == null ? void 0 : config.handlers) == null ? void 0 : _g.create) || create_default)({
|
|
380
|
-
...parameters,
|
|
381
|
-
request
|
|
382
|
-
});
|
|
383
|
-
break;
|
|
384
|
-
}
|
|
385
|
-
case "UPDATE" /* UPDATE */: {
|
|
386
|
-
responseConfig = await (((_h = config == null ? void 0 : config.handlers) == null ? void 0 : _h.update) || update_default)({
|
|
387
|
-
...parameters,
|
|
388
|
-
resourceId: resourceIdFormatted,
|
|
389
|
-
request
|
|
390
|
-
});
|
|
391
|
-
break;
|
|
392
|
-
}
|
|
393
|
-
case "DELETE" /* DELETE */: {
|
|
394
|
-
responseConfig = await (((_i = config == null ? void 0 : config.handlers) == null ? void 0 : _i.delete) || delete_default)({
|
|
395
|
-
...parameters,
|
|
396
|
-
resourceId: resourceIdFormatted
|
|
397
|
-
});
|
|
398
|
-
break;
|
|
399
|
-
}
|
|
400
|
-
default: {
|
|
401
|
-
responseConfig = {
|
|
402
|
-
status: 404,
|
|
403
|
-
data: "Method not found"
|
|
404
|
-
};
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
await responseExecutor(responseOrContext, responseConfig);
|
|
408
|
-
} catch (error) {
|
|
409
|
-
if (adapter.handleError && !(error instanceof ApiError)) {
|
|
410
|
-
adapter.handleError(error);
|
|
411
|
-
} else {
|
|
412
|
-
throw error;
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
} finally {
|
|
416
|
-
await ((_j = adapter.disconnect) == null ? void 0 : _j.call(adapter));
|
|
417
|
-
await finalExecutor(responseOrContext);
|
|
418
|
-
}
|
|
419
|
-
};
|
|
420
|
-
}
|
|
421
|
-
var base_crud_handler_default = baseHandler;
|
|
422
|
-
|
|
423
|
-
// src/next/api/edge/index.ts
|
|
424
|
-
async function handler(adapter, options) {
|
|
425
|
-
return base_crud_handler_default(
|
|
426
|
-
async (_, responseConfig) => new Response(JSON.stringify(responseConfig.data), {
|
|
427
|
-
status: responseConfig.status,
|
|
428
|
-
headers: {
|
|
429
|
-
"content-type": "application/json; charset=utf-8"
|
|
430
|
-
}
|
|
431
|
-
}),
|
|
432
|
-
async () => {
|
|
433
|
-
},
|
|
434
|
-
adapter,
|
|
435
|
-
options
|
|
436
|
-
);
|
|
437
|
-
}
|
|
438
|
-
var edge_default = handler;
|
|
439
|
-
|
|
440
|
-
// src/next/api/node/index.ts
|
|
441
|
-
async function handler2(adapter, options) {
|
|
442
|
-
return base_crud_handler_default(
|
|
443
|
-
async (response, responseConfig) => {
|
|
444
|
-
response.status(responseConfig.status).send(responseConfig.data);
|
|
445
|
-
},
|
|
446
|
-
async (response) => {
|
|
447
|
-
response.end();
|
|
448
|
-
},
|
|
449
|
-
adapter,
|
|
450
|
-
options
|
|
451
|
-
);
|
|
452
|
-
}
|
|
453
|
-
var node_default = handler2;
|
|
454
|
-
export {
|
|
455
|
-
edge_default as edgeHandler,
|
|
456
|
-
node_default as nodeHandler
|
|
457
|
-
};
|
|
1
|
+
import{b as C}from"../chunk-JSOEPRPZ.mjs";import x from"http-errors";import{ApiError as W}from"next/dist/server/api-utils";var G=async({adapter:s,query:e,resourceName:t,request:r})=>({data:await s.create(t,r.body,e),status:201}),k=G;import V from"http-errors";var z=async({adapter:s,query:e,resourceName:t,resourceId:r})=>{if(await s.getOne(t,r,e))return{data:await s.delete(t,r,e),status:200};throw V(404,`${t} ${r} not found`)},v=z;import{paginate as K}from"@visulima/pagination";var X=async({adapter:s,query:e,resourceName:t,pagination:r})=>{let a=!1,o;if((e==null?void 0:e.page)!==void 0){if((e==null?void 0:e.page)<=0)throw new Error("page query must be a strictly positive number");o={page:e==null?void 0:e.page,perPage:(e==null?void 0:e.limit)||r.perPage}}o&&(a=!0,e.skip=(o.page-1)*o.perPage,e.limit=o.perPage);let n=await s.getAll(t,e);if(a){let{page:f,total:y}=await s.getPaginationData(t,e);return{data:K(f,o.perPage,y,n).toJSON(),status:200}}return{data:n,status:200}},N=X;import Y from"http-errors";var Z=async({adapter:s,query:e,resourceName:t,resourceId:r})=>{let a=await s.getOne(t,r,e);if(!a)throw Y(404,`${t} ${r} not found`);return{data:a,status:200}},F=Z;import q from"http-errors";var ee=async({adapter:s,query:e,resourceName:t,resourceId:r,request:a})=>{if(await s.getOne(t,r,e))return{status:201,data:await s.update(t,r,a.body,e)};throw q(404,`${t} ${r} not found`)},j=ee;import B from"lodash.set";import{parse as te}from"qs";var U=s=>{if(typeof s=="string"){let e={};return s.split(",").forEach(r=>{B(e,r,!0)}),e}throw new Error("select query param must be a string")},re=s=>{let e=JSON.parse(s),t={};return Object.keys(e).forEach(r=>{B(t,r,e[r])}),t},se=s=>{let e={},t=JSON.parse(s);if(Object.keys(t).length>0){let r=Object.keys(t)[0];(t[r]==="$asc"||t[r]==="$desc")&&(e[r]=t[r])}if(Object.keys(e).length!==1)throw new Error("orderBy needs to be an object with exactly 1 property with either $asc or $desc value");return e},ae=s=>{if(s){let e=te(s),t={};return e.select&&(t.select=U(e.select)),e.include&&(t.include=U(e.include)),e.where&&(t.where=re(e.where)),e.orderBy&&(t.orderBy=se(e.orderBy)),e.limit!==void 0&&(t.limit=Number.isFinite(+e.limit)?+e.limit:void 0),e.skip!==void 0&&(t.skip=Number.isFinite(+e.skip)?+e.skip:void 0),e.distinct&&(t.distinct=e.distinct),e.page&&(t.page=Number.isFinite(+e.page)?+e.page:void 0),{originalQuery:e,...t}}return{}},D=ae;var ne=s=>Number.isSafeInteger(+s)?+s:s,I=ne;var oe=s=>`${s.charAt(0).toLowerCase()}${s.slice(1)}`,L=(s,e)=>{let t=s.split("?")[0];if(t===void 0)throw new TypeError("Path is undefined");let r=Object.keys(e).find(a=>{let o=e[a],n=oe(o);return new RegExp(`(${o}|${n}$)|(${o}|${n}/)`,"g").test(t)});return{modelName:r,resourceName:e[r]}};import{match as S}from"path-to-regexp";var ie=(s,e,t)=>{let r=e.split("?")[0];if(r===void 0)throw new TypeError("Path is undefined");if(!r.includes(`/${t}`))throw new Error(`invalid resource name '${t}' for route '${r}'`);let a=S([`/(.*)/${t}`,`/(.*)/${t}/:id`],{decode:decodeURIComponent}),o=S(`/(.*)/${t}`,{decode:decodeURIComponent});switch(s){case"GET":{let n=a(r);return n&&n.params.id?{routeType:"READ_ONE",resourceId:n.params.id}:{routeType:"READ_ALL"}}case"POST":return o(r)?{routeType:"CREATE"}:{routeType:null};case"PUT":case"PATCH":{let n=a(r);return n&&n.params.id?{routeType:"UPDATE",resourceId:n.params.id}:{routeType:null}}case"DELETE":{let n=a(r);return n&&n.params.id?{routeType:"DELETE",resourceId:n.params.id}:{routeType:null}}default:return{routeType:null}}},_=ie;import de from"http-errors";var pe=["create"],ue=s=>{pe.forEach(e=>{if(!s[e])throw de(500,`Adapter must implement the "${e}" method.`)})},J=ue;async function ce(s,e,t,r){var f,y;try{J(t)}catch(i){let u=i;throw new W(u.statusCode,u.message)}await((f=t.init)==null?void 0:f.call(t));let a={formatResourceId:I,pagination:{perPage:20},...r},o=await((y=t.mapModelsToRouteNames)==null?void 0:y.call(t)),n={};return t.getModels().forEach(i=>{var u,l;n[i]=((l=(u=a==null?void 0:a.models)==null?void 0:u[i])==null?void 0:l.name)||(o==null?void 0:o[i])||i}),async(i,u)=>{var H,E,w,b,Q,O,M,A,$;let{resourceName:l,modelName:P}=L(i.url,n);if(!l)throw x(404,`Resource not found: ${i.url}`);let{routeType:h,resourceId:T}=_(i.method,i.url,l);if(h===null)throw x(404,`Route not found: ${i.url}`);let d=(H=r==null?void 0:r.models)==null?void 0:H[P];if(!C(d==null?void 0:d.only,d==null?void 0:d.exclude,(r==null?void 0:r.exposeStrategy)||"all").includes(h))throw x(404,`Route not found: ${i.url}`);try{let R=((E=d==null?void 0:d.formatResourceId)==null?void 0:E.call(d,T))??a.formatResourceId(T);await((w=t.connect)==null?void 0:w.call(t));let m=D(i.url.split("?")[1]),c={adapter:t,query:t.parseQuery(P,m),resourceName:P};try{let p;switch(h){case"READ_ONE":{p=await(((b=a==null?void 0:a.handlers)==null?void 0:b.get)||F)({...c,resourceId:R});break}case"READ_ALL":{p=await(((Q=a==null?void 0:a.handlers)==null?void 0:Q.list)||N)({...c,query:{...c.query,page:m.page?Number(m.page):void 0,limit:m.limit?Number(m.limit):void 0},pagination:a.pagination});break}case"CREATE":{p=await(((O=a==null?void 0:a.handlers)==null?void 0:O.create)||k)({...c,request:i});break}case"UPDATE":{p=await(((M=a==null?void 0:a.handlers)==null?void 0:M.update)||j)({...c,resourceId:R,request:i});break}case"DELETE":{p=await(((A=a==null?void 0:a.handlers)==null?void 0:A.delete)||v)({...c,resourceId:R});break}default:p={status:404,data:"Method not found"}}await s(u,p)}catch(p){if(t.handleError&&!(p instanceof W))t.handleError(p);else throw p}}finally{await(($=t.disconnect)==null?void 0:$.call(t)),await e(u)}}}var g=ce;async function le(s,e){return g(async(t,r)=>new Response(JSON.stringify(r.data),{status:r.status,headers:{"content-type":"application/json; charset=utf-8"}}),async()=>{},s,e)}var me=le;async function fe(s,e){return g(async(t,r)=>{t.status(r.status).send(r.data)},async t=>{t.end()},s,e)}var ye=fe;export{me as edgeHandler,ye as nodeHandler};
|
|
458
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/next/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/base-crud-handler.ts","../../src/handler/create.ts","../../src/handler/delete.ts","../../src/handler/list.ts","../../src/handler/read.ts","../../src/handler/update.ts","../../src/query-parser.ts","../../src/utils/format-resource-id.ts","../../src/utils/get-resource-name-from-url.ts","../../src/utils/get-route-type.ts","../../src/utils/validate-adapter-methods.ts","../../src/next/api/edge/index.ts","../../src/next/api/node/index.ts"],"sourcesContent":["import type { HttpError } from \"http-errors\";\nimport createHttpError from \"http-errors\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { ApiError } from \"next/dist/server/api-utils\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport createHandler from \"./handler/create\";\nimport deleteHandler from \"./handler/delete\";\nimport listHandler from \"./handler/list\";\nimport readHandler from \"./handler/read\";\nimport updateHandler from \"./handler/update\";\nimport parseQuery from \"./query-parser\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, HandlerParameters, ParsedQueryParameters,\n} from \"./types.d\";\nimport { RouteType } from \"./types.d\";\nimport formatResourceId from \"./utils/format-resource-id\";\nimport getAccessibleRoutes from \"./utils/get-accessible-routes\";\nimport { getResourceNameFromUrl } from \"./utils/get-resource-name-from-url\";\nimport getRouteType from \"./utils/get-route-type\";\nimport validateAdapterMethods from \"./utils/validate-adapter-methods\";\n\ntype ResponseConfig = { status: number; data: any };\n\nasync function baseHandler<R extends Request, Context extends unknown, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: Context, responseConfig: ResponseConfig) => Promise<Response>,\n finalExecutor: (responseOrContext: Context) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, Context>>;\n\nasync function baseHandler<R extends IncomingMessage, RResponse extends ServerResponse, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: RResponse, responseConfig: ResponseConfig) => Promise<void>,\n finalExecutor: (responseOrContext: RResponse) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, RResponse>>;\n\n// eslint-disable-next-line radar/cognitive-complexity,max-len\nasync function baseHandler<R extends { url: string; method: string }, RResponse, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: RResponse, responseConfig: ResponseConfig) => Promise<RResponse>,\n finalExecutor: (responseOrContext: RResponse) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, RResponse>> {\n try {\n validateAdapterMethods(adapter);\n } catch (error_: any) {\n const error = error_ as HttpError;\n\n throw new ApiError(error.statusCode, error.message);\n }\n\n await adapter.init?.();\n\n const config = {\n formatResourceId,\n pagination: {\n perPage: 20,\n },\n ...options,\n };\n\n const routeNames = await adapter.mapModelsToRouteNames?.();\n const modelRoutes: { [key in M]?: string } = {};\n\n adapter.getModels().forEach((modelName) => {\n modelRoutes[modelName as M] = config?.models?.[modelName as M]?.name || routeNames?.[modelName] || modelName;\n });\n\n return async (request, responseOrContext) => {\n const { resourceName, modelName } = getResourceNameFromUrl(request.url as string, modelRoutes);\n\n if (!resourceName) {\n if (process.env.NODE_ENV === \"development\") {\n const mappedModels = await adapter.mapModelsToRouteNames?.();\n\n if (typeof mappedModels === \"object\") {\n throw createHttpError(404, `Resource not found, possible models: ${Object.values(mappedModels).join(\", \")}`);\n }\n }\n\n throw createHttpError(404, `Resource not found: ${request.url}`);\n }\n\n const { routeType, resourceId } = getRouteType(request.method as string, request.url as string, resourceName);\n\n if (routeType === null) {\n throw createHttpError(404, `Route not found: ${request.url}`);\n }\n\n const modelConfig = options?.models?.[modelName as M];\n\n const accessibleRoutes = getAccessibleRoutes(modelConfig?.only, modelConfig?.exclude, options?.exposeStrategy || \"all\");\n\n if (!accessibleRoutes.includes(routeType)) {\n throw createHttpError(404, `Route not found: ${request.url}`);\n }\n\n try {\n const resourceIdFormatted = modelConfig?.formatResourceId?.(resourceId as string) ?? config.formatResourceId(resourceId as string);\n\n await adapter.connect?.();\n\n const parsedQuery = parseQuery((request.url as string).split(\"?\")[1]);\n const parameters: HandlerParameters<T, Q> = {\n adapter,\n query: adapter.parseQuery(modelName as M, parsedQuery),\n resourceName: modelName as string,\n };\n\n try {\n let responseConfig: ResponseConfig;\n\n switch (routeType) {\n case RouteType.READ_ONE: {\n responseConfig = await (config?.handlers?.get || readHandler)<T, Q>({\n ...parameters,\n resourceId: resourceIdFormatted,\n });\n break;\n }\n case RouteType.READ_ALL: {\n responseConfig = await (config?.handlers?.list || listHandler)<T, Q>({\n ...parameters,\n query: {\n ...parameters.query,\n page: parsedQuery.page ? Number(parsedQuery.page) : undefined,\n limit: parsedQuery.limit ? Number(parsedQuery.limit) : undefined,\n },\n pagination: config.pagination,\n });\n break;\n }\n case RouteType.CREATE: {\n responseConfig = await (config?.handlers?.create || createHandler)<T, Q, R>({\n ...parameters,\n request: request as R & { body: Record<string, any> },\n });\n break;\n }\n case RouteType.UPDATE: {\n responseConfig = await (config?.handlers?.update || updateHandler)<T, Q, R>({\n ...parameters,\n resourceId: resourceIdFormatted,\n request: request as R & { body: Partial<T> },\n });\n break;\n }\n case RouteType.DELETE: {\n responseConfig = await (config?.handlers?.delete || deleteHandler)<T, Q>({\n ...parameters,\n resourceId: resourceIdFormatted,\n });\n break;\n }\n default: {\n responseConfig = {\n status: 404,\n data: \"Method not found\",\n };\n }\n }\n\n await responseExecutor(responseOrContext, responseConfig);\n } catch (error: any) {\n if (adapter.handleError && !(error instanceof ApiError)) {\n adapter.handleError(error);\n } else {\n throw error;\n }\n }\n } finally {\n await adapter.disconnect?.();\n\n await finalExecutor(responseOrContext);\n }\n };\n}\n\nexport default baseHandler;\n","import type { HandlerParameters } from \"../types.d\";\n\nconst createHandler: Handler = async ({\n adapter, query, resourceName, request,\n}) => {\n const resources = await adapter.create(resourceName, request.body, query);\n\n return {\n data: resources,\n status: 201,\n };\n};\n\nexport type Handler = <T, Q, Request>(\n parameters: HandlerParameters<T, Q> & { request: Request & { body: Record<string, any> } },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default createHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst deleteHandler: Handler = async ({\n adapter, query, resourceName, resourceId,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (resource) {\n const deletedResource = await adapter.delete(resourceName, resourceId, query);\n\n return {\n data: deletedResource,\n status: 200,\n };\n }\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n};\n\nexport type Handler = <T, Q>(\n parameters: UniqueResourceHandlerParameters<T, Q>,\n) => Promise<{\n data: any;\n status: number;\n}>;\nexport default deleteHandler;\n","import { paginate } from \"@visulima/pagination\";\n\nimport type { HandlerParameters, PaginationConfig, ParsedQueryParameters } from \"../types.d\";\n\ntype PaginationOptions = {\n page: number;\n perPage: number;\n};\n\nconst listHandler: Handler = async ({\n adapter, query, resourceName, pagination,\n}) => {\n let isPaginated = false;\n let paginationOptions: PaginationOptions | undefined;\n\n if (query?.page !== undefined) {\n if (query?.page <= 0) {\n throw new Error(\"page query must be a strictly positive number\");\n }\n\n paginationOptions = {\n page: query?.page,\n perPage: query?.limit || pagination.perPage,\n };\n }\n\n if (paginationOptions) {\n isPaginated = true;\n\n // eslint-disable-next-line no-param-reassign\n query.skip = (paginationOptions.page - 1) * paginationOptions.perPage;\n // eslint-disable-next-line no-param-reassign\n query.limit = paginationOptions.perPage;\n }\n\n const resources = await adapter.getAll(resourceName, query);\n\n if (isPaginated) {\n const { page, total } = await adapter.getPaginationData(resourceName, query);\n\n const paginator = paginate(page, (paginationOptions as PaginationOptions).perPage as number, total, resources);\n\n return {\n data: paginator.toJSON(),\n status: 200,\n };\n }\n\n return {\n data: resources,\n status: 200,\n };\n};\n\nexport type Handler = <T, Q extends ParsedQueryParameters>(\n parameters: HandlerParameters<T, Q> & { pagination: PaginationConfig },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default listHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst readHandler: Handler = async ({\n adapter, query, resourceName, resourceId,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (!resource) {\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n }\n\n return {\n data: resource,\n status: 200,\n };\n};\n\nexport type Handler = <T, Q>(\n parameters: UniqueResourceHandlerParameters<T, Q>,\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default readHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst updateHandler: Handler = async ({\n adapter, query, resourceName, resourceId, request,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (resource) {\n const updatedResource = await adapter.update(resourceName, resourceId, request.body, query);\n\n return {\n status: 201,\n data: updatedResource,\n };\n }\n\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n};\n\nexport type Handler = <T, Q, Request>(\n parameters: UniqueResourceHandlerParameters<T, Q> & { request: Request & { body: Partial<T> } },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default updateHandler;\n","import set from \"lodash.set\";\nimport { parse } from \"qs\";\n\nimport type {\n OrderByField, ParsedQueryParameters, RecursiveField, WhereField,\n} from \"./types.d\";\n\nconst parseRecursive = (select: string): RecursiveField => {\n if (typeof select === \"string\") {\n const selectFields: RecursiveField = {};\n\n const fields = select.split(\",\");\n\n fields.forEach((field) => {\n set(selectFields, field, true);\n });\n\n return selectFields;\n }\n\n throw new Error(\"select query param must be a string\");\n};\n\nconst parseWhere = (where: string): WhereField => {\n const whereObject = JSON.parse(where);\n const parsed: WhereField = {};\n\n Object.keys(whereObject).forEach((key) => {\n set(parsed, key, whereObject[key]);\n });\n\n return parsed;\n};\n\nconst parseOrderBy = (orderBy: string): OrderByField => {\n const parsed: OrderByField = {};\n const orderByObject = JSON.parse(orderBy);\n\n if (Object.keys(orderByObject).length > 0) {\n const key = Object.keys(orderByObject)[0];\n\n if (orderByObject[key as keyof typeof orderByObject] === \"$asc\" || orderByObject[key as keyof typeof orderByObject] === \"$desc\") {\n parsed[key as string] = orderByObject[key as keyof typeof orderByObject];\n }\n }\n\n if (Object.keys(parsed).length !== 1) {\n throw new Error(\"orderBy needs to be an object with exactly 1 property with either $asc or $desc value\");\n }\n\n return parsed;\n};\n\n// eslint-disable-next-line radar/cognitive-complexity\nconst parseQuery = (queryString?: string): ParsedQueryParameters => {\n if (queryString) {\n const query = parse(queryString);\n const parsedQuery: ParsedQueryParameters = {};\n\n if (query.select) {\n parsedQuery.select = parseRecursive(query.select as string);\n }\n if (query.include) {\n parsedQuery.include = parseRecursive(query.include as string);\n }\n if (query.where) {\n parsedQuery.where = parseWhere(query.where as string);\n }\n if (query.orderBy) {\n parsedQuery.orderBy = parseOrderBy(query.orderBy as string);\n }\n if (query.limit !== undefined) {\n parsedQuery.limit = Number.isFinite(+query.limit) ? +query.limit : undefined;\n }\n if (query.skip !== undefined) {\n parsedQuery.skip = Number.isFinite(+query.skip) ? +query.skip : undefined;\n }\n if (query.distinct) {\n parsedQuery.distinct = query.distinct as string;\n }\n if (query.page) {\n parsedQuery.page = Number.isFinite(+query.page) ? +query.page : undefined;\n }\n\n return {\n originalQuery: query,\n ...parsedQuery,\n };\n }\n\n return {};\n};\n\nexport default parseQuery;\n","const formatResourceId = (resourceId: string): string | number => (Number.isSafeInteger(+resourceId) ? +resourceId : resourceId);\n\nexport default formatResourceId;\n","export const ensureCamelCase = (string_: string) => `${string_.charAt(0).toLowerCase()}${string_.slice(1)}`;\n\nexport const getResourceNameFromUrl = <M extends string = string>(url: string, models: { [key in M]?: string }) => {\n // Exclude the query params from the path\n const realPath = url.split(\"?\")[0];\n\n if (realPath === undefined) {\n throw new TypeError(\"Path is undefined\");\n }\n\n const modelName = (Object.keys(models) as M[]).find((name) => {\n const routeName = models[name] as string;\n const camelCaseModel = ensureCamelCase(routeName);\n\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n return new RegExp(`(${routeName}|${camelCaseModel}$)|(${routeName}|${camelCaseModel}/)`, \"g\").test(realPath);\n });\n\n return {\n modelName,\n resourceName: models[modelName] as string,\n };\n};\n","import { match } from \"path-to-regexp\";\n\nimport { RouteType } from \"../types.d\";\n\ntype PathMatch = { id: string };\n\nconst getRouteType: (\n method: string,\n url: string,\n resourceName: string,\n) => GetRouteType = (method, url, resourceName) => {\n // Exclude the query params from the path\n const realPath = url.split(\"?\")[0];\n\n if (realPath === undefined) {\n throw new TypeError(\"Path is undefined\");\n }\n\n if (!realPath.includes(`/${resourceName}`)) {\n throw new Error(`invalid resource name '${resourceName}' for route '${realPath}'`);\n }\n\n const entityMatcher = match<PathMatch>([`/(.*)/${resourceName}`, `/(.*)/${resourceName}/:id`], { decode: decodeURIComponent });\n const simpleMatcher = match(`/(.*)/${resourceName}`, {\n decode: decodeURIComponent,\n });\n\n switch (method) {\n case \"GET\": {\n const pathMatch = entityMatcher(realPath);\n\n // If we got a /something after the resource name, we are reading 1 entity\n if (pathMatch && pathMatch.params.id) {\n return {\n routeType: RouteType.READ_ONE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: RouteType.READ_ALL,\n };\n }\n case \"POST\": {\n const pathMatch = simpleMatcher(realPath);\n\n if (pathMatch) {\n return {\n routeType: RouteType.CREATE,\n };\n }\n\n return {\n routeType: null,\n };\n }\n case \"PUT\":\n case \"PATCH\": {\n const pathMatch = entityMatcher(realPath);\n\n if (pathMatch && pathMatch.params.id) {\n return {\n routeType: RouteType.UPDATE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: null,\n };\n }\n case \"DELETE\": {\n const pathMatch = entityMatcher(realPath);\n\n if (pathMatch && pathMatch.params.id) {\n return {\n routeType: RouteType.DELETE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: null,\n };\n }\n default: {\n return {\n routeType: null,\n };\n }\n }\n};\n\nexport type GetRouteType = {\n routeType: RouteType | null;\n resourceId?: string;\n};\n\nexport default getRouteType;\n","import createHttpError from \"http-errors\";\n\nimport type { Adapter } from \"../types.d\";\n\nconst adapterMethods = [\"create\" || \"delete\" || \"getAll\" || \"getOne\" || \"parseQuery\" || \"update\" || \"getPaginationData\" || \"getModels\"];\n\nconst validateAdapterMethods = <T, Q>(adapter: Adapter<T, Q>) => {\n adapterMethods.forEach((method) => {\n if (!adapter[method as keyof Adapter<T, Q>]) {\n throw createHttpError(500, `Adapter must implement the \"${method}\" method.`);\n }\n });\n};\n\nexport default validateAdapterMethods;\n","import baseHandler from \"../../../base-crud-handler\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, ParsedQueryParameters,\n} from \"../../../types.d\";\n\nasync function handler<T, R extends Request, Context, Q extends ParsedQueryParameters = any, M extends string = string>(\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, Context>> {\n return baseHandler<R, Context, T, Q, M>(\n async (_, responseConfig) => new Response(JSON.stringify(responseConfig.data), {\n status: responseConfig.status,\n headers: {\n \"content-type\": \"application/json; charset=utf-8\",\n },\n }),\n async () => {},\n adapter,\n options,\n );\n}\n\nexport default handler;\n","import type { NextApiRequest, NextApiResponse } from \"next\";\n\nimport baseHandler from \"../../../base-crud-handler\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, ParsedQueryParameters,\n} from \"../../../types.d\";\n\nasync function handler<\n T,\n Q extends ParsedQueryParameters = any,\n R extends NextApiRequest = NextApiRequest,\n Response extends NextApiResponse = NextApiResponse,\n M extends string = string,\n>(adapter: Adapter<T, Q>, options?: HandlerOptions<M>): Promise<ExecuteHandler<R, Response>> {\n return baseHandler<R, Response, T, Q, M>(\n async (response, responseConfig) => {\n response.status(responseConfig.status).send(responseConfig.data);\n },\n async (response) => {\n (response as Response).end();\n },\n adapter,\n options,\n );\n}\n\nexport default handler;\n"],"mappings":"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","names":["createHttpError","createHttpError","createHttpError","createHttpError","_a","_b","createHttpError","handler"]}
|
|
1
|
+
{"version":3,"sources":["../../src/base-crud-handler.ts","../../src/handler/create.ts","../../src/handler/delete.ts","../../src/handler/list.ts","../../src/handler/read.ts","../../src/handler/update.ts","../../src/query-parser.ts","../../src/utils/format-resource-id.ts","../../src/utils/get-resource-name-from-url.ts","../../src/utils/get-route-type.ts","../../src/utils/validate-adapter-methods.ts","../../src/next/api/edge/index.ts","../../src/next/api/node/index.ts"],"sourcesContent":["import type { HttpError } from \"http-errors\";\nimport createHttpError from \"http-errors\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { ApiError } from \"next/dist/server/api-utils\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport createHandler from \"./handler/create\";\nimport deleteHandler from \"./handler/delete\";\nimport listHandler from \"./handler/list\";\nimport readHandler from \"./handler/read\";\nimport updateHandler from \"./handler/update\";\nimport parseQuery from \"./query-parser\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, HandlerParameters, ParsedQueryParameters,\n} from \"./types.d\";\nimport { RouteType } from \"./types.d\";\nimport formatResourceId from \"./utils/format-resource-id\";\nimport getAccessibleRoutes from \"./utils/get-accessible-routes\";\nimport { getResourceNameFromUrl } from \"./utils/get-resource-name-from-url\";\nimport getRouteType from \"./utils/get-route-type\";\nimport validateAdapterMethods from \"./utils/validate-adapter-methods\";\n\ntype ResponseConfig = { status: number; data: any };\n\nasync function baseHandler<R extends Request, Context extends unknown, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: Context, responseConfig: ResponseConfig) => Promise<Response>,\n finalExecutor: (responseOrContext: Context) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, Context>>;\n\nasync function baseHandler<R extends IncomingMessage, RResponse extends ServerResponse, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: RResponse, responseConfig: ResponseConfig) => Promise<void>,\n finalExecutor: (responseOrContext: RResponse) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, RResponse>>;\n\n// eslint-disable-next-line radar/cognitive-complexity,max-len\nasync function baseHandler<R extends { url: string; method: string }, RResponse, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: RResponse, responseConfig: ResponseConfig) => Promise<RResponse>,\n finalExecutor: (responseOrContext: RResponse) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, RResponse>> {\n try {\n validateAdapterMethods(adapter);\n } catch (error_: any) {\n const error = error_ as HttpError;\n\n throw new ApiError(error.statusCode, error.message);\n }\n\n await adapter.init?.();\n\n const config = {\n formatResourceId,\n pagination: {\n perPage: 20,\n },\n ...options,\n };\n\n const routeNames = await adapter.mapModelsToRouteNames?.();\n const modelRoutes: { [key in M]?: string } = {};\n\n adapter.getModels().forEach((modelName) => {\n modelRoutes[modelName as M] = config?.models?.[modelName as M]?.name || routeNames?.[modelName] || modelName;\n });\n\n return async (request, responseOrContext) => {\n const { resourceName, modelName } = getResourceNameFromUrl(request.url as string, modelRoutes);\n\n if (!resourceName) {\n if (process.env.NODE_ENV === \"development\") {\n const mappedModels = await adapter.mapModelsToRouteNames?.();\n\n if (typeof mappedModels === \"object\") {\n throw createHttpError(404, `Resource not found, possible models: ${Object.values(mappedModels).join(\", \")}`);\n }\n }\n\n throw createHttpError(404, `Resource not found: ${request.url}`);\n }\n\n const { routeType, resourceId } = getRouteType(request.method as string, request.url as string, resourceName);\n\n if (routeType === null) {\n throw createHttpError(404, `Route not found: ${request.url}`);\n }\n\n const modelConfig = options?.models?.[modelName as M];\n\n const accessibleRoutes = getAccessibleRoutes(modelConfig?.only, modelConfig?.exclude, options?.exposeStrategy || \"all\");\n\n if (!accessibleRoutes.includes(routeType)) {\n throw createHttpError(404, `Route not found: ${request.url}`);\n }\n\n try {\n const resourceIdFormatted = modelConfig?.formatResourceId?.(resourceId as string) ?? config.formatResourceId(resourceId as string);\n\n await adapter.connect?.();\n\n const parsedQuery = parseQuery((request.url as string).split(\"?\")[1]);\n const parameters: HandlerParameters<T, Q> = {\n adapter,\n query: adapter.parseQuery(modelName as M, parsedQuery),\n resourceName: modelName as string,\n };\n\n try {\n let responseConfig: ResponseConfig;\n\n switch (routeType) {\n case RouteType.READ_ONE: {\n responseConfig = await (config?.handlers?.get || readHandler)<T, Q>({\n ...parameters,\n resourceId: resourceIdFormatted,\n });\n break;\n }\n case RouteType.READ_ALL: {\n responseConfig = await (config?.handlers?.list || listHandler)<T, Q>({\n ...parameters,\n query: {\n ...parameters.query,\n page: parsedQuery.page ? Number(parsedQuery.page) : undefined,\n limit: parsedQuery.limit ? Number(parsedQuery.limit) : undefined,\n },\n pagination: config.pagination,\n });\n break;\n }\n case RouteType.CREATE: {\n responseConfig = await (config?.handlers?.create || createHandler)<T, Q, R>({\n ...parameters,\n request: request as R & { body: Record<string, any> },\n });\n break;\n }\n case RouteType.UPDATE: {\n responseConfig = await (config?.handlers?.update || updateHandler)<T, Q, R>({\n ...parameters,\n resourceId: resourceIdFormatted,\n request: request as R & { body: Partial<T> },\n });\n break;\n }\n case RouteType.DELETE: {\n responseConfig = await (config?.handlers?.delete || deleteHandler)<T, Q>({\n ...parameters,\n resourceId: resourceIdFormatted,\n });\n break;\n }\n default: {\n responseConfig = {\n status: 404,\n data: \"Method not found\",\n };\n }\n }\n\n await responseExecutor(responseOrContext, responseConfig);\n } catch (error: any) {\n if (adapter.handleError && !(error instanceof ApiError)) {\n adapter.handleError(error);\n } else {\n throw error;\n }\n }\n } finally {\n await adapter.disconnect?.();\n\n await finalExecutor(responseOrContext);\n }\n };\n}\n\nexport default baseHandler;\n","import type { HandlerParameters } from \"../types.d\";\n\nconst createHandler: Handler = async ({\n adapter, query, resourceName, request,\n}) => {\n const resources = await adapter.create(resourceName, request.body, query);\n\n return {\n data: resources,\n status: 201,\n };\n};\n\nexport type Handler = <T, Q, Request>(\n parameters: HandlerParameters<T, Q> & { request: Request & { body: Record<string, any> } },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default createHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst deleteHandler: Handler = async ({\n adapter, query, resourceName, resourceId,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (resource) {\n const deletedResource = await adapter.delete(resourceName, resourceId, query);\n\n return {\n data: deletedResource,\n status: 200,\n };\n }\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n};\n\nexport type Handler = <T, Q>(\n parameters: UniqueResourceHandlerParameters<T, Q>,\n) => Promise<{\n data: any;\n status: number;\n}>;\nexport default deleteHandler;\n","import { paginate } from \"@visulima/pagination\";\n\nimport type { HandlerParameters, PaginationConfig, ParsedQueryParameters } from \"../types.d\";\n\ntype PaginationOptions = {\n page: number;\n perPage: number;\n};\n\nconst listHandler: Handler = async ({\n adapter, query, resourceName, pagination,\n}) => {\n let isPaginated = false;\n let paginationOptions: PaginationOptions | undefined;\n\n if (query?.page !== undefined) {\n if (query?.page <= 0) {\n throw new Error(\"page query must be a strictly positive number\");\n }\n\n paginationOptions = {\n page: query?.page,\n perPage: query?.limit || pagination.perPage,\n };\n }\n\n if (paginationOptions) {\n isPaginated = true;\n\n // eslint-disable-next-line no-param-reassign\n query.skip = (paginationOptions.page - 1) * paginationOptions.perPage;\n // eslint-disable-next-line no-param-reassign\n query.limit = paginationOptions.perPage;\n }\n\n const resources = await adapter.getAll(resourceName, query);\n\n if (isPaginated) {\n const { page, total } = await adapter.getPaginationData(resourceName, query);\n\n const paginator = paginate(page, (paginationOptions as PaginationOptions).perPage as number, total, resources);\n\n return {\n data: paginator.toJSON(),\n status: 200,\n };\n }\n\n return {\n data: resources,\n status: 200,\n };\n};\n\nexport type Handler = <T, Q extends ParsedQueryParameters>(\n parameters: HandlerParameters<T, Q> & { pagination: PaginationConfig },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default listHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst readHandler: Handler = async ({\n adapter, query, resourceName, resourceId,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (!resource) {\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n }\n\n return {\n data: resource,\n status: 200,\n };\n};\n\nexport type Handler = <T, Q>(\n parameters: UniqueResourceHandlerParameters<T, Q>,\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default readHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst updateHandler: Handler = async ({\n adapter, query, resourceName, resourceId, request,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (resource) {\n const updatedResource = await adapter.update(resourceName, resourceId, request.body, query);\n\n return {\n status: 201,\n data: updatedResource,\n };\n }\n\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n};\n\nexport type Handler = <T, Q, Request>(\n parameters: UniqueResourceHandlerParameters<T, Q> & { request: Request & { body: Partial<T> } },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default updateHandler;\n","import set from \"lodash.set\";\nimport { parse } from \"qs\";\n\nimport type {\n OrderByField, ParsedQueryParameters, RecursiveField, WhereField,\n} from \"./types.d\";\n\nconst parseRecursive = (select: string): RecursiveField => {\n if (typeof select === \"string\") {\n const selectFields: RecursiveField = {};\n\n const fields = select.split(\",\");\n\n fields.forEach((field) => {\n set(selectFields, field, true);\n });\n\n return selectFields;\n }\n\n throw new Error(\"select query param must be a string\");\n};\n\nconst parseWhere = (where: string): WhereField => {\n const whereObject = JSON.parse(where);\n const parsed: WhereField = {};\n\n Object.keys(whereObject).forEach((key) => {\n set(parsed, key, whereObject[key]);\n });\n\n return parsed;\n};\n\nconst parseOrderBy = (orderBy: string): OrderByField => {\n const parsed: OrderByField = {};\n const orderByObject = JSON.parse(orderBy);\n\n if (Object.keys(orderByObject).length > 0) {\n const key = Object.keys(orderByObject)[0];\n\n if (orderByObject[key as keyof typeof orderByObject] === \"$asc\" || orderByObject[key as keyof typeof orderByObject] === \"$desc\") {\n parsed[key as string] = orderByObject[key as keyof typeof orderByObject];\n }\n }\n\n if (Object.keys(parsed).length !== 1) {\n throw new Error(\"orderBy needs to be an object with exactly 1 property with either $asc or $desc value\");\n }\n\n return parsed;\n};\n\n// eslint-disable-next-line radar/cognitive-complexity\nconst parseQuery = (queryString?: string): ParsedQueryParameters => {\n if (queryString) {\n const query = parse(queryString);\n const parsedQuery: ParsedQueryParameters = {};\n\n if (query.select) {\n parsedQuery.select = parseRecursive(query.select as string);\n }\n if (query.include) {\n parsedQuery.include = parseRecursive(query.include as string);\n }\n if (query.where) {\n parsedQuery.where = parseWhere(query.where as string);\n }\n if (query.orderBy) {\n parsedQuery.orderBy = parseOrderBy(query.orderBy as string);\n }\n if (query.limit !== undefined) {\n parsedQuery.limit = Number.isFinite(+query.limit) ? +query.limit : undefined;\n }\n if (query.skip !== undefined) {\n parsedQuery.skip = Number.isFinite(+query.skip) ? +query.skip : undefined;\n }\n if (query.distinct) {\n parsedQuery.distinct = query.distinct as string;\n }\n if (query.page) {\n parsedQuery.page = Number.isFinite(+query.page) ? +query.page : undefined;\n }\n\n return {\n originalQuery: query,\n ...parsedQuery,\n };\n }\n\n return {};\n};\n\nexport default parseQuery;\n","const formatResourceId = (resourceId: string): string | number => (Number.isSafeInteger(+resourceId) ? +resourceId : resourceId);\n\nexport default formatResourceId;\n","export const ensureCamelCase = (string_: string) => `${string_.charAt(0).toLowerCase()}${string_.slice(1)}`;\n\nexport const getResourceNameFromUrl = <M extends string = string>(url: string, models: { [key in M]?: string }) => {\n // Exclude the query params from the path\n const realPath = url.split(\"?\")[0];\n\n if (realPath === undefined) {\n throw new TypeError(\"Path is undefined\");\n }\n\n const modelName = (Object.keys(models) as M[]).find((name) => {\n const routeName = models[name] as string;\n const camelCaseModel = ensureCamelCase(routeName);\n\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n return new RegExp(`(${routeName}|${camelCaseModel}$)|(${routeName}|${camelCaseModel}/)`, \"g\").test(realPath);\n });\n\n return {\n modelName,\n resourceName: models[modelName] as string,\n };\n};\n","import { match } from \"path-to-regexp\";\n\nimport { RouteType } from \"../types.d\";\n\ntype PathMatch = { id: string };\n\nconst getRouteType: (\n method: string,\n url: string,\n resourceName: string,\n) => GetRouteType = (method, url, resourceName) => {\n // Exclude the query params from the path\n const realPath = url.split(\"?\")[0];\n\n if (realPath === undefined) {\n throw new TypeError(\"Path is undefined\");\n }\n\n if (!realPath.includes(`/${resourceName}`)) {\n throw new Error(`invalid resource name '${resourceName}' for route '${realPath}'`);\n }\n\n const entityMatcher = match<PathMatch>([`/(.*)/${resourceName}`, `/(.*)/${resourceName}/:id`], { decode: decodeURIComponent });\n const simpleMatcher = match(`/(.*)/${resourceName}`, {\n decode: decodeURIComponent,\n });\n\n switch (method) {\n case \"GET\": {\n const pathMatch = entityMatcher(realPath);\n\n // If we got a /something after the resource name, we are reading 1 entity\n if (pathMatch && pathMatch.params.id) {\n return {\n routeType: RouteType.READ_ONE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: RouteType.READ_ALL,\n };\n }\n case \"POST\": {\n const pathMatch = simpleMatcher(realPath);\n\n if (pathMatch) {\n return {\n routeType: RouteType.CREATE,\n };\n }\n\n return {\n routeType: null,\n };\n }\n case \"PUT\":\n case \"PATCH\": {\n const pathMatch = entityMatcher(realPath);\n\n if (pathMatch && pathMatch.params.id) {\n return {\n routeType: RouteType.UPDATE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: null,\n };\n }\n case \"DELETE\": {\n const pathMatch = entityMatcher(realPath);\n\n if (pathMatch && pathMatch.params.id) {\n return {\n routeType: RouteType.DELETE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: null,\n };\n }\n default: {\n return {\n routeType: null,\n };\n }\n }\n};\n\nexport type GetRouteType = {\n routeType: RouteType | null;\n resourceId?: string;\n};\n\nexport default getRouteType;\n","import createHttpError from \"http-errors\";\n\nimport type { Adapter } from \"../types.d\";\n\nconst adapterMethods = [\"create\" || \"delete\" || \"getAll\" || \"getOne\" || \"parseQuery\" || \"update\" || \"getPaginationData\" || \"getModels\"];\n\nconst validateAdapterMethods = <T, Q>(adapter: Adapter<T, Q>) => {\n adapterMethods.forEach((method) => {\n if (!adapter[method as keyof Adapter<T, Q>]) {\n throw createHttpError(500, `Adapter must implement the \"${method}\" method.`);\n }\n });\n};\n\nexport default validateAdapterMethods;\n","import baseHandler from \"../../../base-crud-handler\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, ParsedQueryParameters,\n} from \"../../../types.d\";\n\nasync function handler<T, R extends Request, Context, Q extends ParsedQueryParameters = any, M extends string = string>(\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, Context>> {\n return baseHandler<R, Context, T, Q, M>(\n async (_, responseConfig) => new Response(JSON.stringify(responseConfig.data), {\n status: responseConfig.status,\n headers: {\n \"content-type\": \"application/json; charset=utf-8\",\n },\n }),\n async () => {},\n adapter,\n options,\n );\n}\n\nexport default handler;\n","import type { NextApiRequest, NextApiResponse } from \"next\";\n\nimport baseHandler from \"../../../base-crud-handler\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, ParsedQueryParameters,\n} from \"../../../types.d\";\n\nasync function handler<\n T,\n Q extends ParsedQueryParameters = any,\n R extends NextApiRequest = NextApiRequest,\n Response extends NextApiResponse = NextApiResponse,\n M extends string = string,\n>(adapter: Adapter<T, Q>, options?: HandlerOptions<M>): Promise<ExecuteHandler<R, Response>> {\n return baseHandler<R, Response, T, Q, M>(\n async (response, responseConfig) => {\n response.status(responseConfig.status).send(responseConfig.data);\n },\n async (response) => {\n (response as Response).end();\n },\n adapter,\n options,\n );\n}\n\nexport default handler;\n"],"mappings":"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","names":["createHttpError","ApiError","createHandler","adapter","query","resourceName","request","create_default","createHttpError","deleteHandler","adapter","query","resourceName","resourceId","delete_default","paginate","listHandler","adapter","query","resourceName","pagination","isPaginated","paginationOptions","resources","page","total","list_default","createHttpError","readHandler","adapter","query","resourceName","resourceId","resource","read_default","createHttpError","updateHandler","adapter","query","resourceName","resourceId","request","update_default","set","parse","parseRecursive","select","selectFields","field","parseWhere","where","whereObject","parsed","key","parseOrderBy","orderBy","orderByObject","parseQuery","queryString","query","parsedQuery","query_parser_default","formatResourceId","resourceId","format_resource_id_default","ensureCamelCase","string_","getResourceNameFromUrl","url","models","realPath","modelName","name","routeName","camelCaseModel","match","getRouteType","method","url","resourceName","realPath","entityMatcher","match","simpleMatcher","pathMatch","get_route_type_default","createHttpError","adapterMethods","validateAdapterMethods","adapter","method","validate_adapter_methods_default","baseHandler","responseExecutor","finalExecutor","adapter","options","_a","_b","validate_adapter_methods_default","error_","error","ApiError","config","format_resource_id_default","routeNames","modelRoutes","modelName","request","responseOrContext","_c","_d","_e","_f","_g","_h","_i","_j","resourceName","getResourceNameFromUrl","createHttpError","routeType","resourceId","get_route_type_default","modelConfig","get_accessible_routes_default","resourceIdFormatted","parsedQuery","query_parser_default","parameters","responseConfig","read_default","list_default","create_default","update_default","delete_default","base_crud_handler_default","handler","adapter","options","base_crud_handler_default","_","responseConfig","edge_default","handler","adapter","options","base_crud_handler_default","response","responseConfig","node_default"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@visulima/crud",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "visulima crud",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"anolilab",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"test": "vitest"
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
|
-
"@visulima/pagination": "1.0
|
|
69
|
+
"@visulima/pagination": "1.1.0",
|
|
70
70
|
"@visulima/prisma-dmmf-transformer": "1.0.2",
|
|
71
71
|
"http-errors": "^2.0.0",
|
|
72
72
|
"lodash.set": "^4.3.2",
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
"@rushstack/eslint-plugin-security": "^0.5.0",
|
|
81
81
|
"@testing-library/react": "^13.4.0",
|
|
82
82
|
"@testing-library/react-hooks": "^8.0.1",
|
|
83
|
-
"@types/http-errors": "^
|
|
83
|
+
"@types/http-errors": "^2.0.0",
|
|
84
84
|
"@types/json-schema": "7.0.11",
|
|
85
85
|
"@types/lodash.set": "^4.3.7",
|
|
86
86
|
"@types/node": "^18.8.4",
|