@visulima/crud 1.0.6 → 1.0.8
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 +15 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/next/index.js +1 -1
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs +1 -1
- package/dist/next/index.mjs.map +1 -1
- package/package.json +4 -6
package/dist/next/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as C}from"../chunk-JSOEPRPZ.mjs";import x from"http-errors";import{ApiError as W}from"next/dist/server/api-utils";var G=async({adapter:s,query:e,resourceName:t,request:r})=>({data:await s.create(t,r.body,e),status:201}),k=G;import V from"http-errors";var z=async({adapter:s,query:e,resourceName:t,resourceId:r})=>{if(await s.getOne(t,r,e))return{data:await s.delete(t,r,e),status:200};throw V(404,`${t} ${r} not found`)},v=z;import{paginate as K}from"@visulima/pagination";var X=async({adapter:s,query:e,resourceName:t,pagination:r})=>{let a=!1,o;if((e==null?void 0:e.page)!==void 0){if((e==null?void 0:e.page)<=0)throw new Error("page query must be a strictly positive number");o={page:e==null?void 0:e.page,perPage:(e==null?void 0:e.limit)||r.perPage}}o&&(a=!0,e.skip=(o.page-1)*o.perPage,e.limit=o.perPage);let n=await s.getAll(t,e);if(a){let{page:f,total:y}=await s.getPaginationData(t,e);return{data:K(f,o.perPage,y,n).toJSON(),status:200}}return{data:n,status:200}},N=X;import Y from"http-errors";var Z=async({adapter:s,query:e,resourceName:t,resourceId:r})=>{let a=await s.getOne(t,r,e);if(!a)throw Y(404,`${t} ${r} not found`);return{data:a,status:200}},F=Z;import q from"http-errors";var ee=async({adapter:s,query:e,resourceName:t,resourceId:r,request:a})=>{if(await s.getOne(t,r,e))return{status:201,data:await s.update(t,r,a.body,e)};throw q(404,`${t} ${r} not found`)},j=ee;import B from"lodash.set";import{parse as te}from"
|
|
1
|
+
import{b as C}from"../chunk-JSOEPRPZ.mjs";import x from"http-errors";import{ApiError as W}from"next/dist/server/api-utils";var G=async({adapter:s,query:e,resourceName:t,request:r})=>({data:await s.create(t,r.body,e),status:201}),k=G;import V from"http-errors";var z=async({adapter:s,query:e,resourceName:t,resourceId:r})=>{if(await s.getOne(t,r,e))return{data:await s.delete(t,r,e),status:200};throw V(404,`${t} ${r} not found`)},v=z;import{paginate as K}from"@visulima/pagination";var X=async({adapter:s,query:e,resourceName:t,pagination:r})=>{let a=!1,o;if((e==null?void 0:e.page)!==void 0){if((e==null?void 0:e.page)<=0)throw new Error("page query must be a strictly positive number");o={page:e==null?void 0:e.page,perPage:(e==null?void 0:e.limit)||r.perPage}}o&&(a=!0,e.skip=(o.page-1)*o.perPage,e.limit=o.perPage);let n=await s.getAll(t,e);if(a){let{page:f,total:y}=await s.getPaginationData(t,e);return{data:K(f,o.perPage,y,n).toJSON(),status:200}}return{data:n,status:200}},N=X;import Y from"http-errors";var Z=async({adapter:s,query:e,resourceName:t,resourceId:r})=>{let a=await s.getOne(t,r,e);if(!a)throw Y(404,`${t} ${r} not found`);return{data:a,status:200}},F=Z;import q from"http-errors";var ee=async({adapter:s,query:e,resourceName:t,resourceId:r,request:a})=>{if(await s.getOne(t,r,e))return{status:201,data:await s.update(t,r,a.body,e)};throw q(404,`${t} ${r} not found`)},j=ee;import B from"lodash.set";import{parse as te}from"url";var U=s=>{let e={};return s.split(",").forEach(r=>{B(e,r,!0)}),e},re=s=>{let e=JSON.parse(s),t={};return Object.keys(e).forEach(r=>{B(t,r,e[r])}),t},se=s=>{let e={},t=JSON.parse(s);if(Object.keys(t).length>0){let r=Object.keys(t)[0];(t[r]==="$asc"||t[r]==="$desc")&&(e[r]=t[r])}if(Object.keys(e).length!==1)throw new Error("orderBy needs to be an object with exactly 1 property with either $asc or $desc value");return e},ae=s=>{if(s){let{query:e}=te(s,!0),t={};return e.select&&(t.select=U(e.select)),e.include&&(t.include=U(e.include)),e.where&&(t.where=re(e.where)),e.orderBy&&(t.orderBy=se(e.orderBy)),e.limit!==void 0&&(t.limit=Number.isFinite(+e.limit)?+e.limit:void 0),e.skip!==void 0&&(t.skip=Number.isFinite(+e.skip)?+e.skip:void 0),e.distinct&&(t.distinct=e.distinct),e.page&&(t.page=Number.isFinite(+e.page)?+e.page:void 0),{originalQuery:e,...t}}return{}},D=ae;var ne=s=>Number.isSafeInteger(+s)?+s:s,I=ne;var oe=s=>`${s.charAt(0).toLowerCase()}${s.slice(1)}`,L=(s,e)=>{let t=s.split("?")[0];if(t===void 0)throw new TypeError("Path is undefined");let r=Object.keys(e).find(a=>{let o=e[a],n=oe(o);return new RegExp(`(${o}|${n}$)|(${o}|${n}/)`,"g").test(t)});return{modelName:r,resourceName:e[r]}};import{match as S}from"path-to-regexp";var ie=(s,e,t)=>{let r=e.split("?")[0];if(r===void 0)throw new TypeError("Path is undefined");if(!r.includes(`/${t}`))throw new Error(`invalid resource name '${t}' for route '${r}'`);let a=S([`/(.*)/${t}`,`/(.*)/${t}/:id`],{decode:decodeURIComponent}),o=S(`/(.*)/${t}`,{decode:decodeURIComponent});switch(s){case"GET":{let n=a(r);return n&&n.params.id?{routeType:"READ_ONE",resourceId:n.params.id}:{routeType:"READ_ALL"}}case"POST":return o(r)?{routeType:"CREATE"}:{routeType:null};case"PUT":case"PATCH":{let n=a(r);return n&&n.params.id?{routeType:"UPDATE",resourceId:n.params.id}:{routeType:null}}case"DELETE":{let n=a(r);return n&&n.params.id?{routeType:"DELETE",resourceId:n.params.id}:{routeType:null}}default:return{routeType:null}}},_=ie;import de from"http-errors";var pe=["create"],ue=s=>{pe.forEach(e=>{if(!s[e])throw de(500,`Adapter must implement the "${e}" method.`)})},J=ue;async function ce(s,e,t,r){var f,y;try{J(t)}catch(i){let u=i;throw new W(u.statusCode,u.message)}await((f=t.init)==null?void 0:f.call(t));let a={formatResourceId:I,pagination:{perPage:20},...r},o=await((y=t.mapModelsToRouteNames)==null?void 0:y.call(t)),n={};return t.getModels().forEach(i=>{var u,l;n[i]=((l=(u=a==null?void 0:a.models)==null?void 0:u[i])==null?void 0:l.name)||(o==null?void 0:o[i])||i}),async(i,u)=>{var H,E,w,b,Q,O,M,A,$;let{resourceName:l,modelName:P}=L(i.url,n);if(!l)throw x(404,`Resource not found: ${i.url}`);let{routeType:h,resourceId:T}=_(i.method,i.url,l);if(h===null)throw x(404,`Route not found: ${i.url}`);let d=(H=r==null?void 0:r.models)==null?void 0:H[P];if(!C(d==null?void 0:d.only,d==null?void 0:d.exclude,(r==null?void 0:r.exposeStrategy)||"all").includes(h))throw x(404,`Route not found: ${i.url}`);try{let R=((E=d==null?void 0:d.formatResourceId)==null?void 0:E.call(d,T))??a.formatResourceId(T);await((w=t.connect)==null?void 0:w.call(t));let m=D(i.url),c={adapter:t,query:t.parseQuery(P,m),resourceName:P};try{let p;switch(h){case"READ_ONE":{p=await(((b=a==null?void 0:a.handlers)==null?void 0:b.get)||F)({...c,resourceId:R});break}case"READ_ALL":{p=await(((Q=a==null?void 0:a.handlers)==null?void 0:Q.list)||N)({...c,query:{...c.query,page:m.page?Number(m.page):void 0,limit:m.limit?Number(m.limit):void 0},pagination:a.pagination});break}case"CREATE":{p=await(((O=a==null?void 0:a.handlers)==null?void 0:O.create)||k)({...c,request:i});break}case"UPDATE":{p=await(((M=a==null?void 0:a.handlers)==null?void 0:M.update)||j)({...c,resourceId:R,request:i});break}case"DELETE":{p=await(((A=a==null?void 0:a.handlers)==null?void 0:A.delete)||v)({...c,resourceId:R});break}default:p={status:404,data:"Method not found"}}await s(u,p)}catch(p){if(t.handleError&&!(p instanceof W))t.handleError(p);else throw p}}finally{await(($=t.disconnect)==null?void 0:$.call(t)),await e(u)}}}var g=ce;async function le(s,e){return g(async(t,r)=>new Response(JSON.stringify(r.data),{status:r.status,headers:{"content-type":"application/json; charset=utf-8"}}),async()=>{},s,e)}var me=le;async function fe(s,e){return g(async(t,r)=>{t.status(r.status).send(r.data)},async t=>{t.end()},s,e)}var ye=fe;export{me as edgeHandler,ye as nodeHandler};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/next/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/base-crud-handler.ts","../../src/handler/create.ts","../../src/handler/delete.ts","../../src/handler/list.ts","../../src/handler/read.ts","../../src/handler/update.ts","../../src/query-parser.ts","../../src/utils/format-resource-id.ts","../../src/utils/get-resource-name-from-url.ts","../../src/utils/get-route-type.ts","../../src/utils/validate-adapter-methods.ts","../../src/next/api/edge/index.ts","../../src/next/api/node/index.ts"],"sourcesContent":["import type { HttpError } from \"http-errors\";\nimport createHttpError from \"http-errors\";\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { ApiError } from \"next/dist/server/api-utils\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport createHandler from \"./handler/create\";\nimport deleteHandler from \"./handler/delete\";\nimport listHandler from \"./handler/list\";\nimport readHandler from \"./handler/read\";\nimport updateHandler from \"./handler/update\";\nimport parseQuery from \"./query-parser\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, HandlerParameters, ParsedQueryParameters,\n} from \"./types.d\";\nimport { RouteType } from \"./types.d\";\nimport formatResourceId from \"./utils/format-resource-id\";\nimport getAccessibleRoutes from \"./utils/get-accessible-routes\";\nimport { getResourceNameFromUrl } from \"./utils/get-resource-name-from-url\";\nimport getRouteType from \"./utils/get-route-type\";\nimport validateAdapterMethods from \"./utils/validate-adapter-methods\";\n\ntype ResponseConfig = { status: number; data: any };\n\nasync function baseHandler<R extends Request, Context extends unknown, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: Context, responseConfig: ResponseConfig) => Promise<Response>,\n finalExecutor: (responseOrContext: Context) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, Context>>;\n\nasync function baseHandler<R extends IncomingMessage, RResponse extends ServerResponse, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: RResponse, responseConfig: ResponseConfig) => Promise<void>,\n finalExecutor: (responseOrContext: RResponse) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, RResponse>>;\n\n// eslint-disable-next-line radar/cognitive-complexity,max-len\nasync function baseHandler<R extends { url: string; method: string }, RResponse, T, Q extends ParsedQueryParameters = any, M extends string = string>(\n responseExecutor: (responseOrContext: RResponse, responseConfig: ResponseConfig) => Promise<RResponse>,\n finalExecutor: (responseOrContext: RResponse) => Promise<void>,\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, RResponse>> {\n try {\n validateAdapterMethods(adapter);\n } catch (error_: any) {\n const error = error_ as HttpError;\n\n throw new ApiError(error.statusCode, error.message);\n }\n\n await adapter.init?.();\n\n const config = {\n formatResourceId,\n pagination: {\n perPage: 20,\n },\n ...options,\n };\n\n const routeNames = await adapter.mapModelsToRouteNames?.();\n const modelRoutes: { [key in M]?: string } = {};\n\n adapter.getModels().forEach((modelName) => {\n modelRoutes[modelName as M] = config?.models?.[modelName as M]?.name || routeNames?.[modelName] || modelName;\n });\n\n return async (request, responseOrContext) => {\n const { resourceName, modelName } = getResourceNameFromUrl(request.url as string, modelRoutes);\n\n if (!resourceName) {\n if (process.env.NODE_ENV === \"development\") {\n const mappedModels = await adapter.mapModelsToRouteNames?.();\n\n if (typeof mappedModels === \"object\") {\n throw createHttpError(404, `Resource not found, possible models: ${Object.values(mappedModels).join(\", \")}`);\n }\n }\n\n throw createHttpError(404, `Resource not found: ${request.url}`);\n }\n\n const { routeType, resourceId } = getRouteType(request.method as string, request.url as string, resourceName);\n\n if (routeType === null) {\n throw createHttpError(404, `Route not found: ${request.url}`);\n }\n\n const modelConfig = options?.models?.[modelName as M];\n\n const accessibleRoutes = getAccessibleRoutes(modelConfig?.only, modelConfig?.exclude, options?.exposeStrategy || \"all\");\n\n if (!accessibleRoutes.includes(routeType)) {\n throw createHttpError(404, `Route not found: ${request.url}`);\n }\n\n try {\n const resourceIdFormatted = modelConfig?.formatResourceId?.(resourceId as string) ?? config.formatResourceId(resourceId as string);\n\n await adapter.connect?.();\n\n const parsedQuery = parseQuery((request.url as string).split(\"?\")[1]);\n const parameters: HandlerParameters<T, Q> = {\n adapter,\n query: adapter.parseQuery(modelName as M, parsedQuery),\n resourceName: modelName as string,\n };\n\n try {\n let responseConfig: ResponseConfig;\n\n switch (routeType) {\n case RouteType.READ_ONE: {\n responseConfig = await (config?.handlers?.get || readHandler)<T, Q>({\n ...parameters,\n resourceId: resourceIdFormatted,\n });\n break;\n }\n case RouteType.READ_ALL: {\n responseConfig = await (config?.handlers?.list || listHandler)<T, Q>({\n ...parameters,\n query: {\n ...parameters.query,\n page: parsedQuery.page ? Number(parsedQuery.page) : undefined,\n limit: parsedQuery.limit ? Number(parsedQuery.limit) : undefined,\n },\n pagination: config.pagination,\n });\n break;\n }\n case RouteType.CREATE: {\n responseConfig = await (config?.handlers?.create || createHandler)<T, Q, R>({\n ...parameters,\n request: request as R & { body: Record<string, any> },\n });\n break;\n }\n case RouteType.UPDATE: {\n responseConfig = await (config?.handlers?.update || updateHandler)<T, Q, R>({\n ...parameters,\n resourceId: resourceIdFormatted,\n request: request as R & { body: Partial<T> },\n });\n break;\n }\n case RouteType.DELETE: {\n responseConfig = await (config?.handlers?.delete || deleteHandler)<T, Q>({\n ...parameters,\n resourceId: resourceIdFormatted,\n });\n break;\n }\n default: {\n responseConfig = {\n status: 404,\n data: \"Method not found\",\n };\n }\n }\n\n await responseExecutor(responseOrContext, responseConfig);\n } catch (error: any) {\n if (adapter.handleError && !(error instanceof ApiError)) {\n adapter.handleError(error);\n } else {\n throw error;\n }\n }\n } finally {\n await adapter.disconnect?.();\n\n await finalExecutor(responseOrContext);\n }\n };\n}\n\nexport default baseHandler;\n","import type { HandlerParameters } from \"../types.d\";\n\nconst createHandler: Handler = async ({\n adapter, query, resourceName, request,\n}) => {\n const resources = await adapter.create(resourceName, request.body, query);\n\n return {\n data: resources,\n status: 201,\n };\n};\n\nexport type Handler = <T, Q, Request>(\n parameters: HandlerParameters<T, Q> & { request: Request & { body: Record<string, any> } },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default createHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst deleteHandler: Handler = async ({\n adapter, query, resourceName, resourceId,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (resource) {\n const deletedResource = await adapter.delete(resourceName, resourceId, query);\n\n return {\n data: deletedResource,\n status: 200,\n };\n }\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n};\n\nexport type Handler = <T, Q>(\n parameters: UniqueResourceHandlerParameters<T, Q>,\n) => Promise<{\n data: any;\n status: number;\n}>;\nexport default deleteHandler;\n","import { paginate } from \"@visulima/pagination\";\n\nimport type { HandlerParameters, PaginationConfig, ParsedQueryParameters } from \"../types.d\";\n\ntype PaginationOptions = {\n page: number;\n perPage: number;\n};\n\nconst listHandler: Handler = async ({\n adapter, query, resourceName, pagination,\n}) => {\n let isPaginated = false;\n let paginationOptions: PaginationOptions | undefined;\n\n if (query?.page !== undefined) {\n if (query?.page <= 0) {\n throw new Error(\"page query must be a strictly positive number\");\n }\n\n paginationOptions = {\n page: query?.page,\n perPage: query?.limit || pagination.perPage,\n };\n }\n\n if (paginationOptions) {\n isPaginated = true;\n\n // eslint-disable-next-line no-param-reassign\n query.skip = (paginationOptions.page - 1) * paginationOptions.perPage;\n // eslint-disable-next-line no-param-reassign\n query.limit = paginationOptions.perPage;\n }\n\n const resources = await adapter.getAll(resourceName, query);\n\n if (isPaginated) {\n const { page, total } = await adapter.getPaginationData(resourceName, query);\n\n const paginator = paginate(page, (paginationOptions as PaginationOptions).perPage as number, total, resources);\n\n return {\n data: paginator.toJSON(),\n status: 200,\n };\n }\n\n return {\n data: resources,\n status: 200,\n };\n};\n\nexport type Handler = <T, Q extends ParsedQueryParameters>(\n parameters: HandlerParameters<T, Q> & { pagination: PaginationConfig },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default listHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst readHandler: Handler = async ({\n adapter, query, resourceName, resourceId,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (!resource) {\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n }\n\n return {\n data: resource,\n status: 200,\n };\n};\n\nexport type Handler = <T, Q>(\n parameters: UniqueResourceHandlerParameters<T, Q>,\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default readHandler;\n","import createHttpError from \"http-errors\";\n\nimport type { UniqueResourceHandlerParameters } from \"../types.d\";\n\nconst updateHandler: Handler = async ({\n adapter, query, resourceName, resourceId, request,\n}) => {\n const resource = await adapter.getOne(resourceName, resourceId, query);\n\n if (resource) {\n const updatedResource = await adapter.update(resourceName, resourceId, request.body, query);\n\n return {\n status: 201,\n data: updatedResource,\n };\n }\n\n throw createHttpError(404, `${resourceName} ${resourceId} not found`);\n};\n\nexport type Handler = <T, Q, Request>(\n parameters: UniqueResourceHandlerParameters<T, Q> & { request: Request & { body: Partial<T> } },\n) => Promise<{\n data: any;\n status: number;\n}>;\n\nexport default updateHandler;\n","import set from \"lodash.set\";\nimport { parse } from \"qs\";\n\nimport type {\n OrderByField, ParsedQueryParameters, RecursiveField, WhereField,\n} from \"./types.d\";\n\nconst parseRecursive = (select: string): RecursiveField => {\n if (typeof select === \"string\") {\n const selectFields: RecursiveField = {};\n\n const fields = select.split(\",\");\n\n fields.forEach((field) => {\n set(selectFields, field, true);\n });\n\n return selectFields;\n }\n\n throw new Error(\"select query param must be a string\");\n};\n\nconst parseWhere = (where: string): WhereField => {\n const whereObject = JSON.parse(where);\n const parsed: WhereField = {};\n\n Object.keys(whereObject).forEach((key) => {\n set(parsed, key, whereObject[key]);\n });\n\n return parsed;\n};\n\nconst parseOrderBy = (orderBy: string): OrderByField => {\n const parsed: OrderByField = {};\n const orderByObject = JSON.parse(orderBy);\n\n if (Object.keys(orderByObject).length > 0) {\n const key = Object.keys(orderByObject)[0];\n\n if (orderByObject[key as keyof typeof orderByObject] === \"$asc\" || orderByObject[key as keyof typeof orderByObject] === \"$desc\") {\n parsed[key as string] = orderByObject[key as keyof typeof orderByObject];\n }\n }\n\n if (Object.keys(parsed).length !== 1) {\n throw new Error(\"orderBy needs to be an object with exactly 1 property with either $asc or $desc value\");\n }\n\n return parsed;\n};\n\n// eslint-disable-next-line radar/cognitive-complexity\nconst parseQuery = (queryString?: string): ParsedQueryParameters => {\n if (queryString) {\n const query = parse(queryString);\n const parsedQuery: ParsedQueryParameters = {};\n\n if (query.select) {\n parsedQuery.select = parseRecursive(query.select as string);\n }\n if (query.include) {\n parsedQuery.include = parseRecursive(query.include as string);\n }\n if (query.where) {\n parsedQuery.where = parseWhere(query.where as string);\n }\n if (query.orderBy) {\n parsedQuery.orderBy = parseOrderBy(query.orderBy as string);\n }\n if (query.limit !== undefined) {\n parsedQuery.limit = Number.isFinite(+query.limit) ? +query.limit : undefined;\n }\n if (query.skip !== undefined) {\n parsedQuery.skip = Number.isFinite(+query.skip) ? +query.skip : undefined;\n }\n if (query.distinct) {\n parsedQuery.distinct = query.distinct as string;\n }\n if (query.page) {\n parsedQuery.page = Number.isFinite(+query.page) ? +query.page : undefined;\n }\n\n return {\n originalQuery: query,\n ...parsedQuery,\n };\n }\n\n return {};\n};\n\nexport default parseQuery;\n","const formatResourceId = (resourceId: string): string | number => (Number.isSafeInteger(+resourceId) ? +resourceId : resourceId);\n\nexport default formatResourceId;\n","export const ensureCamelCase = (string_: string) => `${string_.charAt(0).toLowerCase()}${string_.slice(1)}`;\n\nexport const getResourceNameFromUrl = <M extends string = string>(url: string, models: { [key in M]?: string }) => {\n // Exclude the query params from the path\n const realPath = url.split(\"?\")[0];\n\n if (realPath === undefined) {\n throw new TypeError(\"Path is undefined\");\n }\n\n const modelName = (Object.keys(models) as M[]).find((name) => {\n const routeName = models[name] as string;\n const camelCaseModel = ensureCamelCase(routeName);\n\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n return new RegExp(`(${routeName}|${camelCaseModel}$)|(${routeName}|${camelCaseModel}/)`, \"g\").test(realPath);\n });\n\n return {\n modelName,\n resourceName: models[modelName] as string,\n };\n};\n","import { match } from \"path-to-regexp\";\n\nimport { RouteType } from \"../types.d\";\n\ntype PathMatch = { id: string };\n\nconst getRouteType: (\n method: string,\n url: string,\n resourceName: string,\n) => GetRouteType = (method, url, resourceName) => {\n // Exclude the query params from the path\n const realPath = url.split(\"?\")[0];\n\n if (realPath === undefined) {\n throw new TypeError(\"Path is undefined\");\n }\n\n if (!realPath.includes(`/${resourceName}`)) {\n throw new Error(`invalid resource name '${resourceName}' for route '${realPath}'`);\n }\n\n const entityMatcher = match<PathMatch>([`/(.*)/${resourceName}`, `/(.*)/${resourceName}/:id`], { decode: decodeURIComponent });\n const simpleMatcher = match(`/(.*)/${resourceName}`, {\n decode: decodeURIComponent,\n });\n\n switch (method) {\n case \"GET\": {\n const pathMatch = entityMatcher(realPath);\n\n // If we got a /something after the resource name, we are reading 1 entity\n if (pathMatch && pathMatch.params.id) {\n return {\n routeType: RouteType.READ_ONE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: RouteType.READ_ALL,\n };\n }\n case \"POST\": {\n const pathMatch = simpleMatcher(realPath);\n\n if (pathMatch) {\n return {\n routeType: RouteType.CREATE,\n };\n }\n\n return {\n routeType: null,\n };\n }\n case \"PUT\":\n case \"PATCH\": {\n const pathMatch = entityMatcher(realPath);\n\n if (pathMatch && pathMatch.params.id) {\n return {\n routeType: RouteType.UPDATE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: null,\n };\n }\n case \"DELETE\": {\n const pathMatch = entityMatcher(realPath);\n\n if (pathMatch && pathMatch.params.id) {\n return {\n routeType: RouteType.DELETE,\n resourceId: pathMatch.params.id,\n };\n }\n\n return {\n routeType: null,\n };\n }\n default: {\n return {\n routeType: null,\n };\n }\n }\n};\n\nexport type GetRouteType = {\n routeType: RouteType | null;\n resourceId?: string;\n};\n\nexport default getRouteType;\n","import createHttpError from \"http-errors\";\n\nimport type { Adapter } from \"../types.d\";\n\nconst adapterMethods = [\"create\" || \"delete\" || \"getAll\" || \"getOne\" || \"parseQuery\" || \"update\" || \"getPaginationData\" || \"getModels\"];\n\nconst validateAdapterMethods = <T, Q>(adapter: Adapter<T, Q>) => {\n adapterMethods.forEach((method) => {\n if (!adapter[method as keyof Adapter<T, Q>]) {\n throw createHttpError(500, `Adapter must implement the \"${method}\" method.`);\n }\n });\n};\n\nexport default validateAdapterMethods;\n","import baseHandler from \"../../../base-crud-handler\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, ParsedQueryParameters,\n} from \"../../../types.d\";\n\nasync function handler<T, R extends Request, Context, Q extends ParsedQueryParameters = any, M extends string = string>(\n adapter: Adapter<T, Q>,\n options?: HandlerOptions<M>,\n): Promise<ExecuteHandler<R, Context>> {\n return baseHandler<R, Context, T, Q, M>(\n async (_, responseConfig) => new Response(JSON.stringify(responseConfig.data), {\n status: responseConfig.status,\n headers: {\n \"content-type\": \"application/json; charset=utf-8\",\n },\n }),\n async () => {},\n adapter,\n options,\n );\n}\n\nexport default handler;\n","import type { NextApiRequest, NextApiResponse } from \"next\";\n\nimport baseHandler from \"../../../base-crud-handler\";\nimport type {\n Adapter, ExecuteHandler, HandlerOptions, ParsedQueryParameters,\n} from \"../../../types.d\";\n\nasync function handler<\n T,\n Q extends ParsedQueryParameters = any,\n R extends NextApiRequest = NextApiRequest,\n Response extends NextApiResponse = NextApiResponse,\n M extends string = string,\n>(adapter: Adapter<T, Q>, options?: HandlerOptions<M>): Promise<ExecuteHandler<R, Response>> {\n return baseHandler<R, Response, T, Q, M>(\n async (response, responseConfig) => {\n response.status(responseConfig.status).send(responseConfig.data);\n },\n async (response) => {\n (response as Response).end();\n },\n adapter,\n options,\n );\n}\n\nexport default handler;\n"],"mappings":"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","names":["createHttpError","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"],"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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@visulima/crud",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "visulima crud",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"anolilab",
|
|
@@ -67,11 +67,10 @@
|
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
69
|
"@visulima/pagination": "2.0.0",
|
|
70
|
-
"@visulima/prisma-dmmf-transformer": "1.0.
|
|
70
|
+
"@visulima/prisma-dmmf-transformer": "1.0.3",
|
|
71
71
|
"http-errors": "^2.0.0",
|
|
72
72
|
"lodash.set": "^4.3.2",
|
|
73
|
-
"path-to-regexp": "^6.2.1"
|
|
74
|
-
"qs": "^6.11.0"
|
|
73
|
+
"path-to-regexp": "^6.2.1"
|
|
75
74
|
},
|
|
76
75
|
"devDependencies": {
|
|
77
76
|
"@anolilab/eslint-config": "^4.0.9",
|
|
@@ -84,7 +83,6 @@
|
|
|
84
83
|
"@types/json-schema": "7.0.11",
|
|
85
84
|
"@types/lodash.set": "^4.3.7",
|
|
86
85
|
"@types/node": "^18.8.4",
|
|
87
|
-
"@types/qs": "^6.9.7",
|
|
88
86
|
"@typescript-eslint/eslint-plugin": "^5.40.0",
|
|
89
87
|
"@typescript-eslint/parser": "^5.40.0",
|
|
90
88
|
"cross-env": "^7.0.3",
|
|
@@ -119,7 +117,7 @@
|
|
|
119
117
|
"semantic-release": "^19.0.5",
|
|
120
118
|
"tsup": "^6.2.3",
|
|
121
119
|
"typescript": "^4.8.4",
|
|
122
|
-
"vitest": "^0.
|
|
120
|
+
"vitest": "^0.26.1"
|
|
123
121
|
},
|
|
124
122
|
"engines": {
|
|
125
123
|
"node": ">=16"
|