@visulima/crud 1.0.9 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/chunk-AZH4QNGV.js +8 -0
- package/dist/chunk-AZH4QNGV.js.map +1 -0
- package/dist/chunk-RWIFPCB5.mjs +5 -0
- package/dist/chunk-RWIFPCB5.mjs.map +1 -0
- package/dist/index.d.ts +28 -26
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10 -1
- package/dist/index.mjs.map +1 -1
- package/dist/next/index.d.ts +1 -1
- package/dist/next/index.js +15 -1
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs +12 -1
- package/dist/next/index.mjs.map +1 -1
- package/dist/{types.d-6817d247.d.ts → types.d-54381237.d.ts} +31 -24
- package/package.json +32 -29
- package/dist/chunk-JSOEPRPZ.mjs +0 -2
- package/dist/chunk-JSOEPRPZ.mjs.map +0 -1
- package/dist/chunk-U35WXGEF.js +0 -2
- package/dist/chunk-U35WXGEF.js.map +0 -1
package/dist/next/index.mjs
CHANGED
|
@@ -1,2 +1,13 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { b as b$1 } from '../chunk-RWIFPCB5.mjs';
|
|
2
|
+
import P from 'http-errors';
|
|
3
|
+
import { ApiError } from 'next/dist/server/api-utils';
|
|
4
|
+
import { paginate } from '@visulima/pagination';
|
|
5
|
+
import M from 'lodash.set';
|
|
6
|
+
import { parse } from 'url';
|
|
7
|
+
import { match } from 'path-to-regexp';
|
|
8
|
+
|
|
9
|
+
var v=async({adapter:s,query:e,resourceName:t,request:r})=>({data:await s.create(t,r.body,e),status:201}),T=v;var U=async({adapter:s,query:e,resourceName:t,resourceId:r})=>{if(typeof await s.getOne(t,r,e)=="object")return {data:await s.delete(t,r,e),status:200};throw P(404,`${t} ${r} not found`)},H=U;var D=async({adapter:s,query:e,resourceName:t,pagination:r})=>{let a=!1,i;if(e.page!==void 0){if(e.page<=0)throw new Error("page query must be a strictly positive number");i={page:e.page,perPage:e.limit??r.perPage};}i&&(a=!0,e.skip=(i.page-1)*i.perPage,e.limit=i.perPage);let n=await s.getAll(t,e);if(a){let{page:o,total:p}=await s.getPaginationData(t,e);return {data:paginate(o,i.perPage,p,n).toJSON(),status:200}}return {data:n,status:200}},E=D;var L=async({adapter:s,query:e,resourceName:t,resourceId:r})=>{let a=await s.getOne(t,r,e);if(typeof a!="object")throw P(404,`${t} ${r} not found`);return {data:a,status:200}},b=L;var q=async({adapter:s,query:e,resourceName:t,resourceId:r,request:a})=>{if(typeof await s.getOne(t,r,e)=="object")return {status:201,data:await s.update(t,r,a.body,e)};throw P(404,`${t} ${r} not found`)},w=q;var Q=s=>{let e={};return s.split(",").forEach(r=>{M(e,r,!0);}),e},J=s=>{let e=JSON.parse(s),t={};return Object.keys(e).forEach(r=>{M(t,r,e[r]);}),t},W=s=>{let e={},t=JSON.parse(s);if(Object.keys(t).length>0){let r=Object.keys(t)[0];(t[r]==="$asc"||t[r]==="$desc")&&(e[r]=t[r]);}if(Object.keys(e).length!==1)throw new Error("orderBy needs to be an object with exactly 1 property with either $asc or $desc value");return e},G=s=>{if(s){let{query:e}=parse(s,!0),t={};return e.select&&(t.select=Q(e.select)),e.include&&(t.include=Q(e.include)),e.where&&(t.where=J(e.where)),e.orderBy&&(t.orderBy=W(e.orderBy)),e.limit!==void 0&&(t.limit=Number.isFinite(+e.limit)?+e.limit:void 0),e.skip!==void 0&&(t.skip=Number.isFinite(+e.skip)?+e.skip:void 0),e.distinct&&(t.distinct=e.distinct),e.page&&(t.page=Number.isFinite(+e.page)?+e.page:void 0),{originalQuery:e,...t}}return {}},O=G;var V=s=>Number.isSafeInteger(+s)?+s:s,A=V;var z=s=>`${s.charAt(0).toLowerCase()}${s.slice(1)}`,C=(s,e)=>{let t=s.split("?")[0];if(t===void 0)throw new TypeError("Path is undefined");let r=Object.keys(e).find(a=>{let i=e[a],n=z(i);return new RegExp(`(${i}|${n}$)|(${i}|${n}/)`,"g").test(t)});if(r===void 0)throw new Error(`Couldn't find model name for url ${s}`);return {modelName:r,resourceName:e[r]}};var K=(s,e,t)=>{let r=e.split("?")[0];if(r===void 0)throw new TypeError("Path is undefined");if(!r.includes(`/${t}`))throw new Error(`invalid resource name '${t}' for route '${r}'`);let a=match([`/(.*)/${t}`,`/(.*)/${t}/:id`],{decode:decodeURIComponent}),i=match(`/(.*)/${t}`,{decode:decodeURIComponent});switch(s){case"GET":{let n=a(r);return typeof n=="object"&&n.params.id?{routeType:"READ_ONE",resourceId:n.params.id}:{routeType:"READ_ALL"}}case"POST":return i(r)?{routeType:"CREATE"}:{routeType:null};case"PUT":case"PATCH":{let n=a(r);return typeof n=="object"&&n.params.id?{routeType:"UPDATE",resourceId:n.params.id}:{routeType:null}}case"DELETE":{let n=a(r);return typeof n=="object"&&n.params.id?{routeType:"DELETE",resourceId:n.params.id}:{routeType:null}}default:return {routeType:null}}},k=K;var Y=["create","delete","getAll","getOne","parseQuery","update","getPaginationData","getModels"],Z=s=>{Y.forEach(e=>{if(!s[e])throw P(500,`Adapter must implement the "${e}" method.`)});},j=Z;async function ee(s,e,t,r){try{j(t);}catch(o){let p=o;throw new ApiError(p.statusCode,p.message)}await t.init?.();let a={formatResourceId:A,pagination:{perPage:20},...r},i=await t.mapModelsToRouteNames?.(),n={};return t.getModels().forEach(o=>{n[o]=a.models?.[o]?.name??i?.[o]??o;}),async(o,p)=>{let{resourceName:f,modelName:y}=C(o.url,n);if(!f)throw P(404,`Resource not found: ${o.url}`);let{routeType:g,resourceId:h}=k(o.method,o.url,f);if(g===null)throw P(404,`Route not found: ${o.url}`);let R=r?.models?.[y];if(!b$1(R?.only,R?.exclude,r?.exposeStrategy??"all").includes(g))throw P(404,`Route not found: ${o.url}`);try{let l=R?.formatResourceId?.(h)??a.formatResourceId(h);await t.connect?.();let c=O(o.url),u={adapter:t,query:t.parseQuery(y,c),resourceName:y};try{let d;switch(g){case"READ_ONE":{d=await(a.handlers?.get??b)({...u,resourceId:l});break}case"READ_ALL":{d=await(a.handlers?.list??E)({...u,query:{...u.query,page:c.page?Number(c.page):void 0,limit:c.limit?Number(c.limit):void 0},pagination:a.pagination});break}case"CREATE":{d=await(a.handlers?.create??T)({...u,request:o});break}case"UPDATE":{d=await(a.handlers?.update??w)({...u,resourceId:l,request:o});break}case"DELETE":{d=await(a.handlers?.delete??H)({...u,resourceId:l});break}default:d={status:404,data:"Method not found"};}await s(p,d);}catch(d){if(t.handleError&&!(d instanceof ApiError))t.handleError(d);else throw d}}finally{await t.disconnect?.(),await e(p);}}}var m=ee;async function te(s,e){return m(async(t,r)=>new Response(JSON.stringify(r.data),{status:r.status,headers:{"content-type":"application/json; charset=utf-8"}}),async()=>{},s,e)}var re=te;async function se(s,e){return m(async(t,r)=>{t.status(r.status).send(r.data);},async t=>{t.end();},s,e)}var ae=se;
|
|
10
|
+
|
|
11
|
+
export { re as edgeHandler, ae as nodeHandler };
|
|
12
|
+
//# sourceMappingURL=out.js.map
|
|
2
13
|
//# sourceMappingURL=index.mjs.map
|
package/dist/next/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/base-crud-handler.ts","../../src/handler/create.ts","../../src/handler/delete.ts","../../src/handler/list.ts","../../src/handler/read.ts","../../src/handler/update.ts","../../src/query-parser.ts","../../src/utils/format-resource-id.ts","../../src/utils/get-resource-name-from-url.ts","../../src/utils/get-route-type.ts","../../src/utils/validate-adapter-methods.ts","../../src/next/api/edge/index.ts","../../src/next/api/node/index.ts"],"sourcesContent":["import type { HttpError } from \"http-errors\";\nimport createHttpError from \"http-errors\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { ApiError } from \"next/dist/server/api-utils\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport createHandler from \"./handler/create\";\nimport deleteHandler from \"./handler/delete\";\nimport listHandler from \"./handler/list\";\nimport readHandler from \"./handler/read\";\nimport updateHandler from \"./handler/update\";\nimport parseQuery from \"./query-parser\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, HandlerParameters, ParsedQueryParameters,\n} from \"./types.d\";\nimport { RouteType } from \"./types.d\";\nimport formatResourceId from \"./utils/format-resource-id\";\nimport getAccessibleRoutes from \"./utils/get-accessible-routes\";\nimport { getResourceNameFromUrl } from \"./utils/get-resource-name-from-url\";\nimport getRouteType from \"./utils/get-route-type\";\nimport validateAdapterMethods from \"./utils/validate-adapter-methods\";\n\ntype ResponseConfig = { status: number; data: any };\n\nasync function baseHandler<R extends Request, Context extends unknown, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: Context, responseConfig: ResponseConfig) => Promise<Response>,\n finalExecutor: (responseOrContext: Context) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, Context>>;\n\nasync function baseHandler<R extends IncomingMessage, RResponse extends ServerResponse, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: RResponse, responseConfig: ResponseConfig) => Promise<void>,\n finalExecutor: (responseOrContext: RResponse) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, RResponse>>;\n\n// eslint-disable-next-line radar/cognitive-complexity,max-len\nasync function baseHandler<R extends { url: string; method: string }, RResponse, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: RResponse, responseConfig: ResponseConfig) => Promise<RResponse>,\n finalExecutor: (responseOrContext: RResponse) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, RResponse>> {\n try {\n validateAdapterMethods(adapter);\n } catch (error_: any) {\n const error = error_ as HttpError;\n\n throw new ApiError(error.statusCode, error.message);\n }\n\n await adapter.init?.();\n\n const config = {\n formatResourceId,\n pagination: {\n perPage: 20,\n },\n ...options,\n };\n\n const routeNames = await adapter.mapModelsToRouteNames?.();\n const modelRoutes: { [key in M]?: string } = {};\n\n adapter.getModels().forEach((modelName) => {\n modelRoutes[modelName as M] = config?.models?.[modelName as M]?.name || routeNames?.[modelName] || modelName;\n });\n\n return async (request, responseOrContext) => {\n const { resourceName, modelName } = getResourceNameFromUrl(request.url as string, modelRoutes);\n\n if (!resourceName) {\n if (process.env.NODE_ENV === \"development\") {\n const mappedModels = await adapter.mapModelsToRouteNames?.();\n\n if (typeof mappedModels === \"object\") {\n throw createHttpError(404, `Resource not found, possible models: ${Object.values(mappedModels).join(\", \")}`);\n }\n }\n\n throw createHttpError(404, `Resource not found: ${request.url}`);\n }\n\n const { routeType, resourceId } = getRouteType(request.method as string, request.url as string, resourceName);\n\n if (routeType === null) {\n throw createHttpError(404, `Route not found: ${request.url}`);\n }\n\n const modelConfig = options?.models?.[modelName as M];\n\n const accessibleRoutes = getAccessibleRoutes(modelConfig?.only, modelConfig?.exclude, options?.exposeStrategy || \"all\");\n\n if (!accessibleRoutes.includes(routeType)) {\n throw createHttpError(404, `Route not found: ${request.url}`);\n }\n\n try {\n const resourceIdFormatted = modelConfig?.formatResourceId?.(resourceId as string) ?? config.formatResourceId(resourceId as string);\n\n await adapter.connect?.();\n\n const parsedQuery = parseQuery(request.url);\n const parameters: HandlerParameters<T, Q> = {\n adapter,\n query: adapter.parseQuery(modelName as M, parsedQuery),\n resourceName: modelName as string,\n };\n\n try {\n let responseConfig: ResponseConfig;\n\n switch (routeType) {\n case RouteType.READ_ONE: {\n responseConfig = await (config?.handlers?.get || readHandler)<T, Q>({\n ...parameters,\n resourceId: resourceIdFormatted,\n });\n break;\n }\n case RouteType.READ_ALL: {\n responseConfig = await (config?.handlers?.list || listHandler)<T, Q>({\n ...parameters,\n query: {\n ...parameters.query,\n page: parsedQuery.page ? Number(parsedQuery.page) : undefined,\n limit: parsedQuery.limit ? Number(parsedQuery.limit) : undefined,\n },\n pagination: config.pagination,\n });\n break;\n }\n case RouteType.CREATE: {\n responseConfig = await (config?.handlers?.create || createHandler)<T, Q, R>({\n ...parameters,\n request: request as R & { body: Record<string, any> },\n });\n break;\n }\n case RouteType.UPDATE: {\n responseConfig = await (config?.handlers?.update || updateHandler)<T, Q, R>({\n ...parameters,\n resourceId: resourceIdFormatted,\n request: request as R & { body: Partial<T> },\n });\n break;\n }\n case RouteType.DELETE: {\n responseConfig = await (config?.handlers?.delete || deleteHandler)<T, Q>({\n ...parameters,\n resourceId: resourceIdFormatted,\n });\n break;\n }\n default: {\n responseConfig = {\n status: 404,\n data: \"Method not found\",\n };\n }\n }\n\n await responseExecutor(responseOrContext, responseConfig);\n } catch (error: any) {\n if (adapter.handleError && !(error instanceof ApiError)) {\n adapter.handleError(error);\n } else {\n throw error;\n }\n }\n } finally {\n await adapter.disconnect?.();\n\n await finalExecutor(responseOrContext);\n }\n };\n}\n\nexport default baseHandler;\n","import type { HandlerParameters } from \"../types.d\";\n\nconst createHandler: Handler = async ({\n adapter, query, resourceName, request,\n}) => {\n const resources = await adapter.create(resourceName, request.body, query);\n\n return {\n data: resources,\n status: 201,\n };\n};\n\nexport type Handler = <T, Q, Request>(\n parameters: HandlerParameters<T, Q> & { request: Request & { body: Record<string, any> } },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default createHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst deleteHandler: Handler = async ({\n adapter, query, resourceName, resourceId,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (resource) {\n const deletedResource = await adapter.delete(resourceName, resourceId, query);\n\n return {\n data: deletedResource,\n status: 200,\n };\n }\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n};\n\nexport type Handler = <T, Q>(\n parameters: UniqueResourceHandlerParameters<T, Q>,\n) => Promise<{\n data: any;\n status: number;\n}>;\nexport default deleteHandler;\n","import { paginate } from \"@visulima/pagination\";\n\nimport type { HandlerParameters, PaginationConfig, ParsedQueryParameters } from \"../types.d\";\n\ntype PaginationOptions = {\n page: number;\n perPage: number;\n};\n\nconst listHandler: Handler = async ({\n adapter, query, resourceName, pagination,\n}) => {\n let isPaginated = false;\n let paginationOptions: PaginationOptions | undefined;\n\n if (query?.page !== undefined) {\n if (query?.page <= 0) {\n throw new Error(\"page query must be a strictly positive number\");\n }\n\n paginationOptions = {\n page: query?.page,\n perPage: query?.limit || pagination.perPage,\n };\n }\n\n if (paginationOptions) {\n isPaginated = true;\n\n // eslint-disable-next-line no-param-reassign\n query.skip = (paginationOptions.page - 1) * paginationOptions.perPage;\n // eslint-disable-next-line no-param-reassign\n query.limit = paginationOptions.perPage;\n }\n\n const resources = await adapter.getAll(resourceName, query);\n\n if (isPaginated) {\n const { page, total } = await adapter.getPaginationData(resourceName, query);\n\n const paginator = paginate(page, (paginationOptions as PaginationOptions).perPage as number, total, resources);\n\n return {\n data: paginator.toJSON(),\n status: 200,\n };\n }\n\n return {\n data: resources,\n status: 200,\n };\n};\n\nexport type Handler = <T, Q extends ParsedQueryParameters>(\n parameters: HandlerParameters<T, Q> & { pagination: PaginationConfig },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default listHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst readHandler: Handler = async ({\n adapter, query, resourceName, resourceId,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (!resource) {\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n }\n\n return {\n data: resource,\n status: 200,\n };\n};\n\nexport type Handler = <T, Q>(\n parameters: UniqueResourceHandlerParameters<T, Q>,\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default readHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst updateHandler: Handler = async ({\n adapter, query, resourceName, resourceId, request,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (resource) {\n const updatedResource = await adapter.update(resourceName, resourceId, request.body, query);\n\n return {\n status: 201,\n data: updatedResource,\n };\n }\n\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n};\n\nexport type Handler = <T, Q, Request>(\n parameters: UniqueResourceHandlerParameters<T, Q> & { request: Request & { body: Partial<T> } },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default updateHandler;\n","import set from \"lodash.set\";\nimport { parse } from \"node:url\";\n\nimport type {\n OrderByField, ParsedQueryParameters, RecursiveField, WhereField,\n} from \"./types.d\";\n\nconst parseRecursive = (select: string): RecursiveField => {\n const selectFields: RecursiveField = {};\n\n const fields = select.split(\",\");\n\n fields.forEach((field) => {\n set(selectFields, field, true);\n });\n\n return selectFields;\n};\n\nconst parseWhere = (where: string): WhereField => {\n const whereObject = JSON.parse(where);\n const parsed: WhereField = {};\n\n Object.keys(whereObject).forEach((key) => {\n set(parsed, key, whereObject[key]);\n });\n\n return parsed;\n};\n\nconst parseOrderBy = (orderBy: string): OrderByField => {\n const parsed: OrderByField = {};\n const orderByObject = JSON.parse(orderBy);\n\n if (Object.keys(orderByObject).length > 0) {\n const key = Object.keys(orderByObject)[0];\n\n if (orderByObject[key as keyof typeof orderByObject] === \"$asc\" || orderByObject[key as keyof typeof orderByObject] === \"$desc\") {\n parsed[key as string] = orderByObject[key as keyof typeof orderByObject];\n }\n }\n\n if (Object.keys(parsed).length !== 1) {\n throw new Error(\"orderBy needs to be an object with exactly 1 property with either $asc or $desc value\");\n }\n\n return parsed;\n};\n\n// eslint-disable-next-line radar/cognitive-complexity\nconst parseQuery = (queryString?: string): ParsedQueryParameters => {\n if (queryString) {\n const { query } = parse(queryString, true);\n const parsedQuery: ParsedQueryParameters = {};\n\n if (query.select) {\n parsedQuery.select = parseRecursive(query.select as string);\n }\n\n if (query.include) {\n parsedQuery.include = parseRecursive(query.include as string);\n }\n\n if (query.where) {\n parsedQuery.where = parseWhere(query.where as string);\n }\n\n if (query.orderBy) {\n parsedQuery.orderBy = parseOrderBy(query.orderBy as string);\n }\n\n if (query.limit !== undefined) {\n parsedQuery.limit = Number.isFinite(+query.limit) ? +query.limit : undefined;\n }\n if (query.skip !== undefined) {\n parsedQuery.skip = Number.isFinite(+query.skip) ? +query.skip : undefined;\n }\n\n if (query.distinct) {\n parsedQuery.distinct = query.distinct as string;\n }\n\n if (query.page) {\n parsedQuery.page = Number.isFinite(+query.page) ? +query.page : undefined;\n }\n\n return {\n originalQuery: query,\n ...parsedQuery,\n };\n }\n\n return {};\n};\n\nexport default parseQuery;\n","const formatResourceId = (resourceId: string): string | number => (Number.isSafeInteger(+resourceId) ? +resourceId : resourceId);\n\nexport default formatResourceId;\n","export const ensureCamelCase = (string_: string) => `${string_.charAt(0).toLowerCase()}${string_.slice(1)}`;\n\nexport const getResourceNameFromUrl = <M extends string = string>(url: string, models: { [key in M]?: string }) => {\n // Exclude the query params from the path\n const realPath = url.split(\"?\")[0];\n\n if (realPath === undefined) {\n throw new TypeError(\"Path is undefined\");\n }\n\n const modelName = (Object.keys(models) as M[]).find((name) => {\n const routeName = models[name] as string;\n const camelCaseModel = ensureCamelCase(routeName);\n\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n return new RegExp(`(${routeName}|${camelCaseModel}$)|(${routeName}|${camelCaseModel}/)`, \"g\").test(realPath);\n });\n\n return {\n modelName,\n resourceName: models[modelName] as string,\n };\n};\n","import { match } from \"path-to-regexp\";\n\nimport { RouteType } from \"../types.d\";\n\ntype PathMatch = { id: string };\n\nconst getRouteType: (\n method: string,\n url: string,\n resourceName: string,\n) => GetRouteType = (method, url, resourceName) => {\n // Exclude the query params from the path\n const realPath = url.split(\"?\")[0];\n\n if (realPath === undefined) {\n throw new TypeError(\"Path is undefined\");\n }\n\n if (!realPath.includes(`/${resourceName}`)) {\n throw new Error(`invalid resource name '${resourceName}' for route '${realPath}'`);\n }\n\n const entityMatcher = match<PathMatch>([`/(.*)/${resourceName}`, `/(.*)/${resourceName}/:id`], { decode: decodeURIComponent });\n const simpleMatcher = match(`/(.*)/${resourceName}`, {\n decode: decodeURIComponent,\n });\n\n switch (method) {\n case \"GET\": {\n const pathMatch = entityMatcher(realPath);\n\n // If we got a /something after the resource name, we are reading 1 entity\n if (pathMatch && pathMatch.params.id) {\n return {\n routeType: RouteType.READ_ONE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: RouteType.READ_ALL,\n };\n }\n case \"POST\": {\n const pathMatch = simpleMatcher(realPath);\n\n if (pathMatch) {\n return {\n routeType: RouteType.CREATE,\n };\n }\n\n return {\n routeType: null,\n };\n }\n case \"PUT\":\n case \"PATCH\": {\n const pathMatch = entityMatcher(realPath);\n\n if (pathMatch && pathMatch.params.id) {\n return {\n routeType: RouteType.UPDATE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: null,\n };\n }\n case \"DELETE\": {\n const pathMatch = entityMatcher(realPath);\n\n if (pathMatch && pathMatch.params.id) {\n return {\n routeType: RouteType.DELETE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: null,\n };\n }\n default: {\n return {\n routeType: null,\n };\n }\n }\n};\n\nexport type GetRouteType = {\n routeType: RouteType | null;\n resourceId?: string;\n};\n\nexport default getRouteType;\n","import createHttpError from \"http-errors\";\n\nimport type { Adapter } from \"../types.d\";\n\nconst adapterMethods = [\"create\" || \"delete\" || \"getAll\" || \"getOne\" || \"parseQuery\" || \"update\" || \"getPaginationData\" || \"getModels\"];\n\nconst validateAdapterMethods = <T, Q>(adapter: Adapter<T, Q>) => {\n adapterMethods.forEach((method) => {\n if (!adapter[method as keyof Adapter<T, Q>]) {\n throw createHttpError(500, `Adapter must implement the \"${method}\" method.`);\n }\n });\n};\n\nexport default validateAdapterMethods;\n","import baseHandler from \"../../../base-crud-handler\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, ParsedQueryParameters,\n} from \"../../../types.d\";\n\nasync function handler<T, R extends Request, Context, Q extends ParsedQueryParameters = any, M extends string = string>(\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, Context>> {\n return baseHandler<R, Context, T, Q, M>(\n async (_, responseConfig) => new Response(JSON.stringify(responseConfig.data), {\n status: responseConfig.status,\n headers: {\n \"content-type\": \"application/json; charset=utf-8\",\n },\n }),\n async () => {},\n adapter,\n options,\n );\n}\n\nexport default handler;\n","import type { NextApiRequest, NextApiResponse } from \"next\";\n\nimport baseHandler from \"../../../base-crud-handler\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, ParsedQueryParameters,\n} from \"../../../types.d\";\n\nasync function handler<\n T,\n Q extends ParsedQueryParameters = any,\n R extends NextApiRequest = NextApiRequest,\n Response extends NextApiResponse = NextApiResponse,\n M extends string = string,\n>(adapter: Adapter<T, Q>, options?: HandlerOptions<M>): Promise<ExecuteHandler<R, Response>> {\n return baseHandler<R, Response, T, Q, M>(\n async (response, responseConfig) => {\n response.status(responseConfig.status).send(responseConfig.data);\n },\n async (response) => {\n (response as Response).end();\n },\n adapter,\n options,\n );\n}\n\nexport default handler;\n"],"mappings":"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","names":["createHttpError","ApiError","createHandler","adapter","query","resourceName","request","create_default","createHttpError","deleteHandler","adapter","query","resourceName","resourceId","delete_default","paginate","listHandler","adapter","query","resourceName","pagination","isPaginated","paginationOptions","resources","page","total","list_default","createHttpError","readHandler","adapter","query","resourceName","resourceId","resource","read_default","createHttpError","updateHandler","adapter","query","resourceName","resourceId","request","update_default","set","parse","parseRecursive","select","selectFields","field","parseWhere","where","whereObject","parsed","key","parseOrderBy","orderBy","orderByObject","parseQuery","queryString","query","parsedQuery","query_parser_default","formatResourceId","resourceId","format_resource_id_default","ensureCamelCase","string_","getResourceNameFromUrl","url","models","realPath","modelName","name","routeName","camelCaseModel","match","getRouteType","method","url","resourceName","realPath","entityMatcher","match","simpleMatcher","pathMatch","get_route_type_default","createHttpError","adapterMethods","validateAdapterMethods","adapter","method","validate_adapter_methods_default","baseHandler","responseExecutor","finalExecutor","adapter","options","_a","_b","validate_adapter_methods_default","error_","error","ApiError","config","format_resource_id_default","routeNames","modelRoutes","modelName","request","responseOrContext","_c","_d","_e","_f","_g","_h","_i","_j","resourceName","getResourceNameFromUrl","createHttpError","routeType","resourceId","get_route_type_default","modelConfig","get_accessible_routes_default","resourceIdFormatted","parsedQuery","query_parser_default","parameters","responseConfig","read_default","list_default","create_default","update_default","delete_default","base_crud_handler_default","handler","adapter","options","base_crud_handler_default","_","responseConfig","edge_default","handler","adapter","options","base_crud_handler_default","response","responseConfig","node_default"]}
|
|
1
|
+
{"version":3,"sources":["../../src/base-crud-handler.ts","../../src/handler/create.ts","../../src/handler/delete.ts","../../src/handler/list.ts","../../src/handler/read.ts","../../src/handler/update.ts","../../src/query-parser.ts","../../src/utils/format-resource-id.ts","../../src/utils/get-resource-name-from-url.ts","../../src/utils/get-route-type.ts","../../src/utils/validate-adapter-methods.ts","../../src/next/api/edge/index.ts","../../src/next/api/node/index.ts"],"names":["createHttpError","ApiError","createHandler","adapter","query","resourceName","request","create_default","deleteHandler","resourceId","delete_default","paginate","listHandler","pagination","isPaginated","paginationOptions","resources","page","total","list_default","readHandler","resource","read_default","updateHandler","update_default","set","parse","parseRecursive","select","selectFields","field","parseWhere","where","whereObject","parsed","key","parseOrderBy","orderBy","orderByObject","parseQuery","queryString","parsedQuery","query_parser_default","formatResourceId","format_resource_id_default","ensureCamelCase","string_","getResourceNameFromUrl","url","models","realPath","modelName","name","routeName","camelCaseModel","match","getRouteType","method","entityMatcher","simpleMatcher","pathMatch","get_route_type_default","adapterMethods","validateAdapterMethods","validate_adapter_methods_default","baseHandler","responseExecutor","finalExecutor","options","error_","error","config","routeNames","modelRoutes","responseOrContext","routeType","modelConfig","get_accessible_routes_default","resourceIdFormatted","parameters","responseConfig","base_crud_handler_default","handler","_","edge_default","response","node_default"],"mappings":"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","sourcesContent":["import type { HttpError } from \"http-errors\";\nimport createHttpError from \"http-errors\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { ApiError } from \"next/dist/server/api-utils\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport createHandler from \"./handler/create\";\nimport deleteHandler from \"./handler/delete\";\nimport listHandler from \"./handler/list\";\nimport readHandler from \"./handler/read\";\nimport updateHandler from \"./handler/update\";\nimport parseQuery from \"./query-parser\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, HandlerParameters, ParsedQueryParameters,\n} from \"./types.d\";\nimport { RouteType } from \"./types.d\";\nimport formatResourceId from \"./utils/format-resource-id\";\nimport getAccessibleRoutes from \"./utils/get-accessible-routes\";\nimport { getResourceNameFromUrl } from \"./utils/get-resource-name-from-url\";\nimport getRouteType from \"./utils/get-route-type\";\nimport validateAdapterMethods from \"./utils/validate-adapter-methods\";\n\ntype ResponseConfig = { status: number; data: any };\n\nasync function baseHandler<R extends Request, Context, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: Context, responseConfig: ResponseConfig) => Promise<Response>,\n finalExecutor: (responseOrContext: Context) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, Context>>;\n\nasync function baseHandler<R extends IncomingMessage, RResponse extends ServerResponse, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: RResponse, responseConfig: ResponseConfig) => Promise<void>,\n finalExecutor: (responseOrContext: RResponse) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, RResponse>>;\n\n// eslint-disable-next-line radar/cognitive-complexity,max-len\nasync function baseHandler<R extends { url: string; method: string }, RResponse, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: RResponse, responseConfig: ResponseConfig) => Promise<RResponse>,\n finalExecutor: (responseOrContext: RResponse) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, RResponse>> {\n try {\n validateAdapterMethods(adapter);\n } catch (error_: any) {\n const error = error_ as HttpError;\n\n throw new ApiError(error.statusCode, error.message);\n }\n\n await adapter.init?.();\n\n const config = {\n formatResourceId,\n pagination: {\n perPage: 20,\n },\n ...options,\n };\n\n const routeNames = await adapter.mapModelsToRouteNames?.();\n const modelRoutes: { [key in M]?: string } = {};\n\n adapter.getModels().forEach((modelName) => {\n modelRoutes[modelName as M] = config.models?.[modelName as M]?.name ?? routeNames?.[modelName] ?? modelName;\n });\n\n return async (request, responseOrContext) => {\n const { resourceName, modelName } = getResourceNameFromUrl(request.url, modelRoutes as { [key in M]: string });\n\n if (!resourceName) {\n if (process.env.NODE_ENV === \"development\") {\n const mappedModels = await adapter.mapModelsToRouteNames?.();\n\n if (typeof mappedModels === \"object\") {\n throw createHttpError(404, `Resource not found, possible models: ${Object.values(mappedModels).join(\", \")}`);\n }\n }\n\n throw createHttpError(404, `Resource not found: ${request.url}`);\n }\n\n const { routeType, resourceId } = getRouteType(request.method, request.url, resourceName);\n\n if (routeType === null) {\n throw createHttpError(404, `Route not found: ${request.url}`);\n }\n\n const modelConfig = options?.models?.[modelName as M];\n\n const accessibleRoutes = getAccessibleRoutes(modelConfig?.only, modelConfig?.exclude, options?.exposeStrategy ?? \"all\");\n\n if (!accessibleRoutes.includes(routeType)) {\n throw createHttpError(404, `Route not found: ${request.url}`);\n }\n\n try {\n const resourceIdFormatted = modelConfig?.formatResourceId?.(resourceId as string) ?? config.formatResourceId(resourceId as string);\n\n await adapter.connect?.();\n\n const parsedQuery = parseQuery(request.url);\n const parameters: HandlerParameters<T, Q> = {\n adapter,\n query: adapter.parseQuery(modelName as M, parsedQuery),\n resourceName: modelName,\n };\n\n try {\n let responseConfig: ResponseConfig;\n\n switch (routeType) {\n case RouteType.READ_ONE: {\n responseConfig = await (config.handlers?.get ?? readHandler)<T, Q>({\n ...parameters,\n resourceId: resourceIdFormatted,\n });\n break;\n }\n case RouteType.READ_ALL: {\n responseConfig = await (config.handlers?.list ?? listHandler)<T, Q>({\n ...parameters,\n query: {\n ...parameters.query,\n page: parsedQuery.page ? Number(parsedQuery.page) : undefined,\n limit: parsedQuery.limit ? Number(parsedQuery.limit) : undefined,\n },\n pagination: config.pagination,\n });\n break;\n }\n case RouteType.CREATE: {\n responseConfig = await (config.handlers?.create ?? createHandler)<T, Q, R>({\n ...parameters,\n request: request as R & { body: Record<string, any> },\n });\n break;\n }\n case RouteType.UPDATE: {\n responseConfig = await (config.handlers?.update ?? updateHandler)<T, Q, R>({\n ...parameters,\n resourceId: resourceIdFormatted,\n request: request as R & { body: Partial<T> },\n });\n break;\n }\n case RouteType.DELETE: {\n responseConfig = await (config.handlers?.delete ?? deleteHandler)<T, Q>({\n ...parameters,\n resourceId: resourceIdFormatted,\n });\n break;\n }\n default: {\n responseConfig = {\n status: 404,\n data: \"Method not found\",\n };\n }\n }\n\n await responseExecutor(responseOrContext, responseConfig);\n } catch (error: any) {\n if (adapter.handleError && !(error instanceof ApiError)) {\n adapter.handleError(error);\n } else {\n throw error;\n }\n }\n } finally {\n await adapter.disconnect?.();\n\n await finalExecutor(responseOrContext);\n }\n };\n}\n\nexport default baseHandler;\n","import type { HandlerParameters } from \"../types.d\";\n\nconst createHandler: Handler = async ({\n adapter, query, resourceName, request,\n}) => {\n const resources = await adapter.create(resourceName, request.body, query);\n\n return {\n data: resources,\n status: 201,\n };\n};\n\nexport type Handler = <T, Q, Request>(\n parameters: HandlerParameters<T, Q> & { request: Request & { body: Record<string, any> } },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default createHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst deleteHandler: Handler = async ({\n adapter, query, resourceName, resourceId,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (typeof resource === \"object\") {\n const deletedResource = await adapter.delete(resourceName, resourceId, query);\n\n return {\n data: deletedResource,\n status: 200,\n };\n }\n\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n};\n\nexport type Handler = <T, Q>(\n parameters: UniqueResourceHandlerParameters<T, Q>,\n) => Promise<{\n data: any;\n status: number;\n}>;\nexport default deleteHandler;\n","import { paginate } from \"@visulima/pagination\";\n\nimport type { HandlerParameters, PaginationConfig, ParsedQueryParameters } from \"../types.d\";\n\ntype PaginationOptions = {\n page: number;\n perPage: number;\n};\n\nconst listHandler: Handler = async ({\n adapter, query, resourceName, pagination,\n}) => {\n let isPaginated = false;\n let paginationOptions: PaginationOptions | undefined;\n\n if (query.page !== undefined) {\n if (query.page <= 0) {\n throw new Error(\"page query must be a strictly positive number\");\n }\n\n paginationOptions = {\n page: query.page,\n perPage: query.limit ?? pagination.perPage,\n };\n }\n\n if (paginationOptions) {\n isPaginated = true;\n\n // eslint-disable-next-line no-param-reassign\n query.skip = (paginationOptions.page - 1) * paginationOptions.perPage;\n // eslint-disable-next-line no-param-reassign\n query.limit = paginationOptions.perPage;\n }\n\n const resources = await adapter.getAll(resourceName, query);\n\n if (isPaginated) {\n const { page, total } = await adapter.getPaginationData(resourceName, query);\n\n const paginator = paginate(page, (paginationOptions as PaginationOptions).perPage, total, resources);\n\n return {\n data: paginator.toJSON(),\n status: 200,\n };\n }\n\n return {\n data: resources,\n status: 200,\n };\n};\n\nexport type Handler = <T, Q extends ParsedQueryParameters>(\n parameters: HandlerParameters<T, Q> & { pagination: PaginationConfig },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default listHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst readHandler: Handler = async ({\n adapter, query, resourceName, resourceId,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (typeof resource !== \"object\") {\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n }\n\n return {\n data: resource,\n status: 200,\n };\n};\n\nexport type Handler = <T, Q>(\n parameters: UniqueResourceHandlerParameters<T, Q>,\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default readHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst updateHandler: Handler = async ({\n adapter, query, resourceName, resourceId, request,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (typeof resource === \"object\") {\n const updatedResource = await adapter.update(resourceName, resourceId, request.body, query);\n\n return {\n status: 201,\n data: updatedResource,\n };\n }\n\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n};\n\nexport type Handler = <T, Q, Request>(\n parameters: UniqueResourceHandlerParameters<T, Q> & { request: Request & { body: Partial<T> } },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default updateHandler;\n","import set from \"lodash.set\";\nimport { parse } from \"node:url\";\n\nimport type {\n OrderByField, ParsedQueryParameters, RecursiveField, WhereField,\n} from \"./types.d\";\n\nconst parseRecursive = (select: string): RecursiveField => {\n const selectFields: RecursiveField = {};\n\n const fields = select.split(\",\");\n\n fields.forEach((field) => {\n set(selectFields, field, true);\n });\n\n return selectFields;\n};\n\nconst parseWhere = (where: string): WhereField => {\n const whereObject = JSON.parse(where);\n const parsed: WhereField = {};\n\n Object.keys(whereObject).forEach((key) => {\n set(parsed, key, whereObject[key]);\n });\n\n return parsed;\n};\n\nconst parseOrderBy = (orderBy: string): OrderByField => {\n const parsed: OrderByField = {};\n const orderByObject = JSON.parse(orderBy);\n\n if (Object.keys(orderByObject).length > 0) {\n const key = Object.keys(orderByObject)[0] as string;\n\n if (orderByObject[key as keyof typeof orderByObject] === \"$asc\" || orderByObject[key as keyof typeof orderByObject] === \"$desc\") {\n parsed[key] = orderByObject[key as keyof typeof orderByObject];\n }\n }\n\n if (Object.keys(parsed).length !== 1) {\n throw new Error(\"orderBy needs to be an object with exactly 1 property with either $asc or $desc value\");\n }\n\n return parsed;\n};\n\n// eslint-disable-next-line radar/cognitive-complexity\nconst parseQuery = (queryString?: string): ParsedQueryParameters => {\n if (queryString) {\n const { query } = parse(queryString, true);\n const parsedQuery: ParsedQueryParameters = {};\n\n if (query[\"select\"]) {\n parsedQuery.select = parseRecursive(query[\"select\"] as string);\n }\n\n if (query[\"include\"]) {\n parsedQuery.include = parseRecursive(query[\"include\"] as string);\n }\n\n if (query[\"where\"]) {\n parsedQuery.where = parseWhere(query[\"where\"] as string);\n }\n\n if (query[\"orderBy\"]) {\n parsedQuery.orderBy = parseOrderBy(query[\"orderBy\"] as string);\n }\n\n if (query[\"limit\"] !== undefined) {\n parsedQuery.limit = Number.isFinite(+query[\"limit\"]) ? +query[\"limit\"] : undefined;\n }\n if (query[\"skip\"] !== undefined) {\n parsedQuery.skip = Number.isFinite(+query[\"skip\"]) ? +query[\"skip\"] : undefined;\n }\n\n if (query[\"distinct\"]) {\n parsedQuery.distinct = query[\"distinct\"] as string;\n }\n\n if (query[\"page\"]) {\n parsedQuery.page = Number.isFinite(+query[\"page\"]) ? +query[\"page\"] : undefined;\n }\n\n return {\n originalQuery: query,\n ...parsedQuery,\n };\n }\n\n return {};\n};\n\nexport default parseQuery;\n","const formatResourceId = (resourceId: string): number | string => (Number.isSafeInteger(+resourceId) ? +resourceId : resourceId);\n\nexport default formatResourceId;\n","export const ensureCamelCase = (string_: string): string => `${string_.charAt(0).toLowerCase()}${string_.slice(1)}`;\n\nexport const getResourceNameFromUrl = <M extends string = string>(url: string, models: { [key in M]: string }): {\n modelName: string,\n resourceName: string,\n} => {\n // Exclude the query params from the path\n const realPath = url.split(\"?\")[0];\n\n if (realPath === undefined) {\n throw new TypeError(\"Path is undefined\");\n }\n\n const modelName = (Object.keys(models) as M[]).find((name) => {\n const routeName = models[name];\n const camelCaseModel = ensureCamelCase(routeName);\n\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n return new RegExp(`(${routeName}|${camelCaseModel}$)|(${routeName}|${camelCaseModel}/)`, \"g\").test(realPath);\n });\n\n if (modelName === undefined) {\n throw new Error(`Couldn't find model name for url ${url}`);\n }\n\n return {\n modelName,\n resourceName: models[modelName],\n };\n};\n","import { match } from \"path-to-regexp\";\n\nimport { RouteType } from \"../types.d\";\n\ntype PathMatch = { id: string };\n\nconst getRouteType: (\n method: string,\n url: string,\n resourceName: string,\n) => GetRouteType = (method, url, resourceName) => {\n // Exclude the query params from the path\n const realPath = url.split(\"?\")[0];\n\n if (realPath === undefined) {\n throw new TypeError(\"Path is undefined\");\n }\n\n if (!realPath.includes(`/${resourceName}`)) {\n throw new Error(`invalid resource name '${resourceName}' for route '${realPath}'`);\n }\n\n const entityMatcher = match<PathMatch>([`/(.*)/${resourceName}`, `/(.*)/${resourceName}/:id`], { decode: decodeURIComponent });\n const simpleMatcher = match(`/(.*)/${resourceName}`, {\n decode: decodeURIComponent,\n });\n\n switch (method) {\n case \"GET\": {\n const pathMatch = entityMatcher(realPath);\n\n // If we got a /something after the resource name, we are reading 1 entity\n if (typeof pathMatch === \"object\" && pathMatch.params.id) {\n return {\n routeType: RouteType.READ_ONE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: RouteType.READ_ALL,\n };\n }\n case \"POST\": {\n const pathMatch = simpleMatcher(realPath);\n\n if (pathMatch) {\n return {\n routeType: RouteType.CREATE,\n };\n }\n\n return {\n routeType: null,\n };\n }\n case \"PUT\":\n case \"PATCH\": {\n const pathMatch = entityMatcher(realPath);\n\n if (typeof pathMatch === \"object\" && pathMatch.params.id) {\n return {\n routeType: RouteType.UPDATE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: null,\n };\n }\n case \"DELETE\": {\n const pathMatch = entityMatcher(realPath);\n\n if (typeof pathMatch === \"object\" && pathMatch.params.id) {\n return {\n routeType: RouteType.DELETE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: null,\n };\n }\n default: {\n return {\n routeType: null,\n };\n }\n }\n};\n\nexport type GetRouteType = {\n routeType: RouteType | null;\n resourceId?: string;\n};\n\nexport default getRouteType;\n","import createHttpError from \"http-errors\";\n\nimport type { Adapter } from \"../types.d\";\n\nconst adapterMethods = [\"create\", \"delete\", \"getAll\", \"getOne\", \"parseQuery\", \"update\", \"getPaginationData\", \"getModels\"];\n\nconst validateAdapterMethods = <T, Q>(adapter: Adapter<T, Q>): void => {\n adapterMethods.forEach((method) => {\n if (!adapter[method as keyof Adapter<T, Q>]) {\n throw createHttpError(500, `Adapter must implement the \"${method}\" method.`);\n }\n });\n};\n\nexport default validateAdapterMethods;\n","import baseHandler from \"../../../base-crud-handler\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, ParsedQueryParameters,\n} from \"../../../types.d\";\n\nasync function handler<T, R extends Request, Context, Q extends ParsedQueryParameters = any, M extends string = string>(\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, Context>> {\n return baseHandler<R, Context, T, Q, M>(\n async (_, responseConfig) => new Response(JSON.stringify(responseConfig.data), {\n status: responseConfig.status,\n headers: {\n \"content-type\": \"application/json; charset=utf-8\",\n },\n }),\n async () => {},\n adapter,\n options,\n );\n}\n\nexport default handler;\n","import type { NextApiRequest, NextApiResponse } from \"next\";\n\nimport baseHandler from \"../../../base-crud-handler\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, ParsedQueryParameters,\n} from \"../../../types.d\";\n\nasync function handler<\n T,\n Q extends ParsedQueryParameters = any,\n R extends NextApiRequest = NextApiRequest,\n Response extends NextApiResponse = NextApiResponse,\n M extends string = string,\n>(adapter: Adapter<T, Q>, options?: HandlerOptions<M>): Promise<ExecuteHandler<R, Response>> {\n return baseHandler<R, Response, T, Q, M>(\n async (response, responseConfig) => {\n response.status(responseConfig.status).send(responseConfig.data);\n },\n async (response) => {\n response.end();\n },\n adapter,\n options,\n );\n}\n\nexport default handler;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
type Handler$4 = <T, Q, Request>(parameters: HandlerParameters<T, Q> & {
|
|
2
2
|
request: Request & {
|
|
3
3
|
body: Record<string, any>;
|
|
4
4
|
};
|
|
@@ -7,24 +7,24 @@ declare type Handler$4 = <T, Q, Request>(parameters: HandlerParameters<T, Q> & {
|
|
|
7
7
|
status: number;
|
|
8
8
|
}>;
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
type Handler$3 = <T, Q>(parameters: UniqueResourceHandlerParameters<T, Q>) => Promise<{
|
|
11
11
|
data: any;
|
|
12
12
|
status: number;
|
|
13
13
|
}>;
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
type Handler$2 = <T, Q extends ParsedQueryParameters>(parameters: HandlerParameters<T, Q> & {
|
|
16
16
|
pagination: PaginationConfig;
|
|
17
17
|
}) => Promise<{
|
|
18
18
|
data: any;
|
|
19
19
|
status: number;
|
|
20
20
|
}>;
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
type Handler$1 = <T, Q>(parameters: UniqueResourceHandlerParameters<T, Q>) => Promise<{
|
|
23
23
|
data: any;
|
|
24
24
|
status: number;
|
|
25
25
|
}>;
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
type Handler = <T, Q, Request>(parameters: UniqueResourceHandlerParameters<T, Q> & {
|
|
28
28
|
request: Request & {
|
|
29
29
|
body: Partial<T>;
|
|
30
30
|
};
|
|
@@ -45,7 +45,7 @@ type ModelOption = {
|
|
|
45
45
|
name?: string
|
|
46
46
|
only?: RouteType[]
|
|
47
47
|
exclude?: RouteType[]
|
|
48
|
-
formatResourceId?: (resourceId: string) =>
|
|
48
|
+
formatResourceId?: (resourceId: string) => number | string
|
|
49
49
|
};
|
|
50
50
|
|
|
51
51
|
type ModelsOptions<M extends string = string> = {
|
|
@@ -53,7 +53,7 @@ type ModelsOptions<M extends string = string> = {
|
|
|
53
53
|
};
|
|
54
54
|
|
|
55
55
|
type HandlerOptions<M extends string = string> = {
|
|
56
|
-
formatResourceId?: (resourceId: string) =>
|
|
56
|
+
formatResourceId?: (resourceId: string) => number | string;
|
|
57
57
|
models?: ModelsOptions<M>;
|
|
58
58
|
exposeStrategy?: "all" | "none";
|
|
59
59
|
pagination?: PaginationConfig,
|
|
@@ -80,20 +80,20 @@ interface UniqueResourceHandlerParameters<T, Q> {
|
|
|
80
80
|
adapter: Adapter<T, Q>;
|
|
81
81
|
query: Q;
|
|
82
82
|
resourceName: string;
|
|
83
|
-
resourceId:
|
|
83
|
+
resourceId: number | string;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
interface Adapter<T, Q, M extends string = string> {
|
|
87
87
|
models?: M[];
|
|
88
88
|
init?: () => Promise<void>;
|
|
89
|
-
parseQuery(resourceName: M, query: ParsedQueryParameters)
|
|
90
|
-
getAll(resourceName: M, query: Q)
|
|
91
|
-
getOne(resourceName: M, resourceId:
|
|
92
|
-
create(resourceName: M, data: any, query: Q)
|
|
93
|
-
update(resourceName: M, resourceId:
|
|
94
|
-
delete(resourceName: M, resourceId:
|
|
95
|
-
getPaginationData(resourceName: M, query: Q)
|
|
96
|
-
getModels()
|
|
89
|
+
parseQuery: (resourceName: M, query: ParsedQueryParameters) => Q;
|
|
90
|
+
getAll: (resourceName: M, query: Q) => Promise<T[]>;
|
|
91
|
+
getOne: (resourceName: M, resourceId: number | string, query: Q) => Promise<T>;
|
|
92
|
+
create: (resourceName: M, data: any, query: Q) => Promise<T>;
|
|
93
|
+
update: (resourceName: M, resourceId: number | string, data: any, query: Q) => Promise<T>;
|
|
94
|
+
delete: (resourceName: M, resourceId: number | string, query: Q) => Promise<T>;
|
|
95
|
+
getPaginationData: (resourceName: M, query: Q) => Promise<PaginationData>;
|
|
96
|
+
getModels: () => M[];
|
|
97
97
|
connect?: () => Promise<void>;
|
|
98
98
|
disconnect?: () => Promise<void>;
|
|
99
99
|
handleError?: (error: Error) => void;
|
|
@@ -107,19 +107,19 @@ type PaginationData = {
|
|
|
107
107
|
};
|
|
108
108
|
|
|
109
109
|
type RecursiveField = {
|
|
110
|
-
[key: string]:
|
|
110
|
+
[key: string]: TRecursiveField | boolean;
|
|
111
111
|
};
|
|
112
112
|
|
|
113
|
-
type WhereOperator = "$
|
|
113
|
+
type WhereOperator = "$cont" | "$ends" | "$eq" | "$gt" | "$gte" | "$in" | "$isnull" | "$lt" | "$lte" | "$neq" | "$notin" | "$starts";
|
|
114
114
|
|
|
115
|
-
type SearchCondition =
|
|
115
|
+
type SearchCondition = Date | boolean | number | string | null;
|
|
116
116
|
|
|
117
117
|
type WhereCondition = {
|
|
118
118
|
[key in TWhereOperator]?: TSearchCondition;
|
|
119
119
|
};
|
|
120
120
|
|
|
121
121
|
type Condition = {
|
|
122
|
-
[key: string]:
|
|
122
|
+
[key: string]: TCondition | TSearchCondition | TWhereCondition;
|
|
123
123
|
};
|
|
124
124
|
|
|
125
125
|
type WhereField = Condition & {
|
|
@@ -148,8 +148,15 @@ interface ParsedQueryParameters {
|
|
|
148
148
|
};
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
type ExecuteHandler<Request, Response> = (request: Request, response: Response) => Promise<void>;
|
|
152
|
+
|
|
153
|
+
type FakePrismaClient = {
|
|
154
|
+
_dmmf?: any;
|
|
155
|
+
_getDmmf?: () => any;
|
|
156
|
+
$connect: () => void;
|
|
157
|
+
$disconnect: () => Promise<void>;
|
|
158
|
+
|
|
159
|
+
[key: string]: any
|
|
160
|
+
};
|
|
154
161
|
|
|
155
|
-
export { Adapter as A, Condition as C, ExecuteHandler as E, HandlerParameters as H, ModelsOptions as M, OrderByField as O, PaginationData as P, RouteType as R, SearchCondition as S, UniqueResourceHandlerParameters as U, WhereField as W, ParsedQueryParameters as a, PaginationConfig as b, HandlerOptions as c, ModelOption as d, OrderByOperator as e, RecursiveField as f, WhereOperator as g, WhereCondition as h };
|
|
162
|
+
export { Adapter as A, Condition as C, ExecuteHandler as E, FakePrismaClient as F, HandlerParameters as H, ModelsOptions as M, OrderByField as O, PaginationData as P, RouteType as R, SearchCondition as S, UniqueResourceHandlerParameters as U, WhereField as W, ParsedQueryParameters as a, PaginationConfig as b, HandlerOptions as c, ModelOption as d, OrderByOperator as e, RecursiveField as f, WhereOperator as g, WhereCondition as h };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@visulima/crud",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.10",
|
|
4
4
|
"description": "visulima crud",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"anolilab",
|
|
@@ -58,69 +58,72 @@
|
|
|
58
58
|
"scripts": {
|
|
59
59
|
"build": "rimraf dist && cross-env NODE_ENV=development tsup",
|
|
60
60
|
"build:prod": "rimraf dist && cross-env NODE_ENV=production tsup",
|
|
61
|
-
"clean": "rimraf node_modules dist",
|
|
61
|
+
"clean": "rimraf node_modules dist .eslintcache",
|
|
62
62
|
"coverage": "vitest run --coverage",
|
|
63
63
|
"dev": "pnpm predev && pnpm run build --watch",
|
|
64
64
|
"lint:eslint": "cross-env NO_LOGS=true eslint . --ext js,jsx,ts,tsx --max-warnings=0 --config .eslintrc.cjs --cache --cache-strategy content .",
|
|
65
65
|
"lint:eslint:fix": "pnpm run lint:eslint --fix",
|
|
66
|
-
"test": "vitest"
|
|
66
|
+
"test": "vitest run",
|
|
67
|
+
"test:watch": "vitest"
|
|
67
68
|
},
|
|
68
69
|
"dependencies": {
|
|
69
|
-
"@visulima/pagination": "2.0.
|
|
70
|
-
"@visulima/prisma-dmmf-transformer": "1.0.
|
|
70
|
+
"@visulima/pagination": "2.0.2",
|
|
71
|
+
"@visulima/prisma-dmmf-transformer": "1.0.5",
|
|
71
72
|
"http-errors": "^2.0.0",
|
|
72
73
|
"lodash.set": "^4.3.2",
|
|
73
74
|
"path-to-regexp": "^6.2.1"
|
|
74
75
|
},
|
|
75
76
|
"devDependencies": {
|
|
76
|
-
"@anolilab/eslint-config": "^
|
|
77
|
-
"@anolilab/semantic-release-preset": "^2.0
|
|
78
|
-
"@prisma/client": "^4.
|
|
77
|
+
"@anolilab/eslint-config": "^5.0.2",
|
|
78
|
+
"@anolilab/semantic-release-preset": "^2.2.0",
|
|
79
|
+
"@prisma/client": "^4.9.0",
|
|
79
80
|
"@rushstack/eslint-plugin-security": "^0.5.0",
|
|
80
81
|
"@testing-library/react": "^13.4.0",
|
|
81
82
|
"@testing-library/react-hooks": "^8.0.1",
|
|
82
|
-
"@types/http-errors": "^2.0.
|
|
83
|
+
"@types/http-errors": "^2.0.1",
|
|
83
84
|
"@types/json-schema": "7.0.11",
|
|
84
85
|
"@types/lodash.set": "^4.3.7",
|
|
85
|
-
"@types/node": "^18.
|
|
86
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
87
|
-
"@typescript-eslint/parser": "^5.
|
|
86
|
+
"@types/node": "^18.11.18",
|
|
87
|
+
"@typescript-eslint/eslint-plugin": "^5.49.0",
|
|
88
|
+
"@typescript-eslint/parser": "^5.49.0",
|
|
88
89
|
"cross-env": "^7.0.3",
|
|
89
|
-
"eslint": "^8.
|
|
90
|
+
"eslint": "^8.32.0",
|
|
90
91
|
"eslint-plugin-compat": "^4.0.2",
|
|
91
92
|
"eslint-plugin-eslint-comments": "^3.2.0",
|
|
92
|
-
"eslint-plugin-import": "^2.
|
|
93
|
+
"eslint-plugin-import": "^2.27.5",
|
|
93
94
|
"eslint-plugin-json": "^3.1.0",
|
|
94
|
-
"eslint-plugin-jsx-a11y": "^6.
|
|
95
|
+
"eslint-plugin-jsx-a11y": "^6.7.1",
|
|
95
96
|
"eslint-plugin-markdown": "^3.0.0",
|
|
96
97
|
"eslint-plugin-no-loops": "^0.3.0",
|
|
97
98
|
"eslint-plugin-no-secrets": "^0.8.9",
|
|
98
99
|
"eslint-plugin-node": "^11.1.0",
|
|
99
100
|
"eslint-plugin-optimize-regex": "^1.2.1",
|
|
100
|
-
"eslint-plugin-promise": "^6.
|
|
101
|
+
"eslint-plugin-promise": "^6.1.1",
|
|
101
102
|
"eslint-plugin-radar": "^0.2.1",
|
|
102
|
-
"eslint-plugin-react": "7.
|
|
103
|
+
"eslint-plugin-react": "7.32.1",
|
|
103
104
|
"eslint-plugin-react-hooks": "4.6.0",
|
|
104
|
-
"eslint-plugin-simple-import-sort": "^
|
|
105
|
+
"eslint-plugin-simple-import-sort": "^9.0.0",
|
|
105
106
|
"eslint-plugin-sort-keys-fix": "^1.1.2",
|
|
106
|
-
"eslint-plugin-testing-library": "^5.
|
|
107
|
-
"eslint-plugin-unicorn": "^45.0.
|
|
107
|
+
"eslint-plugin-testing-library": "^5.10.0",
|
|
108
|
+
"eslint-plugin-unicorn": "^45.0.2",
|
|
108
109
|
"eslint-plugin-you-dont-need-lodash-underscore": "^6.12.0",
|
|
109
110
|
"eslint-plugin-you-dont-need-momentjs": "^1.6.0",
|
|
110
111
|
"next": "^12.0.0 || ^13.0.0",
|
|
111
112
|
"next-test-api-route-handler": "^4.0.0-canary.1",
|
|
112
|
-
"node-mocks-http": "^1.
|
|
113
|
-
"openapi-types": "^12.0
|
|
114
|
-
"prettier": "^2.
|
|
113
|
+
"node-mocks-http": "^1.12.1",
|
|
114
|
+
"openapi-types": "^12.1.0",
|
|
115
|
+
"prettier": "^2.8.3",
|
|
116
|
+
"react": "^18.2.0",
|
|
117
|
+
"react-dom": "^18.2.0",
|
|
115
118
|
"read-pkg": "^7.1.0",
|
|
116
|
-
"rimraf": "^
|
|
117
|
-
"semantic-release": "^20.
|
|
118
|
-
"tsup": "^6.
|
|
119
|
-
"typescript": "^4.
|
|
120
|
-
"vitest": "^0.
|
|
119
|
+
"rimraf": "^4.1.2",
|
|
120
|
+
"semantic-release": "^20.1.0",
|
|
121
|
+
"tsup": "^6.5.0",
|
|
122
|
+
"typescript": "^4.9.4",
|
|
123
|
+
"vitest": "^0.28.2"
|
|
121
124
|
},
|
|
122
125
|
"engines": {
|
|
123
|
-
"node": ">=16.18.0 <=19
|
|
126
|
+
"node": ">=16.18.0 <=19.*"
|
|
124
127
|
},
|
|
125
128
|
"publishConfig": {
|
|
126
129
|
"access": "public"
|
package/dist/chunk-JSOEPRPZ.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var a=(e=>(e.CREATE="CREATE",e.READ_ALL="READ_ALL",e.READ_ONE="READ_ONE",e.UPDATE="UPDATE",e.DELETE="DELETE",e))(a||{});var s=(n,r,o="all")=>{let t=o==="none"?[]:["READ_ALL","READ_ONE","UPDATE","DELETE","CREATE"];return Array.isArray(n)&&(t=n),r!=null&&r.length&&(t=t.filter(i=>!r.includes(i))),t},p=s;export{a,p as b};
|
|
2
|
-
//# sourceMappingURL=chunk-JSOEPRPZ.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.d.ts","../src/utils/get-accessible-routes.ts"],"sourcesContent":["import type { Handler as CreateHandler } from \"./handler/create\";\nimport type { Handler as DeleteHandler } from \"./handler/delete\";\nimport type { Handler as ListHandler } from \"./handler/list\";\nimport type { Handler as GetHandler } from \"./handler/read\";\nimport type { Handler as UpdateHandler } from \"./handler/update\";\n\nexport enum RouteType {\n CREATE = \"CREATE\",\n READ_ALL = \"READ_ALL\",\n READ_ONE = \"READ_ONE\",\n UPDATE = \"UPDATE\",\n DELETE = \"DELETE\",\n}\n\nexport type ModelOption = {\n name?: string\n only?: RouteType[]\n exclude?: RouteType[]\n formatResourceId?: (resourceId: string) => string | number\n};\n\nexport type ModelsOptions<M extends string = string> = {\n [key in M]?: ModelOption\n};\n\nexport type HandlerOptions<M extends string = string> = {\n formatResourceId?: (resourceId: string) => string | number;\n models?: ModelsOptions<M>;\n exposeStrategy?: \"all\" | \"none\";\n pagination?: PaginationConfig,\n handlers?: {\n create?: CreateHandler;\n delete?: DeleteHandler;\n get?: GetHandler;\n list?: ListHandler;\n update?: UpdateHandler;\n },\n};\n\nexport type PaginationConfig = {\n perPage: number\n};\n\nexport interface HandlerParameters<T, Q> {\n adapter: Adapter<T, Q>;\n query: Q;\n resourceName: string;\n}\n\nexport interface UniqueResourceHandlerParameters<T, Q> {\n adapter: Adapter<T, Q>;\n query: Q;\n resourceName: string;\n resourceId: string | number;\n}\n\nexport interface Adapter<T, Q, M extends string = string> {\n models?: M[];\n init?: () => Promise<void>;\n parseQuery(resourceName: M, query: ParsedQueryParameters): Q;\n getAll(resourceName: M, query: Q): Promise<T[]>;\n getOne(resourceName: M, resourceId: string | number, query: Q): Promise<T>;\n create(resourceName: M, data: any, query: Q): Promise<T>;\n update(resourceName: M, resourceId: string | number, data: any, query: Q): Promise<T>;\n delete(resourceName: M, resourceId: string | number, query: Q): Promise<T>;\n getPaginationData(resourceName: M, query: Q): Promise<PaginationData>;\n getModels(): M[];\n connect?: () => Promise<void>;\n disconnect?: () => Promise<void>;\n handleError?: (error: Error) => void;\n mapModelsToRouteNames?: () => Promise<{ [key in M]?: string }>;\n}\n\nexport type PaginationData = {\n total: number\n pageCount: number\n page: number\n};\n\nexport type RecursiveField = {\n [key: string]: boolean | TRecursiveField;\n};\n\nexport type WhereOperator = \"$eq\" | \"$neq\" | \"$in\" | \"$notin\" | \"$lt\" | \"$lte\" | \"$gt\" | \"$gte\" | \"$cont\" | \"$starts\" | \"$ends\" | \"$isnull\";\n\nexport type SearchCondition = string | boolean | number | Date | null;\n\nexport type WhereCondition = {\n [key in TWhereOperator]?: TSearchCondition;\n};\n\nexport type Condition = {\n [key: string]: TSearchCondition | TWhereCondition | TCondition;\n};\n\nexport type WhereField = Condition & {\n $and?: TCondition | TCondition[];\n $or?: TCondition | TCondition[];\n $not?: TCondition | TCondition[];\n};\n\nexport type OrderByOperator = \"$asc\" | \"$desc\";\n\nexport type OrderByField = {\n [key: string]: TOrderByOperator;\n};\n\nexport interface ParsedQueryParameters {\n select?: RecursiveField;\n include?: RecursiveField;\n where?: WhereField;\n orderBy?: OrderByField;\n limit?: number;\n skip?: number;\n distinct?: string;\n page?: number;\n originalQuery?: {\n [key: string]: any;\n };\n}\n\nexport interface ExecuteHandler<Request, Response> {\n (request: Request, response: Response): Promise<void>;\n}\n","import { RouteType } from \"../types.d\";\n\nconst getAccessibleRoutes = (only?: RouteType[], exclude?: RouteType[], defaultExposeStrategy: \"all\" | \"none\" = \"all\"): RouteType[] => {\n // eslint-disable-next-line max-len\n let accessibleRoutes: RouteType[] = defaultExposeStrategy === \"none\" ? [] : [RouteType.READ_ALL, RouteType.READ_ONE, RouteType.UPDATE, RouteType.DELETE, RouteType.CREATE];\n\n if (Array.isArray(only)) {\n accessibleRoutes = only;\n }\n\n if (exclude?.length) {\n accessibleRoutes = accessibleRoutes.filter((element) => !exclude.includes(element));\n }\n\n return accessibleRoutes;\n};\n\nexport default getAccessibleRoutes;\n"],"mappings":"AAMO,IAAKA,OACRA,EAAA,OAAS,SACTA,EAAA,SAAW,WACXA,EAAA,SAAW,WACXA,EAAA,OAAS,SACTA,EAAA,OAAS,SALDA,OAAA,ICJZ,IAAMC,EAAsB,CAACC,EAAoBC,EAAuBC,EAAwC,QAAuB,CAEnI,IAAIC,EAAgCD,IAA0B,OAAS,CAAC,EAAI,iDAA6F,EAEzK,OAAI,MAAM,QAAQF,CAAI,IAClBG,EAAmBH,GAGnBC,GAAA,MAAAA,EAAS,SACTE,EAAmBA,EAAiB,OAAQC,GAAY,CAACH,EAAQ,SAASG,CAAO,CAAC,GAG/ED,CACX,EAEOE,EAAQN","names":["RouteType","getAccessibleRoutes","only","exclude","defaultExposeStrategy","accessibleRoutes","element","get_accessible_routes_default"]}
|
package/dist/chunk-U35WXGEF.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var a=(e=>(e.CREATE="CREATE",e.READ_ALL="READ_ALL",e.READ_ONE="READ_ONE",e.UPDATE="UPDATE",e.DELETE="DELETE",e))(a||{});var s=(n,r,o="all")=>{let t=o==="none"?[]:["READ_ALL","READ_ONE","UPDATE","DELETE","CREATE"];return Array.isArray(n)&&(t=n),r!=null&&r.length&&(t=t.filter(i=>!r.includes(i))),t},p= exports.b =s;exports.a = a; exports.b = p;
|
|
2
|
-
//# sourceMappingURL=chunk-U35WXGEF.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.d.ts","../src/utils/get-accessible-routes.ts"],"names":["RouteType","getAccessibleRoutes","only","exclude","defaultExposeStrategy","accessibleRoutes","element","get_accessible_routes_default"],"mappings":"AAMO,IAAKA,OACRA,EAAA,OAAS,SACTA,EAAA,SAAW,WACXA,EAAA,SAAW,WACXA,EAAA,OAAS,SACTA,EAAA,OAAS,SALDA,OAAA,ICJZ,IAAMC,EAAsB,CAACC,EAAoBC,EAAuBC,EAAwC,QAAuB,CAEnI,IAAIC,EAAgCD,IAA0B,OAAS,CAAC,EAAI,iDAA6F,EAEzK,OAAI,MAAM,QAAQF,CAAI,IAClBG,EAAmBH,GAGnBC,GAAA,MAAAA,EAAS,SACTE,EAAmBA,EAAiB,OAAQC,GAAY,CAACH,EAAQ,SAASG,CAAO,CAAC,GAG/ED,CACX,EAEOE,EAAQN","sourcesContent":["import type { Handler as CreateHandler } from \"./handler/create\";\nimport type { Handler as DeleteHandler } from \"./handler/delete\";\nimport type { Handler as ListHandler } from \"./handler/list\";\nimport type { Handler as GetHandler } from \"./handler/read\";\nimport type { Handler as UpdateHandler } from \"./handler/update\";\n\nexport enum RouteType {\n CREATE = \"CREATE\",\n READ_ALL = \"READ_ALL\",\n READ_ONE = \"READ_ONE\",\n UPDATE = \"UPDATE\",\n DELETE = \"DELETE\",\n}\n\nexport type ModelOption = {\n name?: string\n only?: RouteType[]\n exclude?: RouteType[]\n formatResourceId?: (resourceId: string) => string | number\n};\n\nexport type ModelsOptions<M extends string = string> = {\n [key in M]?: ModelOption\n};\n\nexport type HandlerOptions<M extends string = string> = {\n formatResourceId?: (resourceId: string) => string | number;\n models?: ModelsOptions<M>;\n exposeStrategy?: \"all\" | \"none\";\n pagination?: PaginationConfig,\n handlers?: {\n create?: CreateHandler;\n delete?: DeleteHandler;\n get?: GetHandler;\n list?: ListHandler;\n update?: UpdateHandler;\n },\n};\n\nexport type PaginationConfig = {\n perPage: number\n};\n\nexport interface HandlerParameters<T, Q> {\n adapter: Adapter<T, Q>;\n query: Q;\n resourceName: string;\n}\n\nexport interface UniqueResourceHandlerParameters<T, Q> {\n adapter: Adapter<T, Q>;\n query: Q;\n resourceName: string;\n resourceId: string | number;\n}\n\nexport interface Adapter<T, Q, M extends string = string> {\n models?: M[];\n init?: () => Promise<void>;\n parseQuery(resourceName: M, query: ParsedQueryParameters): Q;\n getAll(resourceName: M, query: Q): Promise<T[]>;\n getOne(resourceName: M, resourceId: string | number, query: Q): Promise<T>;\n create(resourceName: M, data: any, query: Q): Promise<T>;\n update(resourceName: M, resourceId: string | number, data: any, query: Q): Promise<T>;\n delete(resourceName: M, resourceId: string | number, query: Q): Promise<T>;\n getPaginationData(resourceName: M, query: Q): Promise<PaginationData>;\n getModels(): M[];\n connect?: () => Promise<void>;\n disconnect?: () => Promise<void>;\n handleError?: (error: Error) => void;\n mapModelsToRouteNames?: () => Promise<{ [key in M]?: string }>;\n}\n\nexport type PaginationData = {\n total: number\n pageCount: number\n page: number\n};\n\nexport type RecursiveField = {\n [key: string]: boolean | TRecursiveField;\n};\n\nexport type WhereOperator = \"$eq\" | \"$neq\" | \"$in\" | \"$notin\" | \"$lt\" | \"$lte\" | \"$gt\" | \"$gte\" | \"$cont\" | \"$starts\" | \"$ends\" | \"$isnull\";\n\nexport type SearchCondition = string | boolean | number | Date | null;\n\nexport type WhereCondition = {\n [key in TWhereOperator]?: TSearchCondition;\n};\n\nexport type Condition = {\n [key: string]: TSearchCondition | TWhereCondition | TCondition;\n};\n\nexport type WhereField = Condition & {\n $and?: TCondition | TCondition[];\n $or?: TCondition | TCondition[];\n $not?: TCondition | TCondition[];\n};\n\nexport type OrderByOperator = \"$asc\" | \"$desc\";\n\nexport type OrderByField = {\n [key: string]: TOrderByOperator;\n};\n\nexport interface ParsedQueryParameters {\n select?: RecursiveField;\n include?: RecursiveField;\n where?: WhereField;\n orderBy?: OrderByField;\n limit?: number;\n skip?: number;\n distinct?: string;\n page?: number;\n originalQuery?: {\n [key: string]: any;\n };\n}\n\nexport interface ExecuteHandler<Request, Response> {\n (request: Request, response: Response): Promise<void>;\n}\n","import { RouteType } from \"../types.d\";\n\nconst getAccessibleRoutes = (only?: RouteType[], exclude?: RouteType[], defaultExposeStrategy: \"all\" | \"none\" = \"all\"): RouteType[] => {\n // eslint-disable-next-line max-len\n let accessibleRoutes: RouteType[] = defaultExposeStrategy === \"none\" ? [] : [RouteType.READ_ALL, RouteType.READ_ONE, RouteType.UPDATE, RouteType.DELETE, RouteType.CREATE];\n\n if (Array.isArray(only)) {\n accessibleRoutes = only;\n }\n\n if (exclude?.length) {\n accessibleRoutes = accessibleRoutes.filter((element) => !exclude.includes(element));\n }\n\n return accessibleRoutes;\n};\n\nexport default getAccessibleRoutes;\n"]}
|