@visulima/crud 1.0.4 → 1.0.6

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.
@@ -1,458 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
2
-
3
- var _chunkZY3WOLEPjs = require('../chunk-ZY3WOLEP.js');
4
-
5
- // src/base-crud-handler.ts
6
- var _httperrors = require('http-errors'); var _httperrors2 = _interopRequireDefault(_httperrors);
7
- var _apiutils = require('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
-
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 _httperrors2.default.call(void 0, 404, `${resourceName} ${resourceId} not found`);
41
- };
42
- var delete_default = deleteHandler;
43
-
44
- // src/handler/list.ts
45
- var _pagination = require('@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 = _pagination.paginate.call(void 0, 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
-
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 _httperrors2.default.call(void 0, 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
-
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 _httperrors2.default.call(void 0, 404, `${resourceName} ${resourceId} not found`);
121
- };
122
- var update_default = updateHandler;
123
-
124
- // src/query-parser.ts
125
- var _lodashset = require('lodash.set'); var _lodashset2 = _interopRequireDefault(_lodashset);
126
- var _qs = require('qs');
127
- var parseRecursive = (select) => {
128
- if (typeof select === "string") {
129
- const selectFields = {};
130
- const fields = select.split(",");
131
- fields.forEach((field) => {
132
- _lodashset2.default.call(void 0, 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
- _lodashset2.default.call(void 0, 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 = _qs.parse.call(void 0, 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
- var _pathtoregexp = require('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 = _pathtoregexp.match.call(void 0, [`/(.*)/${resourceName}`, `/(.*)/${resourceName}/:id`], { decode: decodeURIComponent });
230
- const simpleMatcher = _pathtoregexp.match.call(void 0, `/(.*)/${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
-
293
- var adapterMethods = ["create"];
294
- var validateAdapterMethods = (adapter) => {
295
- adapterMethods.forEach((method) => {
296
- if (!adapter[method]) {
297
- throw _httperrors2.default.call(void 0, 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 (0, _apiutils.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 _httperrors2.default.call(void 0, 404, `Resource not found, possible models: ${Object.values(mappedModels).join(", ")}`);
334
- }
335
- }
336
- throw _httperrors2.default.call(void 0, 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 _httperrors2.default.call(void 0, 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 = _chunkZY3WOLEPjs.get_accessible_routes_default.call(void 0, 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 _httperrors2.default.call(void 0, 404, `Route not found: ${request.url}`);
346
- }
347
- try {
348
- const resourceIdFormatted = _nullishCoalesce(((_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 _apiutils.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
-
455
-
456
-
457
- exports.edgeHandler = edge_default; exports.nodeHandler = node_default;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _chunkU35WXGEFjs = require('../chunk-U35WXGEF.js');var _httperrors = require('http-errors'); var _httperrors2 = _interopRequireDefault(_httperrors);var _apiutils = require('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;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 _httperrors2.default.call(void 0, 404,`${t} ${r} not found`)},v=z;var _pagination = require('@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:_pagination.paginate.call(void 0, f,o.perPage,y,n).toJSON(),status:200}}return{data:n,status:200}},N=X;var Z=async({adapter:s,query:e,resourceName:t,resourceId:r})=>{let a=await s.getOne(t,r,e);if(!a)throw _httperrors2.default.call(void 0, 404,`${t} ${r} not found`);return{data:a,status:200}},F=Z;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 _httperrors2.default.call(void 0, 404,`${t} ${r} not found`)},j=ee;var _lodashset = require('lodash.set'); var _lodashset2 = _interopRequireDefault(_lodashset);var _qs = require('qs');var U=s=>{if(typeof s=="string"){let e={};return s.split(",").forEach(r=>{_lodashset2.default.call(void 0, 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=>{_lodashset2.default.call(void 0, 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=_qs.parse.call(void 0, 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]}};var _pathtoregexp = require('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=_pathtoregexp.match.call(void 0, [`/(.*)/${t}`,`/(.*)/${t}/:id`],{decode:decodeURIComponent}),o=_pathtoregexp.match.call(void 0, `/(.*)/${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;var pe=["create"],ue=s=>{pe.forEach(e=>{if(!s[e])throw _httperrors2.default.call(void 0, 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 (0, _apiutils.ApiError)(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 _httperrors2.default.call(void 0, 404,`Resource not found: ${i.url}`);let{routeType:h,resourceId:T}=_(i.method,i.url,l);if(h===null)throw _httperrors2.default.call(void 0, 404,`Route not found: ${i.url}`);let d=(H=r==null?void 0:r.models)==null?void 0:H[P];if(!_chunkU35WXGEFjs.b.call(void 0, d==null?void 0:d.only,d==null?void 0:d.exclude,(r==null?void 0:r.exposeStrategy)||"all").includes(h))throw _httperrors2.default.call(void 0, 404,`Route not found: ${i.url}`);try{let R=_nullishCoalesce(((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 _apiutils.ApiError))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;exports.edgeHandler = me; exports.nodeHandler = ye;
458
2
  //# sourceMappingURL=index.js.map
@@ -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"],"names":["createHttpError","_a","_b","handler"],"mappings":"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","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"]}
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"],"names":["createHttpError","ApiError","createHandler","adapter","query","resourceName","request","create_default","deleteHandler","resourceId","delete_default","paginate","listHandler","pagination","isPaginated","paginationOptions","resources","page","total","list_default","readHandler","resource","read_default","updateHandler","update_default","set","parse","parseRecursive","select","selectFields","field","parseWhere","where","whereObject","parsed","key","parseOrderBy","orderBy","orderByObject","parseQuery","queryString","parsedQuery","query_parser_default","formatResourceId","format_resource_id_default","ensureCamelCase","string_","getResourceNameFromUrl","url","models","realPath","modelName","name","routeName","camelCaseModel","match","getRouteType","method","entityMatcher","simpleMatcher","pathMatch","get_route_type_default","adapterMethods","validateAdapterMethods","validate_adapter_methods_default","baseHandler","responseExecutor","finalExecutor","options","_a","_b","error_","error","config","routeNames","modelRoutes","responseOrContext","_c","_d","_e","_f","_g","_h","_i","_j","routeType","modelConfig","get_accessible_routes_default","resourceIdFormatted","parameters","responseConfig","base_crud_handler_default","handler","_","edge_default","response","node_default"],"mappings":"yCACA,OAAOA,MAAqB,cAE5B,OAAS,YAAAC,MAAgB,6BCDzB,IAAMC,EAAyB,MAAO,CAClC,QAAAC,EAAS,MAAAC,EAAO,aAAAC,EAAc,QAAAC,CAClC,KAGW,CACH,KAHc,MAAMH,EAAQ,OAAOE,EAAcC,EAAQ,KAAMF,CAAK,EAIpE,OAAQ,GACZ,GAUGG,EAAQL,ECpBf,OAAOF,MAAqB,cAI5B,IAAMQ,EAAyB,MAAO,CAClC,QAAAL,EAAS,MAAAC,EAAO,aAAAC,EAAc,WAAAI,CAClC,IAAM,CAGF,GAFiB,MAAMN,EAAQ,OAAOE,EAAcI,EAAYL,CAAK,EAKjE,MAAO,CACH,KAHoB,MAAMD,EAAQ,OAAOE,EAAcI,EAAYL,CAAK,EAIxE,OAAQ,GACZ,EAEJ,MAAMJ,EAAgB,IAAK,GAAGK,KAAgBI,aAAsB,CACxE,EAQOC,EAAQF,EC1Bf,OAAS,YAAAG,MAAgB,uBASzB,IAAMC,EAAuB,MAAO,CAChC,QAAAT,EAAS,MAAAC,EAAO,aAAAC,EAAc,WAAAQ,CAClC,IAAM,CACF,IAAIC,EAAc,GACdC,EAEJ,IAAIX,GAAA,YAAAA,EAAO,QAAS,OAAW,CAC3B,IAAIA,GAAA,YAAAA,EAAO,OAAQ,EACf,MAAM,IAAI,MAAM,+CAA+C,EAGnEW,EAAoB,CAChB,KAAMX,GAAA,YAAAA,EAAO,KACb,SAASA,GAAA,YAAAA,EAAO,QAASS,EAAW,OACxC,CACJ,CAEIE,IACAD,EAAc,GAGdV,EAAM,MAAQW,EAAkB,KAAO,GAAKA,EAAkB,QAE9DX,EAAM,MAAQW,EAAkB,SAGpC,IAAMC,EAAY,MAAMb,EAAQ,OAAOE,EAAcD,CAAK,EAE1D,GAAIU,EAAa,CACb,GAAM,CAAE,KAAAG,EAAM,MAAAC,CAAM,EAAI,MAAMf,EAAQ,kBAAkBE,EAAcD,CAAK,EAI3E,MAAO,CACH,KAHcO,EAASM,EAAOF,EAAwC,QAAmBG,EAAOF,CAAS,EAGzF,OAAO,EACvB,OAAQ,GACZ,CACJ,CAEA,MAAO,CACH,KAAMA,EACN,OAAQ,GACZ,CACJ,EASOG,EAAQP,EC7Df,OAAOZ,MAAqB,cAI5B,IAAMoB,EAAuB,MAAO,CAChC,QAAAjB,EAAS,MAAAC,EAAO,aAAAC,EAAc,WAAAI,CAClC,IAAM,CACF,IAAMY,EAAW,MAAMlB,EAAQ,OAAOE,EAAcI,EAAYL,CAAK,EAErE,GAAI,CAACiB,EACD,MAAMrB,EAAgB,IAAK,GAAGK,KAAgBI,aAAsB,EAGxE,MAAO,CACH,KAAMY,EACN,OAAQ,GACZ,CACJ,EASOC,EAAQF,EC1Bf,OAAOpB,MAAqB,cAI5B,IAAMuB,GAAyB,MAAO,CAClC,QAAApB,EAAS,MAAAC,EAAO,aAAAC,EAAc,WAAAI,EAAY,QAAAH,CAC9C,IAAM,CAGF,GAFiB,MAAMH,EAAQ,OAAOE,EAAcI,EAAYL,CAAK,EAKjE,MAAO,CACH,OAAQ,IACR,KAJoB,MAAMD,EAAQ,OAAOE,EAAcI,EAAYH,EAAQ,KAAMF,CAAK,CAK1F,EAGJ,MAAMJ,EAAgB,IAAK,GAAGK,KAAgBI,aAAsB,CACxE,EASOe,EAAQD,GC5Bf,OAAOE,MAAS,aAChB,OAAS,SAAAC,OAAa,KAMtB,IAAMC,EAAkBC,GAAmC,CACvD,GAAI,OAAOA,GAAW,SAAU,CAC5B,IAAMC,EAA+B,CAAC,EAItC,OAFeD,EAAO,MAAM,GAAG,EAExB,QAASE,GAAU,CACtBL,EAAII,EAAcC,EAAO,EAAI,CACjC,CAAC,EAEMD,CACX,CAEA,MAAM,IAAI,MAAM,qCAAqC,CACzD,EAEME,GAAcC,GAA8B,CAC9C,IAAMC,EAAc,KAAK,MAAMD,CAAK,EAC9BE,EAAqB,CAAC,EAE5B,cAAO,KAAKD,CAAW,EAAE,QAASE,GAAQ,CACtCV,EAAIS,EAAQC,EAAKF,EAAYE,EAAI,CACrC,CAAC,EAEMD,CACX,EAEME,GAAgBC,GAAkC,CACpD,IAAMH,EAAuB,CAAC,EACxBI,EAAgB,KAAK,MAAMD,CAAO,EAExC,GAAI,OAAO,KAAKC,CAAa,EAAE,OAAS,EAAG,CACvC,IAAMH,EAAM,OAAO,KAAKG,CAAa,EAAE,IAEnCA,EAAcH,KAAuC,QAAUG,EAAcH,KAAuC,WACpHD,EAAOC,GAAiBG,EAAcH,GAE9C,CAEA,GAAI,OAAO,KAAKD,CAAM,EAAE,SAAW,EAC/B,MAAM,IAAI,MAAM,uFAAuF,EAG3G,OAAOA,CACX,EAGMK,GAAcC,GAAgD,CAChE,GAAIA,EAAa,CACb,IAAMpC,EAAQsB,GAAMc,CAAW,EACzBC,EAAqC,CAAC,EAE5C,OAAIrC,EAAM,SACNqC,EAAY,OAASd,EAAevB,EAAM,MAAgB,GAE1DA,EAAM,UACNqC,EAAY,QAAUd,EAAevB,EAAM,OAAiB,GAE5DA,EAAM,QACNqC,EAAY,MAAQV,GAAW3B,EAAM,KAAe,GAEpDA,EAAM,UACNqC,EAAY,QAAUL,GAAahC,EAAM,OAAiB,GAE1DA,EAAM,QAAU,SAChBqC,EAAY,MAAQ,OAAO,SAAS,CAACrC,EAAM,KAAK,EAAI,CAACA,EAAM,MAAQ,QAEnEA,EAAM,OAAS,SACfqC,EAAY,KAAO,OAAO,SAAS,CAACrC,EAAM,IAAI,EAAI,CAACA,EAAM,KAAO,QAEhEA,EAAM,WACNqC,EAAY,SAAWrC,EAAM,UAE7BA,EAAM,OACNqC,EAAY,KAAO,OAAO,SAAS,CAACrC,EAAM,IAAI,EAAI,CAACA,EAAM,KAAO,QAG7D,CACH,cAAeA,EACf,GAAGqC,CACP,CACJ,CAEA,MAAO,CAAC,CACZ,EAEOC,EAAQH,GC7Ff,IAAMI,GAAoBlC,GAAyC,OAAO,cAAc,CAACA,CAAU,EAAI,CAACA,EAAaA,EAE9GmC,EAAQD,GCFR,IAAME,GAAmBC,GAAoB,GAAGA,EAAQ,OAAO,CAAC,EAAE,YAAY,IAAIA,EAAQ,MAAM,CAAC,IAE3FC,EAAyB,CAA4BC,EAAaC,IAAoC,CAE/G,IAAMC,EAAWF,EAAI,MAAM,GAAG,EAAE,GAEhC,GAAIE,IAAa,OACb,MAAM,IAAI,UAAU,mBAAmB,EAG3C,IAAMC,EAAa,OAAO,KAAKF,CAAM,EAAU,KAAMG,GAAS,CAC1D,IAAMC,EAAYJ,EAAOG,GACnBE,EAAiBT,GAAgBQ,CAAS,EAGhD,OAAO,IAAI,OAAO,IAAIA,KAAaC,QAAqBD,KAAaC,MAAoB,GAAG,EAAE,KAAKJ,CAAQ,CAC/G,CAAC,EAED,MAAO,CACH,UAAAC,EACA,aAAcF,EAAOE,EACzB,CACJ,ECtBA,OAAS,SAAAI,MAAa,iBAMtB,IAAMC,GAIc,CAACC,EAAQT,EAAK3C,IAAiB,CAE/C,IAAM6C,EAAWF,EAAI,MAAM,GAAG,EAAE,GAEhC,GAAIE,IAAa,OACb,MAAM,IAAI,UAAU,mBAAmB,EAG3C,GAAI,CAACA,EAAS,SAAS,IAAI7C,GAAc,EACrC,MAAM,IAAI,MAAM,0BAA0BA,iBAA4B6C,IAAW,EAGrF,IAAMQ,EAAgBH,EAAiB,CAAC,SAASlD,IAAgB,SAASA,OAAkB,EAAG,CAAE,OAAQ,kBAAmB,CAAC,EACvHsD,EAAgBJ,EAAM,SAASlD,IAAgB,CACjD,OAAQ,kBACZ,CAAC,EAED,OAAQoD,EAAQ,CACZ,IAAK,MAAO,CACR,IAAMG,EAAYF,EAAcR,CAAQ,EAGxC,OAAIU,GAAaA,EAAU,OAAO,GACvB,CACH,qBACA,WAAYA,EAAU,OAAO,EACjC,EAGG,CACH,oBACJ,CACJ,CACA,IAAK,OAGD,OAFkBD,EAAcT,CAAQ,EAG7B,CACH,kBACJ,EAGG,CACH,UAAW,IACf,EAEJ,IAAK,MACL,IAAK,QAAS,CACV,IAAMU,EAAYF,EAAcR,CAAQ,EAExC,OAAIU,GAAaA,EAAU,OAAO,GACvB,CACH,mBACA,WAAYA,EAAU,OAAO,EACjC,EAGG,CACH,UAAW,IACf,CACJ,CACA,IAAK,SAAU,CACX,IAAMA,EAAYF,EAAcR,CAAQ,EAExC,OAAIU,GAAaA,EAAU,OAAO,GACvB,CACH,mBACA,WAAYA,EAAU,OAAO,EACjC,EAGG,CACH,UAAW,IACf,CACJ,CACA,QACI,MAAO,CACH,UAAW,IACf,CAER,CACJ,EAOOC,EAAQL,GClGf,OAAOxD,OAAqB,cAI5B,IAAM8D,GAAiB,CAAC,QAA8G,EAEhIC,GAAgC5D,GAA2B,CAC7D2D,GAAe,QAASL,GAAW,CAC/B,GAAI,CAACtD,EAAQsD,GACT,MAAMzD,GAAgB,IAAK,+BAA+ByD,YAAiB,CAEnF,CAAC,CACL,EAEOO,EAAQD,GVyBf,eAAeE,GACXC,EACAC,EACAhE,EACAiE,EACqC,CA5CzC,IAAAC,EAAAC,EA6CI,GAAI,CACAN,EAAuB7D,CAAO,CAClC,OAASoE,EAAP,CACE,IAAMC,EAAQD,EAEd,MAAM,IAAItE,EAASuE,EAAM,WAAYA,EAAM,OAAO,CACtD,CAEA,OAAMH,EAAAlE,EAAQ,OAAR,YAAAkE,EAAA,KAAAlE,IAEN,IAAMsE,EAAS,CACX,iBAAA7B,EACA,WAAY,CACR,QAAS,EACb,EACA,GAAGwB,CACP,EAEMM,EAAa,OAAMJ,EAAAnE,EAAQ,wBAAR,YAAAmE,EAAA,KAAAnE,IACnBwE,EAAuC,CAAC,EAE9C,OAAAxE,EAAQ,UAAU,EAAE,QAASgD,GAAc,CAlE/C,IAAAkB,EAAAC,EAmEQK,EAAYxB,KAAkBmB,GAAAD,EAAAI,GAAA,YAAAA,EAAQ,SAAR,YAAAJ,EAAiBlB,KAAjB,YAAAmB,EAAkC,QAAQI,GAAA,YAAAA,EAAavB,KAAcA,CACvG,CAAC,EAEM,MAAO7C,EAASsE,IAAsB,CAtEjD,IAAAN,EAAAO,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAuEQ,GAAM,CAAE,aAAA/E,EAAc,UAAA8C,CAAU,EAAIJ,EAAuBzC,EAAQ,IAAeqE,CAAW,EAE7F,GAAI,CAACtE,EASD,MAAML,EAAgB,IAAK,uBAAuBM,EAAQ,KAAK,EAGnE,GAAM,CAAE,UAAA+E,EAAW,WAAA5E,CAAW,EAAIoD,EAAavD,EAAQ,OAAkBA,EAAQ,IAAeD,CAAY,EAE5G,GAAIgF,IAAc,KACd,MAAMrF,EAAgB,IAAK,oBAAoBM,EAAQ,KAAK,EAGhE,IAAMgF,GAAchB,EAAAF,GAAA,YAAAA,EAAS,SAAT,YAAAE,EAAkBnB,GAItC,GAAI,CAFqBoC,EAAoBD,GAAA,YAAAA,EAAa,KAAMA,GAAA,YAAAA,EAAa,SAASlB,GAAA,YAAAA,EAAS,iBAAkB,KAAK,EAEhG,SAASiB,CAAS,EACpC,MAAMrF,EAAgB,IAAK,oBAAoBM,EAAQ,KAAK,EAGhE,GAAI,CACA,IAAMkF,IAAsBX,EAAAS,GAAA,YAAAA,EAAa,mBAAb,YAAAT,EAAA,KAAAS,EAAgC7E,KAAyBgE,EAAO,iBAAiBhE,CAAoB,EAEjI,OAAMqE,EAAA3E,EAAQ,UAAR,YAAA2E,EAAA,KAAA3E,IAEN,IAAMsC,EAAcC,EAAYpC,EAAQ,IAAe,MAAM,GAAG,EAAE,EAAE,EAC9DmF,EAAsC,CACxC,QAAAtF,EACA,MAAOA,EAAQ,WAAWgD,EAAgBV,CAAW,EACrD,aAAcU,CAClB,EAEA,GAAI,CACA,IAAIuC,EAEJ,OAAQL,EAAW,CACf,eAAyB,CACrBK,EAAiB,QAAOX,EAAAN,GAAA,YAAAA,EAAQ,WAAR,YAAAM,EAAkB,MAAOzD,GAAmB,CAChE,GAAGmE,EACH,WAAYD,CAChB,CAAC,EACD,KACJ,CACA,eAAyB,CACrBE,EAAiB,QAAOV,EAAAP,GAAA,YAAAA,EAAQ,WAAR,YAAAO,EAAkB,OAAQ7D,GAAmB,CACjE,GAAGsE,EACH,MAAO,CACH,GAAGA,EAAW,MACd,KAAMhD,EAAY,KAAO,OAAOA,EAAY,IAAI,EAAI,OACpD,MAAOA,EAAY,MAAQ,OAAOA,EAAY,KAAK,EAAI,MAC3D,EACA,WAAYgC,EAAO,UACvB,CAAC,EACD,KACJ,CACA,aAAuB,CACnBiB,EAAiB,QAAOT,EAAAR,GAAA,YAAAA,EAAQ,WAAR,YAAAQ,EAAkB,SAAU1E,GAAwB,CACxE,GAAGkF,EACH,QAASnF,CACb,CAAC,EACD,KACJ,CACA,aAAuB,CACnBoF,EAAiB,QAAOR,EAAAT,GAAA,YAAAA,EAAQ,WAAR,YAAAS,EAAkB,SAAU1D,GAAwB,CACxE,GAAGiE,EACH,WAAYD,EACZ,QAASlF,CACb,CAAC,EACD,KACJ,CACA,aAAuB,CACnBoF,EAAiB,QAAOP,EAAAV,GAAA,YAAAA,EAAQ,WAAR,YAAAU,EAAkB,SAAUzE,GAAqB,CACrE,GAAG+E,EACH,WAAYD,CAChB,CAAC,EACD,KACJ,CACA,QACIE,EAAiB,CACb,OAAQ,IACR,KAAM,kBACV,CAER,CAEA,MAAMxB,EAAiBU,EAAmBc,CAAc,CAC5D,OAASlB,EAAP,CACE,GAAIrE,EAAQ,aAAe,EAAEqE,aAAiBvE,GAC1CE,EAAQ,YAAYqE,CAAK,MAEzB,OAAMA,CAEd,CACJ,QAAE,CACE,OAAMY,EAAAjF,EAAQ,aAAR,YAAAiF,EAAA,KAAAjF,IAEN,MAAMgE,EAAcS,CAAiB,CACzC,CACJ,CACJ,CAEA,IAAOe,EAAQ1B,GW/Kf,eAAe2B,GACXzF,EACAiE,EACmC,CACnC,OAAOuB,EACH,MAAOE,EAAGH,IAAmB,IAAI,SAAS,KAAK,UAAUA,EAAe,IAAI,EAAG,CAC3E,OAAQA,EAAe,OACvB,QAAS,CACL,eAAgB,iCACpB,CACJ,CAAC,EACD,SAAY,CAAC,EACbvF,EACAiE,CACJ,CACJ,CAEA,IAAO0B,GAAQF,GCff,eAAeA,GAMbzF,EAAwBiE,EAAmE,CACzF,OAAOuB,EACH,MAAOI,EAAUL,IAAmB,CAChCK,EAAS,OAAOL,EAAe,MAAM,EAAE,KAAKA,EAAe,IAAI,CACnE,EACA,MAAOK,GAAa,CACfA,EAAsB,IAAI,CAC/B,EACA5F,EACAiE,CACJ,CACJ,CAEA,IAAO4B,GAAQJ","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"]}