@visulima/crud 3.0.0-alpha.17 → 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 (46) hide show
  1. package/CHANGELOG.md +25 -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-BDmE9rKc.d.cts → types.d-CQwyFrf3.d.cts} +84 -3
  30. package/dist/packem_shared/{types.d-BDmE9rKc.d.mts → types.d-CQwyFrf3.d.mts} +84 -3
  31. package/dist/packem_shared/{types.d-BDmE9rKc.d.ts → types.d-CQwyFrf3.d.ts} +84 -3
  32. package/package.json +4 -4
  33. package/dist/packem_shared/PrismaAdapter-BVs7BWSG.mjs +0 -1
  34. package/dist/packem_shared/PrismaAdapter-Buz6dEMm.cjs +0 -1
  35. package/dist/packem_shared/base-crud-handler-BJJ5vmOh.mjs +0 -1
  36. package/dist/packem_shared/base-crud-handler-Cm23eHkD.cjs +0 -1
  37. package/dist/packem_shared/edgeHandler-CHig8R94.cjs +0 -1
  38. package/dist/packem_shared/edgeHandler-DfRlSUUt.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-BdR0fuw-.mjs +0 -1
  46. package/dist/packem_shared/nodeHandler-Di5MpzCj.cjs +0 -1
@@ -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-BDmE9rKc.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-BDmE9rKc.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-BDmE9rKc.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-DfRlSUUt.mjs";import{default as o}from"../packem_shared/nodeHandler-BdR0fuw-.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;
@@ -5,9 +5,71 @@ declare enum RouteType {
5
5
  READ_ONE = "READ_ONE",
6
6
  UPDATE = "UPDATE",
7
7
  }
8
- interface ModelOption {
8
+ /**
9
+ * A minimal validation schema. It is intentionally structural so that any
10
+ * validator exposing a synchronous/asynchronous `parse`/`safeParse` (e.g. zod)
11
+ * can be plugged in without pulling a hard dependency on the validator.
12
+ *
13
+ * The returned (possibly transformed) value replaces `request.body` before it
14
+ * reaches the adapter.
15
+ */
16
+ interface BodySchema<T = unknown> {
17
+ parse: (data: unknown) => Promise<T> | T;
18
+ }
19
+ /**
20
+ * Per-model access policy. Every field is optional and additive on top of the
21
+ * route-level `only`/`exclude` knobs.
22
+ */
23
+ interface ModelAccessPolicy {
24
+ /**
25
+ * Validation/transform schema applied to the body of `CREATE` requests
26
+ * before it is forwarded to the adapter. Throwing rejects the request
27
+ * with the thrown error (use an `http-errors` 4xx for a clean status).
28
+ */
29
+ createSchema?: BodySchema;
30
+ /**
31
+ * Allowlist of field names a client may filter on (via `where`) or order by.
32
+ * When set, any other field referenced in `where`/`orderBy` is rejected with
33
+ * a 400. Prevents blind-exfiltration oracles on secret columns.
34
+ */
35
+ filterableFields?: string[];
36
+ /**
37
+ * Allowlist of relation names a client may `include`. When set, requesting
38
+ * any other relation is rejected with a 400.
39
+ */
40
+ includableRelations?: string[];
41
+ /**
42
+ * Field names that must never be returned to a client. They are stripped
43
+ * from `select` (if a client tried to select them) and forced into Prisma's
44
+ * `omit`-style exclusion is left to the adapter; here we simply drop them
45
+ * from an explicit `select`. Pair with `selectableFields` for a strict
46
+ * allowlist.
47
+ */
48
+ readableFields?: string[];
49
+ /**
50
+ * Allowlist of field names a client may request via `select`. When set, any
51
+ * other selected field is dropped. Prevents `?select=passwordHash`.
52
+ */
53
+ selectableFields?: string[];
54
+ /**
55
+ * Validation/transform schema applied to the body of `UPDATE` requests.
56
+ */
57
+ updateSchema?: BodySchema;
58
+ /**
59
+ * Allowlist of field names a client may write (CREATE/UPDATE body). When set,
60
+ * any other key in the body is stripped before reaching the adapter,
61
+ * preventing mass-assignment of columns like `role`/`isAdmin`.
62
+ */
63
+ writableFields?: string[];
64
+ }
65
+ interface ModelOption extends ModelAccessPolicy {
9
66
  exclude?: RouteType[];
10
67
  formatResourceId?: (resourceId: string) => number | string;
68
+ /**
69
+ * Hard cap on the number of rows a list request may return, regardless of
70
+ * the client-supplied `limit`. Overrides the handler-level `maxPerPage`.
71
+ */
72
+ maxPerPage?: number;
11
73
  name?: string;
12
74
  only?: RouteType[];
13
75
  }
@@ -52,7 +114,26 @@ interface HandlerOptions<M extends string = string> {
52
114
  list?: ListHandler;
53
115
  update?: UpdateHandler;
54
116
  };
117
+ /**
118
+ * Default hard cap on the number of rows a list request may return for any
119
+ * model, regardless of the client-supplied `limit`. Defaults to no cap.
120
+ * Per-model `maxPerPage` overrides this.
121
+ */
122
+ maxPerPage?: number;
55
123
  models?: ModelsOptions<M>;
124
+ /**
125
+ * Called once per request after the route type is resolved and before the
126
+ * adapter is invoked. Throw (ideally an `http-errors` error) to reject the
127
+ * request — a row/field access guard hook. Receives the resolved model name,
128
+ * route type and resource id (for single-resource routes).
129
+ */
130
+ onRequest?: (context: {
131
+ method: string;
132
+ resourceId?: number | string;
133
+ resourceName: string;
134
+ routeType: RouteType;
135
+ url: string;
136
+ }) => Promise<void> | void;
56
137
  pagination?: PaginationConfig;
57
138
  }
