@visulima/crud 3.0.0-alpha.16 → 3.0.0-alpha.18

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.
Files changed (49) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +127 -5
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.cts +64 -3
  5. package/dist/index.d.mts +64 -3
  6. package/dist/index.d.ts +64 -3
  7. package/dist/index.mjs +1 -1
  8. package/dist/next/index.cjs +1 -1
  9. package/dist/next/index.d.cts +21 -13
  10. package/dist/next/index.d.mts +21 -13
  11. package/dist/next/index.d.ts +21 -13
  12. package/dist/next/index.mjs +1 -1
  13. package/dist/packem_shared/CrudApiError-BH1byAwV.mjs +1 -0
  14. package/dist/packem_shared/CrudApiError-DkRqkpib.cjs +1 -0
  15. package/dist/packem_shared/PrismaAdapter-Bhocjq94.mjs +1 -0
  16. package/dist/packem_shared/PrismaAdapter-DDoEjhQy.cjs +1 -0
  17. package/dist/packem_shared/baseHandler-BGTzX4YA.mjs +1 -0
  18. package/dist/packem_shared/baseHandler-DnuGeT2-.cjs +1 -0
  19. package/dist/packem_shared/edgeHandler-CjCFAdvT.mjs +1 -0
  20. package/dist/packem_shared/edgeHandler-DQ2KLGlC.cjs +1 -0
  21. package/dist/packem_shared/get-accessible-routes-BCUs20dV.cjs +1 -0
  22. package/dist/packem_shared/get-accessible-routes-CGvT_kuy.mjs +1 -0
  23. package/dist/packem_shared/models-to-route-names-BFpwjyxy.mjs +1 -0
  24. package/dist/packem_shared/models-to-route-names-CWnxPVCQ.cjs +1 -0
  25. package/dist/packem_shared/modelsToOpenApi-QqR_HHsz.cjs +1 -0
  26. package/dist/packem_shared/modelsToOpenApi-pOMrwJIY.mjs +1 -0
  27. package/dist/packem_shared/nodeHandler-atOpJB2d.mjs +1 -0
  28. package/dist/packem_shared/nodeHandler-tp623oY3.cjs +1 -0
  29. package/dist/packem_shared/types.d-CQwyFrf3.d.cts +207 -0
  30. package/dist/packem_shared/types.d-CQwyFrf3.d.mts +207 -0
  31. package/dist/packem_shared/types.d-CQwyFrf3.d.ts +207 -0
  32. package/package.json +4 -4
  33. package/dist/packem_shared/PrismaAdapter-D0WRtRlB.cjs +0 -1
  34. package/dist/packem_shared/PrismaAdapter-EuQr18sT.mjs +0 -1
  35. package/dist/packem_shared/base-crud-handler-B6xOUGDj.cjs +0 -1
  36. package/dist/packem_shared/base-crud-handler-DNKq7uog.mjs +0 -1
  37. package/dist/packem_shared/edgeHandler-CaIWVXt-.cjs +0 -1
  38. package/dist/packem_shared/edgeHandler-Deds33h_.mjs +0 -1
  39. package/dist/packem_shared/get-accessible-routes-DLLL11KB.cjs +0 -1
  40. package/dist/packem_shared/get-accessible-routes-xHYBQ_6q.mjs +0 -1
  41. package/dist/packem_shared/models-to-route-names-Dh2b_kIL.cjs +0 -1
  42. package/dist/packem_shared/models-to-route-names-UU1lZmbK.mjs +0 -1
  43. package/dist/packem_shared/modelsToOpenApi-CsQL5VTy.cjs +0 -1
  44. package/dist/packem_shared/modelsToOpenApi-ocNrUF5p.mjs +0 -1
  45. package/dist/packem_shared/nodeHandler-CeBCrxYT.mjs +0 -1
  46. package/dist/packem_shared/nodeHandler-D7AuOmUo.cjs +0 -1
  47. package/dist/packem_shared/types.d-C_XaTdLA.d.cts +0 -126
  48. package/dist/packem_shared/types.d-C_XaTdLA.d.mts +0 -126
  49. package/dist/packem_shared/types.d-C_XaTdLA.d.ts +0 -126
@@ -3,14 +3,13 @@
3
3
  /// <reference types="react/experimental" preserve="true" />
4
4
  /// <reference types="react-dom" preserve="true" />
5
5
  /// <reference types="react-dom/experimental" preserve="true" />
6
- import { a as ParsedQueryParameters, A as Adapter, H as HandlerOptions, E as ExecuteHandler } from "../packem_shared/types.d-C_XaTdLA.cjs";
6
+ import { a as ParsedQueryParameters, A as Adapter, H as HandlerOptions, E as ExecuteHandler } from "../packem_shared/types.d-CQwyFrf3.cjs";
7
7
  import { IncomingMessage, ServerResponse, Agent } from 'http';
8
8
  import { Agent as Agent$1 } from 'https';
9
9
  import { ParsedUrlQuery } from 'querystring';
10
10
  import 'react';
11
11
  import 'url';
12
12
  import 'stream';
13
- import 'react/jsx-runtime';
14
13
  import 'node:http';
15
14
  import 'fs';
16
15
  import 'async_hooks';
@@ -18,11 +17,12 @@ import 'node:querystring';
18
17
  import 'node:url';
19
18
  import 'crypto';
20
19
  import 'react/jsx-dev-runtime';
20
+ import 'react/jsx-runtime';
21
21
  import 'react/compiler-runtime';
22
22
  import { webpack } from 'next/dist/compiled/webpack/webpack';
23
23
  import { Env } from '@next/env';
24
24
  import 'node:stream';
25
- declare const handler$1: <T, R extends Request, Context, Q extends ParsedQueryParameters = ParsedQueryParameters, M extends string = string>(adapter: Adapter<T, Q>, options?: HandlerOptions<M>) => Promise<ExecuteHandler<R, Context>>;
25
+ declare const handler$1: <T, R extends Request, Context, Q extends ParsedQueryParameters = ParsedQueryParameters, M extends string = string>(adapter: Adapter<T, Q>, options?: HandlerOptions<M>) => Promise<ExecuteHandler<R, Context, Response>>;
26
26
  declare const COMPILER_NAMES: {
27
27
  readonly client: "client";
28
28
  readonly server: "server";
@@ -274,7 +274,7 @@ interface NodeJsPartialHmrUpdate extends BaseUpdate {
274
274
  }>;
275
275
  };
276
276
  }
