@zenstackhq/server 3.0.0-beta.24 → 3.0.0-beta.25

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/dist/api.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/index.ts","../src/api/rest/index.ts","../src/api/utils.ts","../src/api/rpc/index.ts"],"sourcesContent":["export { RestApiHandler, type RestApiHandlerOptions } from './rest';\nexport { RPCApiHandler, type RPCApiHandlerOptions } from './rpc';\n","import { clone, enumerate, lowerCaseFirst, paramCase } from '@zenstackhq/common-helpers';\nimport { ORMError, ORMErrorReason, type ClientContract } from '@zenstackhq/orm';\nimport type { FieldDef, ModelDef, SchemaDef } from '@zenstackhq/orm/schema';\nimport { Decimal } from 'decimal.js';\nimport SuperJSON from 'superjson';\nimport tsjapi, { type Linker, type Paginator, type Relator, type Serializer, type SerializerOptions } from 'ts-japi';\nimport { match } from 'ts-pattern';\nimport UrlPattern from 'url-pattern';\nimport z from 'zod';\nimport type { ApiHandler, LogConfig, RequestContext, Response } from '../../types';\nimport { getZodErrorMessage, log, registerCustomSerializers } from '../utils';\n\n/**\n * Options for {@link RestApiHandler}\n */\nexport type RestApiHandlerOptions<Schema extends SchemaDef = SchemaDef> = {\n /**\n * The schema\n */\n schema: Schema;\n\n /**\n * Logging configuration\n */\n log?: LogConfig;\n\n /**\n * The base endpoint of the RESTful API, must be a valid URL\n */\n endpoint: string;\n\n /**\n * The default page size for limiting the number of results returned\n * from collection queries, including resource collection, related data\n * of collection types, and relationship of collection types.\n *\n * Defaults to 100. Set to Infinity to disable pagination.\n */\n pageSize?: number;\n\n /**\n * The divider used to separate compound ID fields in the URL.\n * Defaults to '_'.\n */\n idDivider?: string;\n\n /**\n * The charset used for URL segment values. Defaults to `a-zA-Z0-9-_~ %`. You can change it if your entity's ID values\n * allow different characters. Specifically, if your models use compound IDs and the idDivider is set to a different value,\n * it should be included in the charset.\n */\n urlSegmentCharset?: string;\n\n modelNameMapping?: Record<string, string>;\n\n externalIdMapping?: Record<string, string>;\n};\n\ntype RelationshipInfo = {\n type: string;\n idFields: FieldDef[];\n isCollection: boolean;\n isOptional: boolean;\n};\n\ntype ModelInfo = {\n name: string;\n idFields: FieldDef[];\n fields: Record<string, FieldDef>;\n relationships: Record<string, RelationshipInfo>;\n};\n\ntype Match = {\n type: string;\n id: string;\n relationship: string;\n};\n\nenum UrlPatterns {\n SINGLE = 'single',\n FETCH_RELATIONSHIP = 'fetchRelationship',\n RELATIONSHIP = 'relationship',\n COLLECTION = 'collection',\n}\n\nclass InvalidValueError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nconst DEFAULT_PAGE_SIZE = 100;\n\nconst FilterOperations = [\n 'lt',\n 'lte',\n 'gt',\n 'gte',\n 'contains',\n 'icontains',\n 'search',\n 'startsWith',\n 'endsWith',\n 'has',\n 'hasEvery',\n 'hasSome',\n 'isEmpty',\n] as const;\n\ntype FilterOperationType = (typeof FilterOperations)[number] | undefined;\n\nconst DEFAULT_ID_DIVIDER = '_';\n\nregisterCustomSerializers();\n\n/**\n * RESTful-style API request handler (compliant with JSON:API)\n */\nexport class RestApiHandler<Schema extends SchemaDef> implements ApiHandler<Schema> {\n // resource serializers\n private serializers = new Map<string, Serializer>();\n\n // error responses\n private readonly errors: Record<string, { status: number; title: string; detail?: string }> = {\n unsupportedModel: {\n status: 404,\n title: 'Unsupported model type',\n detail: 'The model type is not supported',\n },\n unsupportedRelationship: {\n status: 400,\n title: 'Unsupported relationship',\n detail: 'The relationship is not supported',\n },\n invalidPath: {\n status: 400,\n title: 'The request path is invalid',\n },\n invalidVerb: {\n status: 400,\n title: 'The HTTP verb is not supported',\n },\n notFound: {\n status: 404,\n title: 'Resource not found',\n },\n noId: {\n status: 400,\n title: 'Model without an ID field is not supported',\n },\n invalidId: {\n status: 400,\n title: 'Resource ID is invalid',\n },\n invalidPayload: {\n status: 400,\n title: 'Invalid payload',\n },\n invalidRelationData: {\n status: 400,\n title: 'Invalid relation data',\n detail: 'Invalid relationship data',\n },\n invalidRelation: {\n status: 400,\n title: 'Invalid relation',\n detail: 'Invalid relationship',\n },\n invalidFilter: {\n status: 400,\n title: 'Invalid filter',\n },\n invalidSort: {\n status: 400,\n title: 'Invalid sort',\n },\n invalidValue: {\n status: 400,\n title: 'Invalid value for type',\n },\n duplicatedFieldsParameter: {\n status: 400,\n title: 'Fields Parameter Duplicated',\n },\n forbidden: {\n status: 403,\n title: 'Operation is forbidden',\n },\n validationError: {\n status: 422,\n title: 'Operation is unprocessable due to validation errors',\n },\n queryError: {\n status: 400,\n title: 'Error occurred while executing the query',\n },\n unknownError: {\n status: 500,\n title: 'Unknown error',\n },\n };\n\n private filterParamPattern = new RegExp(/^filter(?<match>(\\[[^[\\]]+\\])+)$/);\n\n // zod schema for payload of creating and updating a resource\n private createUpdatePayloadSchema = z\n .object({\n data: z.object({\n type: z.string(),\n attributes: z.object({}).passthrough().optional(),\n relationships: z\n .record(\n z.string(),\n z.object({\n data: z.union([\n z.object({ type: z.string(), id: z.union([z.string(), z.number()]) }),\n z.array(z.object({ type: z.string(), id: z.union([z.string(), z.number()]) })),\n ]),\n }),\n )\n .optional(),\n }),\n meta: z.object({}).passthrough().optional(),\n })\n .strict();\n\n // zod schema for updating a single relationship\n private updateSingleRelationSchema = z.object({\n data: z.object({ type: z.string(), id: z.union([z.string(), z.number()]) }).nullable(),\n });\n\n // zod schema for updating collection relationship\n private updateCollectionRelationSchema = z.object({\n data: z.array(z.object({ type: z.string(), id: z.union([z.string(), z.number()]) })),\n });\n\n private upsertMetaSchema = z.object({\n meta: z.object({\n operation: z.literal('upsert'),\n matchFields: z.array(z.string()).min(1),\n }),\n });\n\n // all known types and their metadata\n private typeMap: Record<string, ModelInfo> = {};\n\n // divider used to separate compound ID fields\n private idDivider;\n\n private urlPatternMap: Record<UrlPatterns, UrlPattern>;\n private modelNameMapping: Record<string, string>;\n private reverseModelNameMapping: Record<string, string>;\n private externalIdMapping: Record<string, string>;\n\n constructor(private readonly options: RestApiHandlerOptions<Schema>) {\n this.idDivider = options.idDivider ?? DEFAULT_ID_DIVIDER;\n const segmentCharset = options.urlSegmentCharset ?? 'a-zA-Z0-9-_~ %';\n\n this.modelNameMapping = options.modelNameMapping ?? {};\n this.modelNameMapping = Object.fromEntries(\n Object.entries(this.modelNameMapping).map(([k, v]) => [lowerCaseFirst(k), v]),\n );\n this.reverseModelNameMapping = Object.fromEntries(\n Object.entries(this.modelNameMapping).map(([k, v]) => [v, k]),\n );\n\n this.externalIdMapping = options.externalIdMapping ?? {};\n this.externalIdMapping = Object.fromEntries(\n Object.entries(this.externalIdMapping).map(([k, v]) => [lowerCaseFirst(k), v]),\n );\n\n this.urlPatternMap = this.buildUrlPatternMap(segmentCharset);\n\n this.buildTypeMap();\n this.buildSerializers();\n }\n\n get schema() {\n return this.options.schema;\n }\n\n get log(): LogConfig | undefined {\n return this.options.log;\n }\n\n private buildUrlPatternMap(urlSegmentNameCharset: string): Record<UrlPatterns, UrlPattern> {\n const options = { segmentValueCharset: urlSegmentNameCharset };\n\n const buildPath = (segments: string[]) => {\n return '/' + segments.join('/');\n };\n\n return {\n [UrlPatterns.SINGLE]: new UrlPattern(buildPath([':type', ':id']), options),\n [UrlPatterns.FETCH_RELATIONSHIP]: new UrlPattern(buildPath([':type', ':id', ':relationship']), options),\n [UrlPatterns.RELATIONSHIP]: new UrlPattern(\n buildPath([':type', ':id', 'relationships', ':relationship']),\n options,\n ),\n [UrlPatterns.COLLECTION]: new UrlPattern(buildPath([':type']), options),\n };\n }\n\n private mapModelName(modelName: string): string {\n return this.modelNameMapping[modelName] ?? modelName;\n }\n\n private matchUrlPattern(path: string, routeType: UrlPatterns): Match | undefined {\n const pattern = this.urlPatternMap[routeType];\n if (!pattern) {\n throw new InvalidValueError(`Unknown route type: ${routeType}`);\n }\n\n const match = pattern.match(path);\n if (!match) {\n return;\n }\n\n if (match.type in this.modelNameMapping) {\n throw new InvalidValueError(\n `use the mapped model name: ${this.modelNameMapping[match.type]} and not ${match.type}`,\n );\n }\n\n if (match.type in this.reverseModelNameMapping) {\n match.type = this.reverseModelNameMapping[match.type];\n }\n\n return match;\n }\n\n async handleRequest({ client, method, path, query, requestBody }: RequestContext<Schema>): Promise<Response> {\n method = method.toUpperCase();\n if (!path.startsWith('/')) {\n path = '/' + path;\n }\n\n try {\n switch (method) {\n case 'GET': {\n let match = this.matchUrlPattern(path, UrlPatterns.SINGLE);\n if (match) {\n // single resource read\n return await this.processSingleRead(client, match.type, match.id, query);\n }\n match = this.matchUrlPattern(path, UrlPatterns.FETCH_RELATIONSHIP);\n if (match) {\n // fetch related resource(s)\n return await this.processFetchRelated(client, match.type, match.id, match.relationship, query);\n }\n\n match = this.matchUrlPattern(path, UrlPatterns.RELATIONSHIP);\n if (match) {\n // read relationship\n return await this.processReadRelationship(\n client,\n match.type,\n match.id,\n match.relationship,\n query,\n );\n }\n\n match = this.matchUrlPattern(path, UrlPatterns.COLLECTION);\n if (match) {\n // collection read\n return await this.processCollectionRead(client, match.type, query);\n }\n\n return this.makeError('invalidPath');\n }\n\n case 'POST': {\n if (!requestBody) {\n return this.makeError('invalidPayload');\n }\n let match = this.matchUrlPattern(path, UrlPatterns.COLLECTION);\n if (match) {\n const body = requestBody as any;\n const upsertMeta = this.upsertMetaSchema.safeParse(body);\n if (upsertMeta.success) {\n // resource upsert\n return await this.processUpsert(client, match.type, query, requestBody);\n } else {\n // resource creation\n return await this.processCreate(client, match.type, query, requestBody);\n }\n }\n match = this.matchUrlPattern(path, UrlPatterns.RELATIONSHIP);\n if (match) {\n // relationship creation (collection relationship only)\n return await this.processRelationshipCRUD(\n client,\n 'create',\n match.type,\n match.id,\n match.relationship,\n query,\n requestBody,\n );\n }\n\n return this.makeError('invalidPath');\n }\n\n // TODO: PUT for full update\n case 'PUT':\n case 'PATCH': {\n if (!requestBody) {\n return this.makeError('invalidPayload');\n }\n let match = this.matchUrlPattern(path, UrlPatterns.SINGLE);\n if (match) {\n // resource update\n return await this.processUpdate(client, match.type, match.id, query, requestBody);\n }\n match = this.matchUrlPattern(path, UrlPatterns.RELATIONSHIP);\n if (match) {\n // relationship update\n return await this.processRelationshipCRUD(\n client,\n 'update',\n match.type,\n match.id,\n match.relationship as string,\n query,\n requestBody,\n );\n }\n\n return this.makeError('invalidPath');\n }\n\n case 'DELETE': {\n let match = this.matchUrlPattern(path, UrlPatterns.SINGLE);\n if (match) {\n // resource deletion\n return await this.processDelete(client, match.type, match.id);\n }\n\n match = this.matchUrlPattern(path, UrlPatterns.RELATIONSHIP);\n if (match) {\n // relationship deletion (collection relationship only)\n return await this.processRelationshipCRUD(\n client,\n 'delete',\n match.type,\n match.id,\n match.relationship as string,\n query,\n requestBody,\n );\n }\n\n return this.makeError('invalidPath');\n }\n\n default:\n return this.makeError('invalidPath');\n }\n } catch (err) {\n if (err instanceof InvalidValueError) {\n return this.makeError('invalidValue', err.message);\n } else if (err instanceof ORMError) {\n return this.handleORMError(err);\n } else {\n return this.handleGenericError(err);\n }\n }\n }\n\n private handleGenericError(err: unknown): Response | PromiseLike<Response> {\n return this.makeError('unknownError', err instanceof Error ? `${err.message}\\n${err.stack}` : 'Unknown error');\n }\n\n private async processSingleRead(\n client: ClientContract<Schema>,\n type: string,\n resourceId: string,\n query: Record<string, string | string[]> | undefined,\n ): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const args: any = { where: this.makeIdFilter(typeInfo.idFields, resourceId) };\n\n // include IDs of relation fields so that they can be serialized\n this.includeRelationshipIds(type, args, 'include');\n\n // handle \"include\" query parameter\n let include: string[] | undefined;\n if (query?.['include']) {\n const { select, error, allIncludes } = this.buildRelationSelect(type, query['include'], query);\n if (error) {\n return error;\n }\n if (select) {\n args.include = { ...args.include, ...select };\n }\n include = allIncludes;\n }\n\n // handle partial results for requested type\n const { select, error } = this.buildPartialSelect(type, query);\n if (error) return error;\n if (select) {\n args.select = { ...select, ...args.select };\n if (args.include) {\n args.select = {\n ...args.select,\n ...args.include,\n };\n args.include = undefined;\n }\n }\n\n const entity = await (client as any)[type].findUnique(args);\n\n if (entity) {\n return {\n status: 200,\n body: await this.serializeItems(type, entity, { include }),\n };\n } else {\n return this.makeError('notFound');\n }\n }\n\n private async processFetchRelated(\n client: ClientContract<Schema>,\n type: string,\n resourceId: string,\n relationship: string,\n query: Record<string, string | string[]> | undefined,\n ): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const relationInfo = typeInfo.relationships[relationship];\n if (!relationInfo) {\n return this.makeUnsupportedRelationshipError(type, relationship, 404);\n }\n\n let select: any;\n\n // handle \"include\" query parameter\n let include: string[] | undefined;\n if (query?.['include']) {\n const {\n select: relationSelect,\n error,\n allIncludes,\n } = this.buildRelationSelect(type, query['include'], query);\n if (error) {\n return error;\n }\n // trim the leading `$relationship.` from the include paths\n include = allIncludes\n .filter((i) => i.startsWith(`${relationship}.`))\n .map((i) => i.substring(`${relationship}.`.length));\n select = relationSelect;\n }\n\n // handle partial results for requested type\n if (!select) {\n const { select: partialFields, error } = this.buildPartialSelect(lowerCaseFirst(relationInfo.type), query);\n if (error) return error;\n\n select = partialFields ? { [relationship]: { select: { ...partialFields } } } : { [relationship]: true };\n }\n\n const args: any = {\n where: this.makeIdFilter(typeInfo.idFields, resourceId),\n select,\n };\n\n if (relationInfo.isCollection) {\n // if related data is a collection, it can be filtered, sorted, and paginated\n const error = this.injectRelationQuery(relationInfo.type, select, relationship, query);\n if (error) {\n return error;\n }\n }\n\n const entity: any = await (client as any)[type].findUnique(args);\n\n let paginator: Paginator<any> | undefined;\n\n if (entity?._count?.[relationship] !== undefined) {\n // build up paginator\n const total = entity?._count?.[relationship] as number;\n const url = this.makeNormalizedUrl(`/${type}/${resourceId}/${relationship}`, query);\n const { offset, limit } = this.getPagination(query);\n paginator = this.makePaginator(url, offset, limit, total);\n }\n\n if (entity?.[relationship]) {\n const mappedType = this.mapModelName(type);\n return {\n status: 200,\n body: await this.serializeItems(relationInfo.type, entity[relationship], {\n linkers: {\n document: new tsjapi.Linker(() =>\n this.makeLinkUrl(`/${mappedType}/${resourceId}/${relationship}`),\n ),\n paginator,\n },\n include,\n }),\n };\n } else {\n return this.makeError('notFound');\n }\n }\n\n private async processReadRelationship(\n client: ClientContract<Schema>,\n type: string,\n resourceId: string,\n relationship: string,\n query: Record<string, string | string[]> | undefined,\n ): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const relationInfo = typeInfo.relationships[relationship];\n if (!relationInfo) {\n return this.makeUnsupportedRelationshipError(type, relationship, 404);\n }\n\n const args: any = {\n where: this.makeIdFilter(typeInfo.idFields, resourceId),\n select: this.makeIdSelect(typeInfo.idFields),\n };\n\n // include IDs of relation fields so that they can be serialized\n args.select = { ...args.select, [relationship]: { select: this.makeIdSelect(relationInfo.idFields) } };\n\n let paginator: Paginator<any> | undefined;\n\n if (relationInfo.isCollection) {\n // if related data is a collection, it can be filtered, sorted, and paginated\n const error = this.injectRelationQuery(relationInfo.type, args.select, relationship, query);\n if (error) {\n return error;\n }\n }\n\n const entity: any = await (client as any)[type].findUnique(args);\n const mappedType = this.mapModelName(type);\n\n if (entity?._count?.[relationship] !== undefined) {\n // build up paginator\n const total = entity?._count?.[relationship] as number;\n const url = this.makeNormalizedUrl(`/${mappedType}/${resourceId}/relationships/${relationship}`, query);\n const { offset, limit } = this.getPagination(query);\n paginator = this.makePaginator(url, offset, limit, total);\n }\n\n if (entity?.[relationship]) {\n const serialized: any = await this.serializeItems(relationInfo.type, entity[relationship], {\n linkers: {\n document: new tsjapi.Linker(() =>\n this.makeLinkUrl(`/${mappedType}/${resourceId}/relationships/${relationship}`),\n ),\n paginator,\n },\n onlyIdentifier: true,\n });\n\n return {\n status: 200,\n body: serialized,\n };\n } else {\n return this.makeError('notFound');\n }\n }\n\n private async processCollectionRead(\n client: ClientContract<Schema>,\n type: string,\n query: Record<string, string | string[]> | undefined,\n ): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const args: any = {};\n\n // add filter\n const { filter, error: filterError } = this.buildFilter(type, query);\n if (filterError) {\n return filterError;\n }\n if (filter) {\n args.where = filter;\n }\n\n const { sort, error: sortError } = this.buildSort(type, query);\n if (sortError) {\n return sortError;\n }\n if (sort) {\n args.orderBy = sort;\n }\n\n // include IDs of relation fields so that they can be serialized\n this.includeRelationshipIds(type, args, 'include');\n\n // handle \"include\" query parameter\n let include: string[] | undefined;\n if (query?.['include']) {\n const { select, error, allIncludes } = this.buildRelationSelect(type, query['include'], query);\n if (error) {\n return error;\n }\n if (select) {\n args.include = { ...args.include, ...select };\n }\n include = allIncludes;\n }\n\n // handle partial results for requested type\n const { select, error } = this.buildPartialSelect(type, query);\n if (error) return error;\n if (select) {\n args.select = { ...select, ...args.select };\n if (args.include) {\n args.select = {\n ...args.select,\n ...args.include,\n };\n args.include = undefined;\n }\n }\n\n const { offset, limit } = this.getPagination(query);\n if (offset > 0) {\n args.skip = offset;\n }\n\n if (limit === Infinity) {\n const entities = await (client as any)[type].findMany(args);\n\n const body = await this.serializeItems(type, entities, { include });\n const total = entities.length;\n body.meta = this.addTotalCountToMeta(body.meta, total);\n\n return {\n status: 200,\n body: body,\n };\n } else {\n args.take = limit;\n\n const [entities, count] = await Promise.all([\n (client as any)[type].findMany(args),\n (client as any)[type].count({ where: args.where ?? {} }),\n ]);\n const total = count as number;\n\n const mappedType = this.mapModelName(type);\n const url = this.makeNormalizedUrl(`/${mappedType}`, query);\n const options: Partial<SerializerOptions> = {\n include,\n linkers: {\n paginator: this.makePaginator(url, offset, limit, total),\n },\n };\n const body = await this.serializeItems(type, entities, options);\n body.meta = this.addTotalCountToMeta(body.meta, total);\n\n return {\n status: 200,\n body: body,\n };\n }\n }\n\n private buildPartialSelect(type: string, query: Record<string, string | string[]> | undefined) {\n const selectFieldsQuery = query?.[`fields[${type}]`];\n if (!selectFieldsQuery) {\n return { select: undefined, error: undefined };\n }\n\n if (Array.isArray(selectFieldsQuery)) {\n return {\n select: undefined,\n error: this.makeError('duplicatedFieldsParameter', `duplicated fields query for type ${type}`),\n };\n }\n\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return { select: undefined, error: this.makeUnsupportedModelError(type) };\n }\n\n const selectFieldNames = selectFieldsQuery.split(',').filter((i) => i);\n\n const fields = selectFieldNames.reduce((acc, curr) => ({ ...acc, [curr]: true }), {});\n\n return {\n select: { ...this.makeIdSelect(typeInfo.idFields), ...fields },\n };\n }\n\n private addTotalCountToMeta(meta: any, total: any) {\n return meta ? Object.assign(meta, { total }) : Object.assign({}, { total });\n }\n\n private makePaginator(baseUrl: string, offset: number, limit: number, total: number) {\n if (limit === Infinity) {\n return undefined;\n }\n\n const totalPages = Math.ceil(total / limit);\n\n return new tsjapi.Paginator(() => ({\n first: this.replaceURLSearchParams(baseUrl, { 'page[limit]': limit }),\n last: this.replaceURLSearchParams(baseUrl, {\n 'page[offset]': (totalPages - 1) * limit,\n }),\n prev:\n offset - limit >= 0 && offset - limit <= total - 1\n ? this.replaceURLSearchParams(baseUrl, {\n 'page[offset]': offset - limit,\n 'page[limit]': limit,\n })\n : null,\n next:\n offset + limit <= total - 1\n ? this.replaceURLSearchParams(baseUrl, {\n 'page[offset]': offset + limit,\n 'page[limit]': limit,\n })\n : null,\n }));\n }\n\n private processRequestBody(requestBody: unknown) {\n let body: any = requestBody;\n if (body.meta?.serialization) {\n // superjson deserialize body if a serialization meta is provided\n body = SuperJSON.deserialize({ json: body, meta: body.meta.serialization });\n }\n\n const parseResult = this.createUpdatePayloadSchema.safeParse(body);\n if (!parseResult.success) {\n return {\n attributes: undefined,\n relationships: undefined,\n error: this.makeError('invalidPayload', getZodErrorMessage(parseResult.error)),\n };\n }\n\n return {\n attributes: parseResult.data.data.attributes,\n relationships: parseResult.data.data.relationships,\n error: undefined,\n };\n }\n\n private async processCreate(\n client: ClientContract<Schema>,\n type: string,\n _query: Record<string, string | string[]> | undefined,\n requestBody: unknown,\n ): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const { attributes, relationships, error } = this.processRequestBody(requestBody);\n if (error) {\n return error;\n }\n\n const createPayload: any = { data: { ...attributes } };\n\n // turn relationship payload into `connect` objects\n if (relationships) {\n for (const [key, data] of Object.entries<any>(relationships)) {\n if (!data?.data) {\n return this.makeError('invalidRelationData');\n }\n\n const relationInfo = typeInfo.relationships[key];\n if (!relationInfo) {\n return this.makeUnsupportedRelationshipError(type, key, 400);\n }\n\n if (relationInfo.isCollection) {\n createPayload.data[key] = {\n connect: enumerate(data.data).map((item: any) =>\n this.makeIdConnect(relationInfo.idFields, item.id),\n ),\n };\n } else {\n if (typeof data.data !== 'object') {\n return this.makeError('invalidRelationData');\n }\n createPayload.data[key] = {\n connect: this.makeIdConnect(relationInfo.idFields, data.data.id),\n };\n }\n\n // make sure ID fields are included for result serialization\n createPayload.include = {\n ...createPayload.include,\n [key]: { select: { [this.makeDefaultIdKey(relationInfo.idFields)]: true } },\n };\n }\n }\n\n // include IDs of relation fields so that they can be serialized.\n this.includeRelationshipIds(type, createPayload, 'include');\n\n const entity = await (client as any)[type].create(createPayload);\n return {\n status: 201,\n body: await this.serializeItems(type, entity),\n };\n }\n\n private async processUpsert(\n client: ClientContract<Schema>,\n type: string,\n _query: Record<string, string | string[]> | undefined,\n requestBody: unknown,\n ) {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const modelName = typeInfo.name;\n const { attributes, relationships, error } = this.processRequestBody(requestBody);\n if (error) {\n return error;\n }\n\n const parseResult = this.upsertMetaSchema.safeParse(requestBody);\n if (parseResult.error) {\n return this.makeError('invalidPayload', getZodErrorMessage(parseResult.error));\n }\n const matchFields = parseResult.data.meta.matchFields;\n const uniqueFieldSets = this.getUniqueFieldSets(modelName);\n\n if (!uniqueFieldSets.some((set) => set.every((field) => matchFields.includes(field)))) {\n return this.makeError('invalidPayload', 'Match fields must be unique fields', 400);\n }\n\n const upsertPayload: any = {\n where: this.makeUpsertWhere(matchFields, attributes, typeInfo),\n create: { ...attributes },\n update: {\n ...Object.fromEntries(Object.entries(attributes ?? {}).filter((e) => !matchFields.includes(e[0]))),\n },\n };\n\n if (relationships) {\n for (const [key, data] of Object.entries<any>(relationships)) {\n if (!data?.data) {\n return this.makeError('invalidRelationData');\n }\n\n const relationInfo = typeInfo.relationships[key];\n if (!relationInfo) {\n return this.makeUnsupportedRelationshipError(modelName, key, 400);\n }\n\n if (relationInfo.isCollection) {\n upsertPayload.create[key] = {\n connect: enumerate(data.data).map((item: any) =>\n this.makeIdConnect(relationInfo.idFields, item.id),\n ),\n };\n upsertPayload.update[key] = {\n set: enumerate(data.data).map((item: any) =>\n this.makeIdConnect(relationInfo.idFields, item.id),\n ),\n };\n } else {\n if (typeof data.data !== 'object') {\n return this.makeError('invalidRelationData');\n }\n upsertPayload.create[key] = {\n connect: this.makeIdConnect(relationInfo.idFields, data.data.id),\n };\n upsertPayload.update[key] = {\n connect: this.makeIdConnect(relationInfo.idFields, data.data.id),\n };\n }\n }\n }\n\n // include IDs of relation fields so that they can be serialized.\n this.includeRelationshipIds(modelName, upsertPayload, 'include');\n\n const entity = await (client as any)[modelName].upsert(upsertPayload);\n\n return {\n status: 201,\n body: await this.serializeItems(modelName, entity),\n };\n }\n\n private getUniqueFieldSets(type: string) {\n const modelDef = this.requireModel(type);\n return Object.entries(modelDef.uniqueFields).map(\n ([k, v]) =>\n typeof v.type === 'string'\n ? [k] // single unique field\n : Object.keys(v), // compound unique fields\n );\n }\n\n private async processRelationshipCRUD(\n client: ClientContract<Schema>,\n mode: 'create' | 'update' | 'delete',\n type: string,\n resourceId: string,\n relationship: string,\n _query: Record<string, string | string[]> | undefined,\n requestBody: unknown,\n ): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const relationInfo = typeInfo.relationships[relationship];\n if (!relationInfo) {\n return this.makeUnsupportedRelationshipError(type, relationship, 404);\n }\n\n if (!relationInfo.isCollection && mode !== 'update') {\n // to-one relation can only be updated\n return this.makeError('invalidVerb');\n }\n\n const updateArgs: any = {\n where: this.makeIdFilter(typeInfo.idFields, resourceId),\n select: {\n ...typeInfo.idFields.reduce((acc, field) => ({ ...acc, [field.name]: true }), {}),\n [relationship]: { select: this.makeIdSelect(relationInfo.idFields) },\n },\n };\n\n if (!relationInfo.isCollection) {\n // zod-parse payload\n const parsed = this.updateSingleRelationSchema.safeParse(requestBody);\n if (!parsed.success) {\n return this.makeError('invalidPayload', getZodErrorMessage(parsed.error));\n }\n\n if (parsed.data.data === null) {\n if (!relationInfo.isOptional) {\n // cannot disconnect a required relation\n return this.makeError('invalidPayload');\n }\n // set null -> disconnect\n updateArgs.data = {\n [relationship]: {\n disconnect: true,\n },\n };\n } else {\n updateArgs.data = {\n [relationship]: {\n connect: this.makeIdConnect(relationInfo.idFields, parsed.data.data.id),\n },\n };\n }\n } else {\n // zod-parse payload\n const parsed = this.updateCollectionRelationSchema.safeParse(requestBody);\n if (!parsed.success) {\n return this.makeError('invalidPayload', getZodErrorMessage(parsed.error));\n }\n\n // create -> connect, delete -> disconnect, update -> set\n const relationVerb = mode === 'create' ? 'connect' : mode === 'delete' ? 'disconnect' : 'set';\n\n updateArgs.data = {\n [relationship]: {\n [relationVerb]: enumerate(parsed.data.data).map((item: any) =>\n this.makeIdFilter(relationInfo.idFields, item.id),\n ),\n },\n };\n }\n\n const entity: any = await (client as any)[type].update(updateArgs);\n\n const mappedType = this.mapModelName(type);\n\n const serialized: any = await this.serializeItems(relationInfo.type, entity[relationship], {\n linkers: {\n document: new tsjapi.Linker(() =>\n this.makeLinkUrl(`/${mappedType}/${resourceId}/relationships/${relationship}`),\n ),\n },\n onlyIdentifier: true,\n });\n\n return {\n status: 200,\n body: serialized,\n };\n }\n\n private async processUpdate(\n client: ClientContract<Schema>,\n type: any,\n resourceId: string,\n _query: Record<string, string | string[]> | undefined,\n requestBody: unknown,\n ): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const { attributes, relationships, error } = this.processRequestBody(requestBody);\n if (error) {\n return error;\n }\n\n const updatePayload: any = {\n where: this.makeIdFilter(typeInfo.idFields, resourceId),\n data: { ...attributes },\n };\n\n // turn relationships into query payload\n if (relationships) {\n for (const [key, data] of Object.entries<any>(relationships)) {\n if (!data?.data) {\n return this.makeError('invalidRelationData');\n }\n\n const relationInfo = typeInfo.relationships[key];\n if (!relationInfo) {\n return this.makeUnsupportedRelationshipError(type, key, 400);\n }\n\n if (relationInfo.isCollection) {\n updatePayload.data[key] = {\n set: enumerate(data.data).map((item: any) => ({\n [this.makeDefaultIdKey(relationInfo.idFields)]: item.id,\n })),\n };\n } else {\n if (typeof data.data !== 'object') {\n return this.makeError('invalidRelationData');\n }\n updatePayload.data[key] = {\n connect: {\n [this.makeDefaultIdKey(relationInfo.idFields)]: data.data.id,\n },\n };\n }\n updatePayload.include = {\n ...updatePayload.include,\n [key]: { select: { [this.makeDefaultIdKey(relationInfo.idFields)]: true } },\n };\n }\n }\n\n // include IDs of relation fields so that they can be serialized.\n this.includeRelationshipIds(type, updatePayload, 'include');\n\n const entity = await (client as any)[type].update(updatePayload);\n return {\n status: 200,\n body: await this.serializeItems(type, entity),\n };\n }\n\n private async processDelete(client: ClientContract<Schema>, type: any, resourceId: string): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n await (client as any)[type].delete({\n where: this.makeIdFilter(typeInfo.idFields, resourceId),\n });\n return {\n status: 200,\n body: { meta: {} },\n };\n }\n\n //#region utilities\n\n private requireModel(model: string): ModelDef {\n const modelDef = this.schema.models[model];\n if (!modelDef) {\n throw new Error(`Model ${model} is not defined in the schema`);\n }\n return modelDef;\n }\n\n private getIdFields(model: string): FieldDef[] {\n const modelDef = this.requireModel(model);\n const modelLower = lowerCaseFirst(model);\n if (!(modelLower in this.externalIdMapping)) {\n return Object.values(modelDef.fields).filter((f) => modelDef.idFields.includes(f.name));\n }\n\n // map external ID name to unique constraint field\n const externalIdName = this.externalIdMapping[modelLower];\n for (const [name, info] of Object.entries(modelDef.uniqueFields)) {\n if (name === externalIdName) {\n if (typeof info.type === 'string') {\n // single unique field\n return [this.requireField(model, info.type)];\n } else {\n // compound unique fields\n return Object.keys(info).map((f) => this.requireField(model, f));\n }\n }\n }\n\n throw new Error(`Model ${model} does not have unique key ${externalIdName}`);\n }\n\n private requireField(model: string, field: string): FieldDef {\n const modelDef = this.requireModel(model);\n const fieldDef = modelDef.fields[field];\n if (!fieldDef) {\n throw new Error(`Field ${field} is not defined in model ${model}`);\n }\n return fieldDef;\n }\n\n private buildTypeMap() {\n this.typeMap = {};\n for (const [model, { fields }] of Object.entries(this.schema.models)) {\n const idFields = this.getIdFields(model);\n if (idFields.length === 0) {\n log(this.options.log, 'warn', `Not including model ${model} in the API because it has no ID field`);\n continue;\n }\n\n const modelInfo: ModelInfo = (this.typeMap[lowerCaseFirst(model)] = {\n name: model,\n idFields,\n relationships: {},\n fields,\n });\n\n for (const [field, fieldInfo] of Object.entries(fields)) {\n if (!fieldInfo.relation) {\n continue;\n }\n const fieldTypeIdFields = this.getIdFields(fieldInfo.type);\n if (fieldTypeIdFields.length === 0) {\n log(\n this.options.log,\n 'warn',\n `Not including relation ${model}.${field} in the API because it has no ID field`,\n );\n continue;\n }\n\n modelInfo.relationships[field] = {\n type: fieldInfo.type,\n idFields: fieldTypeIdFields,\n isCollection: !!fieldInfo.array,\n isOptional: !!fieldInfo.optional,\n };\n }\n }\n }\n\n private getModelInfo(model: string): ModelInfo | undefined {\n return this.typeMap[lowerCaseFirst(model)];\n }\n\n private makeLinkUrl(path: string) {\n return `${this.options.endpoint}${path}`;\n }\n\n private buildSerializers() {\n const linkers: Record<string, Linker<any>> = {};\n\n for (const model of Object.keys(this.schema.models)) {\n const ids = this.getIdFields(model);\n const modelLower = lowerCaseFirst(model);\n const mappedModel = this.mapModelName(modelLower);\n\n if (ids.length < 1) {\n continue;\n }\n\n const linker = new tsjapi.Linker((items) =>\n Array.isArray(items)\n ? this.makeLinkUrl(`/${mappedModel}`)\n : this.makeLinkUrl(`/${mappedModel}/${this.getId(model, items)}`),\n );\n linkers[modelLower] = linker;\n\n let projection: Record<string, 0> | null = {};\n const modelDef = this.requireModel(model);\n for (const [field, fieldDef] of Object.entries(modelDef.fields)) {\n if (fieldDef.relation) {\n projection[field] = 0;\n }\n }\n if (Object.keys(projection).length === 0) {\n projection = null;\n }\n\n const serializer = new tsjapi.Serializer(model, {\n version: '1.1',\n idKey: this.makeIdKey(ids),\n linkers: {\n resource: linker,\n document: linker,\n },\n projection,\n });\n this.serializers.set(modelLower, serializer);\n }\n\n // set relators\n for (const model of Object.keys(this.schema.models)) {\n const modelLower = lowerCaseFirst(model);\n const serializer = this.serializers.get(modelLower);\n if (!serializer) {\n continue;\n }\n\n const relators: Record<string, Relator<any>> = {};\n const modelDef = this.requireModel(model);\n for (const [field, fieldDef] of Object.entries(modelDef.fields)) {\n if (!fieldDef.relation) {\n continue;\n }\n const fieldSerializer = this.serializers.get(lowerCaseFirst(fieldDef.type));\n if (!fieldSerializer) {\n continue;\n }\n const fieldIds = this.getIdFields(fieldDef.type);\n if (fieldIds.length > 0) {\n const mappedModel = this.mapModelName(modelLower);\n\n const relator = new tsjapi.Relator(\n async (data) => {\n return (data as any)[field];\n },\n fieldSerializer,\n {\n relatedName: field,\n linkers: {\n related: new tsjapi.Linker((primary) =>\n this.makeLinkUrl(`/${mappedModel}/${this.getId(model, primary)}/${field}`),\n ),\n relationship: new tsjapi.Linker((primary) =>\n this.makeLinkUrl(\n `/${mappedModel}/${this.getId(model, primary)}/relationships/${field}`,\n ),\n ),\n },\n },\n );\n relators[field] = relator;\n }\n }\n serializer.setRelators(relators);\n }\n }\n\n private getId(model: string, data: any) {\n if (!data) {\n return undefined;\n }\n const ids = this.getIdFields(model);\n if (ids.length === 0) {\n return undefined;\n } else {\n return data[this.makeIdKey(ids)];\n }\n }\n\n private async serializeItems(model: string, items: unknown, options?: Partial<SerializerOptions<any>>) {\n model = lowerCaseFirst(model);\n const serializer = this.serializers.get(model);\n if (!serializer) {\n throw new Error(`serializer not found for model ${model}`);\n }\n\n const itemsWithId = clone(items);\n this.injectCompoundId(model, itemsWithId);\n\n // serialize to JSON:API structure\n const serialized = await serializer.serialize(itemsWithId, options);\n\n // convert the serialization result to plain object otherwise SuperJSON won't work\n const plainResult = this.toPlainObject(serialized);\n\n // superjson serialize the result\n const { json, meta } = SuperJSON.serialize(plainResult);\n\n const result: any = json;\n if (meta) {\n result.meta = { ...result.meta, serialization: meta };\n }\n\n return result;\n }\n\n private injectCompoundId(model: string, items: unknown) {\n const typeInfo = this.getModelInfo(model);\n if (!typeInfo) {\n return;\n }\n\n // recursively traverse the entity to create synthetic ID field for models with compound ID\n enumerate(items).forEach((item: any) => {\n if (!item) {\n return;\n }\n\n if (typeInfo.idFields.length > 1) {\n item[this.makeIdKey(typeInfo.idFields)] = this.makeCompoundId(typeInfo.idFields, item);\n }\n\n for (const [key, value] of Object.entries(item)) {\n if (typeInfo.relationships[key]) {\n // field is a relationship, recurse\n this.injectCompoundId(typeInfo.relationships[key].type, value);\n }\n }\n });\n }\n\n private toPlainObject(data: any): any {\n if (data === undefined || data === null) {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.map((item: any) => this.toPlainObject(item));\n }\n\n if (typeof data === 'object') {\n if (typeof data.toJSON === 'function') {\n // custom toJSON function\n return data.toJSON();\n }\n const result: any = {};\n for (const [field, value] of Object.entries(data)) {\n if (value === undefined || typeof value === 'function') {\n // trim undefined and functions\n continue;\n } else if (field === 'attributes') {\n // don't visit into entity data\n result[field] = value;\n } else {\n result[field] = this.toPlainObject(value);\n }\n }\n return result;\n }\n\n return data;\n }\n\n private replaceURLSearchParams(url: string, params: Record<string, string | number>) {\n const r = new URL(url);\n for (const [key, value] of Object.entries(params)) {\n r.searchParams.set(key, value.toString());\n }\n return r.toString();\n }\n\n private makeIdFilter(idFields: FieldDef[], resourceId: string, nested: boolean = true) {\n const decodedId = decodeURIComponent(resourceId);\n if (idFields.length === 1) {\n return { [idFields[0]!.name]: this.coerce(idFields[0]!, decodedId) };\n } else if (nested) {\n return {\n // TODO: support `@@id` with custom name\n [idFields.map((idf) => idf.name).join(DEFAULT_ID_DIVIDER)]: idFields.reduce(\n (acc, curr, idx) => ({\n ...acc,\n [curr.name]: this.coerce(curr, decodedId.split(this.idDivider)[idx]),\n }),\n {},\n ),\n };\n } else {\n return idFields.reduce(\n (acc, curr, idx) => ({\n ...acc,\n [curr.name]: this.coerce(curr, decodedId.split(this.idDivider)[idx]),\n }),\n {},\n );\n }\n }\n\n private makeIdSelect(idFields: FieldDef[]) {\n if (idFields.length === 0) {\n throw this.errors['noId'];\n }\n return idFields.reduce((acc, curr) => ({ ...acc, [curr.name]: true }), {});\n }\n\n private makeIdConnect(idFields: FieldDef[], id: string | number) {\n if (idFields.length === 1) {\n return { [idFields[0]!.name]: this.coerce(idFields[0]!, id) };\n } else {\n return {\n [this.makeDefaultIdKey(idFields)]: idFields.reduce(\n (acc, curr, idx) => ({\n ...acc,\n [curr.name]: this.coerce(curr, `${id}`.split(this.idDivider)[idx]),\n }),\n {},\n ),\n };\n }\n }\n\n private makeIdKey(idFields: FieldDef[]) {\n return idFields.map((idf) => idf.name).join(this.idDivider);\n }\n\n private makeDefaultIdKey(idFields: FieldDef[]) {\n // TODO: support `@@id` with custom name\n return idFields.map((idf) => idf.name).join(DEFAULT_ID_DIVIDER);\n }\n\n private makeCompoundId(idFields: FieldDef[], item: any) {\n return idFields.map((idf) => item[idf.name]).join(this.idDivider);\n }\n\n private makeUpsertWhere(matchFields: any[], attributes: any, typeInfo: ModelInfo) {\n const where = matchFields.reduce((acc: any, field: string) => {\n acc[field] = attributes[field] ?? null;\n return acc;\n }, {});\n\n if (\n typeInfo.idFields.length > 1 &&\n matchFields.some((mf) => typeInfo.idFields.map((idf) => idf.name).includes(mf))\n ) {\n return {\n [this.makeDefaultIdKey(typeInfo.idFields)]: where,\n };\n }\n\n return where;\n }\n\n private includeRelationshipIds(model: string, args: any, mode: 'select' | 'include') {\n const typeInfo = this.getModelInfo(model);\n if (!typeInfo) {\n return;\n }\n for (const [relation, relationInfo] of Object.entries(typeInfo.relationships)) {\n args[mode] = { ...args[mode], [relation]: { select: this.makeIdSelect(relationInfo.idFields) } };\n }\n }\n\n private coerce(fieldDef: FieldDef, value: any) {\n if (typeof value === 'string') {\n if (fieldDef.attributes?.some((attr) => attr.name === '@json')) {\n try {\n return JSON.parse(value);\n } catch {\n throw new InvalidValueError(`invalid JSON value: ${value}`);\n }\n }\n\n const type = fieldDef.type;\n if (type === 'Int') {\n const parsed = parseInt(value);\n if (isNaN(parsed)) {\n throw new InvalidValueError(`invalid ${type} value: ${value}`);\n }\n return parsed;\n } else if (type === 'BigInt') {\n try {\n return BigInt(value);\n } catch {\n throw new InvalidValueError(`invalid ${type} value: ${value}`);\n }\n } else if (type === 'Float') {\n const parsed = parseFloat(value);\n if (isNaN(parsed)) {\n throw new InvalidValueError(`invalid ${type} value: ${value}`);\n }\n return parsed;\n } else if (type === 'Decimal') {\n try {\n return new Decimal(value);\n } catch {\n throw new InvalidValueError(`invalid ${type} value: ${value}`);\n }\n } else if (type === 'Boolean') {\n if (value === 'true') {\n return true;\n } else if (value === 'false') {\n return false;\n } else {\n throw new InvalidValueError(`invalid ${type} value: ${value}`);\n }\n }\n }\n return value;\n }\n\n private makeNormalizedUrl(path: string, query: Record<string, string | string[]> | undefined) {\n const url = new URL(this.makeLinkUrl(path));\n for (const [key, value] of Object.entries(query ?? {})) {\n if (\n key.startsWith('filter[') ||\n key.startsWith('sort[') ||\n key === 'include' ||\n key.startsWith('include[') ||\n key.startsWith('fields[')\n ) {\n for (const v of enumerate(value)) {\n url.searchParams.append(key, v);\n }\n }\n }\n return url.toString();\n }\n\n private getPagination(query: Record<string, string | string[]> | undefined) {\n if (!query) {\n return { offset: 0, limit: this.options.pageSize ?? DEFAULT_PAGE_SIZE };\n }\n\n let offset = 0;\n if (query['page[offset]']) {\n const value = query['page[offset]'];\n const offsetText = Array.isArray(value) ? value[value.length - 1]! : value;\n offset = parseInt(offsetText);\n if (isNaN(offset) || offset < 0) {\n offset = 0;\n }\n }\n\n let pageSizeOption = this.options.pageSize ?? DEFAULT_PAGE_SIZE;\n if (pageSizeOption <= 0) {\n pageSizeOption = DEFAULT_PAGE_SIZE;\n }\n\n let limit = pageSizeOption;\n if (query['page[limit]']) {\n const value = query['page[limit]'];\n const limitText = Array.isArray(value) ? value[value.length - 1]! : value;\n limit = parseInt(limitText);\n if (isNaN(limit) || limit <= 0) {\n limit = pageSizeOption;\n }\n limit = Math.min(pageSizeOption, limit);\n }\n\n return { offset, limit };\n }\n\n private buildFilter(\n type: string,\n query: Record<string, string | string[]> | undefined,\n ): { filter: any; error: any } {\n if (!query) {\n return { filter: undefined, error: undefined };\n }\n\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return { filter: undefined, error: this.makeUnsupportedModelError(type) };\n }\n\n const items: any[] = [];\n\n for (const [key, value] of Object.entries(query)) {\n if (!value) {\n continue;\n }\n\n // try matching query parameter key as \"filter[x][y]...\"\n const match = key.match(this.filterParamPattern);\n if (!match || !match.groups || !match.groups['match']) {\n continue;\n }\n\n const filterKeys = match.groups['match']\n .replaceAll(/[[\\]]/g, ' ')\n .split(' ')\n .filter((i) => i);\n\n if (!filterKeys.length) {\n continue;\n }\n\n // turn filter into a nested query object\n\n const item: any = {};\n let curr = item;\n let currType = typeInfo;\n\n for (const filterValue of enumerate(value)) {\n for (let i = 0; i < filterKeys.length; i++) {\n // extract filter operation from (optional) trailing $op\n let filterKey = filterKeys[i]!;\n let filterOp: FilterOperationType | undefined;\n const pos = filterKey.indexOf('$');\n if (pos > 0) {\n filterOp = filterKey.substring(pos + 1) as FilterOperationType;\n filterKey = filterKey.substring(0, pos);\n }\n\n if (!!filterOp && !FilterOperations.includes(filterOp)) {\n return {\n filter: undefined,\n error: this.makeError('invalidFilter', `invalid filter operation: ${filterOp}`),\n };\n }\n\n const idFields = this.getIdFields(currType.name);\n const fieldDef =\n filterKey === 'id'\n ? Object.values(currType.fields).find((f) => idFields.some((idf) => idf.name === f.name))\n : currType.fields[filterKey];\n if (!fieldDef) {\n return { filter: undefined, error: this.makeError('invalidFilter') };\n }\n\n if (!fieldDef.relation) {\n // regular field\n if (i !== filterKeys.length - 1) {\n // must be the last segment of a filter\n return { filter: undefined, error: this.makeError('invalidFilter') };\n }\n curr[fieldDef.name] = this.makeFilterValue(fieldDef, filterValue, filterOp);\n } else {\n // relation field\n if (i === filterKeys.length - 1) {\n curr[fieldDef.name] = this.makeFilterValue(fieldDef, filterValue, filterOp);\n } else {\n // keep going\n if (fieldDef.array) {\n // collection filtering implies \"some\" operation\n curr[fieldDef.name] = { some: {} };\n curr = curr[fieldDef.name].some;\n } else {\n curr = curr[fieldDef.name] = {};\n }\n currType = this.getModelInfo(fieldDef.type)!;\n }\n }\n }\n items.push(item);\n }\n }\n\n if (items.length === 0) {\n return { filter: undefined, error: undefined };\n } else {\n // combine filters with AND\n return { filter: items.length === 1 ? items[0] : { AND: items }, error: undefined };\n }\n }\n\n private buildSort(type: string, query: Record<string, string | string[]> | undefined) {\n if (!query?.['sort']) {\n return { sort: undefined, error: undefined };\n }\n\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return { sort: undefined, error: this.makeUnsupportedModelError(type) };\n }\n\n const result: any[] = [];\n\n for (const sortSpec of enumerate(query['sort'])) {\n const sortFields = sortSpec.split(',').filter((i) => i);\n\n for (const sortField of sortFields) {\n const dir = sortField.startsWith('-') ? 'desc' : 'asc';\n const cleanedSortField = sortField.startsWith('-') ? sortField.substring(1) : sortField;\n const parts = cleanedSortField.split('.').filter((i) => i);\n\n const sortItem: any = {};\n let curr = sortItem;\n let currType = typeInfo;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!;\n\n const fieldInfo = currType.fields[part];\n if (!fieldInfo || fieldInfo.array) {\n return {\n sort: undefined,\n error: this.makeError('invalidSort', 'sorting by array field is not supported'),\n };\n }\n\n if (i === parts.length - 1) {\n if (fieldInfo.relation) {\n // relation field: sort by id\n const relationType = this.getModelInfo(fieldInfo.type);\n if (!relationType) {\n return { sort: undefined, error: this.makeUnsupportedModelError(fieldInfo.type) };\n }\n curr[fieldInfo.name] = relationType.idFields.reduce((acc: any, idField: FieldDef) => {\n acc[idField.name] = dir;\n return acc;\n }, {});\n } else {\n // regular field\n curr[fieldInfo.name] = dir;\n }\n } else {\n if (!fieldInfo.relation) {\n // must be a relation field\n return {\n sort: undefined,\n error: this.makeError(\n 'invalidSort',\n 'intermediate sort segments must be relationships',\n ),\n };\n }\n // keep going\n curr = curr[fieldInfo.name] = {};\n currType = this.getModelInfo(fieldInfo.type)!;\n if (!currType) {\n return { sort: undefined, error: this.makeUnsupportedModelError(fieldInfo.type) };\n }\n }\n }\n\n result.push(sortItem);\n }\n }\n\n return { sort: result, error: undefined };\n }\n\n private buildRelationSelect(\n type: string,\n include: string | string[],\n query: Record<string, string | string[]> | undefined,\n ) {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return { select: undefined, error: this.makeUnsupportedModelError(type) };\n }\n\n const result: any = {};\n const allIncludes: string[] = [];\n\n for (const includeItem of enumerate(include)) {\n const inclusions = includeItem.split(',').filter((i) => i);\n for (const inclusion of inclusions) {\n allIncludes.push(inclusion);\n\n const parts = inclusion.split('.');\n let currPayload = result;\n let currType = typeInfo;\n\n for (let i = 0; i < parts.length; i++) {\n const relation = parts[i]!;\n const relationInfo = currType.relationships[relation];\n if (!relationInfo) {\n return { select: undefined, error: this.makeUnsupportedRelationshipError(type, relation, 400) };\n }\n\n currType = this.getModelInfo(relationInfo.type)!;\n if (!currType) {\n return { select: undefined, error: this.makeUnsupportedModelError(relationInfo.type) };\n }\n\n // handle partial results for requested type\n const { select, error } = this.buildPartialSelect(lowerCaseFirst(relationInfo.type), query);\n if (error) return { select: undefined, error };\n\n if (i !== parts.length - 1) {\n if (select) {\n currPayload[relation] = { select: { ...select } };\n currPayload = currPayload[relation].select;\n } else {\n currPayload[relation] = { include: { ...currPayload[relation]?.include } };\n currPayload = currPayload[relation].include;\n }\n } else {\n currPayload[relation] = select\n ? {\n select: { ...select },\n }\n : true;\n }\n }\n }\n }\n\n return { select: result, error: undefined, allIncludes };\n }\n\n private makeFilterValue(fieldDef: FieldDef, value: string, op: FilterOperationType): any {\n // TODO: inequality filters?\n if (fieldDef.relation) {\n // relation filter is converted to an ID filter\n const info = this.getModelInfo(fieldDef.type)!;\n if (fieldDef.array) {\n // filtering a to-many relation, imply 'some' operator\n const values = value.split(',').filter((i) => i);\n const filterValue =\n values.length > 1\n ? { OR: values.map((v) => this.makeIdFilter(info.idFields, v, false)) }\n : this.makeIdFilter(info.idFields, value, false);\n return { some: filterValue };\n } else {\n const values = value.split(',').filter((i) => i);\n if (values.length > 1) {\n return { OR: values.map((v) => this.makeIdFilter(info.idFields, v, false)) };\n } else {\n return { is: this.makeIdFilter(info.idFields, value, false) };\n }\n }\n } else {\n const coerced = this.coerce(fieldDef, value);\n switch (op) {\n case 'icontains':\n return { contains: coerced, mode: 'insensitive' };\n case 'hasSome':\n case 'hasEvery': {\n const values = value\n .split(',')\n .filter((i) => i)\n .map((v) => this.coerce(fieldDef, v));\n return { [op]: values };\n }\n case 'isEmpty':\n if (value !== 'true' && value !== 'false') {\n throw new InvalidValueError(`Not a boolean: ${value}`);\n }\n return { isEmpty: value === 'true' ? true : false };\n default:\n if (op === undefined) {\n if (fieldDef.attributes?.some((attr) => attr.name === '@json')) {\n // handle JSON value equality filter\n return { equals: coerced };\n }\n\n // regular filter, split value by comma\n const values = value\n .split(',')\n .filter((i) => i)\n .map((v) => this.coerce(fieldDef, v));\n return values.length > 1 ? { in: values } : { equals: values[0] };\n } else {\n return { [op]: coerced };\n }\n }\n }\n }\n\n private injectRelationQuery(\n type: string,\n injectTarget: any,\n injectKey: string,\n query: Record<string, string | string[]> | undefined,\n ) {\n const { filter, error: filterError } = this.buildFilter(type, query);\n if (filterError) {\n return filterError;\n }\n\n if (filter) {\n injectTarget[injectKey] = { ...injectTarget[injectKey], where: filter };\n }\n\n const { sort, error: sortError } = this.buildSort(type, query);\n if (sortError) {\n return sortError;\n }\n if (sort) {\n injectTarget[injectKey] = { ...injectTarget[injectKey], orderBy: sort };\n }\n\n const pagination = this.getPagination(query);\n const offset = pagination.offset;\n if (offset > 0) {\n // inject skip\n injectTarget[injectKey] = { ...injectTarget[injectKey], skip: offset };\n }\n const limit = pagination.limit;\n if (limit !== Infinity) {\n // inject take\n injectTarget[injectKey] = { ...injectTarget[injectKey], take: limit };\n\n // include a count query for the relationship\n injectTarget._count = { select: { [injectKey]: true } };\n }\n }\n\n private handleORMError(err: ORMError) {\n return match(err.reason)\n .with(ORMErrorReason.INVALID_INPUT, () => {\n return this.makeError('validationError', err.message, 422);\n })\n .with(ORMErrorReason.REJECTED_BY_POLICY, () => {\n return this.makeError('forbidden', err.message, 403, { reason: err.rejectedByPolicyReason });\n })\n .with(ORMErrorReason.NOT_FOUND, () => {\n return this.makeError('notFound', err.message, 404);\n })\n .with(ORMErrorReason.DB_QUERY_ERROR, () => {\n return this.makeError('queryError', err.message, 400, {\n dbErrorCode: err.dbErrorCode,\n });\n })\n .otherwise(() => {\n return this.makeError('unknownError', err.message);\n });\n }\n\n private makeError(\n code: keyof typeof this.errors,\n detail?: string,\n status?: number,\n otherFields: Record<string, any> = {},\n ) {\n status = status ?? this.errors[code]?.status ?? 500;\n const error: any = {\n status,\n code: paramCase(code),\n title: this.errors[code]?.title,\n };\n\n if (detail) {\n error.detail = detail;\n }\n\n Object.assign(error, otherFields);\n\n return {\n status,\n body: {\n errors: [error],\n },\n };\n }\n\n private makeUnsupportedModelError(model: string) {\n return this.makeError('unsupportedModel', `Model ${model} doesn't exist`);\n }\n\n private makeUnsupportedRelationshipError(model: string, relationship: string, status: number) {\n return this.makeError('unsupportedRelationship', `Relationship ${model}.${relationship} doesn't exist`, status);\n }\n\n //#endregion\n}\n","import { Decimal } from 'decimal.js';\nimport SuperJSON from 'superjson';\nimport { match } from 'ts-pattern';\nimport { ZodError } from 'zod';\nimport { fromError as fromError3 } from 'zod-validation-error/v3';\nimport { fromError as fromError4 } from 'zod-validation-error/v4';\nimport type { LogConfig, LogLevel } from '../types';\n\nexport function log(logger: LogConfig | undefined, level: LogLevel, message: string | (() => string), error?: unknown) {\n if (!logger) {\n return;\n }\n\n const getMessage = typeof message === 'function' ? message : () => message;\n\n if (typeof logger === 'function') {\n logger(level, getMessage(), error);\n } else if (logger.includes(level)) {\n const logFn = match(level)\n .with('debug', () => console.debug)\n .with('info', () => console.info)\n .with('warn', () => console.warn)\n .with('error', () => console.error)\n .exhaustive();\n logFn(`@zenstackhq/server: [${level}] ${getMessage()}${error ? `\\n${error}` : ''}`);\n }\n}\n\n/**\n * Registers custom superjson serializers.\n */\nexport function registerCustomSerializers() {\n SuperJSON.registerCustom<Decimal, string>(\n {\n isApplicable: (v): v is Decimal => Decimal.isDecimal(v),\n serialize: (v) => v.toJSON(),\n deserialize: (v) => new Decimal(v),\n },\n 'Decimal',\n );\n\n // `Buffer` is not available in edge runtime\n if (globalThis.Buffer) {\n SuperJSON.registerCustom<Buffer, string>(\n {\n isApplicable: (v): v is Buffer => Buffer.isBuffer(v),\n serialize: (v) => v.toString('base64'),\n deserialize: (v) => Buffer.from(v, 'base64'),\n },\n 'Bytes',\n );\n }\n}\n\n/**\n * Format ZodError into a readable string\n */\nexport function getZodErrorMessage(error: ZodError): string {\n if ('_zod' in error) {\n return fromError4(error).toString();\n } else {\n return fromError3(error).toString();\n }\n}\n","import { lowerCaseFirst, safeJSONStringify } from '@zenstackhq/common-helpers';\nimport { ORMError, ORMErrorReason, type ClientContract } from '@zenstackhq/orm';\nimport type { SchemaDef } from '@zenstackhq/orm/schema';\nimport SuperJSON from 'superjson';\nimport { match } from 'ts-pattern';\nimport type { ApiHandler, LogConfig, RequestContext, Response } from '../../types';\nimport { log, registerCustomSerializers } from '../utils';\n\nregisterCustomSerializers();\n\n/**\n * Options for {@link RPCApiHandler}\n */\nexport type RPCApiHandlerOptions<Schema extends SchemaDef> = {\n /**\n * The schema\n */\n schema: Schema;\n\n /**\n * Logging configuration\n */\n log?: LogConfig;\n};\n\n/**\n * RPC style API request handler that mirrors the ZenStackClient API\n */\nexport class RPCApiHandler<Schema extends SchemaDef> implements ApiHandler<Schema> {\n constructor(private readonly options: RPCApiHandlerOptions<Schema>) {}\n\n get schema(): Schema {\n return this.options.schema;\n }\n\n get log(): LogConfig | undefined {\n return this.options.log;\n }\n\n async handleRequest({ client, method, path, query, requestBody }: RequestContext<Schema>): Promise<Response> {\n const parts = path.split('/').filter((p) => !!p);\n const op = parts.pop();\n let model = parts.pop();\n\n if (parts.length !== 0 || !op || !model) {\n return this.makeBadInputErrorResponse('invalid request path');\n }\n\n model = lowerCaseFirst(model);\n method = method.toUpperCase();\n let args: unknown;\n let resCode = 200;\n\n switch (op) {\n case 'create':\n case 'createMany':\n case 'createManyAndReturn':\n case 'upsert':\n if (method !== 'POST') {\n return this.makeBadInputErrorResponse('invalid request method, only POST is supported');\n }\n if (!requestBody) {\n return this.makeBadInputErrorResponse('missing request body');\n }\n\n args = requestBody;\n resCode = 201;\n break;\n\n case 'findFirst':\n case 'findUnique':\n case 'findMany':\n case 'aggregate':\n case 'groupBy':\n case 'count':\n if (method !== 'GET') {\n return this.makeBadInputErrorResponse('invalid request method, only GET is supported');\n }\n try {\n args = query?.['q']\n ? this.unmarshalQ(query['q'] as string, query['meta'] as string | undefined)\n : {};\n } catch {\n return this.makeBadInputErrorResponse('invalid \"q\" query parameter');\n }\n break;\n\n case 'update':\n case 'updateMany':\n case 'updateManyAndReturn':\n if (method !== 'PUT' && method !== 'PATCH') {\n return this.makeBadInputErrorResponse('invalid request method, only PUT or PATCH are supported');\n }\n if (!requestBody) {\n return this.makeBadInputErrorResponse('missing request body');\n }\n\n args = requestBody;\n break;\n\n case 'delete':\n case 'deleteMany':\n if (method !== 'DELETE') {\n return this.makeBadInputErrorResponse('invalid request method, only DELETE is supported');\n }\n try {\n args = query?.['q']\n ? this.unmarshalQ(query['q'] as string, query['meta'] as string | undefined)\n : {};\n } catch (err) {\n return this.makeBadInputErrorResponse(\n err instanceof Error ? err.message : 'invalid \"q\" query parameter',\n );\n }\n break;\n\n default:\n return this.makeBadInputErrorResponse('invalid operation: ' + op);\n }\n\n const { result: processedArgs, error } = await this.processRequestPayload(args);\n if (error) {\n return this.makeBadInputErrorResponse(error);\n }\n\n try {\n if (!this.isValidModel(client, model)) {\n return this.makeBadInputErrorResponse(`unknown model name: ${model}`);\n }\n\n log(\n this.options.log,\n 'debug',\n () => `handling \"${model}.${op}\" request with args: ${safeJSONStringify(processedArgs)}`,\n );\n\n const clientResult = await (client as any)[model][op](processedArgs);\n let responseBody: any = { data: clientResult };\n\n // superjson serialize response\n if (clientResult) {\n const { json, meta } = SuperJSON.serialize(clientResult);\n responseBody = { data: json };\n if (meta) {\n responseBody.meta = { serialization: meta };\n }\n }\n\n const response = { status: resCode, body: responseBody };\n log(\n this.options.log,\n 'debug',\n () => `sending response for \"${model}.${op}\" request: ${safeJSONStringify(response)}`,\n );\n return response;\n } catch (err) {\n log(this.options.log, 'error', `error occurred when handling \"${model}.${op}\" request`, err);\n if (err instanceof ORMError) {\n return this.makeORMErrorResponse(err);\n } else {\n return this.makeGenericErrorResponse(err);\n }\n }\n }\n\n private isValidModel(client: ClientContract<Schema>, model: string) {\n return Object.keys(client.$schema.models).some((m) => lowerCaseFirst(m) === lowerCaseFirst(model));\n }\n\n private makeBadInputErrorResponse(message: string) {\n const resp = {\n status: 400,\n body: { error: { message } },\n };\n log(this.options.log, 'debug', () => `sending error response: ${safeJSONStringify(resp)}`);\n return resp;\n }\n\n private makeGenericErrorResponse(err: unknown) {\n const resp = {\n status: 500,\n body: { error: { message: err instanceof Error ? err.message : 'unknown error' } },\n };\n log(\n this.options.log,\n 'debug',\n () => `sending error response: ${safeJSONStringify(resp)}${err instanceof Error ? '\\n' + err.stack : ''}`,\n );\n return resp;\n }\n\n private makeORMErrorResponse(err: ORMError) {\n let status = 400;\n const error: any = { message: err.message, reason: err.reason };\n\n match(err.reason)\n .with(ORMErrorReason.NOT_FOUND, () => {\n status = 404;\n error.model = err.model;\n })\n .with(ORMErrorReason.INVALID_INPUT, () => {\n status = 422;\n error.rejectedByValidation = true;\n error.model = err.model;\n })\n .with(ORMErrorReason.REJECTED_BY_POLICY, () => {\n status = 403;\n error.rejectedByPolicy = true;\n error.rejectReason = err.rejectedByPolicyReason;\n error.model = err.model;\n })\n .with(ORMErrorReason.DB_QUERY_ERROR, () => {\n status = 400;\n error.dbErrorCode = err.dbErrorCode;\n })\n .otherwise(() => {});\n\n const resp = { status, body: { error } };\n log(this.options.log, 'debug', () => `sending error response: ${safeJSONStringify(resp)}`);\n return resp;\n }\n\n private async processRequestPayload(args: any) {\n const { meta, ...rest } = args;\n if (meta?.serialization) {\n try {\n // superjson deserialization\n args = SuperJSON.deserialize({ json: rest, meta: meta.serialization });\n } catch (err) {\n return { result: undefined, error: `failed to deserialize request payload: ${(err as Error).message}` };\n }\n }\n return { result: args, error: undefined };\n }\n\n private unmarshalQ(value: string, meta: string | undefined) {\n let parsedValue: any;\n try {\n parsedValue = JSON.parse(value);\n } catch {\n throw new Error('invalid \"q\" query parameter');\n }\n\n if (meta) {\n let parsedMeta: any;\n try {\n parsedMeta = JSON.parse(meta);\n } catch {\n throw new Error('invalid \"meta\" query parameter');\n }\n\n if (parsedMeta.serialization) {\n return SuperJSON.deserialize({ json: parsedValue, meta: parsedMeta.serialization });\n }\n }\n\n return parsedValue;\n }\n}\n"],"mappings":"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","names":["import_decimal","import_superjson","import_ts_pattern","log","logger","level","message","error","getMessage","includes","logFn","match","with","console","debug","info","warn","exhaustive","registerCustomSerializers","SuperJSON","registerCustom","isApplicable","v","Decimal","isDecimal","serialize","toJSON","deserialize","globalThis","Buffer","isBuffer","toString","from","getZodErrorMessage","fromError4","fromError3","InvalidValueError","Error","message","DEFAULT_PAGE_SIZE","FilterOperations","DEFAULT_ID_DIVIDER","registerCustomSerializers","RestApiHandler","serializers","Map","errors","unsupportedModel","status","title","detail","unsupportedRelationship","invalidPath","invalidVerb","notFound","noId","invalidId","invalidPayload","invalidRelationData","invalidRelation","invalidFilter","invalidSort","invalidValue","duplicatedFieldsParameter","forbidden","validationError","queryError","unknownError","filterParamPattern","RegExp","createUpdatePayloadSchema","z","object","data","type","string","attributes","passthrough","optional","relationships","record","union","id","number","array","meta","strict","updateSingleRelationSchema","nullable","updateCollectionRelationSchema","upsertMetaSchema","operation","literal","matchFields","min","typeMap","idDivider","urlPatternMap","modelNameMapping","reverseModelNameMapping","externalIdMapping","options","segmentCharset","urlSegmentCharset","Object","fromEntries","entries","map","k","v","lowerCaseFirst","buildUrlPatternMap","buildTypeMap","buildSerializers","schema","log","urlSegmentNameCharset","segmentValueCharset","buildPath","segments","join","UrlPattern","mapModelName","modelName","matchUrlPattern","path","routeType","pattern","match","handleRequest","client","method","query","requestBody","toUpperCase","startsWith","processSingleRead","processFetchRelated","relationship","processReadRelationship","processCollectionRead","makeError","body","upsertMeta","safeParse","success","processUpsert","processCreate","processRelationshipCRUD","processUpdate","processDelete","err","ORMError","handleORMError","handleGenericError","stack","resourceId","typeInfo","getModelInfo","makeUnsupportedModelError","args","where","makeIdFilter","idFields","includeRelationshipIds","include","select","error","allIncludes","buildRelationSelect","buildPartialSelect","undefined","entity","findUnique","serializeItems","relationInfo","makeUnsupportedRelationshipError","relationSelect","filter","i","substring","length","partialFields","isCollection","injectRelationQuery","paginator","_count","total","url","makeNormalizedUrl","offset","limit","getPagination","makePaginator","mappedType","linkers","document","tsjapi","Linker","makeLinkUrl","makeIdSelect","serialized","onlyIdentifier","filterError","buildFilter","sort","sortError","buildSort","orderBy","skip","Infinity","entities","findMany","addTotalCountToMeta","take","count","Promise","all","selectFieldsQuery","Array","isArray","selectFieldNames","split","fields","reduce","acc","curr","assign","baseUrl","totalPages","Math","ceil","Paginator","first","replaceURLSearchParams","last","prev","next","processRequestBody","serialization","SuperJSON","deserialize","json","parseResult","getZodErrorMessage","_query","createPayload","key","connect","enumerate","item","makeIdConnect","makeDefaultIdKey","create","name","uniqueFieldSets","getUniqueFieldSets","some","set","every","field","includes","upsertPayload","makeUpsertWhere","update","e","upsert","modelDef","requireModel","uniqueFields","keys","mode","updateArgs","parsed","isOptional","disconnect","relationVerb","updatePayload","delete","model","models","getIdFields","modelLower","values","f","externalIdName","info","requireField","fieldDef","modelInfo","fieldInfo","relation","fieldTypeIdFields","endpoint","ids","mappedModel","linker","items","getId","projection","serializer","Serializer","version","idKey","makeIdKey","resource","get","relators","fieldSerializer","fieldIds","relator","Relator","relatedName","related","primary","setRelators","itemsWithId","clone","injectCompoundId","serialize","plainResult","toPlainObject","result","forEach","makeCompoundId","value","toJSON","params","r","URL","searchParams","toString","nested","decodedId","decodeURIComponent","coerce","idf","idx","mf","attr","JSON","parse","parseInt","isNaN","BigInt","parseFloat","Decimal","append","pageSize","offsetText","pageSizeOption","limitText","groups","filterKeys","replaceAll","currType","filterValue","filterKey","filterOp","pos","indexOf","find","makeFilterValue","push","AND","sortSpec","sortFields","sortField","dir","cleanedSortField","parts","sortItem","part","relationType","idField","includeItem","inclusions","inclusion","currPayload","op","OR","is","coerced","contains","isEmpty","equals","in","injectTarget","injectKey","pagination","reason","with","ORMErrorReason","INVALID_INPUT","REJECTED_BY_POLICY","rejectedByPolicyReason","NOT_FOUND","DB_QUERY_ERROR","dbErrorCode","otherwise","code","otherFields","paramCase","import_common_helpers","import_orm","import_superjson","import_ts_pattern","registerCustomSerializers","RPCApiHandler","options","schema","log","handleRequest","client","method","path","query","requestBody","parts","split","filter","p","op","pop","model","length","makeBadInputErrorResponse","lowerCaseFirst","toUpperCase","args","resCode","unmarshalQ","err","Error","message","result","processedArgs","error","processRequestPayload","isValidModel","safeJSONStringify","clientResult","responseBody","data","json","meta","SuperJSON","serialize","serialization","response","status","body","ORMError","makeORMErrorResponse","makeGenericErrorResponse","Object","keys","$schema","models","some","m","resp","stack","reason","match","with","ORMErrorReason","NOT_FOUND","INVALID_INPUT","rejectedByValidation","REJECTED_BY_POLICY","rejectedByPolicy","rejectReason","rejectedByPolicyReason","DB_QUERY_ERROR","dbErrorCode","otherwise","rest","deserialize","undefined","value","parsedValue","JSON","parse","parsedMeta"]}
1
+ {"version":3,"sources":["../src/api/index.ts","../src/api/rest/index.ts","../src/api/utils.ts","../src/api/rpc/index.ts"],"sourcesContent":["export { RestApiHandler, type RestApiHandlerOptions } from './rest';\nexport { RPCApiHandler, type RPCApiHandlerOptions } from './rpc';\n","import { clone, enumerate, lowerCaseFirst, paramCase } from '@zenstackhq/common-helpers';\nimport { ORMError, ORMErrorReason, type ClientContract } from '@zenstackhq/orm';\nimport type { FieldDef, ModelDef, SchemaDef } from '@zenstackhq/orm/schema';\nimport { Decimal } from 'decimal.js';\nimport SuperJSON from 'superjson';\nimport tsjapi, { type Linker, type Paginator, type Relator, type Serializer, type SerializerOptions } from 'ts-japi';\nimport { match } from 'ts-pattern';\nimport UrlPattern from 'url-pattern';\nimport z from 'zod';\nimport type { ApiHandler, LogConfig, RequestContext, Response } from '../../types';\nimport { getZodErrorMessage, log, registerCustomSerializers } from '../utils';\n\n/**\n * Options for {@link RestApiHandler}\n */\nexport type RestApiHandlerOptions<Schema extends SchemaDef = SchemaDef> = {\n /**\n * The schema\n */\n schema: Schema;\n\n /**\n * Logging configuration\n */\n log?: LogConfig;\n\n /**\n * The base endpoint of the RESTful API, must be a valid URL\n */\n endpoint: string;\n\n /**\n * The default page size for limiting the number of results returned\n * from collection queries, including resource collection, related data\n * of collection types, and relationship of collection types.\n *\n * Defaults to 100. Set to Infinity to disable pagination.\n */\n pageSize?: number;\n\n /**\n * The divider used to separate compound ID fields in the URL.\n * Defaults to '_'.\n */\n idDivider?: string;\n\n /**\n * The charset used for URL segment values. Defaults to `a-zA-Z0-9-_~ %`. You can change it if your entity's ID values\n * allow different characters. Specifically, if your models use compound IDs and the idDivider is set to a different value,\n * it should be included in the charset.\n */\n urlSegmentCharset?: string;\n\n modelNameMapping?: Record<string, string>;\n\n externalIdMapping?: Record<string, string>;\n};\n\ntype RelationshipInfo = {\n type: string;\n idFields: FieldDef[];\n isCollection: boolean;\n isOptional: boolean;\n};\n\ntype ModelInfo = {\n name: string;\n idFields: FieldDef[];\n fields: Record<string, FieldDef>;\n relationships: Record<string, RelationshipInfo>;\n};\n\ntype Match = {\n type: string;\n id: string;\n relationship: string;\n};\n\nenum UrlPatterns {\n SINGLE = 'single',\n FETCH_RELATIONSHIP = 'fetchRelationship',\n RELATIONSHIP = 'relationship',\n COLLECTION = 'collection',\n}\n\nclass InvalidValueError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nconst DEFAULT_PAGE_SIZE = 100;\n\nconst FilterOperations = [\n 'lt',\n 'lte',\n 'gt',\n 'gte',\n 'contains',\n 'icontains',\n 'search',\n 'startsWith',\n 'endsWith',\n 'has',\n 'hasEvery',\n 'hasSome',\n 'isEmpty',\n] as const;\n\ntype FilterOperationType = (typeof FilterOperations)[number] | undefined;\n\nconst DEFAULT_ID_DIVIDER = '_';\n\nregisterCustomSerializers();\n\n/**\n * RESTful-style API request handler (compliant with JSON:API)\n */\nexport class RestApiHandler<Schema extends SchemaDef = SchemaDef> implements ApiHandler<Schema> {\n // resource serializers\n private serializers = new Map<string, Serializer>();\n\n // error responses\n private readonly errors: Record<string, { status: number; title: string; detail?: string }> = {\n unsupportedModel: {\n status: 404,\n title: 'Unsupported model type',\n detail: 'The model type is not supported',\n },\n unsupportedRelationship: {\n status: 400,\n title: 'Unsupported relationship',\n detail: 'The relationship is not supported',\n },\n invalidPath: {\n status: 400,\n title: 'The request path is invalid',\n },\n invalidVerb: {\n status: 400,\n title: 'The HTTP verb is not supported',\n },\n notFound: {\n status: 404,\n title: 'Resource not found',\n },\n noId: {\n status: 400,\n title: 'Model without an ID field is not supported',\n },\n invalidId: {\n status: 400,\n title: 'Resource ID is invalid',\n },\n invalidPayload: {\n status: 400,\n title: 'Invalid payload',\n },\n invalidRelationData: {\n status: 400,\n title: 'Invalid relation data',\n detail: 'Invalid relationship data',\n },\n invalidRelation: {\n status: 400,\n title: 'Invalid relation',\n detail: 'Invalid relationship',\n },\n invalidFilter: {\n status: 400,\n title: 'Invalid filter',\n },\n invalidSort: {\n status: 400,\n title: 'Invalid sort',\n },\n invalidValue: {\n status: 400,\n title: 'Invalid value for type',\n },\n duplicatedFieldsParameter: {\n status: 400,\n title: 'Fields Parameter Duplicated',\n },\n forbidden: {\n status: 403,\n title: 'Operation is forbidden',\n },\n validationError: {\n status: 422,\n title: 'Operation is unprocessable due to validation errors',\n },\n queryError: {\n status: 400,\n title: 'Error occurred while executing the query',\n },\n unknownError: {\n status: 500,\n title: 'Unknown error',\n },\n };\n\n private filterParamPattern = new RegExp(/^filter(?<match>(\\[[^[\\]]+\\])+)$/);\n\n // zod schema for payload of creating and updating a resource\n private createUpdatePayloadSchema = z\n .object({\n data: z.object({\n type: z.string(),\n attributes: z.object({}).passthrough().optional(),\n relationships: z\n .record(\n z.string(),\n z.object({\n data: z.union([\n z.object({ type: z.string(), id: z.union([z.string(), z.number()]) }),\n z.array(z.object({ type: z.string(), id: z.union([z.string(), z.number()]) })),\n ]),\n }),\n )\n .optional(),\n }),\n meta: z.object({}).passthrough().optional(),\n })\n .strict();\n\n // zod schema for updating a single relationship\n private updateSingleRelationSchema = z.object({\n data: z.object({ type: z.string(), id: z.union([z.string(), z.number()]) }).nullable(),\n });\n\n // zod schema for updating collection relationship\n private updateCollectionRelationSchema = z.object({\n data: z.array(z.object({ type: z.string(), id: z.union([z.string(), z.number()]) })),\n });\n\n private upsertMetaSchema = z.object({\n meta: z.object({\n operation: z.literal('upsert'),\n matchFields: z.array(z.string()).min(1),\n }),\n });\n\n // all known types and their metadata\n private typeMap: Record<string, ModelInfo> = {};\n\n // divider used to separate compound ID fields\n private idDivider;\n\n private urlPatternMap: Record<UrlPatterns, UrlPattern>;\n private modelNameMapping: Record<string, string>;\n private reverseModelNameMapping: Record<string, string>;\n private externalIdMapping: Record<string, string>;\n\n constructor(private readonly options: RestApiHandlerOptions<Schema>) {\n this.idDivider = options.idDivider ?? DEFAULT_ID_DIVIDER;\n const segmentCharset = options.urlSegmentCharset ?? 'a-zA-Z0-9-_~ %';\n\n this.modelNameMapping = options.modelNameMapping ?? {};\n this.modelNameMapping = Object.fromEntries(\n Object.entries(this.modelNameMapping).map(([k, v]) => [lowerCaseFirst(k), v]),\n );\n this.reverseModelNameMapping = Object.fromEntries(\n Object.entries(this.modelNameMapping).map(([k, v]) => [v, k]),\n );\n\n this.externalIdMapping = options.externalIdMapping ?? {};\n this.externalIdMapping = Object.fromEntries(\n Object.entries(this.externalIdMapping).map(([k, v]) => [lowerCaseFirst(k), v]),\n );\n\n this.urlPatternMap = this.buildUrlPatternMap(segmentCharset);\n\n this.buildTypeMap();\n this.buildSerializers();\n }\n\n get schema() {\n return this.options.schema;\n }\n\n get log(): LogConfig | undefined {\n return this.options.log;\n }\n\n private buildUrlPatternMap(urlSegmentNameCharset: string): Record<UrlPatterns, UrlPattern> {\n const options = { segmentValueCharset: urlSegmentNameCharset };\n\n const buildPath = (segments: string[]) => {\n return '/' + segments.join('/');\n };\n\n return {\n [UrlPatterns.SINGLE]: new UrlPattern(buildPath([':type', ':id']), options),\n [UrlPatterns.FETCH_RELATIONSHIP]: new UrlPattern(buildPath([':type', ':id', ':relationship']), options),\n [UrlPatterns.RELATIONSHIP]: new UrlPattern(\n buildPath([':type', ':id', 'relationships', ':relationship']),\n options,\n ),\n [UrlPatterns.COLLECTION]: new UrlPattern(buildPath([':type']), options),\n };\n }\n\n private mapModelName(modelName: string): string {\n return this.modelNameMapping[modelName] ?? modelName;\n }\n\n private matchUrlPattern(path: string, routeType: UrlPatterns): Match | undefined {\n const pattern = this.urlPatternMap[routeType];\n if (!pattern) {\n throw new InvalidValueError(`Unknown route type: ${routeType}`);\n }\n\n const match = pattern.match(path);\n if (!match) {\n return;\n }\n\n if (match.type in this.modelNameMapping) {\n throw new InvalidValueError(\n `use the mapped model name: ${this.modelNameMapping[match.type]} and not ${match.type}`,\n );\n }\n\n if (match.type in this.reverseModelNameMapping) {\n match.type = this.reverseModelNameMapping[match.type];\n }\n\n return match;\n }\n\n async handleRequest({ client, method, path, query, requestBody }: RequestContext<Schema>): Promise<Response> {\n method = method.toUpperCase();\n if (!path.startsWith('/')) {\n path = '/' + path;\n }\n\n try {\n switch (method) {\n case 'GET': {\n let match = this.matchUrlPattern(path, UrlPatterns.SINGLE);\n if (match) {\n // single resource read\n return await this.processSingleRead(client, match.type, match.id, query);\n }\n match = this.matchUrlPattern(path, UrlPatterns.FETCH_RELATIONSHIP);\n if (match) {\n // fetch related resource(s)\n return await this.processFetchRelated(client, match.type, match.id, match.relationship, query);\n }\n\n match = this.matchUrlPattern(path, UrlPatterns.RELATIONSHIP);\n if (match) {\n // read relationship\n return await this.processReadRelationship(\n client,\n match.type,\n match.id,\n match.relationship,\n query,\n );\n }\n\n match = this.matchUrlPattern(path, UrlPatterns.COLLECTION);\n if (match) {\n // collection read\n return await this.processCollectionRead(client, match.type, query);\n }\n\n return this.makeError('invalidPath');\n }\n\n case 'POST': {\n if (!requestBody) {\n return this.makeError('invalidPayload');\n }\n let match = this.matchUrlPattern(path, UrlPatterns.COLLECTION);\n if (match) {\n const body = requestBody as any;\n const upsertMeta = this.upsertMetaSchema.safeParse(body);\n if (upsertMeta.success) {\n // resource upsert\n return await this.processUpsert(client, match.type, query, requestBody);\n } else {\n // resource creation\n return await this.processCreate(client, match.type, query, requestBody);\n }\n }\n match = this.matchUrlPattern(path, UrlPatterns.RELATIONSHIP);\n if (match) {\n // relationship creation (collection relationship only)\n return await this.processRelationshipCRUD(\n client,\n 'create',\n match.type,\n match.id,\n match.relationship,\n query,\n requestBody,\n );\n }\n\n return this.makeError('invalidPath');\n }\n\n // TODO: PUT for full update\n case 'PUT':\n case 'PATCH': {\n if (!requestBody) {\n return this.makeError('invalidPayload');\n }\n let match = this.matchUrlPattern(path, UrlPatterns.SINGLE);\n if (match) {\n // resource update\n return await this.processUpdate(client, match.type, match.id, query, requestBody);\n }\n match = this.matchUrlPattern(path, UrlPatterns.RELATIONSHIP);\n if (match) {\n // relationship update\n return await this.processRelationshipCRUD(\n client,\n 'update',\n match.type,\n match.id,\n match.relationship as string,\n query,\n requestBody,\n );\n }\n\n return this.makeError('invalidPath');\n }\n\n case 'DELETE': {\n let match = this.matchUrlPattern(path, UrlPatterns.SINGLE);\n if (match) {\n // resource deletion\n return await this.processDelete(client, match.type, match.id);\n }\n\n match = this.matchUrlPattern(path, UrlPatterns.RELATIONSHIP);\n if (match) {\n // relationship deletion (collection relationship only)\n return await this.processRelationshipCRUD(\n client,\n 'delete',\n match.type,\n match.id,\n match.relationship as string,\n query,\n requestBody,\n );\n }\n\n return this.makeError('invalidPath');\n }\n\n default:\n return this.makeError('invalidPath');\n }\n } catch (err) {\n if (err instanceof InvalidValueError) {\n return this.makeError('invalidValue', err.message);\n } else if (err instanceof ORMError) {\n return this.handleORMError(err);\n } else {\n return this.handleGenericError(err);\n }\n }\n }\n\n private handleGenericError(err: unknown): Response | PromiseLike<Response> {\n return this.makeError('unknownError', err instanceof Error ? `${err.message}\\n${err.stack}` : 'Unknown error');\n }\n\n private async processSingleRead(\n client: ClientContract<Schema>,\n type: string,\n resourceId: string,\n query: Record<string, string | string[]> | undefined,\n ): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const args: any = { where: this.makeIdFilter(typeInfo.idFields, resourceId) };\n\n // include IDs of relation fields so that they can be serialized\n this.includeRelationshipIds(type, args, 'include');\n\n // handle \"include\" query parameter\n let include: string[] | undefined;\n if (query?.['include']) {\n const { select, error, allIncludes } = this.buildRelationSelect(type, query['include'], query);\n if (error) {\n return error;\n }\n if (select) {\n args.include = { ...args.include, ...select };\n }\n include = allIncludes;\n }\n\n // handle partial results for requested type\n const { select, error } = this.buildPartialSelect(type, query);\n if (error) return error;\n if (select) {\n args.select = { ...select, ...args.select };\n if (args.include) {\n args.select = {\n ...args.select,\n ...args.include,\n };\n args.include = undefined;\n }\n }\n\n const entity = await (client as any)[type].findUnique(args);\n\n if (entity) {\n return {\n status: 200,\n body: await this.serializeItems(type, entity, { include }),\n };\n } else {\n return this.makeError('notFound');\n }\n }\n\n private async processFetchRelated(\n client: ClientContract<Schema>,\n type: string,\n resourceId: string,\n relationship: string,\n query: Record<string, string | string[]> | undefined,\n ): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const relationInfo = typeInfo.relationships[relationship];\n if (!relationInfo) {\n return this.makeUnsupportedRelationshipError(type, relationship, 404);\n }\n\n let select: any;\n\n // handle \"include\" query parameter\n let include: string[] | undefined;\n if (query?.['include']) {\n const {\n select: relationSelect,\n error,\n allIncludes,\n } = this.buildRelationSelect(type, query['include'], query);\n if (error) {\n return error;\n }\n // trim the leading `$relationship.` from the include paths\n include = allIncludes\n .filter((i) => i.startsWith(`${relationship}.`))\n .map((i) => i.substring(`${relationship}.`.length));\n select = relationSelect;\n }\n\n // handle partial results for requested type\n if (!select) {\n const { select: partialFields, error } = this.buildPartialSelect(lowerCaseFirst(relationInfo.type), query);\n if (error) return error;\n\n select = partialFields ? { [relationship]: { select: { ...partialFields } } } : { [relationship]: true };\n }\n\n const args: any = {\n where: this.makeIdFilter(typeInfo.idFields, resourceId),\n select,\n };\n\n if (relationInfo.isCollection) {\n // if related data is a collection, it can be filtered, sorted, and paginated\n const error = this.injectRelationQuery(relationInfo.type, select, relationship, query);\n if (error) {\n return error;\n }\n }\n\n const entity: any = await (client as any)[type].findUnique(args);\n\n let paginator: Paginator<any> | undefined;\n\n if (entity?._count?.[relationship] !== undefined) {\n // build up paginator\n const total = entity?._count?.[relationship] as number;\n const url = this.makeNormalizedUrl(`/${type}/${resourceId}/${relationship}`, query);\n const { offset, limit } = this.getPagination(query);\n paginator = this.makePaginator(url, offset, limit, total);\n }\n\n if (entity?.[relationship]) {\n const mappedType = this.mapModelName(type);\n return {\n status: 200,\n body: await this.serializeItems(relationInfo.type, entity[relationship], {\n linkers: {\n document: new tsjapi.Linker(() =>\n this.makeLinkUrl(`/${mappedType}/${resourceId}/${relationship}`),\n ),\n paginator,\n },\n include,\n }),\n };\n } else {\n return this.makeError('notFound');\n }\n }\n\n private async processReadRelationship(\n client: ClientContract<Schema>,\n type: string,\n resourceId: string,\n relationship: string,\n query: Record<string, string | string[]> | undefined,\n ): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const relationInfo = typeInfo.relationships[relationship];\n if (!relationInfo) {\n return this.makeUnsupportedRelationshipError(type, relationship, 404);\n }\n\n const args: any = {\n where: this.makeIdFilter(typeInfo.idFields, resourceId),\n select: this.makeIdSelect(typeInfo.idFields),\n };\n\n // include IDs of relation fields so that they can be serialized\n args.select = { ...args.select, [relationship]: { select: this.makeIdSelect(relationInfo.idFields) } };\n\n let paginator: Paginator<any> | undefined;\n\n if (relationInfo.isCollection) {\n // if related data is a collection, it can be filtered, sorted, and paginated\n const error = this.injectRelationQuery(relationInfo.type, args.select, relationship, query);\n if (error) {\n return error;\n }\n }\n\n const entity: any = await (client as any)[type].findUnique(args);\n const mappedType = this.mapModelName(type);\n\n if (entity?._count?.[relationship] !== undefined) {\n // build up paginator\n const total = entity?._count?.[relationship] as number;\n const url = this.makeNormalizedUrl(`/${mappedType}/${resourceId}/relationships/${relationship}`, query);\n const { offset, limit } = this.getPagination(query);\n paginator = this.makePaginator(url, offset, limit, total);\n }\n\n if (entity?.[relationship]) {\n const serialized: any = await this.serializeItems(relationInfo.type, entity[relationship], {\n linkers: {\n document: new tsjapi.Linker(() =>\n this.makeLinkUrl(`/${mappedType}/${resourceId}/relationships/${relationship}`),\n ),\n paginator,\n },\n onlyIdentifier: true,\n });\n\n return {\n status: 200,\n body: serialized,\n };\n } else {\n return this.makeError('notFound');\n }\n }\n\n private async processCollectionRead(\n client: ClientContract<Schema>,\n type: string,\n query: Record<string, string | string[]> | undefined,\n ): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const args: any = {};\n\n // add filter\n const { filter, error: filterError } = this.buildFilter(type, query);\n if (filterError) {\n return filterError;\n }\n if (filter) {\n args.where = filter;\n }\n\n const { sort, error: sortError } = this.buildSort(type, query);\n if (sortError) {\n return sortError;\n }\n if (sort) {\n args.orderBy = sort;\n }\n\n // include IDs of relation fields so that they can be serialized\n this.includeRelationshipIds(type, args, 'include');\n\n // handle \"include\" query parameter\n let include: string[] | undefined;\n if (query?.['include']) {\n const { select, error, allIncludes } = this.buildRelationSelect(type, query['include'], query);\n if (error) {\n return error;\n }\n if (select) {\n args.include = { ...args.include, ...select };\n }\n include = allIncludes;\n }\n\n // handle partial results for requested type\n const { select, error } = this.buildPartialSelect(type, query);\n if (error) return error;\n if (select) {\n args.select = { ...select, ...args.select };\n if (args.include) {\n args.select = {\n ...args.select,\n ...args.include,\n };\n args.include = undefined;\n }\n }\n\n const { offset, limit } = this.getPagination(query);\n if (offset > 0) {\n args.skip = offset;\n }\n\n if (limit === Infinity) {\n const entities = await (client as any)[type].findMany(args);\n\n const body = await this.serializeItems(type, entities, { include });\n const total = entities.length;\n body.meta = this.addTotalCountToMeta(body.meta, total);\n\n return {\n status: 200,\n body: body,\n };\n } else {\n args.take = limit;\n\n const [entities, count] = await Promise.all([\n (client as any)[type].findMany(args),\n (client as any)[type].count({ where: args.where ?? {} }),\n ]);\n const total = count as number;\n\n const mappedType = this.mapModelName(type);\n const url = this.makeNormalizedUrl(`/${mappedType}`, query);\n const options: Partial<SerializerOptions> = {\n include,\n linkers: {\n paginator: this.makePaginator(url, offset, limit, total),\n },\n };\n const body = await this.serializeItems(type, entities, options);\n body.meta = this.addTotalCountToMeta(body.meta, total);\n\n return {\n status: 200,\n body: body,\n };\n }\n }\n\n private buildPartialSelect(type: string, query: Record<string, string | string[]> | undefined) {\n const selectFieldsQuery = query?.[`fields[${type}]`];\n if (!selectFieldsQuery) {\n return { select: undefined, error: undefined };\n }\n\n if (Array.isArray(selectFieldsQuery)) {\n return {\n select: undefined,\n error: this.makeError('duplicatedFieldsParameter', `duplicated fields query for type ${type}`),\n };\n }\n\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return { select: undefined, error: this.makeUnsupportedModelError(type) };\n }\n\n const selectFieldNames = selectFieldsQuery.split(',').filter((i) => i);\n\n const fields = selectFieldNames.reduce((acc, curr) => ({ ...acc, [curr]: true }), {});\n\n return {\n select: { ...this.makeIdSelect(typeInfo.idFields), ...fields },\n };\n }\n\n private addTotalCountToMeta(meta: any, total: any) {\n return meta ? Object.assign(meta, { total }) : Object.assign({}, { total });\n }\n\n private makePaginator(baseUrl: string, offset: number, limit: number, total: number) {\n if (limit === Infinity) {\n return undefined;\n }\n\n const totalPages = Math.ceil(total / limit);\n\n return new tsjapi.Paginator(() => ({\n first: this.replaceURLSearchParams(baseUrl, { 'page[limit]': limit }),\n last: this.replaceURLSearchParams(baseUrl, {\n 'page[offset]': (totalPages - 1) * limit,\n }),\n prev:\n offset - limit >= 0 && offset - limit <= total - 1\n ? this.replaceURLSearchParams(baseUrl, {\n 'page[offset]': offset - limit,\n 'page[limit]': limit,\n })\n : null,\n next:\n offset + limit <= total - 1\n ? this.replaceURLSearchParams(baseUrl, {\n 'page[offset]': offset + limit,\n 'page[limit]': limit,\n })\n : null,\n }));\n }\n\n private processRequestBody(requestBody: unknown) {\n let body: any = requestBody;\n if (body.meta?.serialization) {\n // superjson deserialize body if a serialization meta is provided\n body = SuperJSON.deserialize({ json: body, meta: body.meta.serialization });\n }\n\n const parseResult = this.createUpdatePayloadSchema.safeParse(body);\n if (!parseResult.success) {\n return {\n attributes: undefined,\n relationships: undefined,\n error: this.makeError('invalidPayload', getZodErrorMessage(parseResult.error)),\n };\n }\n\n return {\n attributes: parseResult.data.data.attributes,\n relationships: parseResult.data.data.relationships,\n error: undefined,\n };\n }\n\n private async processCreate(\n client: ClientContract<Schema>,\n type: string,\n _query: Record<string, string | string[]> | undefined,\n requestBody: unknown,\n ): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const { attributes, relationships, error } = this.processRequestBody(requestBody);\n if (error) {\n return error;\n }\n\n const createPayload: any = { data: { ...attributes } };\n\n // turn relationship payload into `connect` objects\n if (relationships) {\n for (const [key, data] of Object.entries<any>(relationships)) {\n if (!data?.data) {\n return this.makeError('invalidRelationData');\n }\n\n const relationInfo = typeInfo.relationships[key];\n if (!relationInfo) {\n return this.makeUnsupportedRelationshipError(type, key, 400);\n }\n\n if (relationInfo.isCollection) {\n createPayload.data[key] = {\n connect: enumerate(data.data).map((item: any) =>\n this.makeIdConnect(relationInfo.idFields, item.id),\n ),\n };\n } else {\n if (typeof data.data !== 'object') {\n return this.makeError('invalidRelationData');\n }\n createPayload.data[key] = {\n connect: this.makeIdConnect(relationInfo.idFields, data.data.id),\n };\n }\n\n // make sure ID fields are included for result serialization\n createPayload.include = {\n ...createPayload.include,\n [key]: { select: { [this.makeDefaultIdKey(relationInfo.idFields)]: true } },\n };\n }\n }\n\n // include IDs of relation fields so that they can be serialized.\n this.includeRelationshipIds(type, createPayload, 'include');\n\n const entity = await (client as any)[type].create(createPayload);\n return {\n status: 201,\n body: await this.serializeItems(type, entity),\n };\n }\n\n private async processUpsert(\n client: ClientContract<Schema>,\n type: string,\n _query: Record<string, string | string[]> | undefined,\n requestBody: unknown,\n ) {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const modelName = typeInfo.name;\n const { attributes, relationships, error } = this.processRequestBody(requestBody);\n if (error) {\n return error;\n }\n\n const parseResult = this.upsertMetaSchema.safeParse(requestBody);\n if (parseResult.error) {\n return this.makeError('invalidPayload', getZodErrorMessage(parseResult.error));\n }\n const matchFields = parseResult.data.meta.matchFields;\n const uniqueFieldSets = this.getUniqueFieldSets(modelName);\n\n if (!uniqueFieldSets.some((set) => set.every((field) => matchFields.includes(field)))) {\n return this.makeError('invalidPayload', 'Match fields must be unique fields', 400);\n }\n\n const upsertPayload: any = {\n where: this.makeUpsertWhere(matchFields, attributes, typeInfo),\n create: { ...attributes },\n update: {\n ...Object.fromEntries(Object.entries(attributes ?? {}).filter((e) => !matchFields.includes(e[0]))),\n },\n };\n\n if (relationships) {\n for (const [key, data] of Object.entries<any>(relationships)) {\n if (!data?.data) {\n return this.makeError('invalidRelationData');\n }\n\n const relationInfo = typeInfo.relationships[key];\n if (!relationInfo) {\n return this.makeUnsupportedRelationshipError(modelName, key, 400);\n }\n\n if (relationInfo.isCollection) {\n upsertPayload.create[key] = {\n connect: enumerate(data.data).map((item: any) =>\n this.makeIdConnect(relationInfo.idFields, item.id),\n ),\n };\n upsertPayload.update[key] = {\n set: enumerate(data.data).map((item: any) =>\n this.makeIdConnect(relationInfo.idFields, item.id),\n ),\n };\n } else {\n if (typeof data.data !== 'object') {\n return this.makeError('invalidRelationData');\n }\n upsertPayload.create[key] = {\n connect: this.makeIdConnect(relationInfo.idFields, data.data.id),\n };\n upsertPayload.update[key] = {\n connect: this.makeIdConnect(relationInfo.idFields, data.data.id),\n };\n }\n }\n }\n\n // include IDs of relation fields so that they can be serialized.\n this.includeRelationshipIds(modelName, upsertPayload, 'include');\n\n const entity = await (client as any)[modelName].upsert(upsertPayload);\n\n return {\n status: 201,\n body: await this.serializeItems(modelName, entity),\n };\n }\n\n private getUniqueFieldSets(type: string) {\n const modelDef = this.requireModel(type);\n return Object.entries(modelDef.uniqueFields).map(\n ([k, v]) =>\n typeof v.type === 'string'\n ? [k] // single unique field\n : Object.keys(v), // compound unique fields\n );\n }\n\n private async processRelationshipCRUD(\n client: ClientContract<Schema>,\n mode: 'create' | 'update' | 'delete',\n type: string,\n resourceId: string,\n relationship: string,\n _query: Record<string, string | string[]> | undefined,\n requestBody: unknown,\n ): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const relationInfo = typeInfo.relationships[relationship];\n if (!relationInfo) {\n return this.makeUnsupportedRelationshipError(type, relationship, 404);\n }\n\n if (!relationInfo.isCollection && mode !== 'update') {\n // to-one relation can only be updated\n return this.makeError('invalidVerb');\n }\n\n const updateArgs: any = {\n where: this.makeIdFilter(typeInfo.idFields, resourceId),\n select: {\n ...typeInfo.idFields.reduce((acc, field) => ({ ...acc, [field.name]: true }), {}),\n [relationship]: { select: this.makeIdSelect(relationInfo.idFields) },\n },\n };\n\n if (!relationInfo.isCollection) {\n // zod-parse payload\n const parsed = this.updateSingleRelationSchema.safeParse(requestBody);\n if (!parsed.success) {\n return this.makeError('invalidPayload', getZodErrorMessage(parsed.error));\n }\n\n if (parsed.data.data === null) {\n if (!relationInfo.isOptional) {\n // cannot disconnect a required relation\n return this.makeError('invalidPayload');\n }\n // set null -> disconnect\n updateArgs.data = {\n [relationship]: {\n disconnect: true,\n },\n };\n } else {\n updateArgs.data = {\n [relationship]: {\n connect: this.makeIdConnect(relationInfo.idFields, parsed.data.data.id),\n },\n };\n }\n } else {\n // zod-parse payload\n const parsed = this.updateCollectionRelationSchema.safeParse(requestBody);\n if (!parsed.success) {\n return this.makeError('invalidPayload', getZodErrorMessage(parsed.error));\n }\n\n // create -> connect, delete -> disconnect, update -> set\n const relationVerb = mode === 'create' ? 'connect' : mode === 'delete' ? 'disconnect' : 'set';\n\n updateArgs.data = {\n [relationship]: {\n [relationVerb]: enumerate(parsed.data.data).map((item: any) =>\n this.makeIdFilter(relationInfo.idFields, item.id),\n ),\n },\n };\n }\n\n const entity: any = await (client as any)[type].update(updateArgs);\n\n const mappedType = this.mapModelName(type);\n\n const serialized: any = await this.serializeItems(relationInfo.type, entity[relationship], {\n linkers: {\n document: new tsjapi.Linker(() =>\n this.makeLinkUrl(`/${mappedType}/${resourceId}/relationships/${relationship}`),\n ),\n },\n onlyIdentifier: true,\n });\n\n return {\n status: 200,\n body: serialized,\n };\n }\n\n private async processUpdate(\n client: ClientContract<Schema>,\n type: any,\n resourceId: string,\n _query: Record<string, string | string[]> | undefined,\n requestBody: unknown,\n ): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n const { attributes, relationships, error } = this.processRequestBody(requestBody);\n if (error) {\n return error;\n }\n\n const updatePayload: any = {\n where: this.makeIdFilter(typeInfo.idFields, resourceId),\n data: { ...attributes },\n };\n\n // turn relationships into query payload\n if (relationships) {\n for (const [key, data] of Object.entries<any>(relationships)) {\n if (!data?.data) {\n return this.makeError('invalidRelationData');\n }\n\n const relationInfo = typeInfo.relationships[key];\n if (!relationInfo) {\n return this.makeUnsupportedRelationshipError(type, key, 400);\n }\n\n if (relationInfo.isCollection) {\n updatePayload.data[key] = {\n set: enumerate(data.data).map((item: any) => ({\n [this.makeDefaultIdKey(relationInfo.idFields)]: item.id,\n })),\n };\n } else {\n if (typeof data.data !== 'object') {\n return this.makeError('invalidRelationData');\n }\n updatePayload.data[key] = {\n connect: {\n [this.makeDefaultIdKey(relationInfo.idFields)]: data.data.id,\n },\n };\n }\n updatePayload.include = {\n ...updatePayload.include,\n [key]: { select: { [this.makeDefaultIdKey(relationInfo.idFields)]: true } },\n };\n }\n }\n\n // include IDs of relation fields so that they can be serialized.\n this.includeRelationshipIds(type, updatePayload, 'include');\n\n const entity = await (client as any)[type].update(updatePayload);\n return {\n status: 200,\n body: await this.serializeItems(type, entity),\n };\n }\n\n private async processDelete(client: ClientContract<Schema>, type: any, resourceId: string): Promise<Response> {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return this.makeUnsupportedModelError(type);\n }\n\n await (client as any)[type].delete({\n where: this.makeIdFilter(typeInfo.idFields, resourceId),\n });\n return {\n status: 200,\n body: { meta: {} },\n };\n }\n\n //#region utilities\n\n private requireModel(model: string): ModelDef {\n const modelDef = this.schema.models[model];\n if (!modelDef) {\n throw new Error(`Model ${model} is not defined in the schema`);\n }\n return modelDef;\n }\n\n private getIdFields(model: string): FieldDef[] {\n const modelDef = this.requireModel(model);\n const modelLower = lowerCaseFirst(model);\n if (!(modelLower in this.externalIdMapping)) {\n return Object.values(modelDef.fields).filter((f) => modelDef.idFields.includes(f.name));\n }\n\n // map external ID name to unique constraint field\n const externalIdName = this.externalIdMapping[modelLower];\n for (const [name, info] of Object.entries(modelDef.uniqueFields)) {\n if (name === externalIdName) {\n if (typeof info.type === 'string') {\n // single unique field\n return [this.requireField(model, info.type)];\n } else {\n // compound unique fields\n return Object.keys(info).map((f) => this.requireField(model, f));\n }\n }\n }\n\n throw new Error(`Model ${model} does not have unique key ${externalIdName}`);\n }\n\n private requireField(model: string, field: string): FieldDef {\n const modelDef = this.requireModel(model);\n const fieldDef = modelDef.fields[field];\n if (!fieldDef) {\n throw new Error(`Field ${field} is not defined in model ${model}`);\n }\n return fieldDef;\n }\n\n private buildTypeMap() {\n this.typeMap = {};\n for (const [model, { fields }] of Object.entries(this.schema.models)) {\n const idFields = this.getIdFields(model);\n if (idFields.length === 0) {\n log(this.options.log, 'warn', `Not including model ${model} in the API because it has no ID field`);\n continue;\n }\n\n const modelInfo: ModelInfo = (this.typeMap[lowerCaseFirst(model)] = {\n name: model,\n idFields,\n relationships: {},\n fields,\n });\n\n for (const [field, fieldInfo] of Object.entries(fields)) {\n if (!fieldInfo.relation) {\n continue;\n }\n const fieldTypeIdFields = this.getIdFields(fieldInfo.type);\n if (fieldTypeIdFields.length === 0) {\n log(\n this.options.log,\n 'warn',\n `Not including relation ${model}.${field} in the API because it has no ID field`,\n );\n continue;\n }\n\n modelInfo.relationships[field] = {\n type: fieldInfo.type,\n idFields: fieldTypeIdFields,\n isCollection: !!fieldInfo.array,\n isOptional: !!fieldInfo.optional,\n };\n }\n }\n }\n\n private getModelInfo(model: string): ModelInfo | undefined {\n return this.typeMap[lowerCaseFirst(model)];\n }\n\n private makeLinkUrl(path: string) {\n return `${this.options.endpoint}${path}`;\n }\n\n private buildSerializers() {\n const linkers: Record<string, Linker<any>> = {};\n\n for (const model of Object.keys(this.schema.models)) {\n const ids = this.getIdFields(model);\n const modelLower = lowerCaseFirst(model);\n const mappedModel = this.mapModelName(modelLower);\n\n if (ids.length < 1) {\n continue;\n }\n\n const linker = new tsjapi.Linker((items) =>\n Array.isArray(items)\n ? this.makeLinkUrl(`/${mappedModel}`)\n : this.makeLinkUrl(`/${mappedModel}/${this.getId(model, items)}`),\n );\n linkers[modelLower] = linker;\n\n let projection: Record<string, 0> | null = {};\n const modelDef = this.requireModel(model);\n for (const [field, fieldDef] of Object.entries(modelDef.fields)) {\n if (fieldDef.relation) {\n projection[field] = 0;\n }\n }\n if (Object.keys(projection).length === 0) {\n projection = null;\n }\n\n const serializer = new tsjapi.Serializer(model, {\n version: '1.1',\n idKey: this.makeIdKey(ids),\n linkers: {\n resource: linker,\n document: linker,\n },\n projection,\n });\n this.serializers.set(modelLower, serializer);\n }\n\n // set relators\n for (const model of Object.keys(this.schema.models)) {\n const modelLower = lowerCaseFirst(model);\n const serializer = this.serializers.get(modelLower);\n if (!serializer) {\n continue;\n }\n\n const relators: Record<string, Relator<any>> = {};\n const modelDef = this.requireModel(model);\n for (const [field, fieldDef] of Object.entries(modelDef.fields)) {\n if (!fieldDef.relation) {\n continue;\n }\n const fieldSerializer = this.serializers.get(lowerCaseFirst(fieldDef.type));\n if (!fieldSerializer) {\n continue;\n }\n const fieldIds = this.getIdFields(fieldDef.type);\n if (fieldIds.length > 0) {\n const mappedModel = this.mapModelName(modelLower);\n\n const relator = new tsjapi.Relator(\n async (data) => {\n return (data as any)[field];\n },\n fieldSerializer,\n {\n relatedName: field,\n linkers: {\n related: new tsjapi.Linker((primary) =>\n this.makeLinkUrl(`/${mappedModel}/${this.getId(model, primary)}/${field}`),\n ),\n relationship: new tsjapi.Linker((primary) =>\n this.makeLinkUrl(\n `/${mappedModel}/${this.getId(model, primary)}/relationships/${field}`,\n ),\n ),\n },\n },\n );\n relators[field] = relator;\n }\n }\n serializer.setRelators(relators);\n }\n }\n\n private getId(model: string, data: any) {\n if (!data) {\n return undefined;\n }\n const ids = this.getIdFields(model);\n if (ids.length === 0) {\n return undefined;\n } else {\n return data[this.makeIdKey(ids)];\n }\n }\n\n private async serializeItems(model: string, items: unknown, options?: Partial<SerializerOptions<any>>) {\n model = lowerCaseFirst(model);\n const serializer = this.serializers.get(model);\n if (!serializer) {\n throw new Error(`serializer not found for model ${model}`);\n }\n\n const itemsWithId = clone(items);\n this.injectCompoundId(model, itemsWithId);\n\n // serialize to JSON:API structure\n const serialized = await serializer.serialize(itemsWithId, options);\n\n // convert the serialization result to plain object otherwise SuperJSON won't work\n const plainResult = this.toPlainObject(serialized);\n\n // superjson serialize the result\n const { json, meta } = SuperJSON.serialize(plainResult);\n\n const result: any = json;\n if (meta) {\n result.meta = { ...result.meta, serialization: meta };\n }\n\n return result;\n }\n\n private injectCompoundId(model: string, items: unknown) {\n const typeInfo = this.getModelInfo(model);\n if (!typeInfo) {\n return;\n }\n\n // recursively traverse the entity to create synthetic ID field for models with compound ID\n enumerate(items).forEach((item: any) => {\n if (!item) {\n return;\n }\n\n if (typeInfo.idFields.length > 1) {\n item[this.makeIdKey(typeInfo.idFields)] = this.makeCompoundId(typeInfo.idFields, item);\n }\n\n for (const [key, value] of Object.entries(item)) {\n if (typeInfo.relationships[key]) {\n // field is a relationship, recurse\n this.injectCompoundId(typeInfo.relationships[key].type, value);\n }\n }\n });\n }\n\n private toPlainObject(data: any): any {\n if (data === undefined || data === null) {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.map((item: any) => this.toPlainObject(item));\n }\n\n if (typeof data === 'object') {\n if (typeof data.toJSON === 'function') {\n // custom toJSON function\n return data.toJSON();\n }\n const result: any = {};\n for (const [field, value] of Object.entries(data)) {\n if (value === undefined || typeof value === 'function') {\n // trim undefined and functions\n continue;\n } else if (field === 'attributes') {\n // don't visit into entity data\n result[field] = value;\n } else {\n result[field] = this.toPlainObject(value);\n }\n }\n return result;\n }\n\n return data;\n }\n\n private replaceURLSearchParams(url: string, params: Record<string, string | number>) {\n const r = new URL(url);\n for (const [key, value] of Object.entries(params)) {\n r.searchParams.set(key, value.toString());\n }\n return r.toString();\n }\n\n private makeIdFilter(idFields: FieldDef[], resourceId: string, nested: boolean = true) {\n const decodedId = decodeURIComponent(resourceId);\n if (idFields.length === 1) {\n return { [idFields[0]!.name]: this.coerce(idFields[0]!, decodedId) };\n } else if (nested) {\n return {\n // TODO: support `@@id` with custom name\n [idFields.map((idf) => idf.name).join(DEFAULT_ID_DIVIDER)]: idFields.reduce(\n (acc, curr, idx) => ({\n ...acc,\n [curr.name]: this.coerce(curr, decodedId.split(this.idDivider)[idx]),\n }),\n {},\n ),\n };\n } else {\n return idFields.reduce(\n (acc, curr, idx) => ({\n ...acc,\n [curr.name]: this.coerce(curr, decodedId.split(this.idDivider)[idx]),\n }),\n {},\n );\n }\n }\n\n private makeIdSelect(idFields: FieldDef[]) {\n if (idFields.length === 0) {\n throw this.errors['noId'];\n }\n return idFields.reduce((acc, curr) => ({ ...acc, [curr.name]: true }), {});\n }\n\n private makeIdConnect(idFields: FieldDef[], id: string | number) {\n if (idFields.length === 1) {\n return { [idFields[0]!.name]: this.coerce(idFields[0]!, id) };\n } else {\n return {\n [this.makeDefaultIdKey(idFields)]: idFields.reduce(\n (acc, curr, idx) => ({\n ...acc,\n [curr.name]: this.coerce(curr, `${id}`.split(this.idDivider)[idx]),\n }),\n {},\n ),\n };\n }\n }\n\n private makeIdKey(idFields: FieldDef[]) {\n return idFields.map((idf) => idf.name).join(this.idDivider);\n }\n\n private makeDefaultIdKey(idFields: FieldDef[]) {\n // TODO: support `@@id` with custom name\n return idFields.map((idf) => idf.name).join(DEFAULT_ID_DIVIDER);\n }\n\n private makeCompoundId(idFields: FieldDef[], item: any) {\n return idFields.map((idf) => item[idf.name]).join(this.idDivider);\n }\n\n private makeUpsertWhere(matchFields: any[], attributes: any, typeInfo: ModelInfo) {\n const where = matchFields.reduce((acc: any, field: string) => {\n acc[field] = attributes[field] ?? null;\n return acc;\n }, {});\n\n if (\n typeInfo.idFields.length > 1 &&\n matchFields.some((mf) => typeInfo.idFields.map((idf) => idf.name).includes(mf))\n ) {\n return {\n [this.makeDefaultIdKey(typeInfo.idFields)]: where,\n };\n }\n\n return where;\n }\n\n private includeRelationshipIds(model: string, args: any, mode: 'select' | 'include') {\n const typeInfo = this.getModelInfo(model);\n if (!typeInfo) {\n return;\n }\n for (const [relation, relationInfo] of Object.entries(typeInfo.relationships)) {\n args[mode] = { ...args[mode], [relation]: { select: this.makeIdSelect(relationInfo.idFields) } };\n }\n }\n\n private coerce(fieldDef: FieldDef, value: any) {\n if (typeof value === 'string') {\n if (fieldDef.attributes?.some((attr) => attr.name === '@json')) {\n try {\n return JSON.parse(value);\n } catch {\n throw new InvalidValueError(`invalid JSON value: ${value}`);\n }\n }\n\n const type = fieldDef.type;\n if (type === 'Int') {\n const parsed = parseInt(value);\n if (isNaN(parsed)) {\n throw new InvalidValueError(`invalid ${type} value: ${value}`);\n }\n return parsed;\n } else if (type === 'BigInt') {\n try {\n return BigInt(value);\n } catch {\n throw new InvalidValueError(`invalid ${type} value: ${value}`);\n }\n } else if (type === 'Float') {\n const parsed = parseFloat(value);\n if (isNaN(parsed)) {\n throw new InvalidValueError(`invalid ${type} value: ${value}`);\n }\n return parsed;\n } else if (type === 'Decimal') {\n try {\n return new Decimal(value);\n } catch {\n throw new InvalidValueError(`invalid ${type} value: ${value}`);\n }\n } else if (type === 'Boolean') {\n if (value === 'true') {\n return true;\n } else if (value === 'false') {\n return false;\n } else {\n throw new InvalidValueError(`invalid ${type} value: ${value}`);\n }\n }\n }\n return value;\n }\n\n private makeNormalizedUrl(path: string, query: Record<string, string | string[]> | undefined) {\n const url = new URL(this.makeLinkUrl(path));\n for (const [key, value] of Object.entries(query ?? {})) {\n if (\n key.startsWith('filter[') ||\n key.startsWith('sort[') ||\n key === 'include' ||\n key.startsWith('include[') ||\n key.startsWith('fields[')\n ) {\n for (const v of enumerate(value)) {\n url.searchParams.append(key, v);\n }\n }\n }\n return url.toString();\n }\n\n private getPagination(query: Record<string, string | string[]> | undefined) {\n if (!query) {\n return { offset: 0, limit: this.options.pageSize ?? DEFAULT_PAGE_SIZE };\n }\n\n let offset = 0;\n if (query['page[offset]']) {\n const value = query['page[offset]'];\n const offsetText = Array.isArray(value) ? value[value.length - 1]! : value;\n offset = parseInt(offsetText);\n if (isNaN(offset) || offset < 0) {\n offset = 0;\n }\n }\n\n let pageSizeOption = this.options.pageSize ?? DEFAULT_PAGE_SIZE;\n if (pageSizeOption <= 0) {\n pageSizeOption = DEFAULT_PAGE_SIZE;\n }\n\n let limit = pageSizeOption;\n if (query['page[limit]']) {\n const value = query['page[limit]'];\n const limitText = Array.isArray(value) ? value[value.length - 1]! : value;\n limit = parseInt(limitText);\n if (isNaN(limit) || limit <= 0) {\n limit = pageSizeOption;\n }\n limit = Math.min(pageSizeOption, limit);\n }\n\n return { offset, limit };\n }\n\n private buildFilter(\n type: string,\n query: Record<string, string | string[]> | undefined,\n ): { filter: any; error: any } {\n if (!query) {\n return { filter: undefined, error: undefined };\n }\n\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return { filter: undefined, error: this.makeUnsupportedModelError(type) };\n }\n\n const items: any[] = [];\n\n for (const [key, value] of Object.entries(query)) {\n if (!value) {\n continue;\n }\n\n // try matching query parameter key as \"filter[x][y]...\"\n const match = key.match(this.filterParamPattern);\n if (!match || !match.groups || !match.groups['match']) {\n continue;\n }\n\n const filterKeys = match.groups['match']\n .replaceAll(/[[\\]]/g, ' ')\n .split(' ')\n .filter((i) => i);\n\n if (!filterKeys.length) {\n continue;\n }\n\n // turn filter into a nested query object\n\n const item: any = {};\n let curr = item;\n let currType = typeInfo;\n\n for (const filterValue of enumerate(value)) {\n for (let i = 0; i < filterKeys.length; i++) {\n // extract filter operation from (optional) trailing $op\n let filterKey = filterKeys[i]!;\n let filterOp: FilterOperationType | undefined;\n const pos = filterKey.indexOf('$');\n if (pos > 0) {\n filterOp = filterKey.substring(pos + 1) as FilterOperationType;\n filterKey = filterKey.substring(0, pos);\n }\n\n if (!!filterOp && !FilterOperations.includes(filterOp)) {\n return {\n filter: undefined,\n error: this.makeError('invalidFilter', `invalid filter operation: ${filterOp}`),\n };\n }\n\n const idFields = this.getIdFields(currType.name);\n const fieldDef =\n filterKey === 'id'\n ? Object.values(currType.fields).find((f) => idFields.some((idf) => idf.name === f.name))\n : currType.fields[filterKey];\n if (!fieldDef) {\n return { filter: undefined, error: this.makeError('invalidFilter') };\n }\n\n if (!fieldDef.relation) {\n // regular field\n if (i !== filterKeys.length - 1) {\n // must be the last segment of a filter\n return { filter: undefined, error: this.makeError('invalidFilter') };\n }\n curr[fieldDef.name] = this.makeFilterValue(fieldDef, filterValue, filterOp);\n } else {\n // relation field\n if (i === filterKeys.length - 1) {\n curr[fieldDef.name] = this.makeFilterValue(fieldDef, filterValue, filterOp);\n } else {\n // keep going\n if (fieldDef.array) {\n // collection filtering implies \"some\" operation\n curr[fieldDef.name] = { some: {} };\n curr = curr[fieldDef.name].some;\n } else {\n curr = curr[fieldDef.name] = {};\n }\n currType = this.getModelInfo(fieldDef.type)!;\n }\n }\n }\n items.push(item);\n }\n }\n\n if (items.length === 0) {\n return { filter: undefined, error: undefined };\n } else {\n // combine filters with AND\n return { filter: items.length === 1 ? items[0] : { AND: items }, error: undefined };\n }\n }\n\n private buildSort(type: string, query: Record<string, string | string[]> | undefined) {\n if (!query?.['sort']) {\n return { sort: undefined, error: undefined };\n }\n\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return { sort: undefined, error: this.makeUnsupportedModelError(type) };\n }\n\n const result: any[] = [];\n\n for (const sortSpec of enumerate(query['sort'])) {\n const sortFields = sortSpec.split(',').filter((i) => i);\n\n for (const sortField of sortFields) {\n const dir = sortField.startsWith('-') ? 'desc' : 'asc';\n const cleanedSortField = sortField.startsWith('-') ? sortField.substring(1) : sortField;\n const parts = cleanedSortField.split('.').filter((i) => i);\n\n const sortItem: any = {};\n let curr = sortItem;\n let currType = typeInfo;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!;\n\n const fieldInfo = currType.fields[part];\n if (!fieldInfo || fieldInfo.array) {\n return {\n sort: undefined,\n error: this.makeError('invalidSort', 'sorting by array field is not supported'),\n };\n }\n\n if (i === parts.length - 1) {\n if (fieldInfo.relation) {\n // relation field: sort by id\n const relationType = this.getModelInfo(fieldInfo.type);\n if (!relationType) {\n return { sort: undefined, error: this.makeUnsupportedModelError(fieldInfo.type) };\n }\n curr[fieldInfo.name] = relationType.idFields.reduce((acc: any, idField: FieldDef) => {\n acc[idField.name] = dir;\n return acc;\n }, {});\n } else {\n // regular field\n curr[fieldInfo.name] = dir;\n }\n } else {\n if (!fieldInfo.relation) {\n // must be a relation field\n return {\n sort: undefined,\n error: this.makeError(\n 'invalidSort',\n 'intermediate sort segments must be relationships',\n ),\n };\n }\n // keep going\n curr = curr[fieldInfo.name] = {};\n currType = this.getModelInfo(fieldInfo.type)!;\n if (!currType) {\n return { sort: undefined, error: this.makeUnsupportedModelError(fieldInfo.type) };\n }\n }\n }\n\n result.push(sortItem);\n }\n }\n\n return { sort: result, error: undefined };\n }\n\n private buildRelationSelect(\n type: string,\n include: string | string[],\n query: Record<string, string | string[]> | undefined,\n ) {\n const typeInfo = this.getModelInfo(type);\n if (!typeInfo) {\n return { select: undefined, error: this.makeUnsupportedModelError(type) };\n }\n\n const result: any = {};\n const allIncludes: string[] = [];\n\n for (const includeItem of enumerate(include)) {\n const inclusions = includeItem.split(',').filter((i) => i);\n for (const inclusion of inclusions) {\n allIncludes.push(inclusion);\n\n const parts = inclusion.split('.');\n let currPayload = result;\n let currType = typeInfo;\n\n for (let i = 0; i < parts.length; i++) {\n const relation = parts[i]!;\n const relationInfo = currType.relationships[relation];\n if (!relationInfo) {\n return { select: undefined, error: this.makeUnsupportedRelationshipError(type, relation, 400) };\n }\n\n currType = this.getModelInfo(relationInfo.type)!;\n if (!currType) {\n return { select: undefined, error: this.makeUnsupportedModelError(relationInfo.type) };\n }\n\n // handle partial results for requested type\n const { select, error } = this.buildPartialSelect(lowerCaseFirst(relationInfo.type), query);\n if (error) return { select: undefined, error };\n\n if (i !== parts.length - 1) {\n if (select) {\n currPayload[relation] = { select: { ...select } };\n currPayload = currPayload[relation].select;\n } else {\n currPayload[relation] = { include: { ...currPayload[relation]?.include } };\n currPayload = currPayload[relation].include;\n }\n } else {\n currPayload[relation] = select\n ? {\n select: { ...select },\n }\n : true;\n }\n }\n }\n }\n\n return { select: result, error: undefined, allIncludes };\n }\n\n private makeFilterValue(fieldDef: FieldDef, value: string, op: FilterOperationType): any {\n // TODO: inequality filters?\n if (fieldDef.relation) {\n // relation filter is converted to an ID filter\n const info = this.getModelInfo(fieldDef.type)!;\n if (fieldDef.array) {\n // filtering a to-many relation, imply 'some' operator\n const values = value.split(',').filter((i) => i);\n const filterValue =\n values.length > 1\n ? { OR: values.map((v) => this.makeIdFilter(info.idFields, v, false)) }\n : this.makeIdFilter(info.idFields, value, false);\n return { some: filterValue };\n } else {\n const values = value.split(',').filter((i) => i);\n if (values.length > 1) {\n return { OR: values.map((v) => this.makeIdFilter(info.idFields, v, false)) };\n } else {\n return { is: this.makeIdFilter(info.idFields, value, false) };\n }\n }\n } else {\n const coerced = this.coerce(fieldDef, value);\n switch (op) {\n case 'icontains':\n return { contains: coerced, mode: 'insensitive' };\n case 'hasSome':\n case 'hasEvery': {\n const values = value\n .split(',')\n .filter((i) => i)\n .map((v) => this.coerce(fieldDef, v));\n return { [op]: values };\n }\n case 'isEmpty':\n if (value !== 'true' && value !== 'false') {\n throw new InvalidValueError(`Not a boolean: ${value}`);\n }\n return { isEmpty: value === 'true' ? true : false };\n default:\n if (op === undefined) {\n if (fieldDef.attributes?.some((attr) => attr.name === '@json')) {\n // handle JSON value equality filter\n return { equals: coerced };\n }\n\n // regular filter, split value by comma\n const values = value\n .split(',')\n .filter((i) => i)\n .map((v) => this.coerce(fieldDef, v));\n return values.length > 1 ? { in: values } : { equals: values[0] };\n } else {\n return { [op]: coerced };\n }\n }\n }\n }\n\n private injectRelationQuery(\n type: string,\n injectTarget: any,\n injectKey: string,\n query: Record<string, string | string[]> | undefined,\n ) {\n const { filter, error: filterError } = this.buildFilter(type, query);\n if (filterError) {\n return filterError;\n }\n\n if (filter) {\n injectTarget[injectKey] = { ...injectTarget[injectKey], where: filter };\n }\n\n const { sort, error: sortError } = this.buildSort(type, query);\n if (sortError) {\n return sortError;\n }\n if (sort) {\n injectTarget[injectKey] = { ...injectTarget[injectKey], orderBy: sort };\n }\n\n const pagination = this.getPagination(query);\n const offset = pagination.offset;\n if (offset > 0) {\n // inject skip\n injectTarget[injectKey] = { ...injectTarget[injectKey], skip: offset };\n }\n const limit = pagination.limit;\n if (limit !== Infinity) {\n // inject take\n injectTarget[injectKey] = { ...injectTarget[injectKey], take: limit };\n\n // include a count query for the relationship\n injectTarget._count = { select: { [injectKey]: true } };\n }\n }\n\n private handleORMError(err: ORMError) {\n return match(err.reason)\n .with(ORMErrorReason.INVALID_INPUT, () => {\n return this.makeError('validationError', err.message, 422);\n })\n .with(ORMErrorReason.REJECTED_BY_POLICY, () => {\n return this.makeError('forbidden', err.message, 403, { reason: err.rejectedByPolicyReason });\n })\n .with(ORMErrorReason.NOT_FOUND, () => {\n return this.makeError('notFound', err.message, 404);\n })\n .with(ORMErrorReason.DB_QUERY_ERROR, () => {\n return this.makeError('queryError', err.message, 400, {\n dbErrorCode: err.dbErrorCode,\n });\n })\n .otherwise(() => {\n return this.makeError('unknownError', err.message);\n });\n }\n\n private makeError(\n code: keyof typeof this.errors,\n detail?: string,\n status?: number,\n otherFields: Record<string, any> = {},\n ) {\n status = status ?? this.errors[code]?.status ?? 500;\n const error: any = {\n status,\n code: paramCase(code),\n title: this.errors[code]?.title,\n };\n\n if (detail) {\n error.detail = detail;\n }\n\n Object.assign(error, otherFields);\n\n return {\n status,\n body: {\n errors: [error],\n },\n };\n }\n\n private makeUnsupportedModelError(model: string) {\n return this.makeError('unsupportedModel', `Model ${model} doesn't exist`);\n }\n\n private makeUnsupportedRelationshipError(model: string, relationship: string, status: number) {\n return this.makeError('unsupportedRelationship', `Relationship ${model}.${relationship} doesn't exist`, status);\n }\n\n //#endregion\n}\n","import { Decimal } from 'decimal.js';\nimport SuperJSON from 'superjson';\nimport { match } from 'ts-pattern';\nimport { ZodError } from 'zod';\nimport { fromError as fromError3 } from 'zod-validation-error/v3';\nimport { fromError as fromError4 } from 'zod-validation-error/v4';\nimport type { LogConfig, LogLevel } from '../types';\n\nexport function log(logger: LogConfig | undefined, level: LogLevel, message: string | (() => string), error?: unknown) {\n if (!logger) {\n return;\n }\n\n const getMessage = typeof message === 'function' ? message : () => message;\n\n if (typeof logger === 'function') {\n logger(level, getMessage(), error);\n } else if (logger.includes(level)) {\n const logFn = match(level)\n .with('debug', () => console.debug)\n .with('info', () => console.info)\n .with('warn', () => console.warn)\n .with('error', () => console.error)\n .exhaustive();\n logFn(`@zenstackhq/server: [${level}] ${getMessage()}${error ? `\\n${error}` : ''}`);\n }\n}\n\n/**\n * Registers custom superjson serializers.\n */\nexport function registerCustomSerializers() {\n SuperJSON.registerCustom<Decimal, string>(\n {\n isApplicable: (v): v is Decimal => Decimal.isDecimal(v),\n serialize: (v) => v.toJSON(),\n deserialize: (v) => new Decimal(v),\n },\n 'Decimal',\n );\n\n // `Buffer` is not available in edge runtime\n if (globalThis.Buffer) {\n SuperJSON.registerCustom<Buffer, string>(\n {\n isApplicable: (v): v is Buffer => Buffer.isBuffer(v),\n serialize: (v) => v.toString('base64'),\n deserialize: (v) => Buffer.from(v, 'base64'),\n },\n 'Bytes',\n );\n }\n}\n\n/**\n * Format ZodError into a readable string\n */\nexport function getZodErrorMessage(error: ZodError): string {\n if ('_zod' in error) {\n return fromError4(error).toString();\n } else {\n return fromError3(error).toString();\n }\n}\n","import { lowerCaseFirst, safeJSONStringify } from '@zenstackhq/common-helpers';\nimport { ORMError, ORMErrorReason, type ClientContract } from '@zenstackhq/orm';\nimport type { SchemaDef } from '@zenstackhq/orm/schema';\nimport SuperJSON from 'superjson';\nimport { match } from 'ts-pattern';\nimport type { ApiHandler, LogConfig, RequestContext, Response } from '../../types';\nimport { log, registerCustomSerializers } from '../utils';\n\nregisterCustomSerializers();\n\n/**\n * Options for {@link RPCApiHandler}\n */\nexport type RPCApiHandlerOptions<Schema extends SchemaDef = SchemaDef> = {\n /**\n * The schema\n */\n schema: Schema;\n\n /**\n * Logging configuration\n */\n log?: LogConfig;\n};\n\n/**\n * RPC style API request handler that mirrors the ZenStackClient API\n */\nexport class RPCApiHandler<Schema extends SchemaDef = SchemaDef> implements ApiHandler<Schema> {\n constructor(private readonly options: RPCApiHandlerOptions<Schema>) {}\n\n get schema(): Schema {\n return this.options.schema;\n }\n\n get log(): LogConfig | undefined {\n return this.options.log;\n }\n\n async handleRequest({ client, method, path, query, requestBody }: RequestContext<Schema>): Promise<Response> {\n const parts = path.split('/').filter((p) => !!p);\n const op = parts.pop();\n let model = parts.pop();\n\n if (parts.length !== 0 || !op || !model) {\n return this.makeBadInputErrorResponse('invalid request path');\n }\n\n model = lowerCaseFirst(model);\n method = method.toUpperCase();\n let args: unknown;\n let resCode = 200;\n\n switch (op) {\n case 'create':\n case 'createMany':\n case 'createManyAndReturn':\n case 'upsert':\n if (method !== 'POST') {\n return this.makeBadInputErrorResponse('invalid request method, only POST is supported');\n }\n if (!requestBody) {\n return this.makeBadInputErrorResponse('missing request body');\n }\n\n args = requestBody;\n resCode = 201;\n break;\n\n case 'findFirst':\n case 'findUnique':\n case 'findMany':\n case 'aggregate':\n case 'groupBy':\n case 'count':\n if (method !== 'GET') {\n return this.makeBadInputErrorResponse('invalid request method, only GET is supported');\n }\n try {\n args = query?.['q']\n ? this.unmarshalQ(query['q'] as string, query['meta'] as string | undefined)\n : {};\n } catch {\n return this.makeBadInputErrorResponse('invalid \"q\" query parameter');\n }\n break;\n\n case 'update':\n case 'updateMany':\n case 'updateManyAndReturn':\n if (method !== 'PUT' && method !== 'PATCH') {\n return this.makeBadInputErrorResponse('invalid request method, only PUT or PATCH are supported');\n }\n if (!requestBody) {\n return this.makeBadInputErrorResponse('missing request body');\n }\n\n args = requestBody;\n break;\n\n case 'delete':\n case 'deleteMany':\n if (method !== 'DELETE') {\n return this.makeBadInputErrorResponse('invalid request method, only DELETE is supported');\n }\n try {\n args = query?.['q']\n ? this.unmarshalQ(query['q'] as string, query['meta'] as string | undefined)\n : {};\n } catch (err) {\n return this.makeBadInputErrorResponse(\n err instanceof Error ? err.message : 'invalid \"q\" query parameter',\n );\n }\n break;\n\n default:\n return this.makeBadInputErrorResponse('invalid operation: ' + op);\n }\n\n const { result: processedArgs, error } = await this.processRequestPayload(args);\n if (error) {\n return this.makeBadInputErrorResponse(error);\n }\n\n try {\n if (!this.isValidModel(client, model)) {\n return this.makeBadInputErrorResponse(`unknown model name: ${model}`);\n }\n\n log(\n this.options.log,\n 'debug',\n () => `handling \"${model}.${op}\" request with args: ${safeJSONStringify(processedArgs)}`,\n );\n\n const clientResult = await (client as any)[model][op](processedArgs);\n let responseBody: any = { data: clientResult };\n\n // superjson serialize response\n if (clientResult) {\n const { json, meta } = SuperJSON.serialize(clientResult);\n responseBody = { data: json };\n if (meta) {\n responseBody.meta = { serialization: meta };\n }\n }\n\n const response = { status: resCode, body: responseBody };\n log(\n this.options.log,\n 'debug',\n () => `sending response for \"${model}.${op}\" request: ${safeJSONStringify(response)}`,\n );\n return response;\n } catch (err) {\n log(this.options.log, 'error', `error occurred when handling \"${model}.${op}\" request`, err);\n if (err instanceof ORMError) {\n return this.makeORMErrorResponse(err);\n } else {\n return this.makeGenericErrorResponse(err);\n }\n }\n }\n\n private isValidModel(client: ClientContract<Schema>, model: string) {\n return Object.keys(client.$schema.models).some((m) => lowerCaseFirst(m) === lowerCaseFirst(model));\n }\n\n private makeBadInputErrorResponse(message: string) {\n const resp = {\n status: 400,\n body: { error: { message } },\n };\n log(this.options.log, 'debug', () => `sending error response: ${safeJSONStringify(resp)}`);\n return resp;\n }\n\n private makeGenericErrorResponse(err: unknown) {\n const resp = {\n status: 500,\n body: { error: { message: err instanceof Error ? err.message : 'unknown error' } },\n };\n log(\n this.options.log,\n 'debug',\n () => `sending error response: ${safeJSONStringify(resp)}${err instanceof Error ? '\\n' + err.stack : ''}`,\n );\n return resp;\n }\n\n private makeORMErrorResponse(err: ORMError) {\n let status = 400;\n const error: any = { message: err.message, reason: err.reason };\n\n match(err.reason)\n .with(ORMErrorReason.NOT_FOUND, () => {\n status = 404;\n error.model = err.model;\n })\n .with(ORMErrorReason.INVALID_INPUT, () => {\n status = 422;\n error.rejectedByValidation = true;\n error.model = err.model;\n })\n .with(ORMErrorReason.REJECTED_BY_POLICY, () => {\n status = 403;\n error.rejectedByPolicy = true;\n error.rejectReason = err.rejectedByPolicyReason;\n error.model = err.model;\n })\n .with(ORMErrorReason.DB_QUERY_ERROR, () => {\n status = 400;\n error.dbErrorCode = err.dbErrorCode;\n })\n .otherwise(() => {});\n\n const resp = { status, body: { error } };\n log(this.options.log, 'debug', () => `sending error response: ${safeJSONStringify(resp)}`);\n return resp;\n }\n\n private async processRequestPayload(args: any) {\n const { meta, ...rest } = args;\n if (meta?.serialization) {\n try {\n // superjson deserialization\n args = SuperJSON.deserialize({ json: rest, meta: meta.serialization });\n } catch (err) {\n return { result: undefined, error: `failed to deserialize request payload: ${(err as Error).message}` };\n }\n }\n return { result: args, error: undefined };\n }\n\n private unmarshalQ(value: string, meta: string | undefined) {\n let parsedValue: any;\n try {\n parsedValue = JSON.parse(value);\n } catch {\n throw new Error('invalid \"q\" query parameter');\n }\n\n if (meta) {\n let parsedMeta: any;\n try {\n parsedMeta = JSON.parse(meta);\n } catch {\n throw new Error('invalid \"meta\" query parameter');\n }\n\n if (parsedMeta.serialization) {\n return SuperJSON.deserialize({ json: parsedValue, meta: parsedMeta.serialization });\n }\n }\n\n return parsedValue;\n }\n}\n"],"mappings":"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","names":["import_decimal","import_superjson","import_ts_pattern","log","logger","level","message","error","getMessage","includes","logFn","match","with","console","debug","info","warn","exhaustive","registerCustomSerializers","SuperJSON","registerCustom","isApplicable","v","Decimal","isDecimal","serialize","toJSON","deserialize","globalThis","Buffer","isBuffer","toString","from","getZodErrorMessage","fromError4","fromError3","InvalidValueError","Error","message","DEFAULT_PAGE_SIZE","FilterOperations","DEFAULT_ID_DIVIDER","registerCustomSerializers","RestApiHandler","serializers","Map","errors","unsupportedModel","status","title","detail","unsupportedRelationship","invalidPath","invalidVerb","notFound","noId","invalidId","invalidPayload","invalidRelationData","invalidRelation","invalidFilter","invalidSort","invalidValue","duplicatedFieldsParameter","forbidden","validationError","queryError","unknownError","filterParamPattern","RegExp","createUpdatePayloadSchema","z","object","data","type","string","attributes","passthrough","optional","relationships","record","union","id","number","array","meta","strict","updateSingleRelationSchema","nullable","updateCollectionRelationSchema","upsertMetaSchema","operation","literal","matchFields","min","typeMap","idDivider","urlPatternMap","modelNameMapping","reverseModelNameMapping","externalIdMapping","options","segmentCharset","urlSegmentCharset","Object","fromEntries","entries","map","k","v","lowerCaseFirst","buildUrlPatternMap","buildTypeMap","buildSerializers","schema","log","urlSegmentNameCharset","segmentValueCharset","buildPath","segments","join","UrlPattern","mapModelName","modelName","matchUrlPattern","path","routeType","pattern","match","handleRequest","client","method","query","requestBody","toUpperCase","startsWith","processSingleRead","processFetchRelated","relationship","processReadRelationship","processCollectionRead","makeError","body","upsertMeta","safeParse","success","processUpsert","processCreate","processRelationshipCRUD","processUpdate","processDelete","err","ORMError","handleORMError","handleGenericError","stack","resourceId","typeInfo","getModelInfo","makeUnsupportedModelError","args","where","makeIdFilter","idFields","includeRelationshipIds","include","select","error","allIncludes","buildRelationSelect","buildPartialSelect","undefined","entity","findUnique","serializeItems","relationInfo","makeUnsupportedRelationshipError","relationSelect","filter","i","substring","length","partialFields","isCollection","injectRelationQuery","paginator","_count","total","url","makeNormalizedUrl","offset","limit","getPagination","makePaginator","mappedType","linkers","document","tsjapi","Linker","makeLinkUrl","makeIdSelect","serialized","onlyIdentifier","filterError","buildFilter","sort","sortError","buildSort","orderBy","skip","Infinity","entities","findMany","addTotalCountToMeta","take","count","Promise","all","selectFieldsQuery","Array","isArray","selectFieldNames","split","fields","reduce","acc","curr","assign","baseUrl","totalPages","Math","ceil","Paginator","first","replaceURLSearchParams","last","prev","next","processRequestBody","serialization","SuperJSON","deserialize","json","parseResult","getZodErrorMessage","_query","createPayload","key","connect","enumerate","item","makeIdConnect","makeDefaultIdKey","create","name","uniqueFieldSets","getUniqueFieldSets","some","set","every","field","includes","upsertPayload","makeUpsertWhere","update","e","upsert","modelDef","requireModel","uniqueFields","keys","mode","updateArgs","parsed","isOptional","disconnect","relationVerb","updatePayload","delete","model","models","getIdFields","modelLower","values","f","externalIdName","info","requireField","fieldDef","modelInfo","fieldInfo","relation","fieldTypeIdFields","endpoint","ids","mappedModel","linker","items","getId","projection","serializer","Serializer","version","idKey","makeIdKey","resource","get","relators","fieldSerializer","fieldIds","relator","Relator","relatedName","related","primary","setRelators","itemsWithId","clone","injectCompoundId","serialize","plainResult","toPlainObject","result","forEach","makeCompoundId","value","toJSON","params","r","URL","searchParams","toString","nested","decodedId","decodeURIComponent","coerce","idf","idx","mf","attr","JSON","parse","parseInt","isNaN","BigInt","parseFloat","Decimal","append","pageSize","offsetText","pageSizeOption","limitText","groups","filterKeys","replaceAll","currType","filterValue","filterKey","filterOp","pos","indexOf","find","makeFilterValue","push","AND","sortSpec","sortFields","sortField","dir","cleanedSortField","parts","sortItem","part","relationType","idField","includeItem","inclusions","inclusion","currPayload","op","OR","is","coerced","contains","isEmpty","equals","in","injectTarget","injectKey","pagination","reason","with","ORMErrorReason","INVALID_INPUT","REJECTED_BY_POLICY","rejectedByPolicyReason","NOT_FOUND","DB_QUERY_ERROR","dbErrorCode","otherwise","code","otherFields","paramCase","import_common_helpers","import_orm","import_superjson","import_ts_pattern","registerCustomSerializers","RPCApiHandler","options","schema","log","handleRequest","client","method","path","query","requestBody","parts","split","filter","p","op","pop","model","length","makeBadInputErrorResponse","lowerCaseFirst","toUpperCase","args","resCode","unmarshalQ","err","Error","message","result","processedArgs","error","processRequestPayload","isValidModel","safeJSONStringify","clientResult","responseBody","data","json","meta","SuperJSON","serialize","serialization","response","status","body","ORMError","makeORMErrorResponse","makeGenericErrorResponse","Object","keys","$schema","models","some","m","resp","stack","reason","match","with","ORMErrorReason","NOT_FOUND","INVALID_INPUT","rejectedByValidation","REJECTED_BY_POLICY","rejectedByPolicy","rejectReason","rejectedByPolicyReason","DB_QUERY_ERROR","dbErrorCode","otherwise","rest","deserialize","undefined","value","parsedValue","JSON","parse","parsedMeta"]}