58
139
  interface PaginationConfig {
@@ -115,7 +196,7 @@ interface ParsedQueryParameters {
115
196
  skip?: number;
116
197
  where?: WhereField;
117
198
  }
118
- type ExecuteHandler<Request, Response> = (request: Request, response: Response) => Promise<void>;
199
+ type ExecuteHandler<Request, Response, Result = void> = (request: Request, response: Response) => Promise<Result>;
119
200
  interface FakePrismaClient {
120
201
  $connect: () => Promise<void> | void;
121
202
  $disconnect: () => Promise<void>;
@@ -123,4 +204,4 @@ interface FakePrismaClient {
123
204
  _dmmf?: unknown;
124
205
  _getDmmf?: () => unknown;
125
206
  }
126
- export { Adapter as A, Condition as C, ExecuteHandler as E, FakePrismaClient as F, HandlerOptions as H, ModelsOptions as M, OrderByField as O, PaginationData as P, RouteType as R, SearchCondition as S, UniqueResourceHandlerParameters as U, WhereCondition as W, ParsedQueryParameters as a, HandlerParameters as b, ModelOption as c, OrderByOperator as d, PaginationConfig as e, RecursiveField as f, WhereField as g, WhereOperator as h };
207
+ export { Adapter as A, BodySchema as B, Condition as C, DeleteHandler as D, ExecuteHandler as E, FakePrismaClient as F, GetHandler as G, HandlerOptions as H, ListHandler as L, ModelsOptions as M, OrderByField as O, PaginationData as P, RouteType as R, SearchCondition as S, UniqueResourceHandlerParameters as U, WhereCondition as W, ParsedQueryParameters as a, CreateHandler as b, HandlerParameters as c, ModelAccessPolicy as d, ModelOption as e, OrderByOperator as f, PaginationConfig as g, RecursiveField as h, UpdateHandler as i, WhereField as j, WhereOperator as k };