277
- declare global {
277
+ declare global$6 {
278
278
  interface Window {
279
279
  __BUILD_MANIFEST?: Record<string, string[]>;
280
280
  __BUILD_MANIFEST_CB?: Function;
@@ -290,7 +290,7 @@ declare global {
290
290
  __INTERCEPTION_ROUTE_REWRITE_MANIFEST?: string;
291
291
  }
292
292
  }
293
- declare global {
293
+ declare global$5 {
294
294
  interface Window {
295
295
  __DEV_MIDDLEWARE_MATCHERS?: ProxyMatcher[];
296
296
  __DEV_PAGES_MANIFEST?: {
@@ -300,17 +300,17 @@ declare global {
300
300
  __SSG_MANIFEST?: Set<string>;
301
301
  }
302
302
  }
303
- declare global {
303
+ declare global$4 {
304
304
  interface Window {
305
305
  __NEXT_DATA__: NEXT_DATA;
306
306
  }
307
307
  }
308
- declare global {
308
+ declare global$3 {
309
309
  interface Window {
310
310
  __NEXT_PRELOADREADY?: (ids?: (string | number)[]) => Promise<void>;
311
311
  }
312
312
  }
313
- declare global {
313
+ declare global$2 {
314
314
  var __next_log_error__: undefined | ((err: unknown) => void);
315
315
  }
316
316
  interface RequiredServerFilesManifest {
@@ -321,7 +321,7 @@ interface RequiredServerFilesManifest {
321
321
  files: string[];
322
322
  ignore: string[];
323
323
  }
324
- declare global {
324
+ declare global$1 {
325
325
  var __next__clear_chunk_cache__: (() => void) | null | undefined;
326
326
  var __turbopack_clear_chunk_cache__: () => void | null | undefined;
327
327
  var __turbopack_server_hmr_apply__: ((update: NodeJsPartialHmrUpdate) => boolean) | undefined;
@@ -856,6 +856,14 @@ interface ExperimentalConfig {
856
856
  * configuration is enabled by default.
857
857
  */
858
858
  turbopackUseBuiltinSass?: boolean;
859
+ /**
860
+ * Enable per-directory PostCSS config resolution for Turbopack. When enabled,
861
+ * Turbopack searches for `postcss.config.js` starting from the CSS file's
862
+ * parent directory first, then falls back to the project root. When disabled
863
+ * (default), the project root is checked first, with the CSS file's directory
864
+ * as a fallback.
865
+ */
866
+ turbopackLocalPostcssConfig?: boolean;
859
867
  /**
860
868
  * The module ID strategy to use for Turbopack.
861
869
  * If not set, the default is `'named'` for development and `'deterministic'`
@@ -1727,7 +1735,10 @@ declare module 'react' {
1727
1735
  fetchPriority?: 'high' | 'low' | 'auto' | undefined;
1728
1736
  }
1729
1737
  }
1730
- declare _0 {
1738
+ type FileSizeSuffix = `${'k' | 'K' | 'm' | 'M' | 'g' | 'G' | 't' | 'T' | 'p' | 'P'}${'b' | 'B'}`;
1739
+ type SizeLimit = number | `${number}${FileSizeSuffix}`;
1740
+ type PreviewData = string | false | object | undefined;
1741
+ declare global {
1731
1742
  interface Crypto {
1732
1743
  readonly subtle: SubtleCrypto;
1733
1744
  getRandomValues<T extends Int8Array | Int16Array | Int32Array | Uint8Array | Uint16Array | Uint32Array | Uint8ClampedArray | Float32Array | Float64Array | DataView | null>(array: T): T;
@@ -1740,8 +1751,5 @@ declare _0 {
1740
1751
  var __NEXT_HTTP_AGENT: Agent;
1741
1752
  var __NEXT_HTTPS_AGENT: Agent$1;
1742
1753
  }
1743
- type FileSizeSuffix = `${'k' | 'K' | 'm' | 'M' | 'g' | 'G' | 't' | 'T' | 'p' | 'P'}${'b' | 'B'}`;
1744
- type SizeLimit = number | `${number}${FileSizeSuffix}`;
1745
- type PreviewData = string | false | object | undefined;
1746
1754
  declare const handler: <T, Q extends ParsedQueryParameters = ParsedQueryParameters, R extends NextApiRequest = NextApiRequest, Response extends NextApiResponse = NextApiResponse, M extends string = string>(adapter: Adapter<T, Q>, options?: HandlerOptions<M>) => Promise<ExecuteHandler<R, Response>>;
1747
1755
  export { handler$1 as edgeHandler, handler as nodeHandler };
@@ -1,11 +1,10 @@
1
- import { a as ParsedQueryParameters, A as Adapter, H as HandlerOptions, E as ExecuteHandler } from "../packem_shared/types.d-C_XaTdLA.mjs";
1
+ import { a as ParsedQueryParameters, A as Adapter, H as HandlerOptions, E as ExecuteHandler } from "../packem_shared/types.d-CQwyFrf3.mjs";
2
2
  import { IncomingMessage, ServerResponse, Agent } from 'http';
3
3
  import { Agent as Agent$1 } from 'https';
4
4
  import { ParsedUrlQuery } from 'querystring';
5
5
  import 'react';
6
6
  import 'url';
7
7
  import 'stream';
8
- import 'react/jsx-runtime';
9
8
  import 'node:http';
10
9
  import 'fs';
11
10
  import 'async_hooks';
@@ -13,11 +12,12 @@ import 'node:querystring';
13
12
  import 'node:url';
14
13
  import 'crypto';
15
14
  import 'react/jsx-dev-runtime';
15
+ import 'react/jsx-runtime';
16
16
  import 'react/compiler-runtime';
17
17
  import { webpack } from 'next/dist/compiled/webpack/webpack';
18
18
  import { Env } from '@next/env';
19
19
  import 'node:stream';
20
- declare const handler$1: <T, R extends Request, Context, Q extends ParsedQueryParameters = ParsedQueryParameters, M extends string = string>(adapter: Adapter<T, Q>, options?: HandlerOptions<M>) => Promise<ExecuteHandler<R, Context>>;
20
+ declare const handler$1: <T, R extends Request, Context, Q extends ParsedQueryParameters = ParsedQueryParameters, M extends string = string>(adapter: Adapter<T, Q>, options?: HandlerOptions<M>) => Promise<ExecuteHandler<R, Context, Response>>;
21
21
  declare const COMPILER_NAMES: {
22
22
  readonly client: "client";
23
23
  readonly server: "server";
@@ -269,7 +269,7 @@ interface NodeJsPartialHmrUpdate extends BaseUpdate {
269
269
  }>;
270
270
  };
271
271
  }
272
- declare global {
272
+ declare global$6 {
273
273
  interface Window {
274
274
  __BUILD_MANIFEST?: Record<string, string[]>;
275
275
  __BUILD_MANIFEST_CB?: Function;
@@ -285,7 +285,7 @@ declare global {
285
285
  __INTERCEPTION_ROUTE_REWRITE_MANIFEST?: string;
286
286
  }
287
287
  }
288
- declare global {
288
+ declare global$5 {
289
289
  interface Window {
290
290
  __DEV_MIDDLEWARE_MATCHERS?: ProxyMatcher[];
291
291
  __DEV_PAGES_MANIFEST?: {
@@ -295,17 +295,17 @@ declare global {
295
295
  __SSG_MANIFEST?: Set<string>;
296
296
  }
297
297
  }
298
- declare global {
298
+ declare global$4 {
299
299
  interface Window {
300
300
  __NEXT_DATA__: NEXT_DATA;
301
301
  }
302
302
  }
303
- declare global {
303
+ declare global$3 {
304
304
  interface Window {
305
305
  __NEXT_PRELOADREADY?: (ids?: (string | number)[]) => Promise<void>;
306
306
  }
307
307
  }
308
- declare global {
308
+ declare global$2 {
309
309
  var __next_log_error__: undefined | ((err: unknown) => void);
310
310
  }
311
311
  interface RequiredServerFilesManifest {
@@ -316,7 +316,7 @@ interface RequiredServerFilesManifest {
316
316
  files: string[];
317
317
  ignore: string[];
318
318
  }
319
- declare global {
319
+ declare global$1 {
320
320
  var __next__clear_chunk_cache__: (() => void) | null | undefined;
321
321
  var __turbopack_clear_chunk_cache__: () => void | null | undefined;
322
322
  var __turbopack_server_hmr_apply__: ((update: NodeJsPartialHmrUpdate) => boolean) | undefined;
@@ -851,6 +851,14 @@ interface ExperimentalConfig {
851
851
  * configuration is enabled by default.
852
852
  */
853
853
  turbopackUseBuiltinSass?: boolean;
854
+ /**
855
+ * Enable per-directory PostCSS config resolution for Turbopack. When enabled,
856
+ * Turbopack searches for `postcss.config.js` starting from the CSS file's
857
+ * parent directory first, then falls back to the project root. When disabled
858
+ * (default), the project root is checked first, with the CSS file's directory
859
+ * as a fallback.
860
+ */
861
+ turbopackLocalPostcssConfig?: boolean;
854
862
  /**
855
863
  * The module ID strategy to use for Turbopack.
856
864
  * If not set, the default is `'named'` for development and `'deterministic'`
@@ -1722,7 +1730,10 @@ declare module 'react' {
1722
1730
  fetchPriority?: 'high' | 'low' | 'auto' | undefined;
1723
1731
  }
1724
1732
  }
1725
- declare _0 {
1733
+ type FileSizeSuffix = `${'k' | 'K' | 'm' | 'M' | 'g' | 'G' | 't' | 'T' | 'p' | 'P'}${'b' | 'B'}`;
1734
+ type SizeLimit = number | `${number}${FileSizeSuffix}`;
1735
+ type PreviewData = string | false | object | undefined;
1736
+ declare global {
1726
1737
  interface Crypto {
1727
1738
  readonly subtle: SubtleCrypto;
1728
1739
  getRandomValues<T extends Int8Array | Int16Array | Int32Array | Uint8Array | Uint16Array | Uint32Array | Uint8ClampedArray | Float32Array | Float64Array | DataView | null>(array: T): T;
@@ -1735,8 +1746,5 @@ declare _0 {
1735
1746
  var __NEXT_HTTP_AGENT: Agent;
1736
1747
  var __NEXT_HTTPS_AGENT: Agent$1;
1737
1748
  }
1738
- type FileSizeSuffix = `${'k' | 'K' | 'm' | 'M' | 'g' | 'G' | 't' | 'T' | 'p' | 'P'}${'b' | 'B'}`;
1739
- type SizeLimit = number | `${number}${FileSizeSuffix}`;
1740
- type PreviewData = string | false | object | undefined;
1741
1749
  declare const handler: <T, Q extends ParsedQueryParameters = ParsedQueryParameters, R extends NextApiRequest = NextApiRequest, Response extends NextApiResponse = NextApiResponse, M extends string = string>(adapter: Adapter<T, Q>, options?: HandlerOptions<M>) => Promise<ExecuteHandler<R, Response>>;
1742
1750
  export { handler$1 as edgeHandler, handler as nodeHandler };
@@ -1,11 +1,10 @@
1
- import { a as ParsedQueryParameters, A as Adapter, H as HandlerOptions, E as ExecuteHandler } from "../packem_shared/types.d-C_XaTdLA.js";
1
+ import { a as ParsedQueryParameters, A as Adapter, H as HandlerOptions, E as ExecuteHandler } from "../packem_shared/types.d-CQwyFrf3.js";
2
2
  import { IncomingMessage, ServerResponse, Agent } from 'http';
3
3
  import { Agent as Agent$1 } from 'https';
4
4
  import { ParsedUrlQuery } from 'querystring';
5
5
  import 'react';
6
6
  import 'url';
7
7
  import 'stream';
8
- import 'react/jsx-runtime';
9
8
  import 'node:http';
10
9
  import 'fs';
11
10
  import 'async_hooks';
@@ -13,11 +12,12 @@ import 'node:querystring';
13
12
  import 'node:url';
14
13
  import 'crypto';
15
14
  import 'react/jsx-dev-runtime';
15
+ import 'react/jsx-runtime';
16
16
  import 'react/compiler-runtime';
17
17
  import { webpack } from 'next/dist/compiled/webpack/webpack';
18
18
  import { Env } from '@next/env';
19
19
  import 'node:stream';
20
- declare const handler$1: <T, R extends Request, Context, Q extends ParsedQueryParameters = ParsedQueryParameters, M extends string = string>(adapter: Adapter<T, Q>, options?: HandlerOptions<M>) => Promise<ExecuteHandler<R, Context>>;
20
+ declare const handler$1: <T, R extends Request, Context, Q extends ParsedQueryParameters = ParsedQueryParameters, M extends string = string>(adapter: Adapter<T, Q>, options?: HandlerOptions<M>) => Promise<ExecuteHandler<R, Context, Response>>;
21
21
  declare const COMPILER_NAMES: {
22
22
  readonly client: "client";
23
23
  readonly server: "server";
@@ -269,7 +269,7 @@ interface NodeJsPartialHmrUpdate extends BaseUpdate {
269
269
  }>;
270
270
  };
271
271
  }
272
- declare global {
272
+ declare global$6 {
273
273
  interface Window {
274
274
  __BUILD_MANIFEST?: Record<string, string[]>;
275
275
  __BUILD_MANIFEST_CB?: Function;
@@ -285,7 +285,7 @@ declare global {
285
285
  __INTERCEPTION_ROUTE_REWRITE_MANIFEST?: string;
286
286
  }
287
287
  }
288
- declare global {
288
+ declare global$5 {
289
289
  interface Window {
290
290
  __DEV_MIDDLEWARE_MATCHERS?: ProxyMatcher[];
291
291
  __DEV_PAGES_MANIFEST?: {
@@ -295,17 +295,17 @@ declare global {
295
295
  __SSG_MANIFEST?: Set<string>;
296
296
  }
297
297
  }
298
- declare global {
298
+ declare global$4 {
299
299
  interface Window {
300
300
  __NEXT_DATA__: NEXT_DATA;
301
301
  }
302
302
  }
303
- declare global {
303
+ declare global$3 {
304
304
  interface Window {
305
305
  __NEXT_PRELOADREADY?: (ids?: (string | number)[]) => Promise<void>;
306
306
  }
307
307
  }
308
- declare global {
308
+ declare global$2 {
309
309
  var __next_log_error__: undefined | ((err: unknown) => void);
310
310
  }
311
311
  interface RequiredServerFilesManifest {
@@ -316,7 +316,7 @@ interface RequiredServerFilesManifest {
316
316
  files: string[];
317
317
  ignore: string[];
318
318
  }
319
- declare global {
319
+ declare global$1 {
320
320
  var __next__clear_chunk_cache__: (() => void) | null | undefined;
321
321
  var __turbopack_clear_chunk_cache__: () => void | null | undefined;
322
322
  var __turbopack_server_hmr_apply__: ((update: NodeJsPartialHmrUpdate) => boolean) | undefined;
@@ -851,6 +851,14 @@ interface ExperimentalConfig {
851
851
  * configuration is enabled by default.
852
852
  */
853
853
  turbopackUseBuiltinSass?: boolean;
854
+ /**
855
+ * Enable per-directory PostCSS config resolution for Turbopack. When enabled,
856
+ * Turbopack searches for `postcss.config.js` starting from the CSS file's
857
+ * parent directory first, then falls back to the project root. When disabled
858
+ * (default), the project root is checked first, with the CSS file's directory
859
+ * as a fallback.
860
+ */
861
+ turbopackLocalPostcssConfig?: boolean;
854
862
  /**
855
863
  * The module ID strategy to use for Turbopack.
856
864
  * If not set, the default is `'named'` for development and `'deterministic'`
@@ -1722,7 +1730,10 @@ declare module 'react' {
1722
1730
  fetchPriority?: 'high' | 'low' | 'auto' | undefined;
1723
1731
  }
1724
1732
  }
1725
- declare _0 {
1733
+ type FileSizeSuffix = `${'k' | 'K' | 'm' | 'M' | 'g' | 'G' | 't' | 'T' | 'p' | 'P'}${'b' | 'B'}`;
1734
+ type SizeLimit = number | `${number}${FileSizeSuffix}`;
1735
+ type PreviewData = string | false | object | undefined;
1736
+ declare global {
1726
1737
  interface Crypto {
1727
1738
  readonly subtle: SubtleCrypto;
1728
1739
  getRandomValues<T extends Int8Array | Int16Array | Int32Array | Uint8Array | Uint16Array | Uint32Array | Uint8ClampedArray | Float32Array | Float64Array | DataView | null>(array: T): T;
@@ -1735,8 +1746,5 @@ declare _0 {
1735
1746
  var __NEXT_HTTP_AGENT: Agent;
1736
1747
  var __NEXT_HTTPS_AGENT: Agent$1;
1737
1748
  }
1738
- type FileSizeSuffix = `${'k' | 'K' | 'm' | 'M' | 'g' | 'G' | 't' | 'T' | 'p' | 'P'}${'b' | 'B'}`;
1739
- type SizeLimit = number | `${number}${FileSizeSuffix}`;
1740
- type PreviewData = string | false | object | undefined;
1741
1749
  declare const handler: <T, Q extends ParsedQueryParameters = ParsedQueryParameters, R extends NextApiRequest = NextApiRequest, Response extends NextApiResponse = NextApiResponse, M extends string = string>(adapter: Adapter<T, Q>, options?: HandlerOptions<M>) => Promise<ExecuteHandler<R, Response>>;
1742
1750
  export { handler$1 as edgeHandler, handler as nodeHandler };
@@ -1 +1 @@
1
- import{default as d}from"../packem_shared/edgeHandler-Deds33h_.mjs";import{default as o}from"../packem_shared/nodeHandler-CeBCrxYT.mjs";export{d as edgeHandler,o as nodeHandler};
1
+ import{default as d}from"../packem_shared/edgeHandler-CjCFAdvT.mjs";import{default as o}from"../packem_shared/nodeHandler-atOpJB2d.mjs";export{d as edgeHandler,o as nodeHandler};
@@ -0,0 +1 @@
1
+ class t extends Error{statusCode;constructor(s,r){super(r),this.name="CrudApiError",this.statusCode=s,Object.setPrototypeOf(this,t.prototype)}}export{t as default};
@@ -0,0 +1 @@
1
+ "use strict";class t extends Error{statusCode;constructor(s,r){super(r),this.name="CrudApiError",this.statusCode=s,Object.setPrototypeOf(this,t.prototype)}}module.exports=t;
@@ -0,0 +1 @@
1
+ import u from"http-errors";import{n as $}from"./models-to-route-names-BFpwjyxy.mjs";const b=new Set(["boolean","number","string"]),d=r=>b.has(typeof r),C=r=>{const t={};if(Object.keys(r).forEach(e=>{const s=r[e];d(s)&&(t[e]=s)}),Object.keys(t).length!==1)throw new Error("cursor needs to be an object with exactly 1 property with a primitive value");return t},D={$asc:"asc",$desc:"desc"},O=r=>{const t={};return Object.keys(r).forEach(e=>{const s=r[e];t[e]=D[s]}),t},m=(r,t)=>{const e={};return Object.keys(r).forEach(s=>{e[s]=r[s]===!0?!0:{[t]:m(r[s],t)}}),e},o=r=>r instanceof Object,P={$cont:"contains",$ends:"endsWith",$eq:"equals",$gt:"gt",$gte:"gte",$in:"in",$lt:"lt",$lte:"lte",$neq:"not",$notin:"notIn",$starts:"startsWith"},E=r=>/^\d{4}-[01]\d-[0-3]\d(?:T[0-2](?:\d:[0-5]){2}\d(?:\.\d+)?(?:Z|[+-][0-2]\d(?::?[0-5]\d)?)?)?$/g.test(r),M=(r,t)=>t&&typeof r=="string"&&E(r)?new Date(r):typeof r=="string"&&r==="$isnull"?null:r,p=(r,t)=>{const e=r.split(".");return e.splice(-1,1),t.includes(e.join("."))},y=r=>{const t=Object.keys(r)[0],e=P[t];if(e)return{[e]:r[t]}},f=(r,t,e,s,i)=>{const n=t.split(".").toReversed();let a={};n.forEach((h,k)=>{k===0?g(r,h,a,s,i):a={[h]:{some:a}}});const c=n.toReversed()[0],w=e[c];e[c]={some:{...w?.some,...a[c]?.some}}},l=(r,t,e)=>{const s={};return Object.keys(r).forEach(i=>{const n=r[i];if(p(i,t))f(n,i,s,t,e);else if(d(n))s[i]=n;else if(o(n)){const a=y(n);a&&(s[i]=a)}}),s},g=(r,t,e,s,i)=>{if(d(r))e[t]=M(r,i);else switch(t){case"$and":{o(r)&&(e.AND=l(r,s,i));break}case"$not":{o(r)&&(e.NOT=l(r,s,i));break}case"$or":{o(r)&&(e.OR=l(r,s,i));break}default:{e[t]=y(r);break}}},j=(r,t,e=!0)=>{const s={};return Object.keys(r).forEach(i=>{const n=r[i];p(i,t)?f(n,i,s,t,e):g(n,i,s,t,e)}),s};class K{models;ctorModels;dmmf;manyRelations;primaryKey;prismaClient;coerceWhereDates;ctorDmmf;constructor({coerceWhereDates:t=!0,dmmf:e,manyRelations:s={},models:i,primaryKey:n="id",prismaClient:a}){this.prismaClient=a,this.primaryKey=n,this.manyRelations=s,this.ctorModels=i,this.coerceWhereDates=t,this.ctorDmmf=e}async connect(){await this.prismaClient.$connect()}async create(t,e,s){return await this.getPrismaDelegate(t).create({data:e,include:s.include,select:s.select})}async delete(t,e,s){return await this.getPrismaDelegate(t).delete({include:s.include,select:s.select,where:{[this.primaryKey]:e}})}async disconnect(){await this.prismaClient.$disconnect()}async getAll(t,e){return await this.getPrismaDelegate(t).findMany({cursor:e.cursor,distinct:e.distinct,include:e.include,orderBy:e.orderBy,select:e.select,skip:e.skip,take:e.take,where:e.where})}getModels(){return this.models??[]}async getOne(t,e,s){const i=this.getPrismaDelegate(t);return await(i.findUnique??i.findOne)({include:s.include,select:s.select,where:{[this.primaryKey]:e}})}async getPaginationData(t,e){const s=await this.getPrismaDelegate(t).count({distinct:e.distinct,where:e.where}),i=e.take??0;return{page:i>0?Math.ceil((e.skip??0)/i)+1:1,pageCount:i>0?Math.ceil(s/i):0,total:s}}handleError(t){throw console.error(t),t instanceof Error&&t.stack&&console.error(t.stack),t.constructor.name==="PrismaClientKnownRequestError"||t.constructor.name==="PrismaClientValidationError"?u(400,"invalid request, check your server logs for more info"):u(500,"an unknown error occured, check your server logs for more info")}async init(){const t=this.ctorModels,e=await this.getPrismaClientModels();t!==void 0&&t.forEach(s=>{if(!Object.keys(e).includes(s))throw new Error(`Model name ${s} is invalid.`)}),this.models=t??Object.keys(e)}async mapModelsToRouteNames(){return $(await this.getPrismaClientModels(),this.getModels())}parseQuery(t,e){const s={};return e.select&&(s.select=m(e.select,"select")),e.include&&(s.include=m(e.include,"include")),e.where&&(s.where=j(e.where,this.manyRelations[t]??[],this.coerceWhereDates)),e.orderBy&&(s.orderBy=O(e.orderBy)),e.limit!==void 0&&(s.take=e.limit),e.skip!==void 0&&(s.skip=e.skip),e.originalQuery?.cursor&&(s.cursor=C(JSON.parse(e.originalQuery.cursor))),e.distinct&&(s.distinct=e.distinct),s}async update(t,e,s,i){return await this.getPrismaDelegate(t).update({data:s,include:i.include,select:i.select,where:{[this.primaryKey]:e}})}get client(){return this.prismaClient}getPrismaClientModels=async()=>{const t=this.ctorDmmf?.datamodel?.models;if(t!==void 0)return Object.fromEntries(t.map(s=>[s.name,{}]));const e=this.prismaClient._runtimeDataModel?.models;if(e!==void 0)return Object.fromEntries(Object.keys(e).map(s=>[s,{}]));if(this.prismaClient._dmmf!==void 0)return this.dmmf=this.prismaClient._dmmf,this.dmmf.mappingsMap;if(this.prismaClient._getDmmf!==void 0)return this.dmmf=await this.prismaClient._getDmmf(),this.dmmf.mappingsMap;throw new Error("Couldn't get prisma client models. For Prisma 5/6 pass `dmmf: Prisma.dmmf` to the PrismaAdapter constructor.")};getPrismaDelegate(t){return this.prismaClient[`${t.charAt(0).toLowerCase()}${t.slice(1)}`]}}export{K as default};
@@ -0,0 +1 @@
1
+ "use strict";const $=require("http-errors"),b=require("./models-to-route-names-CWnxPVCQ.cjs"),C=r=>r&&typeof r=="object"&&"default"in r?r.default:r,h=C($),D=new Set(["boolean","number","string"]),m=r=>D.has(typeof r),O=r=>{const t={};if(Object.keys(r).forEach(e=>{const s=r[e];m(s)&&(t[e]=s)}),Object.keys(t).length!==1)throw new Error("cursor needs to be an object with exactly 1 property with a primitive value");return t},P={$asc:"asc",$desc:"desc"},j=r=>{const t={};return Object.keys(r).forEach(e=>{const s=r[e];t[e]=P[s]}),t},d=(r,t)=>{const e={};return Object.keys(r).forEach(s=>{e[s]=r[s]===!0?!0:{[t]:d(r[s],t)}}),e},o=r=>r instanceof Object,E={$cont:"contains",$ends:"endsWith",$eq:"equals",$gt:"gt",$gte:"gte",$in:"in",$lt:"lt",$lte:"lte",$neq:"not",$notin:"notIn",$starts:"startsWith"},M=r=>/^\d{4}-[01]\d-[0-3]\d(?:T[0-2](?:\d:[0-5]){2}\d(?:\.\d+)?(?:Z|[+-][0-2]\d(?::?[0-5]\d)?)?)?$/g.test(r),v=(r,t)=>t&&typeof r=="string"&&M(r)?new Date(r):typeof r=="string"&&r==="$isnull"?null:r,p=(r,t)=>{const e=r.split(".");return e.splice(-1,1),t.includes(e.join("."))},y=r=>{const t=Object.keys(r)[0],e=E[t];if(e)return{[e]:r[t]}},f=(r,t,e,s,i)=>{const n=t.split(".").toReversed();let a={};n.forEach((u,k)=>{k===0?g(r,u,a,s,i):a={[u]:{some:a}}});const c=n.toReversed()[0],w=e[c];e[c]={some:{...w?.some,...a[c]?.some}}},l=(r,t,e)=>{const s={};return Object.keys(r).forEach(i=>{const n=r[i];if(p(i,t))f(n,i,s,t,e);else if(m(n))s[i]=n;else if(o(n)){const a=y(n);a&&(s[i]=a)}}),s},g=(r,t,e,s,i)=>{if(m(r))e[t]=v(r,i);else switch(t){case"$and":{o(r)&&(e.AND=l(r,s,i));break}case"$not":{o(r)&&(e.NOT=l(r,s,i));break}case"$or":{o(r)&&(e.OR=l(r,s,i));break}default:{e[t]=y(r);break}}},R=(r,t,e=!0)=>{const s={};return Object.keys(r).forEach(i=>{const n=r[i];p(i,t)?f(n,i,s,t,e):g(n,i,s,t,e)}),s};class q{models;ctorModels;dmmf;manyRelations;primaryKey;prismaClient;coerceWhereDates;ctorDmmf;constructor({coerceWhereDates:t=!0,dmmf:e,manyRelations:s={},models:i,primaryKey:n="id",prismaClient:a}){this.prismaClient=a,this.primaryKey=n,this.manyRelations=s,this.ctorModels=i,this.coerceWhereDates=t,this.ctorDmmf=e}async connect(){await this.prismaClient.$connect()}async create(t,e,s){return await this.getPrismaDelegate(t).create({data:e,include:s.include,select:s.select})}async delete(t,e,s){return await this.getPrismaDelegate(t).delete({include:s.include,select:s.select,where:{[this.primaryKey]:e}})}async disconnect(){await this.prismaClient.$disconnect()}async getAll(t,e){return await this.getPrismaDelegate(t).findMany({cursor:e.cursor,distinct:e.distinct,include:e.include,orderBy:e.orderBy,select:e.select,skip:e.skip,take:e.take,where:e.where})}getModels(){return this.models??[]}async getOne(t,e,s){const i=this.getPrismaDelegate(t);return await(i.findUnique??i.findOne)({include:s.include,select:s.select,where:{[this.primaryKey]:e}})}async getPaginationData(t,e){const s=await this.getPrismaDelegate(t).count({distinct:e.distinct,where:e.where}),i=e.take??0;return{page:i>0?Math.ceil((e.skip??0)/i)+1:1,pageCount:i>0?Math.ceil(s/i):0,total:s}}handleError(t){throw console.error(t),t instanceof Error&&t.stack&&console.error(t.stack),t.constructor.name==="PrismaClientKnownRequestError"||t.constructor.name==="PrismaClientValidationError"?h(400,"invalid request, check your server logs for more info"):h(500,"an unknown error occured, check your server logs for more info")}async init(){const t=this.ctorModels,e=await this.getPrismaClientModels();t!==void 0&&t.forEach(s=>{if(!Object.keys(e).includes(s))throw new Error(`Model name ${s} is invalid.`)}),this.models=t??Object.keys(e)}async mapModelsToRouteNames(){return b.n(await this.getPrismaClientModels(),this.getModels())}parseQuery(t,e){const s={};return e.select&&(s.select=d(e.select,"select")),e.include&&(s.include=d(e.include,"include")),e.where&&(s.where=R(e.where,this.manyRelations[t]??[],this.coerceWhereDates)),e.orderBy&&(s.orderBy=j(e.orderBy)),e.limit!==void 0&&(s.take=e.limit),e.skip!==void 0&&(s.skip=e.skip),e.originalQuery?.cursor&&(s.cursor=O(JSON.parse(e.originalQuery.cursor))),e.distinct&&(s.distinct=e.distinct),s}async update(t,e,s,i){return await this.getPrismaDelegate(t).update({data:s,include:i.include,select:i.select,where:{[this.primaryKey]:e}})}get client(){return this.prismaClient}getPrismaClientModels=async()=>{const t=this.ctorDmmf?.datamodel?.models;if(t!==void 0)return Object.fromEntries(t.map(s=>[s.name,{}]));const e=this.prismaClient._runtimeDataModel?.models;if(e!==void 0)return Object.fromEntries(Object.keys(e).map(s=>[s,{}]));if(this.prismaClient._dmmf!==void 0)return this.dmmf=this.prismaClient._dmmf,this.dmmf.mappingsMap;if(this.prismaClient._getDmmf!==void 0)return this.dmmf=await this.prismaClient._getDmmf(),this.dmmf.mappingsMap;throw new Error("Couldn't get prisma client models. For Prisma 5/6 pass `dmmf: Prisma.dmmf` to the PrismaAdapter constructor.")};getPrismaDelegate(t){return this.prismaClient[`${t.charAt(0).toLowerCase()}${t.slice(1)}`]}}module.exports=q;
@@ -0,0 +1 @@
1
+ import{createRequire as q}from"node:module";import c from"http-errors";import T from"./CrudApiError-BH1byAwV.mjs";import{paginate as D}from"@visulima/pagination";import{RouteType as u}from"./RouteType-BQ2RxFPE.mjs";import{s as L}from"./get-accessible-routes-CGvT_kuy.mjs";import{match as I}from"path-to-regexp";const F=q(import.meta.url),m=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,C=t=>{if(typeof m<"u"&&m.versions&&m.versions.node){const[e,n]=m.versions.node.split(".").map(Number);if(e>22||e===22&&n>=3||e===20&&n>=16)return m.getBuiltinModule(t)}return F(t)},{URL:M}=C("node:url"),B=async({adapter:t,query:e,request:n,resourceName:r})=>({data:await t.create(r,n.body,e),status:201}),U=async({adapter:t,query:e,resourceId:n,resourceName:r})=>{if(await t.getOne(r,n,e))return{data:await t.delete(r,n,e),status:200};throw c(404,`${r} ${String(n)} not found`)},Q=async({adapter:t,pagination:e,query:n,resourceName:r})=>{let o=!1,i;if(n.page!==void 0){if(n.page<=0)throw new Error("page query must be a strictly positive number");i={page:n.page,perPage:n.limit??e.perPage}}i&&(o=!0,n.skip=(i.page-1)*i.perPage,n.take=i.perPage);const a=await t.getAll(r,n);if(o){const{page:s,total:d}=await t.getPaginationData(r,n);return{data:D(s,i.perPage,d,a).toJSON(),status:200}}return{data:a,status:200}},J=async({adapter:t,query:e,resourceId:n,resourceName:r})=>{const o=await t.getOne(r,n,e);if(!o)throw c(404,`${r} ${String(n)} not found`);return{data:o,status:200}},G=async({adapter:t,query:e,request:n,resourceId:r,resourceName:o})=>{if(await t.getOne(o,r,e))return{data:await t.update(o,r,n.body,e),status:200};throw c(404,`${o} ${String(r)} not found`)},x=t=>{const e=typeof t;return t!==null&&(e==="object"||e==="function")},O=new Set(["__proto__","prototype","constructor"]),_=1e6,X=t=>t>="0"&&t<="9";function P(t){if(t==="0")return!0;if(/^[1-9]\d*$/.test(t)){const e=Number.parseInt(t,10);return e<=Number.MAX_SAFE_INTEGER&&e<=_}return!1}function w(t,e){return O.has(t)?!1:(t&&P(t)?e.push(Number.parseInt(t,10)):e.push(t),!0)}function H(t){if(typeof t!="string")throw new TypeError(`Expected a string, got ${typeof t}`);const e=[];let n="",r="start",o=!1,i=0;for(const a of t){if(i++,o){n+=a,o=!1;continue}if(a==="\\"){if(r==="index")throw new Error(`Invalid character '${a}' in an index at position ${i}`);if(r==="indexEnd")throw new Error(`Invalid character '${a}' after an index at position ${i}`);o=!0,r=r==="start"?"property":r;continue}switch(a){case".":{if(r==="index")throw new Error(`Invalid character '${a}' in an index at position ${i}`);if(r==="indexEnd"){r="property";break}if(!w(n,e))return[];n="",r="property";break}case"[":{if(r==="index")throw new Error(`Invalid character '${a}' in an index at position ${i}`);if(r==="indexEnd"){r="index";break}if(r==="property"||r==="start"){if((n||r==="property")&&!w(n,e))return[];n=""}r="index";break}case"]":{if(r==="index"){if(n==="")n=(e.pop()||"")+"[]",r="property";else{const s=Number.parseInt(n,10);!Number.isNaN(s)&&Number.isFinite(s)&&s>=0&&s<=Number.MAX_SAFE_INTEGER&&s<=_&&n===String(s)?e.push(s):e.push(n),n="",r="indexEnd"}break}if(r==="indexEnd")throw new Error(`Invalid character '${a}' after an index at position ${i}`);n+=a;break}default:{if(r==="index"&&!X(a))throw new Error(`Invalid character '${a}' in an index at position ${i}`);if(r==="indexEnd")throw new Error(`Invalid character '${a}' after an index at position ${i}`);r==="start"&&(r="property"),n+=a}}}switch(o&&(n+="\\"),r){case"property":{if(!w(n,e))return[];break}case"index":throw new Error("Index was not closed");case"start":{e.push("");break}}return e}function z(t){if(typeof t=="string")return H(t);if(Array.isArray(t)){const e=[];for(const[n,r]of t.entries()){if(typeof r!="string"&&typeof r!="number")throw new TypeError(`Expected a string or number for path segment at index ${n}, got ${typeof r}`);if(typeof r=="number"&&!Number.isFinite(r))throw new TypeError(`Path segment at index ${n} must be a finite number, got ${r}`);if(O.has(r))return[];typeof r=="string"&&P(r)?e.push(Number.parseInt(r,10)):e.push(r)}return e}return[]}function S(t,e,n){if(!x(t)||typeof e!="string"&&!Array.isArray(e))return t;const r=t,o=z(e);if(o.length===0)return t;for(let i=0;i<o.length;i++){const a=o[i];if(i===o.length-1)t[a]=n;else if(!x(t[a])){const s=typeof o[i+1]=="number";t[a]=s?[]:{}}t=t[a]}return r}const v=t=>{const e={};return t.split(",").forEach(n=>{S(e,n,!0)}),e},K=t=>{let e;try{e=JSON.parse(t)}catch{throw c(400,'Invalid JSON in "where" query parameter')}const n={};return Object.keys(e).forEach(r=>{S(n,r,e[r])}),n},V=t=>{let e;try{e=JSON.parse(t)}catch{throw c(400,'Invalid JSON in "orderBy" query parameter')}const n=Object.keys(e),r=n[0];if(n.length!==1||r===void 0||e[r]!=="$asc"&&e[r]!=="$desc")throw c(400,"orderBy needs to be an object with exactly 1 property with either $asc or $desc value");return{[r]:e[r]}},W=t=>{if(t){const{searchParams:e}=new M(t),n={};return e.get("select")&&(n.select=v(e.get("select"))),e.get("include")&&(n.include=v(e.get("include"))),e.get("where")&&(n.where=K(e.get("where"))),e.get("orderBy")&&(n.orderBy=V(e.get("orderBy"))),e.has("limit")&&(n.limit=Number.isFinite(+e.get("limit"))?+e.get("limit"):void 0),e.has("skip")&&(n.skip=Number.isFinite(+e.get("skip"))?+e.get("skip"):void 0),e.get("distinct")&&(n.distinct=e.get("distinct")),e.get("page")&&(n.page=Number.isFinite(+e.get("page"))?+e.get("page"):void 0),{originalQuery:Object.fromEntries(e.entries()),...n}}return{}},Y=(t,e)=>{const n=new Set(e),r={};return Object.keys(t).forEach(o=>{n.has(o)&&(r[o]=t[o])}),r},b=t=>{const e=[];return Object.keys(t).forEach(n=>{if(n==="$and"||n==="$or"||n==="$not"){const r=t[n];Array.isArray(r)?r.forEach(o=>e.push(...b(o))):r&&typeof r=="object"&&e.push(...b(r));return}e.push(n.split(".")[0])}),e},Z=(t,e)=>{if(!e)return t;if(t.select&&(e.selectableFields&&(t.select=Y(t.select,e.selectableFields)),e.readableFields&&e.readableFields.length>0)){const n=new Set(e.readableFields);t.select=Object.fromEntries(Object.entries(t.select).filter(([r])=>!n.has(r)))}if(t.include&&e.includableRelations){const n=new Set(e.includableRelations);Object.keys(t.include).forEach(r=>{if(!n.has(r))throw c(400,`Relation "${r}" is not includable`)})}if(e.filterableFields){const n=new Set(e.filterableFields);t.where&&b(t.where).forEach(r=>{if(!n.has(r))throw c(400,`Field "${r}" is not filterable`)}),t.orderBy&&Object.keys(t.orderBy).forEach(r=>{if(!n.has(r))throw c(400,`Field "${r}" is not sortable`)})}return t},R=(t,e)=>{if(!e?.writableFields)return t;const n=new Set(e.writableFields);return Object.fromEntries(Object.entries(t).filter(([r])=>n.has(r)))},ee=t=>Number.isSafeInteger(+t)?+t:t,te=t=>`${t.charAt(0).toLowerCase()}${t.slice(1)}`,re=(t,e)=>{const n=t.split("?")[0];if(n===void 0)throw new TypeError("Path is undefined");const r=new Set(n.split("/").filter(Boolean)),o=Object.keys(e).find(i=>{const a=e[i];return a===""?!0:r.has(a)||r.has(te(a))});if(o===void 0)throw new Error(`Couldn't find model name for url ${t}`);return{modelName:o,resourceName:e[o]}},A=new Map,ne=t=>{let e=A.get(t);return e===void 0&&(e={entityMatcher:I(`/*placeholder/${t}{/:id}`,{decode:decodeURIComponent}),simpleMatcher:I(`/*placeholder/${t}`,{decode:decodeURIComponent})},A.set(t,e)),e},oe=(t,e,n)=>{const r=e.split("?")[0];if(r===void 0)throw new TypeError("Path is undefined");if(!r.includes(`/${n}`))throw new Error(`invalid resource name '${n}' for route '${r}'`);const{entityMatcher:o,simpleMatcher:i}=ne(n);switch(t){case"DELETE":{const a=o(r);return typeof a=="object"&&a.params.id?{resourceId:a.params.id,routeType:u.DELETE}:{routeType:null}}case"GET":{const a=o(r);return typeof a=="object"&&a.params.id?{resourceId:a.params.id,routeType:u.READ_ONE}:{routeType:u.READ_ALL}}case"PATCH":case"PUT":{const a=o(r);return typeof a=="object"&&a.params.id?{resourceId:a.params.id,routeType:u.UPDATE}:{routeType:null}}case"POST":return i(r)?{routeType:u.CREATE}:{routeType:null};default:return{routeType:null}}},ae=["create","delete","getAll","getOne","parseQuery","update","getPaginationData","getModels"],se=t=>{ae.forEach(e=>{if(!t[e])throw c(500,`Adapter must implement the "${e}" method.`)})},ie=/\/$/u,j=async(t,e)=>t?await t.parse(e):e,ce=t=>{const{headers:e}=t;return e&&typeof e.get=="function"?e.get("host")??"":e?.host??""},ue=async(t,e)=>{throw c(404,`Resource not found: ${e}`)},de=async({config:t,modelConfig:e,parameters:n,parsedQuery:r,request:o,resourceIdFormatted:i,routeType:a})=>{switch(a){case u.CREATE:{const s=await j(e?.createSchema,R(o.body??{},e));return(t.handlers?.create??B)({...n,request:Object.assign(o,{body:s})})}case u.DELETE:return(t.handlers?.delete??U)({...n,resourceId:i});case u.READ_ALL:return(t.handlers?.list??Q)({...n,pagination:t.pagination,query:{...n.query,limit:r.limit??void 0,page:r.page??void 0}});case u.READ_ONE:return(t.handlers?.get??J)({...n,resourceId:i});case u.UPDATE:{const s=await j(e?.updateSchema,R(o.body??{},e));return(t.handlers?.update??G)({...n,request:Object.assign(o,{body:s}),resourceId:i})}default:return{data:"Method not found",status:404}}};async function we(t,e,n,r){try{se(n)}catch(s){const d=s;throw new T(d.statusCode,d.message)}await n.init?.();const o={formatResourceId:ee,pagination:{perPage:20},...r},i=await n.mapModelsToRouteNames?.(),a={};return n.getModels().forEach(s=>{a[s]=o.models?.[s]?.name??i?.[s]??s}),await n.connect?.(),async(s,d)=>{const{modelName:y,resourceName:E}=re(s.url,a);E||await ue(n,s.url);const{resourceId:$,routeType:l}=oe(s.method,s.url,E);if(l===null)throw c(404,`Route not found: ${s.url}`);const p=r?.models?.[y];if(!L(p?.only,p?.exclude,r?.exposeStrategy??"all").includes(l))throw c(404,`Route not found: ${s.url}`);const N=p?.formatResourceId?.($)??o.formatResourceId($);await r?.onRequest?.({method:s.method,resourceId:l===u.CREATE||l===u.READ_ALL?void 0:N,resourceName:y,routeType:l,url:s.url});try{const f=W(`https://${ce(s).replace(ie,"")}/${s.url}`);Z(f,p);const g=p?.maxPerPage??r?.maxPerPage;g!==void 0&&f.limit!==void 0&&f.limit>g&&(f.limit=g);const k={adapter:n,query:n.parseQuery(y,f),resourceName:y};try{const h=await de({config:o,modelConfig:p,parameters:k,parsedQuery:f,request:s,resourceIdFormatted:N,routeType:l});return await t(d,h)}catch(h){if(n.handleError&&!(h instanceof T))n.handleError(h);else throw h;return d}}finally{await e(d)}}}export{we as default};
@@ -0,0 +1 @@
1
+ "use strict";const k=require("http-errors"),T=require("./CrudApiError-DkRqkpib.cjs"),F=require("@visulima/pagination"),_=require("node:url"),c=require("./RouteType-DLV_OhhD.cjs"),C=require("./get-accessible-routes-BCUs20dV.cjs"),R=require("path-to-regexp"),D=t=>t&&typeof t=="object"&&"default"in t?t.default:t,u=D(k),L=async({adapter:t,query:e,request:n,resourceName:r})=>({data:await t.create(r,n.body,e),status:201}),M=async({adapter:t,query:e,resourceId:n,resourceName:r})=>{if(await t.getOne(r,n,e))return{data:await t.delete(r,n,e),status:200};throw u(404,`${r} ${String(n)} not found`)},B=async({adapter:t,pagination:e,query:n,resourceName:r})=>{let o=!1,i;if(n.page!==void 0){if(n.page<=0)throw new Error("page query must be a strictly positive number");i={page:n.page,perPage:n.limit??e.perPage}}i&&(o=!0,n.skip=(i.page-1)*i.perPage,n.take=i.perPage);const a=await t.getAll(r,n);if(o){const{page:s,total:d}=await t.getPaginationData(r,n);return{data:F.paginate(s,i.perPage,d,a).toJSON(),status:200}}return{data:a,status:200}},U=async({adapter:t,query:e,resourceId:n,resourceName:r})=>{const o=await t.getOne(r,n,e);if(!o)throw u(404,`${r} ${String(n)} not found`);return{data:o,status:200}},Q=async({adapter:t,query:e,request:n,resourceId:r,resourceName:o})=>{if(await t.getOne(o,r,e))return{data:await t.update(o,r,n.body,e),status:200};throw u(404,`${o} ${String(r)} not found`)},N=t=>{const e=typeof t;return t!==null&&(e==="object"||e==="function")},O=new Set(["__proto__","prototype","constructor"]),q=1e6,J=t=>t>="0"&&t<="9";function P(t){if(t==="0")return!0;if(/^[1-9]\d*$/.test(t)){const e=Number.parseInt(t,10);return e<=Number.MAX_SAFE_INTEGER&&e<=q}return!1}function g(t,e){return O.has(t)?!1:(t&&P(t)?e.push(Number.parseInt(t,10)):e.push(t),!0)}function G(t){if(typeof t!="string")throw new TypeError(`Expected a string, got ${typeof t}`);const e=[];let n="",r="start",o=!1,i=0;for(const a of t){if(i++,o){n+=a,o=!1;continue}if(a==="\\"){if(r==="index")throw new Error(`Invalid character '${a}' in an index at position ${i}`);if(r==="indexEnd")throw new Error(`Invalid character '${a}' after an index at position ${i}`);o=!0,r=r==="start"?"property":r;continue}switch(a){case".":{if(r==="index")throw new Error(`Invalid character '${a}' in an index at position ${i}`);if(r==="indexEnd"){r="property";break}if(!g(n,e))return[];n="",r="property";break}case"[":{if(r==="index")throw new Error(`Invalid character '${a}' in an index at position ${i}`);if(r==="indexEnd"){r="index";break}if(r==="property"||r==="start"){if((n||r==="property")&&!g(n,e))return[];n=""}r="index";break}case"]":{if(r==="index"){if(n==="")n=(e.pop()||"")+"[]",r="property";else{const s=Number.parseInt(n,10);!Number.isNaN(s)&&Number.isFinite(s)&&s>=0&&s<=Number.MAX_SAFE_INTEGER&&s<=q&&n===String(s)?e.push(s):e.push(n),n="",r="indexEnd"}break}if(r==="indexEnd")throw new Error(`Invalid character '${a}' after an index at position ${i}`);n+=a;break}default:{if(r==="index"&&!J(a))throw new Error(`Invalid character '${a}' in an index at position ${i}`);if(r==="indexEnd")throw new Error(`Invalid character '${a}' after an index at position ${i}`);r==="start"&&(r="property"),n+=a}}}switch(o&&(n+="\\"),r){case"property":{if(!g(n,e))return[];break}case"index":throw new Error("Index was not closed");case"start":{e.push("");break}}return e}function X(t){if(typeof t=="string")return G(t);if(Array.isArray(t)){const e=[];for(const[n,r]of t.entries()){if(typeof r!="string"&&typeof r!="number")throw new TypeError(`Expected a string or number for path segment at index ${n}, got ${typeof r}`);if(typeof r=="number"&&!Number.isFinite(r))throw new TypeError(`Path segment at index ${n} must be a finite number, got ${r}`);if(O.has(r))return[];typeof r=="string"&&P(r)?e.push(Number.parseInt(r,10)):e.push(r)}return e}return[]}function S(t,e,n){if(!N(t)||typeof e!="string"&&!Array.isArray(e))return t;const r=t,o=X(e);if(o.length===0)return t;for(let i=0;i<o.length;i++){const a=o[i];if(i===o.length-1)t[a]=n;else if(!N(t[a])){const s=typeof o[i+1]=="number";t[a]=s?[]:{}}t=t[a]}return r}const I=t=>{const e={};return t.split(",").forEach(n=>{S(e,n,!0)}),e},H=t=>{let e;try{e=JSON.parse(t)}catch{throw u(400,'Invalid JSON in "where" query parameter')}const n={};return Object.keys(e).forEach(r=>{S(n,r,e[r])}),n},z=t=>{let e;try{e=JSON.parse(t)}catch{throw u(400,'Invalid JSON in "orderBy" query parameter')}const n=Object.keys(e),r=n[0];if(n.length!==1||r===void 0||e[r]!=="$asc"&&e[r]!=="$desc")throw u(400,"orderBy needs to be an object with exactly 1 property with either $asc or $desc value");return{[r]:e[r]}},K=t=>{if(t){const{searchParams:e}=new _.URL(t),n={};return e.get("select")&&(n.select=I(e.get("select"))),e.get("include")&&(n.include=I(e.get("include"))),e.get("where")&&(n.where=H(e.get("where"))),e.get("orderBy")&&(n.orderBy=z(e.get("orderBy"))),e.has("limit")&&(n.limit=Number.isFinite(+e.get("limit"))?+e.get("limit"):void 0),e.has("skip")&&(n.skip=Number.isFinite(+e.get("skip"))?+e.get("skip"):void 0),e.get("distinct")&&(n.distinct=e.get("distinct")),e.get("page")&&(n.page=Number.isFinite(+e.get("page"))?+e.get("page"):void 0),{originalQuery:Object.fromEntries(e.entries()),...n}}return{}},V=(t,e)=>{const n=new Set(e),r={};return Object.keys(t).forEach(o=>{n.has(o)&&(r[o]=t[o])}),r},w=t=>{const e=[];return Object.keys(t).forEach(n=>{if(n==="$and"||n==="$or"||n==="$not"){const r=t[n];Array.isArray(r)?r.forEach(o=>e.push(...w(o))):r&&typeof r=="object"&&e.push(...w(r));return}e.push(n.split(".")[0])}),e},W=(t,e)=>{if(!e)return t;if(t.select&&(e.selectableFields&&(t.select=V(t.select,e.selectableFields)),e.readableFields&&e.readableFields.length>0)){const n=new Set(e.readableFields);t.select=Object.fromEntries(Object.entries(t.select).filter(([r])=>!n.has(r)))}if(t.include&&e.includableRelations){const n=new Set(e.includableRelations);Object.keys(t.include).forEach(r=>{if(!n.has(r))throw u(400,`Relation "${r}" is not includable`)})}if(e.filterableFields){const n=new Set(e.filterableFields);t.where&&w(t.where).forEach(r=>{if(!n.has(r))throw u(400,`Field "${r}" is not filterable`)}),t.orderBy&&Object.keys(t.orderBy).forEach(r=>{if(!n.has(r))throw u(400,`Field "${r}" is not sortable`)})}return t},x=(t,e)=>{if(!e?.writableFields)return t;const n=new Set(e.writableFields);return Object.fromEntries(Object.entries(t).filter(([r])=>n.has(r)))},Y=t=>Number.isSafeInteger(+t)?+t:t,Z=t=>`${t.charAt(0).toLowerCase()}${t.slice(1)}`,ee=(t,e)=>{const n=t.split("?")[0];if(n===void 0)throw new TypeError("Path is undefined");const r=new Set(n.split("/").filter(Boolean)),o=Object.keys(e).find(i=>{const a=e[i];return a===""?!0:r.has(a)||r.has(Z(a))});if(o===void 0)throw new Error(`Couldn't find model name for url ${t}`);return{modelName:o,resourceName:e[o]}},A=new Map,te=t=>{let e=A.get(t);return e===void 0&&(e={entityMatcher:R.match(`/*placeholder/${t}{/:id}`,{decode:decodeURIComponent}),simpleMatcher:R.match(`/*placeholder/${t}`,{decode:decodeURIComponent})},A.set(t,e)),e},re=(t,e,n)=>{const r=e.split("?")[0];if(r===void 0)throw new TypeError("Path is undefined");if(!r.includes(`/${n}`))throw new Error(`invalid resource name '${n}' for route '${r}'`);const{entityMatcher:o,simpleMatcher:i}=te(n);switch(t){case"DELETE":{const a=o(r);return typeof a=="object"&&a.params.id?{resourceId:a.params.id,routeType:c.RouteType.DELETE}:{routeType:null}}case"GET":{const a=o(r);return typeof a=="object"&&a.params.id?{resourceId:a.params.id,routeType:c.RouteType.READ_ONE}:{routeType:c.RouteType.READ_ALL}}case"PATCH":case"PUT":{const a=o(r);return typeof a=="object"&&a.params.id?{resourceId:a.params.id,routeType:c.RouteType.UPDATE}:{routeType:null}}case"POST":return i(r)?{routeType:c.RouteType.CREATE}:{routeType:null};default:return{routeType:null}}},ne=["create","delete","getAll","getOne","parseQuery","update","getPaginationData","getModels"],oe=t=>{ne.forEach(e=>{if(!t[e])throw u(500,`Adapter must implement the "${e}" method.`)})},ae=/\/$/u,v=async(t,e)=>t?await t.parse(e):e,se=t=>{const{headers:e}=t;return e&&typeof e.get=="function"?e.get("host")??"":e?.host??""},ie=async(t,e)=>{throw u(404,`Resource not found: ${e}`)},ue=async({config:t,modelConfig:e,parameters:n,parsedQuery:r,request:o,resourceIdFormatted:i,routeType:a})=>{switch(a){case c.RouteType.CREATE:{const s=await v(e?.createSchema,x(o.body??{},e));return(t.handlers?.create??L)({...n,request:Object.assign(o,{body:s})})}case c.RouteType.DELETE:return(t.handlers?.delete??M)({...n,resourceId:i});case c.RouteType.READ_ALL:return(t.handlers?.list??B)({...n,pagination:t.pagination,query:{...n.query,limit:r.limit??void 0,page:r.page??void 0}});case c.RouteType.READ_ONE:return(t.handlers?.get??U)({...n,resourceId:i});case c.RouteType.UPDATE:{const s=await v(e?.updateSchema,x(o.body??{},e));return(t.handlers?.update??Q)({...n,request:Object.assign(o,{body:s}),resourceId:i})}default:return{data:"Method not found",status:404}}};async function ce(t,e,n,r){try{oe(n)}catch(s){const d=s;throw new T(d.statusCode,d.message)}await n.init?.();const o={formatResourceId:Y,pagination:{perPage:20},...r},i=await n.mapModelsToRouteNames?.(),a={};return n.getModels().forEach(s=>{a[s]=o.models?.[s]?.name??i?.[s]??s}),await n.connect?.(),async(s,d)=>{const{modelName:y,resourceName:b}=ee(s.url,a);b||await ie(n,s.url);const{resourceId:E,routeType:l}=re(s.method,s.url,b);if(l===null)throw u(404,`Route not found: ${s.url}`);const p=r?.models?.[y];if(!C.s(p?.only,p?.exclude,r?.exposeStrategy??"all").includes(l))throw u(404,`Route not found: ${s.url}`);const $=p?.formatResourceId?.(E)??o.formatResourceId(E);await r?.onRequest?.({method:s.method,resourceId:l===c.RouteType.CREATE||l===c.RouteType.READ_ALL?void 0:$,resourceName:y,routeType:l,url:s.url});try{const f=K(`https://${se(s).replace(ae,"")}/${s.url}`);W(f,p);const m=p?.maxPerPage??r?.maxPerPage;m!==void 0&&f.limit!==void 0&&f.limit>m&&(f.limit=m);const j={adapter:n,query:n.parseQuery(y,f),resourceName:y};try{const h=await ue({config:o,modelConfig:p,parameters:j,parsedQuery:f,request:s,resourceIdFormatted:$,routeType:l});return await t(d,h)}catch(h){if(n.handleError&&!(h instanceof T))n.handleError(h);else throw h;return d}}finally{await e(d)}}}module.exports=ce;
@@ -0,0 +1 @@
1
+ import n from"./baseHandler-BGTzX4YA.mjs";const c=async(a,s)=>await n(async(o,t)=>Response.json(t.data,{headers:{"content-type":"application/json; charset=utf-8"},status:t.status}),async()=>{},a,s);export{c as default};
@@ -0,0 +1 @@
1
+ "use strict";const n=require("./baseHandler-DnuGeT2-.cjs"),e=async(t,a)=>await n(async(c,s)=>Response.json(s.data,{headers:{"content-type":"application/json; charset=utf-8"},status:s.status}),async()=>{},t,a);module.exports=e;
@@ -0,0 +1 @@
1
+ "use strict";const e=require("./RouteType-DLV_OhhD.cjs"),T=(u,r,E="all")=>{let t=E==="none"?[]:[e.RouteType.READ_ALL,e.RouteType.READ_ONE,e.RouteType.UPDATE,e.RouteType.DELETE,e.RouteType.CREATE];return Array.isArray(u)&&(t=u),r?.length&&(t=t.filter(R=>!r.includes(R))),t};exports.s=T;
@@ -0,0 +1 @@
1
+ import{RouteType as e}from"./RouteType-BQ2RxFPE.mjs";const o=(t,E,A="all")=>{let r=A==="none"?[]:[e.READ_ALL,e.READ_ONE,e.UPDATE,e.DELETE,e.CREATE];return Array.isArray(t)&&(r=t),E?.length&&(r=r.filter(l=>!E.includes(l))),r};export{o as s};
@@ -0,0 +1 @@
1
+ const c=(n,o)=>{const r={};return o.forEach(t=>{r[t]=n[t].plural}),r};export{c as n};
@@ -0,0 +1 @@
1
+ "use strict";const s=(r,c)=>{const t={};return c.forEach(n=>{t[n]=r[n].plural}),t};exports.n=s;
@@ -0,0 +1 @@
1
+ "use strict";const I=require("./models-to-route-names-CWnxPVCQ.cjs"),S=require("@visulima/pagination"),D=require("@visulima/prisma-dmmf-transformer"),A=require("./get-accessible-routes-BCUs20dV.cjs"),l=require("./RouteType-DLV_OhhD.cjs"),g=r=>`#/components/schemas/${r}`,O=r=>{switch(r){case"BigInt":case"Int":return"integer";case"Boolean":return"boolean";case"Bytes":case"DateTime":case"String":return"string";case"Decimal":case"Float":return"number";case"Json":return"object";case"Null":return"null";default:return""}},$="PaginationData",M=[{methodStart:"createOne",schemaNameStart:"Create"},{methodStart:"updateOne",schemaNameStart:"Update"}];class C{constructor(e){this.dmmf=e}dmmf;schemaInputTypes=new Map;formatInputTypeData(e){if(e.kind==="object"){const t=g(e.type.name);return e.isList?{items:{$ref:t},type:"array",xml:{name:e.type.name,wrapped:!0}}:{$ref:t}}const a=O(e.type);return e.isList?{items:{type:a},type:"array",xml:{name:e.type.name,wrapped:!0}}:{type:a}}getExampleModelsSchemas(e,a){const t=n=>{const o=n.replace("#/components/schemas/",""),p=a[o],c={};return Object.entries(p.properties??{}).forEach(([u,m])=>{const d=m.type;c[u]=d==="array"?[i(m.items)]:d}),c},s=n=>{const o={};return Object.entries(n).forEach(([p,c])=>{o[p]=c.$ref===void 0?c.type:t(c.$ref)}),o},i=n=>{const o={};return Object.entries(n).forEach(([p,c])=>{c.items.$ref!==void 0?o[p]=[t(c.items.$ref)]:c.type==="array"?o[p]=[i(c.items)]:c.type==="object"?o[p]=s(c.properties):o[p]=c.type}),o};return e.reduce((n,o)=>{const p={},c=a[o];Object.entries(c.properties).forEach(([d,y])=>{const f=y.type;f==="array"?p[d]=[t(y.items.$ref)]:f==="object"?p[d]=s(y.properties):p[d]=f});const u=this.getPaginationDataSchema()[$],m={};return Object.entries(u.properties).forEach(([d,y])=>{m[d]=y.type}),{...n,[`${o}Page`]:{value:{data:[p],meta:m}},[`${o}s`]:{value:[p]},[o]:{value:p}}},{})}getPaginatedModelsSchemas(e){return e.reduce((a,t)=>({...a,[`${t}Page`]:{properties:{data:{items:{$ref:g(t)},type:"array",xml:{name:"data",wrapped:!0}},meta:{$ref:g($)}},type:"object",xml:{name:`${t}Page`}}}),{})}getPaginationDataSchema(){return S.createPaginationMetaSchemaObject($)}parseInputTypes(e){const a=e.reduce((t,s)=>(M.map(i=>({name:`${i.methodStart}${s}`,schemaName:`${i.schemaNameStart}${s}`})).forEach(({name:i,schemaName:n})=>{const o=this.dmmf.mutationType.fieldMap[i].args[0].inputTypes[0].type.fields,p=[],c=o.reduce((u,m)=>{if(m.inputTypes[0].kind==="scalar"){const d=D.getJSONSchemaProperty(this.dmmf.datamodel,{})({name:m.name,...m.inputTypes[0]}),{type:y}=d[1];y&&Array.isArray(y)?y.includes("null")&&(u[m.name]={...y,nullable:!0,type:y.filter(f=>f!=="null")},u[m.name].type.length===1&&(u[m.name]={...u[m.name],type:u[m.name].type[0]})):u[m.name]=d[1]}else{const d=this.parseObjectInputType(m.inputTypes[0]);u[m.name]={...d,nullable:m.isNullable}}return m.isRequired&&p.push(m.name),u},{});t[n]={properties:c,type:"object",xml:{name:n}},p.length>0&&(t[n].required=p)}),t),{});return this.schemaInputTypes.forEach((t,s)=>{a[s]={properties:t,type:"object",xml:{name:s}}}),a}parseModels(){const e=D.transformDMMF(this.dmmf).definitions;return Object.keys(e).forEach(a=>{const{properties:t}=e[a];Object.keys(t).forEach(s=>{Array.isArray(t[s].type)&&t[s].type.includes("null")&&(t[s].type=t[s].type.filter(i=>i!=="null"),t[s].type.length===1&&(t[s].type=t[s].type[0]),t[s].nullable=!0)})}),e}parseObjectInputType(e){return e.kind==="object"?(this.schemaInputTypes.has(e.type.name)||(this.schemaInputTypes.set(e.type.name,{}),e.type.fields.forEach(a=>{let t={};if(a.inputTypes.length>1){let s=!1;const i=a.inputTypes.map(n=>{const o=this.formatInputTypeData(n);if(o.type==="null"){s=!0;return}return o}).filter(Boolean);i.length===1?t=i[0]:t.anyOf=i,s&&(t.nullable=!0)}else{const s=a.inputTypes[0];t=this.formatInputTypeData(s)}this.schemaInputTypes.set(e.type.name,{...this.schemaInputTypes.get(e.type.name),[a.name]:t}),a.inputTypes.forEach(s=>{s.kind==="object"&&this.parseObjectInputType(s)})})),{$ref:g(e.type.name)}):{type:O(e.type)}}}const N=(r,e,a="all")=>r.reduce((t,s)=>e?.[s]?{...t,[s]:A.s(e[s].only,e[s].exclude,a)}:{...t,[s]:A.s(void 0,void 0,a)},{}),h={distinct:{description:"Fields to distinctively retrieve",name:"distinct",schema:{type:"string"}},include:{description:"Include relations, same as select",name:"include",schema:{type:"string"}},limit:{description:"Maximum number of elements to retrieve",name:"limit",schema:{minimum:0,type:"integer"}},orderBy:{description:'Field on which to order by a direction. See <a href="https://next-crud.js.org/query-params#orderBy">the docs</a>',name:"orderBy",schema:{type:"string"}},page:{description:"Page number. Use only for pagination.",name:"page",schema:{minimum:1,type:"integer"}},select:{description:"Fields to select. For nested fields, chain them separated with a dot, eg: user.posts",name:"select",schema:{type:"string"}},skip:{description:"Number of rows to skip",name:"skip",schema:{minimum:0,type:"integer"}},where:{description:'Fields to filter. See <a href="https://next-crud.js.org/query-params#where">the docs</a>',name:"where",schema:{type:"string"}}},w=[h.select,h.include].filter(Boolean),L=[...w,h.limit,h.skip,h.where,h.orderBy,h.page,h.distinct].filter(Boolean),k=(r,e=[])=>r===l.RouteType.READ_ALL?[...L,...e].filter(Boolean):[...w,...e].filter(Boolean),T=r=>`#/components/examples/${r}`,E=(r,e)=>e?{items:{$ref:g(r)},type:"array"}:{$ref:g(r)},B=(r,e)=>r===l.RouteType.CREATE?{content:{content:{"application/json":{example:T(e),schema:E(e)}},description:`${e} created`},statusCode:201}:r===l.RouteType.DELETE?{content:{content:{"application/json":{example:T(e),schema:E(e)}},description:`${e} item deleted`},statusCode:200}:r===l.RouteType.READ_ALL?{content:{content:{"application/json":{examples:{Default:{$ref:T(`${e}s`)},Pagination:{$ref:T(`${e}Page`)}},schema:{oneOf:[E(e,!0),E(`${e}Page`,!1)]}}},description:`${e} list retrieved`},statusCode:200}:r===l.RouteType.READ_ONE?{content:{content:{"application/json":{example:T(e),schema:E(e)}},description:`${e} item retrieved`},statusCode:200}:{content:{content:{"application/json":{example:T(e),schema:E(e)}},description:`${e} item updated`},statusCode:200},v=(r,e)=>({content:{"application/json":{schema:{$ref:g(`${r}${e}`)}}}}),q=r=>{switch(r){case l.RouteType.CREATE:return"post";case l.RouteType.DELETE:return"delete";case l.RouteType.READ_ALL:case l.RouteType.READ_ONE:return"get";case l.RouteType.UPDATE:return"put";default:throw new TypeError(`Method for route type ${r} was not found.`)}},x=({hasId:r,modelName:e,modelsConfig:a,routeTypes:t,tag:s})=>{const i={};return t.forEach(n=>{const o=a?.[e]?.routeTypes?.[n]?.response.name??a?.[e]?.type?.name??e,p=q(n),c=B(n,o);i[p]={parameters:k(n).map(u=>({...u,in:"query"})),responses:{[c.statusCode]:c.content,...a?.[e]?.routeTypes?.[n]?.responses},summary:a?.[e]?.routeTypes?.[n]?.summary,tags:[s]},r&&i[p].parameters.push({description:`ID of the ${e}`,in:"path",name:"id",required:!0,schema:{type:"string"}}),n===l.RouteType.UPDATE?i[p].requestBody=v("Update",o):n===l.RouteType.CREATE&&(i[p].requestBody=v("Create",o))}),i},_=({models:r,modelsConfig:e,routes:a,routesMap:t})=>Object.keys(a).reduce((s,i)=>{const n=a[i],o=r?.[i]?.name??t?.[i]??i,p=e?.[i]?.tag.name??i;if(n.includes(l.RouteType.CREATE)||n.includes(l.RouteType.READ_ALL)){const c=`/${o}`,u=[l.RouteType.READ_ALL,l.RouteType.CREATE].filter(m=>n.includes(m));s[c]=x({modelName:i,modelsConfig:e,routeTypes:u,tag:p})}if(n.includes(l.RouteType.READ_ONE)||n.includes(l.RouteType.UPDATE)||n.includes(l.RouteType.DELETE)){const c=`/${o}/{id}`,u=[l.RouteType.READ_ONE,l.RouteType.UPDATE,l.RouteType.DELETE].filter(m=>n.includes(m));s[c]=x({hasId:!0,modelName:i,modelsConfig:e,routeTypes:u,tag:p})}return s},{}),F=(r,e)=>r.map(a=>e?.[a]?.tag?e[a].tag:{name:a}),U=(r,e)=>{if(typeof r.example=="string"){const a=r.example.replace("#/components/examples/","");e[a]?.value!==void 0&&(r.example=e[a].value)}},J=(r,e)=>(Object.values(r).forEach(a=>{Object.values(a).forEach(t=>{typeof t.responses=="object"&&Object.values(t.responses).forEach(s=>{typeof s.content=="object"&&Object.values(s.content).forEach(i=>{U(i,e)})})})}),r),Q=async({crud:r={models:{}},defaultExposeStrategy:e="all",dmmf:a,models:t,prismaClient:s,swagger:i={allowedMediaTypes:{"application/json":!0},models:{}}})=>{let n,o;if(a!==void 0?(n=a,o=a.mappingsMap):s._dmmf!==void 0?(n=s._dmmf,o=n.mappingsMap):s._getDmmf!==void 0&&(n=await s._getDmmf(),o=n.mappingsMap),n===void 0||o===void 0)throw new TypeError("Couldn't get prisma client models");const p=new C(n),c=p.parseModels(),u=Object.keys(c),m=JSON.stringify({...c,...p.parseInputTypes(u),...p.getPaginationDataSchema(),...p.getPaginatedModelsSchemas(u)});t!==void 0&&t.forEach(j=>{if(!Object.keys(o).includes(j))throw new Error(`Model name ${j} is invalid.`)});const d=t??Object.keys(o),y=N(d,r.models,e),f=F(d,i.models),P=_({models:r.models,modelsConfig:i.models,routes:y,routesMap:I.n(o,d)}),b=JSON.parse(m.replaceAll("#/definitions","#/components/schemas")),R=p.getExampleModelsSchemas(u,b);return{examples:R,paths:J(P,R),schemas:b,tags:f}};module.exports=Q;
@@ -0,0 +1 @@
1
+ import{n as I}from"./models-to-route-names-BFpwjyxy.mjs";import{createPaginationMetaSchemaObject as S}from"@visulima/pagination";import{getJSONSchemaProperty as M,transformDMMF as C}from"@visulima/prisma-dmmf-transformer";import{s as A}from"./get-accessible-routes-CGvT_kuy.mjs";import{RouteType as d}from"./RouteType-BQ2RxFPE.mjs";const g=r=>`#/components/schemas/${r}`,O=r=>{switch(r){case"BigInt":case"Int":return"integer";case"Boolean":return"boolean";case"Bytes":case"DateTime":case"String":return"string";case"Decimal":case"Float":return"number";case"Json":return"object";case"Null":return"null";default:return""}},$="PaginationData",N=[{methodStart:"createOne",schemaNameStart:"Create"},{methodStart:"updateOne",schemaNameStart:"Update"}];class R{constructor(e){this.dmmf=e}dmmf;schemaInputTypes=new Map;formatInputTypeData(e){if(e.kind==="object"){const t=g(e.type.name);return e.isList?{items:{$ref:t},type:"array",xml:{name:e.type.name,wrapped:!0}}:{$ref:t}}const s=O(e.type);return e.isList?{items:{type:s},type:"array",xml:{name:e.type.name,wrapped:!0}}:{type:s}}getExampleModelsSchemas(e,s){const t=n=>{const o=n.replace("#/components/schemas/",""),p=s[o],c={};return Object.entries(p.properties??{}).forEach(([l,m])=>{const u=m.type;c[l]=u==="array"?[i(m.items)]:u}),c},a=n=>{const o={};return Object.entries(n).forEach(([p,c])=>{o[p]=c.$ref===void 0?c.type:t(c.$ref)}),o},i=n=>{const o={};return Object.entries(n).forEach(([p,c])=>{c.items.$ref!==void 0?o[p]=[t(c.items.$ref)]:c.type==="array"?o[p]=[i(c.items)]:c.type==="object"?o[p]=a(c.properties):o[p]=c.type}),o};return e.reduce((n,o)=>{const p={},c=s[o];Object.entries(c.properties).forEach(([u,y])=>{const f=y.type;f==="array"?p[u]=[t(y.items.$ref)]:f==="object"?p[u]=a(y.properties):p[u]=f});const l=this.getPaginationDataSchema()[$],m={};return Object.entries(l.properties).forEach(([u,y])=>{m[u]=y.type}),{...n,[`${o}Page`]:{value:{data:[p],meta:m}},[`${o}s`]:{value:[p]},[o]:{value:p}}},{})}getPaginatedModelsSchemas(e){return e.reduce((s,t)=>({...s,[`${t}Page`]:{properties:{data:{items:{$ref:g(t)},type:"array",xml:{name:"data",wrapped:!0}},meta:{$ref:g($)}},type:"object",xml:{name:`${t}Page`}}}),{})}getPaginationDataSchema(){return S($)}parseInputTypes(e){const s=e.reduce((t,a)=>(N.map(i=>({name:`${i.methodStart}${a}`,schemaName:`${i.schemaNameStart}${a}`})).forEach(({name:i,schemaName:n})=>{const o=this.dmmf.mutationType.fieldMap[i].args[0].inputTypes[0].type.fields,p=[],c=o.reduce((l,m)=>{if(m.inputTypes[0].kind==="scalar"){const u=M(this.dmmf.datamodel,{})({name:m.name,...m.inputTypes[0]}),{type:y}=u[1];y&&Array.isArray(y)?y.includes("null")&&(l[m.name]={...y,nullable:!0,type:y.filter(f=>f!=="null")},l[m.name].type.length===1&&(l[m.name]={...l[m.name],type:l[m.name].type[0]})):l[m.name]=u[1]}else{const u=this.parseObjectInputType(m.inputTypes[0]);l[m.name]={...u,nullable:m.isNullable}}return m.isRequired&&p.push(m.name),l},{});t[n]={properties:c,type:"object",xml:{name:n}},p.length>0&&(t[n].required=p)}),t),{});return this.schemaInputTypes.forEach((t,a)=>{s[a]={properties:t,type:"object",xml:{name:a}}}),s}parseModels(){const e=C(this.dmmf).definitions;return Object.keys(e).forEach(s=>{const{properties:t}=e[s];Object.keys(t).forEach(a=>{Array.isArray(t[a].type)&&t[a].type.includes("null")&&(t[a].type=t[a].type.filter(i=>i!=="null"),t[a].type.length===1&&(t[a].type=t[a].type[0]),t[a].nullable=!0)})}),e}parseObjectInputType(e){return e.kind==="object"?(this.schemaInputTypes.has(e.type.name)||(this.schemaInputTypes.set(e.type.name,{}),e.type.fields.forEach(s=>{let t={};if(s.inputTypes.length>1){let a=!1;const i=s.inputTypes.map(n=>{const o=this.formatInputTypeData(n);if(o.type==="null"){a=!0;return}return o}).filter(Boolean);i.length===1?t=i[0]:t.anyOf=i,a&&(t.nullable=!0)}else{const a=s.inputTypes[0];t=this.formatInputTypeData(a)}this.schemaInputTypes.set(e.type.name,{...this.schemaInputTypes.get(e.type.name),[s.name]:t}),s.inputTypes.forEach(a=>{a.kind==="object"&&this.parseObjectInputType(a)})})),{$ref:g(e.type.name)}):{type:O(e.type)}}}const L=(r,e,s="all")=>r.reduce((t,a)=>e?.[a]?{...t,[a]:A(e[a].only,e[a].exclude,s)}:{...t,[a]:A(void 0,void 0,s)},{}),h={distinct:{description:"Fields to distinctively retrieve",name:"distinct",schema:{type:"string"}},include:{description:"Include relations, same as select",name:"include",schema:{type:"string"}},limit:{description:"Maximum number of elements to retrieve",name:"limit",schema:{minimum:0,type:"integer"}},orderBy:{description:'Field on which to order by a direction. See <a href="https://next-crud.js.org/query-params#orderBy">the docs</a>',name:"orderBy",schema:{type:"string"}},page:{description:"Page number. Use only for pagination.",name:"page",schema:{minimum:1,type:"integer"}},select:{description:"Fields to select. For nested fields, chain them separated with a dot, eg: user.posts",name:"select",schema:{type:"string"}},skip:{description:"Number of rows to skip",name:"skip",schema:{minimum:0,type:"integer"}},where:{description:'Fields to filter. See <a href="https://next-crud.js.org/query-params#where">the docs</a>',name:"where",schema:{type:"string"}}},w=[h.select,h.include].filter(Boolean),k=[...w,h.limit,h.skip,h.where,h.orderBy,h.page,h.distinct].filter(Boolean),B=(r,e=[])=>r===d.READ_ALL?[...k,...e].filter(Boolean):[...w,...e].filter(Boolean),E=r=>`#/components/examples/${r}`,T=(r,e)=>e?{items:{$ref:g(r)},type:"array"}:{$ref:g(r)},_=(r,e)=>r===d.CREATE?{content:{content:{"application/json":{example:E(e),schema:T(e)}},description:`${e} created`},statusCode:201}:r===d.DELETE?{content:{content:{"application/json":{example:E(e),schema:T(e)}},description:`${e} item deleted`},statusCode:200}:r===d.READ_ALL?{content:{content:{"application/json":{examples:{Default:{$ref:E(`${e}s`)},Pagination:{$ref:E(`${e}Page`)}},schema:{oneOf:[T(e,!0),T(`${e}Page`,!1)]}}},description:`${e} list retrieved`},statusCode:200}:r===d.READ_ONE?{content:{content:{"application/json":{example:E(e),schema:T(e)}},description:`${e} item retrieved`},statusCode:200}:{content:{content:{"application/json":{example:E(e),schema:T(e)}},description:`${e} item updated`},statusCode:200},v=(r,e)=>({content:{"application/json":{schema:{$ref:g(`${r}${e}`)}}}}),q=r=>{switch(r){case d.CREATE:return"post";case d.DELETE:return"delete";case d.READ_ALL:case d.READ_ONE:return"get";case d.UPDATE:return"put";default:throw new TypeError(`Method for route type ${r} was not found.`)}},x=({hasId:r,modelName:e,modelsConfig:s,routeTypes:t,tag:a})=>{const i={};return t.forEach(n=>{const o=s?.[e]?.routeTypes?.[n]?.response.name??s?.[e]?.type?.name??e,p=q(n),c=_(n,o);i[p]={parameters:B(n).map(l=>({...l,in:"query"})),responses:{[c.statusCode]:c.content,...s?.[e]?.routeTypes?.[n]?.responses},summary:s?.[e]?.routeTypes?.[n]?.summary,tags:[a]},r&&i[p].parameters.push({description:`ID of the ${e}`,in:"path",name:"id",required:!0,schema:{type:"string"}}),n===d.UPDATE?i[p].requestBody=v("Update",o):n===d.CREATE&&(i[p].requestBody=v("Create",o))}),i},F=({models:r,modelsConfig:e,routes:s,routesMap:t})=>Object.keys(s).reduce((a,i)=>{const n=s[i],o=r?.[i]?.name??t?.[i]??i,p=e?.[i]?.tag.name??i;if(n.includes(d.CREATE)||n.includes(d.READ_ALL)){const c=`/${o}`,l=[d.READ_ALL,d.CREATE].filter(m=>n.includes(m));a[c]=x({modelName:i,modelsConfig:e,routeTypes:l,tag:p})}if(n.includes(d.READ_ONE)||n.includes(d.UPDATE)||n.includes(d.DELETE)){const c=`/${o}/{id}`,l=[d.READ_ONE,d.UPDATE,d.DELETE].filter(m=>n.includes(m));a[c]=x({hasId:!0,modelName:i,modelsConfig:e,routeTypes:l,tag:p})}return a},{}),U=(r,e)=>r.map(s=>e?.[s]?.tag?e[s].tag:{name:s}),J=(r,e)=>{if(typeof r.example=="string"){const s=r.example.replace("#/components/examples/","");e[s]?.value!==void 0&&(r.example=e[s].value)}},Q=(r,e)=>(Object.values(r).forEach(s=>{Object.values(s).forEach(t=>{typeof t.responses=="object"&&Object.values(t.responses).forEach(a=>{typeof a.content=="object"&&Object.values(a.content).forEach(i=>{J(i,e)})})})}),r),W=async({crud:r={models:{}},defaultExposeStrategy:e="all",dmmf:s,models:t,prismaClient:a,swagger:i={allowedMediaTypes:{"application/json":!0},models:{}}})=>{let n,o;if(s!==void 0?(n=s,o=s.mappingsMap):a._dmmf!==void 0?(n=a._dmmf,o=n.mappingsMap):a._getDmmf!==void 0&&(n=await a._getDmmf(),o=n.mappingsMap),n===void 0||o===void 0)throw new TypeError("Couldn't get prisma client models");const p=new R(n),c=p.parseModels(),l=Object.keys(c),m=JSON.stringify({...c,...p.parseInputTypes(l),...p.getPaginationDataSchema(),...p.getPaginatedModelsSchemas(l)});t!==void 0&&t.forEach(D=>{if(!Object.keys(o).includes(D))throw new Error(`Model name ${D} is invalid.`)});const u=t??Object.keys(o),y=L(u,r.models,e),f=U(u,i.models),P=F({models:r.models,modelsConfig:i.models,routes:y,routesMap:I(o,u)}),b=JSON.parse(m.replaceAll("#/definitions","#/components/schemas")),j=p.getExampleModelsSchemas(l,b);return{examples:j,paths:Q(P,j),schemas:b,tags:f}};export{W as default};
@@ -0,0 +1 @@
1
+ import c from"./baseHandler-BGTzX4YA.mjs";const e=async(t,n)=>await c(async(a,s)=>{a.status(s.status).send(s.data)},async a=>{a.end()},t,n);export{e as default};
@@ -0,0 +1 @@
1
+ "use strict";const e=require("./baseHandler-DnuGeT2-.cjs"),c=async(t,n)=>await e(async(s,a)=>{s.status(a.status).send(a.data)},async s=>{s.end()},t,n);module.exports=c;